Осем мита за Java

Java е бавна

Това е доста стар мит, но едно време наистина беше вярно. Първоначално виртуалните машини, които управляваха байт кода на Java, бяха несъвършени, а освен това езикът Java и виртуалната машина бяха разработени не за компютри в обичайния им смисъл, а като вид универсална среда за различни устройства, където скоростта на програмите не беше критична и обемите на данните бяха незначителни. Разликата в скоростта на изпълнение на едни и същи задачи между обикновения компилиран код и интерпретирания Java код може да бъде стотици пъти. Но въпреки това, в момента скоростта на работа с байт код на съвременните виртуални машини е само с няколко десетки процента по-ниска от най-добрите компилатори на машинни кодове, а в някои случаи дори ги превъзхожда! Може ли интерпретацията да изпревари компилираната програма? Разбира се, че не. Факт е, че байт кодът на Java вече не се интерпретира от виртуална машина, а се компилира и дори оптимизира, при това динамично, въз основа на данните, събрани от виртуалните машини за изпълнението на програмата. Java е доста добра при тестовете за скорост на пожар, но какво да кажем за реалните приложения? За съжаление нещата не вървят толкова добре с персонализираните приложения. Причината за това е бавната работа на графичните компоненти на системата.

Java програмистите знаят, че езикът има две стандартни характеристики на потребителския интерфейс, AWT и Swing. AWT е специфична за платформата реализация на графичен потребителски интерфейс. Скоростта на повечето от неговите реализации е доста задоволителна, но броят на функциите е много ограничен. Като алтернатива на AWT е разработена библиотеката Swing. Изцяло се базира наезикови възможности, има много функции и е платформено независим, но скоростта на работата му е ниска.

Java е трудна за програмиране

Митът за сложността на програмирането на Java се основава до голяма степен на факта, че стандартната библиотека от класове има многостепенна дървовидна структура и включва огромно разнообразие от обекти и алгоритми за приложения. Но благодарение на стандартните класове създаването и поддръжката на приложения е опростено.

Програмният език Java е изцяло обектно-ориентиран. Синтаксисът му е подобен на C++. В същото време, излишната, генерираща грешки функционалност на C++ (като претоварване на оператори или множествено наследяване) се отхвърля. Вместо множествено наследяване, Java използва много по-простата концепция за интерфейс, тоест конвенция за наименувано извикване за набор от функции. Java използва стриктно въвеждане и няма да позволи неправилно предаване на параметри, освен това е много по-строг от C++ по отношение на небрежността в изходния код и, например, няма да ви позволи да създадете метод с умишлено неизползван кодов раздел. Освен това Java няма да компилира програма с неинициализирана променлива.

Един от основните източници на проблеми при разработването на програми е неправилното използване на динамична памет или по-скоро неправилното освобождаване на предварително заети блокове. Java използва концепцията за събирач на отпадъци. Това означава, че програмистът изобщо не трябва да се притеснява за освобождаването на заетата памет. Самата система ще го добави към свободната памет, когато установи, че вече няма връзки от програмата към този обект.

Java използва фантастичната концепция за изключения, за да сигнализира за грешки. Изключение прави някое специално събитие, което сигнализира за грешка в програмата. Повечето езиципрограмиране (и API), за да сигнализира за грешка, предава резултата от извикването на функцията (добър или лош) на повикващия. В резултат на това кодът за разбор на върнатата стойност се смесва с кода на нормалното изпълнение на програмата, което прави програмите трудни за четене и модифициране. По-важното обаче е, че изключенията не само подобряват четливостта на изходния код, но и не позволяват на повикващия да игнорира грешката. Програмистът трябва или да улови изключението, или да прехвърли отговорността на извикващата функция.

Към горното можем да добавим, че Java има вградена поддръжка за многозадачност. Когато създава многонишкови приложения, програмистът обикновено трябва да използва инструменти на операционната система (семафори, мутекси), за да синхронизира задачите. Java, от друга страна, предлага универсално решение, базирано на конструкциите на самия език.

Обобщавайки, можем да кажем, че по отношение на сложността на програмирането на Java не може да се сравни с C++ или Pascal. Разработени езикови функции, поддръжка за събиране на отпадъци, единна стандартна библиотека от класове, контрол на компилатора, всичко това значително опростява създаването на приложения и ускорява тяхното отстраняване на грешки.

Java работи еднакво навсякъде

Създавате, след като използвате навсякъде (Пишете веднъж, изпълнявайте навсякъде). Втората част от този лозунг на създателите на Java съдържа твърдението, че Java програмата работи по един и същи начин навсякъде. За съжаление в действителност нещата не са толкова прости. Java машини от различни компании на различни платформи НЕ са 100% съвместими една с друга.

Разликите в работата на Java машини на различни платформи съществуват както в изпълнението на многозадачност, така и в работата на прозоречната библиотека (AWT). Сложните Java програми трябва да се изпълняват на различни платформи, за да сте сигурни, че всичко е наред. Най-общо казано,дори на една и съща платформа, но на различни машини, такива програми могат да се изпълняват по различни начини. Например, програмист може да се сблъска със ситуация, в която неговият код се държи различно на многопроцесорна машина, отколкото на еднопроцесорна машина. Специално трябва да се спомене Java машината, създадена от Microsoft (наричана по-долу MS JVM). Нарича се Java не е напълно законно (което беше потвърдено от скорошно съдебно решение). В MS JVM няма да видите поддръжка за RMI или CORBA технологии, но тук можете да използвате ActiveX обекти, технология, която е специфична само за платформата Windows и не съществува никъде другаде. Microsoft разшири стандартната библиотека с класове на Java с типове, които отразяват част от начина, по който работи платформата на Windows.

Не трябва да забравяме и различните скорости на Java машините. Тази разлика може да доведе до неприемливи забавяния на програмата или други проблеми. Изводът от горното е прост: когато създавате Java програми, трябва да ги тествате на широк набор от платформи и да не използвате нестандартни езикови разширения.

Java е език за програмиране

Има мнение, че Java е просто вид език за програмиране. Но това е само заблуда. Да, Java също е език за програмиране. Тази и цял набор от други технологии.

Java е платформа, модерна софтуерна платформа, като цяло се стреми да замени всички функции на операционната система. Може би това ще се случи в близко бъдеще (въпреки че такива опити вече са направени, но неуспешни). Основната силна страна на Java е независимостта на платформата, т.е. независимостта на софтуера, работещ на виртуална машина, от хардуера и операционната система.

Трябва да се отбележи, че има десетки различни езици за програмиране за платформата Java.Някои от тях могат да бъдат компилирани от самия Java компилатор, докато други могат да работят директно с виртуалната машина.

Java по-малката сестра на C++

Езикът за програмиране Java наистина ли произлиза от C++? По-скоро не, отколкото да. Идеята на Sun беше да направи Java по-лесна за изучаване, като направи нейния синтаксис подобен на този на най-широко използвания език за програмиране. Това в крайна сметка трябваше да насърчи и опрости прехода към Java C програмисти. В същото време Java се основава на идеи и механизми, извлечени от редица други системи и езици за програмиране. Вземете поне контрола върху препълването на масива (Паскал). Или фактът, че Java програмите се компилират отделно, класовете се пакетират. Това е вариант на модулно програмиране (както, да речем, Module-2), който се различава от концепцията за независимо компилиране на C++ файлове. Някои нововъведения са взети от езици и системи, неизвестни на широката публика. Например принципът на класовия интерфейс е пренесен от езика Objective C, разработен от NeXT. Механизмът за обработка на изключения е почти изцяло заимстван от Modula-3. Принципите на вътрешното изпълнение на такъв важен компонент на езика Java като събиране на боклук са извлечени предимно от Lisp. Някои нормални езици, като Eiffel, Modula-3, Oberon, също първоначално са имали този механизъм.

Обобщавайки горното, можем да заключим, че Java е усвоила голям брой идеи и подходи от различни системи за програмиране, включително синтаксиса на езика C++.

Java е добра само за аплети и уеб

Java е неразривно свързана с аплетите. Всъщност аплетите са неразделна част както от езика, така и от платформата Javaобщо взето. Освен това създаването им е успешен маркетингов ход на Sun. Без аплети светът нямаше да научи за Java толкова бързо.