Ноу Інти, лекція, що таке java історія створення
платформа Java
Отже, Java має довгу і непростою історією розвитку, проте настав час розглянути, що ж вийшло у творців, якими властивостями володіє дана технологія.
Саме широко відоме, і в той же час викликає самі бурхливі суперечки, властивість - багато- або кроссплатформенность. Уже говорилося, що воно досягається за рахунок використання віртуальної машини JVM. яка є звичайною програмою, що виконується операційною системою і надає Java-додатків всі необхідні можливості. Оскільки всі параметри JVM специфіковані, то залишається єдине завдання - реалізувати віртуальні машини на всіх існуючих і використовуваних платформах.
Наявність віртуальної машини визначає багато властивостей Java. проте зараз зупинимося на наступному питанні - є Java мовою компільовані або інтерпретується? Насправді, використовуються обидва підходи.
Багато розробники спочатку жорстко критикували сміливий гасло Sun "Write once, run everywhere", виявляючи все більше і більше невідповідностей і нестиковок на різних платформах. Однак треба визнати, що вони просто були занадто нетерплячі. Java тільки з'явилася на світ, а перші версії специфікацій були недостатньо вичерпними.
Детальний розгляд об'єктної моделі Java проводиться протягом усього курсу, однак позначимо основні особливості. Перш за все, творці відмовилися від множинного спадкоємства. Було вирішено, що воно занадто ускладнює і заплутує програми. У мові використовується альтернативний підхід - спеціальний тип "інтерфейс". Він докладно розглядається у відповідній лекції.
Далі, в Java застосовується сувора типізація. Це означає, що будь-яка змінна і будь-який вираз має тип, відомий вже на момент компіляції. Такий підхід застосований для спрощення виявлення проблем, адже компілятор відразу повідомляє про помилки і вказує їх розташування в коді. Пошук же виняткових ситуацій (exceptions - так в Java називаються некоректні ситуації) під час виконання програми (runtime) зажадає складного тестування, при цьому причина дефекту може виявитися зовсім в іншому класі. Таким чином, потрібно докладати додаткові зусилля при написанні коду, зате істотно підвищується його надійність (а це одна з основних цілей, для яких і створювався новий мову).
В Java існує всього 8 типів даних, які не є об'єктами. Вони були визначені з найпершої версії і ніколи не змінювалися. Це п'ять цілочисельних типів: byte, short, int, long, а також до них відносять символьний char. Потім два дрібних типу float і double і, нарешті, булевский тип boolean. Такі типи називаються простими, або примітивними (від англійського primitive), і вони детально розглядаються в лекції, присвяченій типам даних. Всі інші типи - об'єктні або посилальні (англ. Reference).
Синтаксис Java чомусь багатьох ввів в оману. Він дійсно створений на основі синтаксису мов C / C ++, так що якщо подивитися на вихідний код програм, написаних на цих мовах і на Java, то не відразу вдається зрозуміти, яка з них якою мовою написана. Це чомусь дало багатьом привід думати, що Java - це спрощений C ++ з додатковими можливостями, такими як garbage collector. Автоматичний збирач сміття (garbage collector) ми розглянемо трохи нижче, але вважати, що Java такий же мова, як і C ++, - велика помилка.
Але, як вже говорилося, С ++ принципово не годився для нових завдань, які поставили собі розробники з компанії Sun, тому модель Java була побудована заново, причому відповідно до зовсім іншими цілями. Подальші лекції будуть поступово розкривати конкретні відмінності.
Що ж стосується об'єктної моделі, то вона скоріше була побудована за зразком таких мов, як Smalltalk від IBM, або розроблений ще в 60-і роки в Норвезькому Обчислювальному Центрі мову Simula, на який посилається сам творець Java Джеймс Гослінг.
В Java з самого початку був введений механізм автоматичного складання сміття (від англійського garbage collector). Припустимо, програма створює певний об'єкт, працює з ним, а далі настає момент, коли він більше вже не потрібен. Необхідно звільнити займану пам'ять, щоб не заважати операційній системі нормально функціонувати. В С / С ++ це необхідно робити явно з програми. Очевидно, що при такому підході існує дві небезпеки - або видалити об'єкт, який ще комусь потрібен (і якщо до нього дійсно станеться звернення, то виникне помилка), або не видаляти об'єкт, який став непотрібним, а це означає витік пам'яті, тобто програма починає споживати все більшу кількість оперативної пам'яті.
При розробці на Java програміст взагалі не думає про звільнення пам'яті. Віртуальна машина сама підраховує кількість посилань на кожен об'єкт, і якщо воно стає рівним нулю, то такий об'єкт позначається для обробки garbage collector. Таким чином, програміст повинен стежити лише за тим, щоб не залишалося посилань на непотрібні об'єкти. Складальник сміття - це фоновий потік виконання, який регулярно переглядає існуючі об'єкти і видаляє вже не потрібні. З програми ніяк не можна вплинути на роботу garbage collector. можна тільки явно ініціювати його черговий прохід за допомогою стандартної функції. Ясно, що це істотно спрощує розробку програм, особливо для початківців програмістів.
Однак досвідчені розробники були незадоволені тим, що вони не можуть повністю контролювати все, що відбувається з їх системою. Немає точної інформації, коли саме буде видалений об'єкт, що став непотрібним, коли почне працювати (а значить, і займати системні ресурси) потік збирача сміття і т.д. Але, при всій повазі до досвіду таких програмістів, необхідно відзначити, що переважна кількість збоїв програм, написаних на С / С ++, припадає саме на некоректну роботу з пам'яттю, причому часом це трапляється навіть з широко поширеними продуктами вельми серйозних компаній.
Нарешті, Internet-бум 90-х років набирав обертів і висував нові, більш жорсткі вимоги до термінів розробки. Багаторічні проекти, які були в минулому звичайною справою, перестали відповідати потребам замовників, нові системи треба було створювати максимум за рік, а то і за лічені місяці.
Крім введення garbage collector. були зроблені й інші кроки для полегшення розробки. Деякі з них вже згадувалися - відмова від множинного спадкоємства, спрощення синтаксису та ін. Можливість створення багатопотокових додатків була реалізована в першій же версії Java (дослідження показали, що це дуже зручно для користувачів, а існуючі стандарти спираються на телетайпні системи, які застаріли багато років назад). Інші особливості будуть розглянуті в наступних лекціях. Однак те, що створення і підтримка систем дійсно простіше на Java. ніж на C / C ++, давно є загальновизнаним фактом. Втім, все-таки ці мови створені для різних цілей, і кожен має свої незаперечні переваги.
Наступне важливе властивість Java - безпека. Початкова націленість на розподілені додатки, і особливо рішення виконувати аплети на клієнтській машині, зробили питання захисту одним з найбільш пріоритетних. При роботі будь-якої віртуальної машини Java діє цілий комплекс заходів. Далі наводиться лише короткий опис деяких з них.
По-друге, наявність віртуальної машини-інтерпретатора значно полегшує відсікання небезпечного коду на кожному етапі роботи. Спочатку байт-код завантажується в систему, як правило, у вигляді class-файлів. JVM ретельно перевіряє, чи всі вони підкоряються загальним правилам безпеки Java і не створені чи зловмисниками за допомогою якихось інших коштів (і не спотворені чи при передачі). Потім, під час виконання програми, інтерпретатор легко може перевірити кожну дію на допустимість. Можливості класів, які були завантажені з локального диска або по мережі, істотно розрізняються (користувач легко може призначати або скасовувати конкретні права). Наприклад, аплети за замовчуванням ніколи не отримають доступ до локальної файлової системи. Такі вбудовані обмеження є у всіх стандартних бібліотеках Java.
Сукупність описаних властивостей Java дозволяє стверджувати, що мова дуже пристосований для розробки Internet- і інтранет (внутрішні мережі корпорацій)-додатків.
Нарешті, важлива відмінна риса Java - це його динамічність. Мова дуже вдало задуманий, в його розвитку беруть участь сотні тисяч розробників і багато великих компаній. Основні етапи цього розвитку коротко висвітлені в наступному розділі.
Отже, підіб'ємо підсумки. Java -платформи має наступні переваги:
- переносимість, або кроссплатформенность;
- об'єктна орієнтованість, створена ефективна об'єктна модель;
- звичний синтаксис С / С ++;
- вбудована і прозора модель безпеки;
- орієнтація на Internet-завдання, мережеві розподілені додатки;
- динамічність. легкість розвитку і додавання нових можливостей;
- простота освоєння.
Але не слід вважати, що більш легке освоєння означає, що вивчати мову не потрібно зовсім. Щоб писати дійсно хороші програми, створювати великі складні системи, необхідно чітке розуміння всіх базових концепцій Java і використовуваних бібліотек. Саме цьому і присвячено даний курс.
Основні версії і продукти Java
Відразу обмовимося, що під продуктами тут розуміються програмні рішення від компанії Sun, є "зразками реалізації" (reference implementation).
- Java language specification. JLS. специфікація мови Java (описує лексику, типи даних, основні конструкції і т.д.);
- специфікація JVM;
- Java Development Kit. JDK - засіб розробника, що складається в основному з утиліт, стандартних бібліотек класів і демонстраційних прикладів.
Специфікація JVM призначена в першу чергу для творців віртуальних машин, а тому практично не використовується Java-програміст.
Перша версія містила всього 8 стандартних бібліотек:
- java.lang - базові класи, необхідні для роботи будь-якої програми (назва - скорочення від language);
- java.util - багато корисних допоміжні класи;
- java.applet - класи для створення аплетів;
- java.awt. java.awt.peer - бібліотека для створення графічного інтерфейсу користувача (GUI), називається Abstract Window Toolkit. AWT. детально описується в лекції 11;
- java.awt.image - додаткові класи для роботи з зображеннями;
- java.io - робота з потоками даних (streams) і з файлами;
- java.net - робота з мережею.
Таким чином, всі бібліотеки починаються з java. саме вони є стандартними. Всі інші (що починаються з com, org і ін.) Можуть змінюватися в будь-якої версії без підтримки сумісності.
Відразу пояснимо систему іменування версій. Позначення версії складається з трьох цифр. Першою поки завжди стоїть 1. Це означає, що підтримується повна сумісність між усіма версіями 1.х.х. Тобто програма, написана на більш старому JDK. завжди успішно виконається на більш новому. По можливості дотримується і зворотна сумісність - якщо програма відкомпільована новішим JDK. а ніякі нові бібліотеки не використовувалися, то в більшості випадків старі віртуальні машини зможуть виконати такий код.
Друга цифра змінилася від 0 до 4 (остання на момент створення курсу). У кожній версії відбувалося істотне розширення стандартних бібліотек (212, 504, 1781, 2130 і 2738 - кількість класів і інтерфейсів з 1.0 по 1.4), а також додавалися деякі нові можливості в саму мову. Змінювалися і утиліти, що входять в JDK.
Нарешті, третя цифра означає розвиток однієї версії. У мові або бібліотеках нічого не змінюється, лише усуваються помилки, проводиться оптимізація, можуть змінюватися (додаватися) аргументи утиліт. Так, остання версія JDK 1.0 - 1.0.2.
Разом з першим успіхом JDK 1.0 приспіла і критика. Основні недоліки, виявлені розробниками, були наступними. По-перше, звичайно, продуктивність. Перша віртуальна машина працювала дуже повільно. Це пов'язано з тим, що JVM. по суті, являє собою інтерпретатор, який працює завжди повільніше, ніж виповнюється відкомпільований код. Однак успішна оптимізація, устранившая цей недолік, була ще попереду. Також відзначалися досить бідні можливості AWT. відсутність роботи з базами даних та інші.
За перші три тижні JDK 1.1 був викачаний більше 220.000 разів, менш ніж через рік - понад два мільйони разів. На даний момент версія 1.1 вважається повністю застарілою і її розвиток зупинився на 1.1.8. Однак через те, що найпоширеніший браузер MS IE досі підтримує тільки цю версію, вона продовжує використовуватися для написання невеликих аплетів.
- вдосконалений віконний інтерфейс. який отримав особливу назву - Swing;
- реалізація Drag-and-Drop;
- підтримка 2D-графіки, більш зручна робота з зображеннями;
- Accessibility API для користувачів з обмеженими можливостями
Список що з'явилися можливостей дуже широкий, тому перерахуємо найбільш значимі з них:
- Java 2 Platform, Standard Edition (J2SE);
- Java 2 Platform, Enterprise Edition (J2EE);
- Java 2 Platform, Micro Edition (J2ME).
Насправді, подібна класифікація вже давно назріла, зокрема, різних специфікацій і бібліотек налічувалося кілька десятків, а тому вони потребували чіткої структуризації. Крім того, такий поділ полегшувало розвиток і просування на ринок технології Java.
J2SE призначається для використання на робочих станціях і персональних комп'ютерах. Standard Edition - основа технології Java і прямий розвиток JDK (засіб розробника було перейменовано в j2sdk).
J2EE містить все необхідне для створення складних, високонадійних, розподілених серверних додатків. Умовно можна сказати, що Enterprise Edition - це набір потужних бібліотек (наприклад, Enterprise Java Beans. EJB) і приклад реалізації платформи (сервера додатків, Application Server), яка їх підтримує. Робота такої платформи завжди спирається на j2sdk.
Нова платформа може працювати в двох режимах - клієнтському і серверному. Режими розрізнялися настройками і іншими оптимізують алгоритмами. За замовчуванням робота йде в клієнтському режимі.
На закінчення для демонстрації рівня розвитку Standard Edition наведемо стандартні діаграми, які описують всі складові технології, з документації до версій 1.3 та 1.4.