Java: відмінності між версіями

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку
[перевірена версія][перевірена версія]
Вилучено вміст Додано вміст
Немає опису редагування
Рядок 24: Рядок 24:
}}
}}


'''Java''' (вимовляється ''Джава''; інколи — ''Ява'') — [[Об'єктно-орієнтоване програмування|об'єктно-орієнтована]] [[мова програмування]], випущена компанією [[Sun Microsystems]] у [[1995]] році як основний компонент [[платформа Java|платформи Java]]. Зараз мовою займається компанія [[Oracle Corporation|Oracle]], яка придбала [[Sun Microsystems]] у [[2009]] році. Синтаксис мови багато в чому схожий на [[C (мова програмування)|C]] та [[C++]]. У офіційній реалізації Java-програми [[Компілятор|компілюються]] у [[байт-код]], який при виконанні інтерпретується [[віртуальна машина Java|віртуальною машиною]] для конкретної платформи.
'''Java''' (вимовляється ''Джава''; інколи — ''Ява'') — [[Об'єктно-орієнтоване програмування|об'єктно-орієнтована]] [[мова програмування]], випущена 1995 року компанією «[[Sun Microsystems]]» як основний компонент платформи Java. З 2009 року мовою займається компанія «[[Oracle Corporation|Oracle]]», яка того року придбала «Sun Microsystems». В офіційній реалізації Java-програми [[Компілятор|компілюються]] у [[байт-код]], який при виконанні інтерпретується [[віртуальна машина Java|віртуальною машиною]] для конкретної платформи.


Oracle надає компілятор Java та [[віртуальна машина Java|віртуальну машину Java]], які задовольняють специфікації [[Java Community Process]], під ліцензією [[GNU General Public License]].
«Oracle» надає компілятор Java та [[віртуальна машина Java|віртуальну машину Java]], які задовольняють специфікації [[Java Community Process]], під ліцензією [[GNU General Public License]].


Мова значно запозичила синтаксис із [[C (мова програмування)|C]] і [[C++]]. Зокрема, взято за основу об'єктну модель {{s|С++}}, проте її модифіковано. Усунуто можливість появи деяких конфліктних ситуацій, що могли виникнути через помилки програміста та полегшено сам процес розробки об'єктно-орієнтованих програм. Ряд дій, які в С/C++ повинні здійснювати програмісти, доручено віртуальній машині. Передусім Java розроблялась як платформо-незалежна мова, тому вона має менше низькорівневих можливостей для роботи з апаратним забезпеченням. За необхідності таких дій java дозволяє викликати підпрограми, написані іншими мовами програмування.
Мова значно запозичила синтаксис із [[C (мова програмування)|C]] і [[C++]]. Зокрема, взято за основу об'єктну модель {{s|С++}}, проте її модифіковано. Усунуто можливість появи деяких конфліктних ситуацій, що могли виникнути через помилки програміста та полегшено сам процес розробки об'єктно-орієнтованих програм. Ряд дій, які в С/C++ повинні здійснювати програмісти, доручено віртуальній машині. Передусім Java розроблялась як платформо-незалежна мова, тому вона має менше низькорівневих можливостей для роботи з апаратним забезпеченням, що в порівнянні, наприклад, з C++ зменшує швидкість роботи програм. За необхідності таких дій Java дозволяє викликати підпрограми, написані іншими мовами програмування.


Java вплинула на розвиток [[J++]], що розроблялась компанією Microsoft. Роботу над J++ було зупинено через судовий позов компанії Sun Microsystems, оскільки ця мова програмування була модифікацією Java. Пізніше в новій платформі Microsoft [[.NET Framework|.NET]] випустило [[Visual J Sharp|J#]], щоб полегшити міграцію програмістів J++ або Java на нову платформу. З часом нова мова програмування [[C Sharp|С#]] стала основною мовою платформи, перейнявши багато чого з Java. J# востаннє включався в версію [[Microsoft Visual Studio]] 2005. Мова сценаріїв [[JavaScript]] має схожу із Java назву і синтаксис, але не пов'язана із Java.
Java вплинула на розвиток [[J++]], що розроблялась компанією «[[Microsoft]]». Роботу над J++ було зупинено через судовий позов «Sun Microsystems», оскільки ця мова програмування була модифікацією Java. Пізніше в новій платформі «Microsoft» [[.NET Framework|.NET]] випустили [[Visual J Sharp|J#]], щоб полегшити міграцію програмістів J++ або Java на нову платформу. З часом нова мова програмування [[C Sharp|С#]] стала основною мовою платформи, перейнявши багато чого з Java. J# востаннє включався в версію [[Microsoft Visual Studio]] 2005. Мова сценаріїв [[JavaScript]] має схожу із Java назву і синтаксис, але не пов'язана із Java.


== Назва ==
== Назва ==

Версія за 09:00, 18 березня 2017

Java
Парадигма об'єктно орієнтована, структурна, імперативна
Дата появи 1995
Творці Sun Microsystems, Oracle
Розробник Sun Microsystems і Oracle Corporation[1]
Останній реліз Java Standard Edition 8 (18 березня 2014; 10 років тому (2014-03-18))
Система типізації статична, сувора, безпечна, називна, явна
Основні реалізації віртуальні машини Java
Під впливом від Objective-C, C++, Smalltalk, Eiffel[2], Ada 83, Mesa,[3] Modula-3[4]
Вплинула на C#, D, J#, Ada 2005, ECMAScript, Groovy, PHP, Scala, JavaScript
Операційна система Мультиплатформна
Ліцензія GNU General Public License / Java Community Process
Звичайні розширення файлів .java, .class, .jar, .jad або .jmod
Вебсайт Офіційна сторінка(англ.)]
CMNS: Java у Вікісховищі

Java (вимовляється Джава; інколи — Ява) — об'єктно-орієнтована мова програмування, випущена 1995 року компанією «Sun Microsystems» як основний компонент платформи Java. З 2009 року мовою займається компанія «Oracle», яка того року придбала «Sun Microsystems». В офіційній реалізації Java-програми компілюються у байт-код, який при виконанні інтерпретується віртуальною машиною для конкретної платформи.

«Oracle» надає компілятор Java та віртуальну машину Java, які задовольняють специфікації Java Community Process, під ліцензією GNU General Public License.

Мова значно запозичила синтаксис із C і C++. Зокрема, взято за основу об'єктну модель С++, проте її модифіковано. Усунуто можливість появи деяких конфліктних ситуацій, що могли виникнути через помилки програміста та полегшено сам процес розробки об'єктно-орієнтованих програм. Ряд дій, які в С/C++ повинні здійснювати програмісти, доручено віртуальній машині. Передусім Java розроблялась як платформо-незалежна мова, тому вона має менше низькорівневих можливостей для роботи з апаратним забезпеченням, що в порівнянні, наприклад, з C++ зменшує швидкість роботи програм. За необхідності таких дій Java дозволяє викликати підпрограми, написані іншими мовами програмування.

Java вплинула на розвиток J++, що розроблялась компанією «Microsoft». Роботу над J++ було зупинено через судовий позов «Sun Microsystems», оскільки ця мова програмування була модифікацією Java. Пізніше в новій платформі «Microsoft» .NET випустили J#, щоб полегшити міграцію програмістів J++ або Java на нову платформу. З часом нова мова програмування С# стала основною мовою платформи, перейнявши багато чого з Java. J# востаннє включався в версію Microsoft Visual Studio 2005. Мова сценаріїв JavaScript має схожу із Java назву і синтаксис, але не пов'язана із Java.

Назва

Спочатку мова називалася Oak («дуб») і розроблялася Джеймсом Гослінгом для програмування побутових електронних пристроїв. Згодом вона була перейменована в Java і стала використовуватися для написання клієнтських застосунків і серверного програмного забезпечення. Названа на честь марки кави Java, яка, в свою чергу, отримала найменування однойменного острова (Ява), тому на офіційній емблемі мови зображена чашка з паркою кавою. Існує й інша версія походження назви мови, пов'язана з алюзією на кава-машину як приклад побутового влаштування, для програмування якого спочатку мова створювалася.

Історія

Мова програмування Java зародилася в 1991 р. в лабораторіях компанії Sun Microsystems. Розробку проекту започаткував Джеймс Ґослінґ, сам проект мав назву «Green» (Зелений). Створення першої робочої версії, яка мала назву «Oak» (дуб), зайняло 18 місяців. Оскільки виявилось, що ім'я Oak уже використовувалось іншою фірмою, то в результаті тривалих суперечок навколо назви нової мови з-поміж ряду запропонованих було вибрано назву Java[5], у 1995 р. мову було офіційно перейменовано[6].

Головним мотивом створення Java була потреба в мові програмування, яка б не залежала від платформи (тобто від архітектури) і яку можна було б використовувати для створення програмного забезпечення, що вбудовується в різноманітні побутові електронні прилади, такі як мобільні засоби зв'язку, пристрої дистанційного керування тощо.

Досить скоро майже всі найпопулярніші тогочасні веб-оглядачі отримали можливість запускати «безпечні» для системи Java-аплети всередині веб-сторінок. У грудні 1998 р. Sun Microsystems випустила Java 2 (спершу під назвою J2SE 1.2), де було реалізовано декілька конфігурацій для різних типів платформ. Наприклад, J2EE призначалася для створення корпоративних застосунків, а значно урізана J2ME для приладів з обмеженими ресурсами, таких як мобільні телефони. У 2006 році в маркетингових цілях версії J2 було перейменовано у Java EE, Java ME та Java SE відповідно.

13 листопада 2006 року Sun випустили більшу частину Java як вільне та відкрите програмне забезпечення згідно з умовами GNU General Public License (GPL). 8 травня 2007 корпорація закінчила процес, в результаті якого всі початкові коди Java були випущенні під GPL, за винятком невеликої частини коду, на який Sun не мала авторського права.

Період становлення Java збігся у часі з розквітом міжнародної інформаційної служби World Wide Web. Ця обставина відіграла вирішальну роль у майбутньому Java, оскільки Web теж вимагала платформо-незалежних програм. Як наслідок, були зміщені акценти в розробці Sun з побутової електроніки на програмування для Інтернет.

Головні концепції

Початкові цілі

У створенні мови програмування Java було чотири початкові цілі:[7]

  1. Синтаксис мови повинен бути «простим, об'єктно-орієнтовним та звичним».
  2. Реалізація має бути «безвідмовною та безпечною».
  3. Повинна зберегтися «незалежність від архітектури та переносимість».
  4. Висока продуктивність виконання
  5. Мова має бути «інтерпретованою, багатонитевою, із динамічним зв'язуванням модулів».

Платформа Java

Під «незалежністю від архітектури» мається на увазі те, що програма, написана на мові Java, працюватиме на будь-якій підтримуваній апаратній чи системній платформі без змін у початковому коді та перекомпіляції.

Цього можна досягти, компілюючи початковий Java код у байт-код, який є спрощеними машинними командами. Потім програму можна виконати на будь-якій платформі, що має встановлену віртуальну машину Java, яка інтерпретує байткод у код, пристосований до специфіки конкретної операційної системи і процесора. Зараз віртуальні машини Java існують для більшості процесорів і операційних систем.

Стандартні бібліотеки забезпечують загальний спосіб доступу до таких платформозалежних особливостей, як обробка графіки, багатопотоковість та роботу з мережами. У деяких версіях задля збільшення продуктивності JVM байт-код можна компілювати у машинний код до або під час виконання програми.

Основна перевага використання байт-коду — це портативність. Тим не менш, додаткові витрати на інтерпретацію означають, що інтерпретовані програми будуть майже завжди працювати повільніше, ніж скомпільовані у машинний код, і саме тому Java одержала репутацію «повільної»[джерело?] мови. Проте, цей розрив суттєво скоротився після введення декількох методів оптимізації у сучасних реалізаціях JVM.

Одним із таких методів є just-in-time компіляція (JIT, що перетворює байт-код Java у машинний під час першого запуску програми, а потім кешує його. У результаті така програма запускається і виконується швидше, ніж простий інтерпретований код, але ціною додаткових витрат на компіляцію під час виконання. Складніші віртуальні машини також використовують динамічну рекомпіляцію, яка полягає в тому, що віртуальна машина аналізує поведінку запущеної програми й вибірково рекомпілює та оптимізує певні її частини. З використанням динамічної рекомпіляції можна досягти більшого рівня оптимізації, ніж за статичної компіляції, оскільки динамічний компілятор може робити оптимізації на базі знань про довкілля періоду виконання та про завантажені класи. До того ж він може виявляти так звані гарячі точки (англ. hot spots) — частини програми, найчастіше внутрішні цикли, які займають найбільше часу при виконанні. JIT-компіляція та динамічна рекомпіляція збільшує швидкість Java-програм, не втрачаючи при цьому портативності.

Існує ще одна технологія оптимізації байткоду, широко відома як статична компіляція, або компіляція ahead-of-time (AOT). Цей метод передбачає, як і традиційні компілятори, безпосередню компіляцію у машинний код. Це забезпечує хороші показники в порівнянні з інтерпретацією, але за рахунок втрати переносності: скомпільовану таким способом програму можна запустити тільки на одній, цільовій платформі.

Швидкість офіційної віртуальної машини Java значно покращилася з моменту випуску ранніх версій, до того ж, деякі випробування показали, що продуктивність JIT-компіляторів у порівнянні зі звичайними компіляторами у машинний код майже однакова. Проте ефективність компіляторів не завжди свідчить про швидкість виконання скомпільованого коду, тільки ретельне тестування може виявити справжню ефективність у даній системі.

Об'єктність

На противагу C++, Java об'єктно-орієнтованіша. Всі дані і дії групуються в класи об'єктів. Виключенням з повної об'єктності (як скажімо в Smalltalk) є примітивні типи (int, float тощо). Це було свідомим рішенням проектувальників мови задля збільшення швидкості. Через це Java не вважається повністю об'єктно-орієнтовною мовою.

У Java всі об'єкти є похідними від головного об'єкта (він називається просто Object), з якого вони успадковують базову поведінку і властивості.

Хоча у C++ вперше стало доступне множинне успадкування, але у Java можливе тільки одинарне успадкування, завдяки чому виключається можливість конфліктів між членами класу (методи і змінні), які успадковуються від базових класів.

Безпека

У намірах проектувальників Java мала замінити C++ — об'єктного наступника мови C.[8] Проектувальники почали з аналізу властивостей C++, які є причиною найбільшого числа помилок, щоби створити просту, безпечну і безвідмовну мову програмування.

В Java існує система винятків або ситуацій, коли програма зустрічається з неочікуваними труднощами, наприклад:

  • операції над елементом масиву поза його межами або над порожнім елементом
  • читання з недоступного каталогу або неправильної адреси URL
  • ввід недопустимих даних користувачем

Одна з особливостей концепції віртуальної машини полягає в тому, що помилки (виключення) не призводять до повного краху системи. Крім того, існують інструменти, які «приєднуються» до середовища періоду виконання і кожен раз, коли сталося певне виключення, записують інформацію з пам'яті для відлагодження програми. Ці інструменти автоматизованої обробки виключень надають основну інформацію щодо виключень в програмах на Java.

Проте мову програмування Java не рекомендується використовувати в системах, збій в роботі яких може призвести до смерті, травм чи значних фізичних ушкоджень (наприклад, програмне забезпечення для керування атомними електростанціями, польотами, систем життєзабезпечення чи систем озброєння) через ненадійність програм, написаних на мові програмування Java.[9], пункт ліцензії Microsoft 7.7.h.

Автоматичне керування пам'яттю

Див. також: Збирання сміття

Java використовує автоматичний збирач сміття для керування пам'яттю під час життєвого циклу об'єкта. Програміст вирішує, коли створювати об'єкти, а віртуальна машина відповідальна за звільнення пам'яті після того, як об'єкт стає непотрібним. Коли до певного об'єкта вже не залишається посилань, збирач сміття може автоматично прибирати його із пам'яті. Проте, витік пам'яті все ж може статися, якщо код, написаний програмістом, має посилання на вже непотрібні об'єкти, наприклад на об'єкти, що зберігаються у діючих контейнерах.

Збирання сміття дозволене у будь-який час. В ідеалі воно відбувається під час бездіяльності програми. Збірка сміття автоматично форсується при нестачі вільної пам'яті в купі для розміщення нового об'єкта, що може призводити до кількасекундного зависання. Тому існують реалізації віртуальної машини Java з прибиральником сміття, спеціально створеним для програмування систем реального часу.

Java не має підтримки вказівників у стилі C/C++. Це зроблено задля безпеки й надійності, аби дозволити збирачу сміття переміщувати вказівникові об'єкти.

Приклад програми

Програма, яка виводить «Hello, World!»:

public class HelloWorld {
    public static void main(String[] args) {
        System.out.println("Hello, World!");
    }
}

Випуски

Докладніше: Історія версій Java

Структура Java-програми

Програми на Java утворені з визначень класів та інтерфейсів. Класи містять змінні та константи, які утримують дані, методи, які виконують дії, та конструктори, які створюють екземпляри класів — об'єкти. Дані можуть мати простий тип (наприклад байт, ціле число, символ) або бути посиланням на об'єкт. Мова Java є статично типізованою.

Лексична структура

Java-програми записуються в Юнікоді, також надається лексичне перетворення, яке дозволяє записувати символи Юнікоду керівними кодами Unicode за допомогою лише множини символів ASCII. Мова Java представляє текст послідовностями 16-бітних кодових одиниць, використовуючи кодування UTF-16. За винятком коментарів, ідентифікаторів та вмісту символьних та рядкових літералів, всі вхідні елементи програми на Java складаються із символів ASCII або відповідних їм керівних кодів Unicode.

Типи даних

Java є суворо типізованою мовою, кожна змінна та вираз має тип, відомий на етапі компіляції.

Типи даних Java належать до двох категорій: прості (primitive) та вказівникові (reference). До простих типів належить булевий(логічний) тип, числові типи та символьний тип.

Числові типи складаються із цілих типів byte, short, int, long та дійсних типів float, double. Символьний тип представлений типом char. Вказівникові типи складаються із класів, інтерфейсів, масивів. Значенням вказівникового типу є вказівник на об'єкт — екземпляр класу чи масиву. Рядки є об'єктами класу String.

Прості типи даних

Тип Довжина (в байтах) Діапазон або набір значень
boolean не визначено true, false
byte 1 −128..127
char 2 0..216−1, або 0..65535
short 2 −215..215−1, або −32768..32767
int 4 −231..231−1, або −2147483648..2147483647
long 8 −263..263−1, або приблизно −9.2·1018..9.2·1018
float 4 -(2-2−23)·2127..(2-2−23)·2127, або приблизно −3.4·1038..3.4·1038, а також , , NaN
double 8 -(2-2−52)·21023..(2-2−52)·21023, або приблизно −1.8·10308..1.8·10308, а також , , NaN

Критика

Докладніше: Критика Java

Оскільки Java програми виконуються віртуальною машиною Java, то це призводить до дещо нижчої швидкодію порівняно з самого початку скомпільованими на машинний код програмами (наприклад, написаними на С++). Проте за останнє десятиліття розробники віртуальної машини значно пришвидшили даний процес, тож в даний час програми на Java не надто поступаються аналогам на С++. Іншою проблемою Java є те, що для низькорівневого програмування (для роботи з апаратним забезпеченням) все ж необхідно використовувати модулі написані на інших більш підходящих для цього мовах програмування (той же С++). Для стандартних задач як то робота із портами комп'ютера для Java уже існують готові сторонні native-бібліотеки. Програми, які використовують платформно залежні модулі уже не є настільки портабельними і потребують, щоб дані модулі були реалізовані для різних систем. Ще однією з грунтовних проблем Java є безпека Java аплетів - спеціальних програм на Java, що можуть вбудовуватися у веб-сторінки. Щоправда останні так і не набули значної популярності в інтернеті поступившись іншим аналогічним технологіям як то флеш технологія.

Використання іншими компаніями

Android широко використовує технології Java

Google

При створенні Android (операційної системи з відкритим кодом) Google взяла за основу Java. Не зважаючи на те, що операційна система, збудована на ядрі Linux, була написана переважно на C, Android SDK використовує Java для розробки застосунків для платформи Android.

7 травня 2012 року суд Сан-Франциско виявив, що якщо API може бути захищене авторським правом, то Google, використовуючи Java в Android, порушив авторські права Oracle.[10] Було підняте питання про правовий статус використання Java в Android-пристроях. Однак вже 31 травня того ж року федеральний суддя США постановив, що API не можуть бути захищеними авторським правом.[11]

Графічний інтерфейс користувача

Для реалізації графічного інтерфейсу (GUI) в Java існують два основні пакети класів[12]:

Перевагами першого є простота використання, інтерфейс, подібний до інтерфейсу операційної системи, та дещо краща швидкодія, оскільки базується на засобах ОС, щоправда має обмежений набір графічних елементів. Другий пакет Swing реалізує власний Java-інтерфейс. Цей пакет створювався на основі AWT і має набагато більше можливостей та більшу кількість графічних елементів.[13]. Swing-компоненти ще називають полегшеними (англ. lightweight), оскільки вони написані повністю на Java і тому платформонезалежні.

Існують також сторонні пакети, найпопулярнішим є Standard Widget Toolkit (SWT, вимовляється «ес-дабл-ю-ті») — Стандартний інструментарій віджетів. Розроблений підрозділом Rational фірми IBM і компанією Object Technology International (OTI), зараз розвивається фондом Eclipse.

Див. також

Примітки

  1. https://www.oracle.com/java/
  2. Gosling and McGilton (May 1996). The Java Language Environment. Архів оригіналу за 12 травня 2013. 
  3. J. Gosling, B. Joy, G. Steele, G. Brachda. The Java Language Specification, 2nd Edition. Архів оригіналу за 12 травня 2013. 
  4. http://www.computerworld.com.au/index.php/id;1422447371;pp;3;fp;4194304;fpid;1
  5. Different Isn't Always Better, But Better's Always Different.11:45 30 серпня, 2007 р.
  6. The Java History Timeline. Офіційний сайт www.java.com
  7. 1.2 Design Goals of the JavaTM Programming Language
  8. http://java.sun.com/docs/books/tutorial/getStarted/intro/changemylife.html
  9. Текст ліцензії Microsoft
  10. Mullin, Joe. «Google guilty of infringement in Oracle trial; future legal headaches loom»
  11. Joe Mullin (31.05.2012). «Google wins crucial API ruling, Oracle's case decimated». Ars Technica. 
  12. Графический интерфейс на Java (Swing GUI Tutorial)
  13. Feigenbaum, Barry. SWT, Swing or AWT: Which is right for you? (21.02.2006). Архів оригіналу за 12 травня 2013. Процитовано 2 вересня 2010. 

Література

  • Кей С. Хорстманн (2014). Java SE 8. Вводный курс. «Вільямс». ISBN 978-5-8459-1900-7. 
  • Фрэд Лонг та ін. (2014). Руководство для программиста на Java: 75 рекомендаций по написанию надежных и защищенных программ. «Вільямс». ISBN 978-5-8459-1897-0.  {{cite book}}: Явне використання «та ін.» у: |автор= (довідка)
  • Кей С. Хорстманн, Гари Корнелл (2013). Java. Библиотека профессионала, том 1. Основы. 9-е издание. «Вільямс». ISBN 978-5-8459-1869-7. 
  • Барри Берд (2013). Программирование на Java для чайников, 3-е издание. «Діалектика». ISBN 978-5-8459-1834-5. 
  • Bruce Eckel (2006). Thinking in Java (4th Edition). Prentice Hall PTR. ISBN 978-0131872486. 
  • Joshua Bloch (2008). Effective Java (2nd Edition). Prentice Hall PTR. ISBN 978-0321356680. 
  • James Gosling; Bill Joy, Guy Steele, Gilad Bracha (2005). The Java Language Specification, Third Edition. Addison-Wesley. ISBN 0-321-24678-0. 

Посилання