Java

**Java** (вымаўляецца: Джа́ва) — аб’ектна-арыентаваная мова праграмаваньня, распрацаваная карпарацыяй *[[Sun Microsystems]]* у пачатку 1990-х гадоў. Праграмы, напісаныя на *Java*, звычайна кампілююцца ў байткод, але кампіляцыя ў родны машынны код таксама магчыма. У час выкананьня выкарыстоўваецца *Java* інтэрпрэтатар альбо JIT кампіляцыя ў машынны код.

Мова значна запазычала сынтакс з *[[C (мова праграмаваньня)|C]]* і *[[C++]]*, але мае больш простую аб’ектную мадэль і менш нізкаўзроўневых магчымасьцяў. Скрыптовая мова *[[JavaScript]]* мае падобную назву й сынтакс, але ня мае дачыненьня да *Java*.

## Гісторыя
Мова Java была распрацаваная Джэймсам Ґослінґам у чэрвені 1991 года для ўжываньня ў адным зь ягоных шматлікіх праектаў па распрацоўцы тэлевізійных прыставак. Першапачатковая назва мовы была *Oak*, магчыма таму, што побач з офісам Ґослінґа рос дуб. Некаторы час мова мела назву *Green*, але пасьля была прынята канчатковая назва Java, абраная са сьпісу выпадковых словаў. Мэтай Ґослінґа было стварэньне рэалізацыі віртуальнае машыны й мовы, якая б мела звыклы C/C++ стыль запісу натацыяў. У 1995 годзе зьявілася на сьвет першая агульнадаступная рэалізацыя Java, якая мела вэрсію 1.0. Выхад гэтае вэрсіі абвяшчаў «Write Once, Run Anyware» (Напісаўшы аднойчы, запускай паўсюль) і прадугледжваў бясплатнае працоўнае асяродзьдзе для папулярных плятформаў. Яна была дастаткова бясьпечная, мела наладкі бясьпекі, уключаючы магчымасьць абмяжоўваньня доступу да сеціва й файлаў. Неўзабаве асноўныя браўзэры зрабілі падтрымку запуску бясьпечных Java-аплетаў унутры вэб-старонак. Java хутка сталася папулярнай. З праходам Java 2, новыя вэрсіі мелі розную канфігурацыю для розных тыпаў плятформаў. Для прыкладу, J2EE была створаная для распрацоўкі праграмаў буйнога бізнэсу, а вельмі абрэзаная вэрсія Java Platform, Micro Edition (J2ME) — для мабільных плятформаў. J2SE было абазначэньнем стандартнае вэрсіі. У 2006 годзе ў маркетынгавых мэтах новыя J2-вэрсіі былі перайменаваныя ў *Java EE*, *Java ME* і *Java SE* адпаведна.

У 1997 годзе Sun Microsystems зьвярнулася да органу стандартызацыі ISO/IEC JTC1 і пазьней да Ecma International, каб стандартызаваць Java, але скора дакумэнт быў адкліканы. Java застаецца стандартам de facto i кантралюецца з дапамогай Java Community Process. У свой час, Sun зрабіла ўсе часткі рэалізацыі Java даступнымі без прад’яўленьня прэтэнзіяў да карыстальнікаў, хоць яны й былі ўласьніцкім праграмным забесьпячэньнем. Sun атрымоўвала даход ад Java за кошт продажу ліцэнзіяў для спэцыяльных прадуктаў, такіх як Java Enterprise System. Sun адрозьнівае свае Software Development Kit (SDK) і Runtime Environment (JRE), якая зьяўляецца часткай SDK і ў яе склад не ўваходзяць прылады для распрацоўкі праграмаў на Java.

11 лістапада 2006 году пад ліцэнзіяй GPL былі выпушчаны кампілятар javac і hotspot Java VM (за выключэньнем бібліятэкі клясаў). 13 лістапада 2006 году кампанія Sun Microsystems зрабіла большую частку Java вольным праграмным забесьпячэньнем, выпусьціўшы яе пад ліцэнзіяй GNU General Public License (GPL). 

8 траўня 2007 году Sun Microsystems скончыла працэс адкрыцьця ўсяго галоўнага кода Java. Засталася закрытай невялікая частка кода, на якую Sun ня мела аўтарскіх правоў. Але з дапамогай праекту IcedTea, які вяла з дазволу Sun кампанія Red Hat, у чэрвені 2008 года Java стала цалкам адкрытай. 

### Гісторыя выпускаў
* JDK 1.1.4 *(Sparkler)* 12 верасьня 1997
** JDK 1.1.5 *(Pumpkin)* 3 сьнежня 1997
** JDK 1.1.6 *(Abigail)* 24 красавіка 1998
** JDK 1.1.7 *(Brutus)* 28 верасьня 1998
** JDK 1.1.8 *(Chelsea)* 8 красавіка 1999
* J2SE 1.2 *(Playground)* 4 сьнежня 1998
** J2SE 1.2.1 *(none)* 30 сакавіка 1999
** J2SE 1.2.2 *(Cricket)* 8 ліпеня 1999
* J2SE 1.3 *(Kestrel)* 8 траўня 2000
** J2SE 1.3.1 *(Ladybird)* 17 траўня 2001
* J2SE 1.4.0 *(Merlin)* 13 лютага 2002
** J2SE 1.4.1 *(Hopper)* 16 верасьня 2002
** J2SE 1.4.2 *(Mantis)* 26 жніўня 2003
* J2SE 5.0 (1.5.0) *(Tiger)* 29 верасьня 2004
* Java SE 6 (1.6.0) *(Mustang)* 11 сьнежня 2006
* Java SE 7 (1.7.0) *(Dolphin)* 28 ліпеня 2011
* Java SE 8 (1.8.0) *(Spider)* 18 сакавіка 2014

## Філязофія

### Галоўныя мэты
Галоўныя мэты, якія ставіліся пры распрацоўцы *Java*:

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

Дзеля дасягненьня падтрымкі сеціва й выкананьня аддалёнага коду, *Java*-праграмісты часам карыстуюцца пашырэньнямі накшталт CORBA, Internet Communication Engine альбо OSGi.

## Асаблівасьці

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

### Аўтаматычнае прыбіраньне сьмецьця
Адной з галоўных ідэяў Java была аўтаматычная мадэль кіраваньня памяцьцю. Java-праграміст пазбаўлены неабходнасьці самастойнага кіраваньня памяцьцю. У некаторых іншых мовах праграмаваньня праграміст вымушаны самастойна прызначаць памяць для стварэньня аб’ектаў і разьмяшчэньня іх ў кучы (heap). Пасьля гэтага ён адказны за самастойнае вызваленьне захопленае памяці, калі ў ёй зьнікала неабходнасьць. Калі праграміст забываўся на вызваленьне памяці пасьля таго, як аб’екты зьмешчаныя ў ёй станавіліся непатрэбнымі, адбывалася тое, што называецца працёкам памяці (memory leak). У выніку праграма магла ўжываць неабмежаваную колькасьць даступнае памяці. У дадатак да гэтага, калі праграміст спрабаваў вызваліць адну й тую ж вобласьць памяці некалькі разоў, праграма магла стацца нестабільнай і гэта магло выклікаць яе парушэньне.

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

### [[API]]
Клясы ў API Java арганізаваныя ў асобныя групы, якія маюць назву пакетаў (packages). Кожны пакет утрымлівае набор злучаных інтэрфэйсаў, клясаў ды выключэньняў. Дасягнасьць розных пакетаў API залежыць ад выбранай плятформы:
* Java Platform, Micro Edition (Java ME) — накіраваная на абсталяваньне з абмежаванай вылічальнай магутнасьцю (мабільныя тэлефоны, кішэнныя кампутары і г. д.).
* Java Platform, Standard Edition (Java SE) — накіраваная на настольныя сыстэмы, стварэньне дастасаваньня для канечнага карыстальніка.
* Java Platform, Enterprise Edition (Java EE) — накіраваная на стварэньне дастасаваньня ўзроўню прадпрыемства.

Гэтыя наборы API кантралююцца Sun Microsystems у супольнасці зь іншымі зацікаўленымі суб’ектамі праз праграму Java Community Process. Удзельнікі гэтае праграмы, кампаніі ці індывідуальныя распрацоўшчыкі, могуць удзельнічаць у працэсе распрацоўкі Java API. Аднак гэта сталася прадметам разнагалосьсяў.

## Сынтакс
У адрозьненьне ад мовы C++, якая мае ў сябе сродкі й сынтакс для структурнага, абагульняльнага й аб’ектна-арыентаванага праграмаваньня, *Java* была створаная выключна як аб’ектна-арыентаваная мова. Як вынік, амаль усё зьяўляецца аб’ектамі й увесь код пішацца ўнутры клясаў. Выключэньне складаюць нутраныя тыпы (натуральныя й рэчаісныя лікі, лягічны тып, літары), якія не зьяўляюцца клясамі для забесьпячэньня добрае прадукцыйнасьці.

Аднак трэба зазначыць, што ў *Java* вэрсіі 5.0 зьявіўся працэс аўтапакаваньня (autoboxing) і распакаваньня (auto-unboxing).
* Аўтапакаваньне — гэта працэс аўтаматычнага пераўтварэньня зьвестак простага тыпу ў адпаведныя яму аб’екты.
* Аўтараcпакаваньне — працэс аўтаматычнага выцягваньня значэньня з аб’екта, у які яно ўпакаванае, пры неабходнасьці.

Прыклад:

```java
Integer iOb = 100; // Java аўтаматычна пакуе значэньне тыпу int у аб’ект

int i = iOb; // аб’ект iOb аўтаматычна распакоўваецца ў просты тып
```


### Прыклад праграмы

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


Перад выкарыстаньнем гэтае праграмы яе трэба скампіляваць. Захаваем крынічны код праграмы ў файл, `Hello.java` (імя файла павінна супадаць зь імем клясы). І зараз скампілюем яе ў байт-код:

 $ javac Hello.java

што ў выніку дасьць нам файл `Hello.class`. Гэты файл можна запусьціць на выкананьне:

 $ java Hello
 Hello, World!
 
 $

## Бібліятэкі клясаў
* Java Development Kit (JDK)
* Chemistry Development Kit (CDK)
* Модульная бібліятэка для распазнаньня аўдыё (MARF)
* JDOM

## Крыніцы

## Вонкавыя спасылкі
* Афіцыйная хатняя старонка для карыстальнікаў
* Афіцыйная хатняя старонка для распрацоўшчыкаў на сайце Oracle
* Суполка беларускiх Java-дэвэлапэраў
* Набор анлайн-падручнікаў


Катэгорыя:Зьявіліся ў 1995 годзе