Вісім міфів про Java, Java, Програмування, статті

Владислав Кравченко, Григорій Григоренко

Java повільно працює

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

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

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

По тестах на “скорострільність” Java вельми непогана, але як же йдуть справи з реальними додатками? На жаль, з користувацькими додатками справи йдуть не так вже й добре. Причина тому – повільна робота графічних компонентів системи.

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

На Java складно програмувати

Міф про складність програмування на Java заснований більшою частиною на те, що стандартна бібліотека класів має багаторівневу деревоподібну структуру і включає величезну кількість різноманітних об’єктів і прикладних алгоритмів. Але саме завдяки стандартним класам спрощується створення та підтримка додатків.

Мова програмування Java є повністю об’єктно-орієнтованим. За синтаксису він схожий на Сі + +. При цьому надлишковий, що приводить до помилок функціонал Сі + + (такий, як перевантаження операторів або множинне спадкування) відкинутий.

Замість множинного успадкування в Java застосовується набагато простіша концепція “інтерфейсу”, т. е. іменованого угоди про виклики набору функцій. Java використовує строгу типізацію і не допустить невірної передачі параметра, до того ж вона набагато суворіше Сі + + відноситься до недбалостей у вихідному коді і, наприклад, не дозволить створити метод зі свідомо невживаних ділянкою коду. Також Java не відкомпілює програму з неініціалізованої змінної.

Один з головних джерел проблем при розробці програм – Неправильне використання динамічної пам’яті, а точніше, некоректне звільнення зайнятих раніше блоків. Java використовує концепцію “збирача сміття”. Це означає, що програмісту абсолютно не потрібно піклуватися про звільнення зайнятої ділянки пам’яті. Система сама додасть його до вільної пам’яті, коли виявить, що посилань з програми на даний об’єкт вже немає.

Для сигналізації про помилки Java вдається до модної концепції “виключень”. Виняток – це якесь спеціальне подія, яка сигналізує про помилку в програмі. Більшість мов програмування (і API) для сигналізації про помилку передають викликає результат виклику функції (“Погано” або “добре”). Код аналізу повернутого значення в результаті виявляється перемішаним з кодом нормального виконання програми, це ускладнює читання програм і їх модифікацію.

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

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

Резюмуючи, можна сказати, що за складністю програмування Java і в порівняння не йде з Сі + + або Паскалем. Розвинені можливості мови, підтримка “збору сміття”, єдина стандартна бібліотека класів, контроль з боку компілятора – все це помітно спрощує створення додатків і прискорює їх налагодження.

Java працює скрізь однаково

“Створюєш один раз – використовуєш де завгодно” (“Write once – run anywhere “). Друга частина цього гасла творців Java містить твердження, що Java-програма працює скрізь однаково. На жаль, насправді все не так просто. Java-машини різних компаній на різних платформах НЕ стовідсотково сумісні один з одним.

Відмінності в роботі 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 – молодша сестра Сі + +

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

У той же час в Java закладені ідеї і механізми, почерпнуті з ряду інших систем і мов програмування. Взяти хоча б контроль виходу за кордон масиву (Паскаль). Або той факт, що компіляція Java-програм є роздільною, класи розбиті по пакетах. Це є одним з варіантів модульного програмування (як, скажімо, в Модулі-2), що відрізняється від концепції незалежної компіляції файлів Сі + +.

Деякі новації були взяті з невідомих широкій публіці мов і систем.

Наприклад, принцип інтерфейсу класів перенесено з мови Objective C, розробленого компанією NeXT. Механізм обробки виняткових ситуацій майже повністю запозичений з Модуль-3. Засади внутрішньої реалізації такої важливої складової мови Java, як “збірка сміття”, почерпнуті перш за все з Ліспу. Частина “нормальних” мов, таких, як Ейфель, Модула-3, Оберон, також спочатку мала цим механізмом.

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

Мова Java придатний тільки для аплетів та Інтернету

Java нерозривно пов’язують з аплетів. І дійсно, аплети – невід’ємна частина як мови, так і платформи Java в цілому. До того ж їх створення – вдалий маркетинговий крок Sun. Без аплетов світ про Java не дізнався б так швидко.

Ідея вбудованих додатків в гіпертекстові документи (HTML) не так вже й нова. Багато фірм намагалися просунути свої технології на цей сектор ринку, але в даний час конкурентів у Java тут небагато. На сьогодні це, мабуть, JavaScript, ActiveX і технологія Flash. Дві останні, правда, працюють тільки під керуванням Windows.

Що приваблює в Java програмістів? Потужна модель безпеки, єдиний код для всіх платформ, широкі можливості для використання готових бібліотек, простота програмування. Насправді все не так райдужно, як хотілося б. Модель безпеки, безумовно, не погана, але її реалізації, виконані тими чи іншими виробниками, розрізняються. У результаті код, прекрасно працює під управлінням одного браузера, не працює під управлінням іншого.

Ну, якщо в браузерах Java є, то як йдуть справи з додатками, які виконуються без браузера, а під управлінням віртуальної машини прямо в операційній системі? Тут ситуація схожа, в кожній сучасній ОС вже встановлена ​​якась версія JVM. І користувачі здатні виконувати з її допомогою наявні у них програми для JVM, хоча більшість навіть не підозрює про таку можливість.

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

А якщо сюди додати ще й клієнтські програми або навіть аплети, то виходить повний комплект для автоматизації.

Платформа Java – це не тільки аплети. Вона застосовується повсюдно, починаючи від клієнта і закінчуючи сервером. А якщо пригадати, що Java використовується не тільки на ЕОМ, а й в стільникових телефонах, побутовій техніці і смарт-картках, то створюється враження, що вона проникла вже у всі сектори ринку, де хоч якось можливе застосування програмування.

Java – ідеал, вона не потребує поліпшень

Java була створена в 1994-1995 рр.. До цього моменту інформаційні технології отримали інтенсивний розвиток як за рахунок “персоналізації” комп’ютерів, так і частково за рахунок поширення Інтернету. Автори Java постаралися втілити в ній всі досягнення інформаційної індустрії, але ідеал, як відомо, недосяжний. Дещо все-таки залишилося за бортом, в тому числі перевірка умов правильності виконання програми, “Програмування за контрактом”, шаблони та ін

У Сі + + існує засіб перевірки умов, зване asset. Ця функція перевіряє деякий умова, що задається програмістом, на “істину”. Якщо умова “помилково”, asset зупиняє програму і вказує, що допустимі умови роботи порушені, при цьому компілятор при створенні кінцевої версії програми виклики asset відкидає. У Java подібної можливості не існує. Зрозуміло, можна використовувати перевірку умов і генерацію винятків на їх основі, але в результаті всі ці перевірки потраплять у виконуваний код програми.

Існує більш потужна технологія, ніж asset. Це Design By Contract, “програмування за контрактом”, що дозволяє спростити створення великих додатків, які використовують раніше створений код. Java ж не підтримує і “Програмування за контрактом”.

Шаблони класів в Сі + + – це можливість генерації коду “Під” вказаний користувачем клас (насправді розробники Java цілком усвідомлено відмовилися від шаблонів, вважаючи, що від них більше проблем, ніж користі. – Прим. ред.). Колекція об’єктів, реалізована за допомогою шаблону, буде компілюватися кожен раз для кожного типу об’єктів, зберігається в цій колекції. Типова колекція об’єктів в Java зберігає екземпляри класу Object, предка всіх Java-класів.

Програміст, витягуючи об’єкти з колекції, змушений використовувати приведення типу, щоб скористатися своїм “Робочим” класом. Таке додаток працює чудово до тих пір, поки інший програміст випадково не додасть в колекцію примірник зовсім іншого класу. Тоді на етапі компіляції помилки не виникає, але вона відбувається пізніше, при витяганні примірника і спробі приведення його до невірного типу.

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

Java коштує купу грошей

Чи справді технологія Java є дорогою? Все залежить від складності розроблюваного програмного забезпечення. Скажімо, для невеликого програми (від одного до трьох людино-місяців) Java може не коштувати взагалі нічого. Безумовно, абсолютно безкоштовною ця технологія не є. Кваліфікований Java-програміст коштує грошей.

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

Схожі статті:


Сподобалася стаття? Ви можете залишити відгук або підписатися на RSS , щоб автоматично отримувати інформацію про нові статтях.

Коментарів поки що немає.

Ваш отзыв

Поділ на параграфи відбувається автоматично, адреса електронної пошти ніколи не буде опублікований, допустимий HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

*

*