**Java** — сямейства праграмных прадуктаў і спецыфікацый ад кампаніі Sun Microsystems, якія разам складаюць праграмную платформу для распрацоўкі прыкладнога праграмнага забеспячэння і разгортвання яго ў кросплатформавым асяроддзі. Розныя рэалізацыі платформы Java дазваляюць ствараць праграмнае забеспячэнне для прылад шырокага спектра складанасці: ад убудаваных прылад і мабільных тэлефонаў да сервераў і суперкамп'ютараў. Найбольшае распаўсюджанне Java атрымала ў распрацоўцы праграмных сродкаў для абслугоўвання патрэб вялікіх прадпрыемстваў, у мабільных і серверных вэб-тэхналогіях, радзей Java выкарыстоўваецца на настольных камп'ютарах.
Java не выкарыстоўвае такія нізкаўзроўневыя канструкцыі, як указальнікі, праца з памяццю аблегчана тым, што ўсе аб'екты — гэта спасылковыя тыпы, экзэмпляры якіх размяшчаюцца ў кучы. За кіраванне выкарыстоўвання памяці адказвае віртуальная машына Java з дапамогай аўтаматызаванага зборшчыка смецця.

Платформа
---------

Згодна з канцэпцыяй «напісана адзін раз, працуе ўсюды», праграма напісаная для платформы Java кампілюецца не ў машынны код, а ў байт-код, асяроддзем выканання для якога з'яўляецца Java Runtime Environment(JRE). Віртуальная машына Java (JVM) — частка JRE — інтэрпрэтуе байт-код у машынныя інструкцыі, спецыфічныя для той апаратнай і праграмнай платформы, для якой рэалізавана дадзеная версія JRE. Такім чынам дасягаецца кросплатформавасць праграмнага забеспячэння, напісанага для Java.

* Java Card: тэхналогія, якая дазваляе запускаць у асяроддзі павышанай бяспекі Java-праекты на смарт-картах і іншых прыладах, якія максімальна абмежаваны ў памяці і выканаўчых магчымасцях
* Java ME: набор тэхналогій і спецыфікацый, прызначаных для невялікіх прылад, якія абмежаваны ў памяці, спажыванні энергіі, маюць невялікі дысплэй. З цягам часу былі вылучаны дзве галіны гэтай платформы: Connected Limited Device Configuration (CLDC) з асаблівай увагай на невялікія мабільныя тэлефоны і Connected Device Configuration (СDС) для прылад, якія не так моцна абмежаваны ў рэсурсах і маюць пашыраныя магчымасці, напрыклад, смартфоны.
* Java SE: базавая платформа, якая можа быць выкарыстана і на ўсталяваных прыладах, і на хатніх кампьютарах, і на вялікіх серверах
* Java EE: платформа, якая прапануе шырокі функцыянал, неабходны для пабудовы масштабуемых праграмных прадуктаў, якія забяспечваюць вэб патрэбы і патрэбы вялікіх прадпрыемстваў, як сервернае ПЗ

### Java Virtual Machine

Канцэпцыя віртуальнай машыны Java ляжыць у аснове ўсёй Java-платформы. Java-праграмы кампілююцца ў байт-код аднолькавы для ўсіх апаратных асяроддзяў, бо інтэрпрэтатарам кода з'яўляецца JVM. Першапачаткова JVM проста правярала на бяспеку і выконвала байт-код, які на ёй запускаецца, але, пачынаючы з версіі 1.2, якая выйшла ў 1998 годзе, кампанія Sun выпускае віртуальныя машыны Java, у склад якіх уключан кампілятар часу выканання (just-in-time альбо JIT compiler). Гэта тэхналогія дазваляе пад час выканання аналізаваць уваходны байт-код. Часткі праграмы, якія паўтараюцца, JIT кампілятар перапрацоўвае ў апаратныя інструкцыі спецыфічныя для дадзенай аперацыйнай сістэмы і працэсара. JIT-кампіляцыя значна паскарае працэс інтэпрытацыі, бо скампіляваны код будзе выконвацца так жа хутка, як і код спецыфічны для канкрэтнай сістэмы выканання.

Java Virtual Machine дазваляе пісаць праграмныя прадукты, якія не залежаць ад платформы, але сама JVM кросплатформавай не з'яўляецца, і кожнае асяроддзе выканання мае сваю асабістую віртуальную машыну.

У 1996 годзе кампанія Sun выпусціла першую версію спецыфікацыі Java-машыны, вядомую пад назвай «Блакітная кніга». Гэтая спецыфікацыя дэ-факта стала стандартам платформы Java і дазволіла стварыць мноства альтэрнатыўных рэалізацый JVM. Зыходны код на мове C адной з мінімальных рэалізацый віртуальнай машыны Java (Kilo Virtual Machine) прадстаўлены на афіцыйным сайце кампаніі Sun (такая Java-машына звычайна выкарыстоўваецца ў мабільных прыладах у складзе платформы Java ME)

### API платформы Java

Большасць сучасных аперацыйных сістэм палягчаюць працу праграмістаў шляхам прапановы дынамічна звязаных бібліятэк, у якіх ужо рэалізаваны найбольш запатрабаваны функцыянал. Бібліятэкі і сігнатуры іх метадаў складаюць інтэрфейс прыкладнога праграмавання (API). Цалкам зразумела, што API розных аперацыйных сістэм будуць адрознівацца адно ад аднаго і іх прамое выкарыстанне прывяло б да залежнасці Java ад той ці іншай платформы

Па гэтай прычыне асяроддзе выканання Java (JRE) уключае ў сябе, разам з віртуальнай машынай, яшчэ і свой асабісты API. Можна вылучыць тры асноўныя задачы, якія яно вырашае. Па-першае, гэта рэалізацыя каранёвых класаў, ад якіх наследуюцца ўсе астатнія (Object, Class, Enum, Exception, Thread...), а таксама рэалізацыя трывіальных праблем праграмавання, такіх як вылічэнне матэматычных функцый, праца з «доўгімі» лічбамі, сарціроўка масіваў і іншае. Па-другое, API Java высока абстрагуе задачы вельмі спецыфічныя для кожнай платформы. Напрыклад сістэмы ўвода-вывада, праца з сеткай і сеткавымі пратаколамі, выкарыстоўванне далучаных прылад. І па-трэцяе, калі ніжэйляжачая платформа не падтрымлівае тэхналогію, якую прадугледжвае Java, наўпрост, то сістэма павінна працягваць каррэктную працу, вынік якой павінен як мага менш адрознівацца ад сістэмы к сістэме

Кампаніяй Sun рэалізаваны тры асноўныя Java-платформы, якія, з пункту гледжання праграмавання, будуць адрозніваюцца сваім API. Базавай для трох платформай з'яўляецца Java SE (стандартнае выданне), на яе аснове пабудаваны Java EE (карпрацыйнае выданне) і Java ME (мікра выданне). Таксама ёсць і іншыя вельмі важныя платформы ці тэхналогіі (Java Card, JavaFX, JavaDB і інш.), API якіх накіравана на вырашэнне спецыфічных праблем сваёй галіны выкарыстання.

Платформа Java дазваляе выкарыстоўваць староннія бібліятэкі не толькі ў сваёй функцыянальнай частцы, але і ў рэалізацыі серады выканання. Усё, што праграмнаму забеспячэнню для гэтага патрэбна - прайсці серыю тэстаў кампаніі Sun на сумяшчальнасць з платформай.

### Мовы праграмавання

Першапачаткова на платформе Java працавала толькі адна мова праграмавання створаная для яе і названая ў яе гонар, але для віртуальнай машыны няма аніякай розніцы, на якой мове была першапачаткова напісана праграма - галоўнае, каб яна была скампілявана ў карэктны байт-код. Таму нарастаючая папулярнасць платформы прывяла да стварэння Java-кампілятараў для ўжо існуючых моў праграмавання, узнікнення крыху змененых моў праграмавання для лепшага ўжывання магчымасцей платформы, а таксама да стварэння новых моў, якія знаходзяць сваё выкарыстанне ў розных сферах праграмавання

| Мова | Java-версія |
| --- | --- |
| Ada | JGNAT |
| AWK | Jawk |
| BBx | BBj |
| C | C to Java Virtual Machine compilers |
| Cobol | Micro Focus JVM Visual COBOL Архівавана 1 чэрвеня 2011.Veryant isCobol |
| ColdFusion | ColdFusionRailoOpen BlueDragon |
| Common Lisp | Armed Bear Common LispCLforJavaJatha (Common LISP) |
| Component Pascal | Gardens Point Component Pascal |
| Erlang | Erjang |
| Forth | myForth |
| JavaScript | Rhino |
| LOGO | jLogoXLogo |
| Lua | KahluaLuajJill |
| Oberon-2 | Canterbury Oberon-2 for JVM |
| Objective Caml (OCaml) | OCaml-Java |
| Pascal | Canterbury Pascal for JVMMIDletPascal |
| PHP | IBM WebSphere sMash PHP (P8)
Caucho Quercus |
| Python | Jython |
| Rexx | IBM NetRexx |
| Ruby | JRuby |
| Scheme | BiglooKawaSISCJScheme |
| Tcl | JaclJTcl |

### Java і .NET Framework

Платформа .NET Framework лічыцца адказам карпарацыі Microsoft на ўзрослую к канцу 90-х папулярнасць Java. Калі існаванне прамежкавага байт-кода ў Java было першапачаткова накіравана на падтрымку кросплатформавай канцэпцыі, то .NET Framework выкарыстоўвае CLI (агульная прамежкавая мова) для падтрымкі адной платформай адразу некалькіх моў праграмавання (клас мовы C# наследаваны ад класа Visual Basic.NET, к прыкладу, павінен быў стаць нармальнай практыкай). CLI - мова праграмавання зразумелая чалавеку, яе можна разглядаць як мову асэмблера для віртуальнай машыны .NET. Гэта палягчае задачу дэкампіляцыі, што можа быць выкарастана як у карысных мэтах, так і для раскрыцця камерцыйнай тайны.

Платформа .NET, распрацоўкай якой займаецца Microsoft, не з'яўляецца кросплатформавай або значна звужае функцыянал пры пераходзе на іншыя аперацыйныя сістэмы. Аднак існуе праект Mono, які займаецца распрацоўкай ліцэнзаванай Microsoft кросплатформавай версіяй .NET Framework, а таксама не ліцэнзаванымі кросплатформавымі версіямі WinForms, ADO.NET і ASP.NET

Visual J#, створаная для пераходу Java-праграмістаў на платформу.NET, не была сумяшчальнай са спецыфікацыяй Java і, з прычыны нізкай папулярнасці, цалкам перастала падтрымлівацца платформай у 2015 годзе.

### Java Development Kit

JDK - камплект распрацоўшчыка Java, створаны карпарацыяй Sun для патрэб праграмістаў. У яго склад уваходзіць кампілятар (javac), стандартны набор бібліятэк платформы, выканаўчае асяроддзе Java (JRE), а таксама дакументацыя, прыклады і больш за дваццаць утыліт, такіх як загрузчык праграм, адладчык, прагляднік аплетаў і інш. Усе сучасныя інтэграваныя асяроддзі распрацоўкі выкарыстоўваюць JDK для сваёй працы, таму патрабуюць каб JDK быў перадусталёваны, або пастаўляюцца разам з ім.

Большая частка кода JDK выйшла 8 мая 2007 года пад адкрытым ліцэнзійным пагадненнем GNU.

### Гісторыя версій

Гэта, натуральна, не поўны спіс тэхналогій, якія былі дадзены ў кожнай з версій Java

JDK 1.0  

23 студзеня 1996 года  

Першая версія Java, стабільная версія 1.0.2 атрымала назву Java 1

JDK 1.1  

19 лютага 1997 года  

Перагледжана мадэль апрацоўкі падзей у AWT. Дадана магчымасць стварэння ўключаных класаў. Рэалізованы тэхналогіі JDBC i RMI (падключэнне да баз дадзеных і выдалены выклік метадаў адпаведна)

J2SE 1.2  

8 снежня 1998 года  

Пачынаючы з гэтай версіі, Java выходзіць пакетамі J2SE, J2EE, J2ME, дзе "2" сімвалізуе другое пакаленне платформы  
 
Выкарыстоўванне strictfp-класаў і метадаў дазволіла зрабіць рэзультаты аперацый з плаваючай коскай незалежнымі ад абранага працэсара. У JVM убудованы кампілятар часу выканання. Дададзены бібліятэкі для працы са стандартнымі калекцыямі дадзеных. Грунтоўна перагледжаны клас Thread (метады suspend(), stop() і resume(), да прыкладу, з тых пор лічацца састарэлымі)

J2SE 1.3  

8 мая 2000 года  

З гэтага часу выкарыстоўваецца віртуальная машына HotSpot, якая кампілюе толькі кавалкі коду, якія будуць выкарыстоўвацца часцей за іншыя (Hot Spot - гарачыя месцы, у перакладзе)

J2SE 1.4  

6 лютага 2002 года  
 
Новая канцэпцыя ланцуговых выключэнняў дазволіла захоўваць сістэмную інфармацыю часу ўзнікнення выключнай сітуацыі падчас перадачы выключэння па іерархіі вызываў. Даданы сінтаксічны аналізатар XML і падтрымка IPv6

J2SE 5  

30 верасня 2004 года  
 
Даданы пераличэнні, цыкл for у стыле foreach, пераменныя зменнай колькасці. Рэалізавана аўтаабгортка скалярных тыпаў дадзеных, і ўведзены родавыя функцыі і класы

Java SE 6  

11 снежня 2006 года  

Асноўныя намаганні накіраваны на павелічэнне хуткадзейнасці праз змены ў рэалізацыі каранёвых бібліятэк, кампілятара і зборшчыка смецця

Java SE 7  

28 ліпеня 2011 года  

Падтрымка дынамічных моў вядзецца праз так званую шматмоўную віртуальную машыну ("машына Да Винчы" ад Sun). Даданы такія сінтаксічныя паляпшэнні як аўтавызначэнне тыпа пры стварэнні аб'ектаў родавых класаў, кіраванне рэсурсамі ў try-блоках і выкарстоўванне радковых тыпаў у switch-блоках

Выданне Java SE 8 анансавана на сакавік 2014 года

Выкарыстанне
------------

### Выкарыстанне на персанальных камп'ютарах

Паводле Sun, JRE выкарыстоўваецца зараз болей чым на 700 мільёнах персанальных камп’ютараў. Найбольшую папулярнасць набылі такія праграмныя прадукты створаныя з дапамогай Java як інтэграваныя асяроддзі праграмавання NetBeans і Eclipse, файлаабменныя праграмы LimeWire, Vuze. MATLAB і праграма для сумеснай працы Lotus Notes таксама выкарыстоўваюць Java.

Microsoft не пастаўляе JRE у камплекце з Windows з таго часу як кампанія Sun падала на Microsoft судовыя пазовы. Судовыя пазовы былі звязаны з тым, што Microsoft дадавала ў сваё асяроддзе выканання Java класы, якія працавалі выключна на Windows. Асяроддзе выканання Java пастаўляецца з Mac OS X (пазначаецца як састарэлае пачынаючы з версіі 10.6.3 сакавіка 2010 года, таму можа быць не ўключана ў будучыя версіі), шмат якія дыстрыбутывы Linux уключаюць у сабе свабодныя рэалізацыі Java: GNU classpath, IcedTea

### Мабільныя прылады

Платформа Java ME набыла вялікую папулярнасць у галіне выкарыстання на мабільных прыладах, дзе яна паспяхова канкуруе з Symbian, BREW і .NET Compact Framework.

Шырокая разнастайнасць вытворцаў мабільных тэлефонаў прывяла да патрэбы распрацоўкі адзіных стандартаў, гэтым стандартам у 2000 годзе стал MIDP — профіль мабільнай прылады з інфармацыйнымі функцыямі. Стандарт, распрацаваны ў межах Java Community Process, вызначаў паняцце "мідлет" - кампактная праграма на мове Java.

MIDP1 вызначаў прыладу з невялікім дысплэем, без доступу да аўдыя і абмежаваннем на памеры праграмы ў 32 кБ. MIDP2 ужо дазваляў выкарыстоўваць аўдыя і павялічыў максімальны памер праграмы да 64kB. Некаторыя вытворцы, дзякуючы пашыраным магчымасцям сваіх мабільных прылад паслабляюць гэтыя абмежаванні, напрыклад, каб дазволіць запуск мідлетаў большых памераў.

Аперацыйная сістэма Android выкарыстоўвае толькі мову праграмавання Java, бібліятэкі і віртуальная машына для падтрымкі мовы асабістыя і не маюць непасрэднага дачынення да платформы Java.

### Карпарацыйнае і сэрвернае выкарыстанне

Java стала асновай IT-распрацоўкі ў галіне карпарацыйнага выкарыстання, гэта было дасягнута дзвюмя шляхамі

1. Магчымасць Java паспяхова працаваць на вэб-серверах дазволіла ёй стаць вядучай платформай для сувязі інфармацыйных сістэм прадпрыемстваў з інтэрнэтам. Выкарыстоўваючы тэхналогіі Java, камерцыйныя арганізацыі змаглі перанесці частку сваіх паслуг у інтэрнэт (банкавыя паслугі ў сістэме рэальнага часу, заказ білетаў праз інтэрнэт)
2. Java стала стандартам у распрацоўцы праграмнага забеспячэння, якое выкарыстоўваецца вялікімі прадпрыемствамі. Да гэтай катэгорыі адносяцца вэб-сервера, серверныя праграмы, базы даных, сістэмы кіравання бізнес-працэсамі і сістэмы кіравання зместам

Крытыка
-------

### Generic-класы

Generic або родавыя класы і функцыі былі ўведзены ў мову Java у версіі J2SE 5.0, але гэта было дадаткам да мовы праграмавання, у той час як у платформе не было зроблена змяненняў для падтрымкі дадзенай магчымасці. Кампанія Sun абгрунтавала гэта тым, што так будзе дасягнута зваротная сумяшчальнасць з бібліятэкамі і праграмнымі прадуктамі напісанымі раней. Але такой падыход запатрабаваў ад распрацоўшчыкаў выкарыстаць метад, пры якім інфармацыя аб тыпе аб'екта родавага класа губляецца пад час выканання, застаўляючы толькі інфармацыю аб інтэрфейсе. Гэта не дазваляе джава-распрацоўшчыкам выкарыстоўваць зручныя падыходы даступныя на платформах-канкурэнтах. Напрыклад, аперацыі ніжэй немагчымы ў мове праграмавання Java:

```
public class MyClass<E> {
    public static void myMethod(Object item) {
        if (item instanceof E) {  //Памылка на этапе кампіляцыі
         ...
        }
        E item2 = new E();   //Памылка на этапе кампіляцыі
        E[] iArray = new E[10]; //Памылка на этапе кампіляцыі
    }
}
```

### Хуткадзейнасць

На пачатку свайго існавання Java сутыкалася з небезгрунтоўнай крытыкай хуткадзейнасці праграм напісаных на ёй: яна не ішла ні ў якія параўнанні з вынікамі для кампілюемых моў праграмавання. Вялікім крокам у выпраўленні такога становішча быў пераход да выкарыстання віртуальнай машыны Java HotSpot, які адбыўся ў версіі 1.3 (2000 год). На 2011 год Java паказвае лепшыя вынікі прадукцыйнасці ў сваім класе платформ з кампіляцыяй пад час выканання, у разы выйграе ў інтэрпрытуемых моў праграмавання і скарачае адставанне ад моў C\C++ 

JIT-кампіляцыя, якая з'явілася ў версіі 1.1 дазваляе кампіляваць байт-код пад час выканання і такім чынам у разы павысіць хуткадзейнасць, але гэта ў сваю чаргу вядзе да вялікіх часовых затрат падчас загрузкі праграмы. Натуральна, што быў абраны падыход пры якім кампілююцца толькі найбольш ужываныя часткі кода, і, пасля паўзы пры запуску, прадукцыйнасць Java-праграмы становіцца параўнальнай з машынным кодам

### Бяспека

Даследаванні праведзеныя кампаніяй Microsoft у 2010 годзе паказалі, што Java стала прычынай большасці атак на такой шырокавыкарыстоўваемы праграмны прадукт як Adobe Reader. Атакі праводзіліся з выкарыстаннем шырокавядомых дзір у бяспецы Java-машыны, і яны былі б немагчымы пры ўсталяваных абнаўленнях, але Java усталявана на такім мностве машын, што вялікая колькасць карыстальнікаў проста не ведае, што абнаўленні патрэбны або не ведае, як іх праводзіць. З іншага боку, карпаратыўныя карыстальнікі свядома адцягваюць момант абнаўлення свайго праграмнага забеспячэння.

Зноскі
------

1. ↑  Jawk source forge project
2. ↑  see for example AMPC project
3. ↑  ABCL project
4. ↑
5. ↑  myForth project
6. ↑  JavaLogo project
7. ↑  XLogo project **(нявызн.)**(недаступная спасылка). Архівавана з першакрыніцы 8 жніўня 2013. Праверана 19 жніўня 2011.
8. ↑  Kahlua project
9. ↑  Luaj
10. ↑  Jill
11. ↑  OCaml-Java project
12. ↑  IBM WebSphere sMash PHP project Архівавана 22 ліпеня 2018.
13. ↑  Caucho Quercus project
14. ↑  JTcl
15. ↑  Type Erasure **(нявызн.)**.
16. ↑  Generics in Java **(нявызн.)**.  Object Computing, Inc.. Праверана 9 снежня 2006.
17. ↑  What's Wrong With Java: Type Erasure **(нявызн.)**(недаступная спасылка) (6 снежня 2006). Архівавана з першакрыніцы 3 верасня 2012. Праверана 9 снежня 2006.
18. ↑  Кампанія Sun аб Java HotSpot **(нявызн.)**.  shootout.alioth.debian.org. Праверана 25 студзеня 2012.
19. ↑  Computer Language Benchmarks Game **(нявызн.)**(недаступная спасылка).  shootout.alioth.debian.org. Архівавана з першакрыніцы 21 чэрвеня 2011. Праверана 2 June 20111.
20. ↑  Researchers Highlight Recent Uptick in Java Security Exploits **(нявызн.)**. Праверана 17 лютага 2012.