Java як центр архіпелагу, Java, Програмування, статті

Олександр Таранов, Володимир Цішевскій

Зміст

 1. Введення
2. Інтернет, WWW і Інтранет
3. Java, Joe, NEO
4. Java - мова і технологія 4.1. Мова Java 4.1.1. Об'єктна модель мови Java 4.1.2. Примітивні типи даних 4.1.3. Пакети 4.1.4. Керуючі конструкції 4.1.5. Виняткові ситуації 4.1.6. Механізм потоків 4.2. Технологія Java 4.2.1. Технологічний цикл обробки Java-програм 4.2.2. Java-машина 4.2.3. Java і безпека
4.2.4. Java WorkShop 4.3. Зв'язок Java з оточенням: віконний інструментарій 4.3.1. Загальні положення 4.3.2. З чого будується графічний інтерфейс (компоненти й контейнери) 4.3.3. Як організувати інтерфейс 4.3.4. Події 4.3.5. Методи класу Component, пов'язані з обробкою подій
5. Joe - технологія зв'язування Java-програм з об'єктними біз- нес-додатками
6. Висновок

1. Введення


Коли говорять і пишуть про Java, найпопулярнішою фразою є "Світ зійшов з розуму". Дійсно, і швидкість, і характер роз- ространенія (так і хочеться згадати лексикон недавнього пройшло- го і сказати про "переможній ході") не мають аналогів. При появ- лении альфа-версії продукту вишиковується черга на його запро- вадив (рис. 1).
Рис. 1. Вони хочуть ліцензувати технологію Java (знімок зроблений на острові Ява).
Бета-версія стає інструментом реалізації інформаційних систем великих компаній. Акції компаній, що мають міцні пози- ції в Інтернет, ростуть, як на дріжджах. Всі кинулися реалі- вивать WWW-навігатори з підтримкою Java і борються за право пе- реда їх в безкоштовне використання якомога більшому числу клієнтів. Йде битва за долю майбутнього ринку, контури которо- го поки тільки намічаються, бій із застосуванням засобів, ко- торие з точки зору "здорового бізнесу" інакше як дикими і наз- вать не можна.
У чому причина загального божевілля і що це за продукт, яка зачарувала світ? Спробуємо зовсім коротко висловити деякі міркування з першого питання, після чого перейдемо на чисто технічні рейки і зосередимося на описі технології та мови Java та асоційованих продуктів.
Персональні комп'ютери зробили інформаційні технології частиною масової культури. При мільйонних тиражах навіть единст- венний "комп'ютерний хіт" здатний принести дуже великі день- ги. Автори багатьох подібних хітів, крім багатства, отримують колосальний вплив на людей, що по суті є джерелом ником величезного додаткового збагачення. І тим не менше, вже досить тривала історія розвитку персональних комп'ютерів не знала нічого, подібного феномену Java. Що змінилося у світі в останні роки, чому цей феномен став можливий?
Змінився Інтернет. Він став доступний мільйонам людей, далеких від технічних проблем. Число користувачів Інтернету по порядку величини вже не відрізняється від числа користувачів персональних комп'ютерів і продовжує вибухоподібно рости. Одночасно Ін- тернет забезпечив таку швидкість розповсюдження новинок інфор- маціонние технологій, яку не могли і ніколи не зможуть дати традиційні канали збуту. Час спресувалося. В Інтернеті, запізнившись буквально на день, комп'ютерна компанія, навіть велика, ризикує серйозно послабити свої позиції відразу в усьому світі.

2. Інтернет, WWW і Інтранет


Інформаційні перевантаження - характерна риса нашого часу. Створені потужні механізми, що забезпечують виробництво величезного кількості інформації. Істотно менше зроблено для полегшений- ня її отримання і використання.
Типовою є ситуація, коли ініціатива належить пос- тавщіку, а не споживача інформації. Постачальник по определенно- му приводу створює інформацію і направляє її всім, хто, на його думку, в ній потребує (рис. 2).
Рис. 2. Доставка інформації з ініціативи постачальника
Так працюють засоби масової інформації, видавництва, рек- ламние агентства. Так працює електронна пошта. У більшості випадків споживачеві ця інформація, може бути, і потрібна, але не в даний момент, не зараз. Споживач змушений архівувати отриману інформацію. При цьому в кращому випадку велика ймовірність ність, що до моменту, коли інформація справді знадобиться- ся, вона втратить актуальність. Звичайно ж у споживача просто накопичуються гори сміття, в якому відшукати щось потрібне поч- ти неможливо.
Щоб інформація була актуальною для споживача, вона повинна доставлятися до нього по запиту - в точності тоді, коли в ній виникла необхідність. Крім того, постачальник повинен зберігати можливість управління інформацією, він повинен не тільки ство- вать її, але і вчасно оновлювати і знищувати.
Централізовані комп'ютерні системи, які домінували ще 10 років тому, дозволяли користувачам порівняно легко знаходити інформацію в оперативному режимі, проте вони утрудняли управ- ня інформацією, оскільки її джерела, як правило, разнород- ни і територіально рознесені. Ще один важливий недолік цент- ралізованние систем - їх складність і дорожнеча (рис. 3).
Рис. 3. Взаємодія з централізованою комп'ютерною системою
Переважній більшості російських організацій вони просто не по кишені.
Мережі персональних комп'ютерів істотно дешевше централізованого- ванних систем, вони залишають за постачальником необхідну свободу управління інформацією, проте споживачам доводиться шукати необхідні дані на безлічі машин, серед великої кількості додатків (рис. 4).
Рис. 4. Отримання інформації з мережі персональних комп'ютерів
Рядовому користувачеві працювати в такій різнорідної прикладної середовищі вкрай незручно.
Спосіб вирішення зазначених проблем, до якого вдаються веду- щие компанії, полягає в побудові інформаційної структури ор- ганізації за образом і подобою Інтернет, з Web-сервісом в ка- честве концептуальної основи (рис. 5).
Рис. 5. Універсальний клієнт Web-сервісу
Можливість зберігання даних різних типів (текст, графіка, аудіо, відео) в поєднанні з механізмами зв'язування інформації, розташованої в різних вузлах комп'ютерної мережі, дозволяють рас- редотачівать інформацію відповідно до природним порядком її створення і споживання, здійснювати однаковий доступ, вирушаючи від невеликого числа відомих "коріння". Тим самим постачальник може ефективно готувати і контролювати інформації цію, а споживач в змозі без зусиль знайти необхідні дан- ні саме тоді, коли вони стали потрібні.
Засоби Web, крім зв'язування розподілених даних, здійсню- ються ще одну дуже важливу функцію. Вони дозволяють розглядають ривать інформацію з потрібним ступенем деталізації, що суттєво але спрощує аналіз великих обсягів даних. Можна швидко відоб- рать найцікавіше, а потім вивчити обраний матеріал під всіх подробицях.
Таким чином, Web-сервери і Web-навігатори можуть і повинні ис- користуватися не тільки в "світовому масштабі". Web - це інфраст- руктурний сервіс, необхідний кожній організації зі скільки-ні- будь помітними інформаційними потоками.
У той же час, Web-сервісу притаманні і певні недоліки, випливають з відсутності станів в HTTP-протоколі. По-перше, клієнт по суті позбавлений засобів управління зовнішнім представле- ням об'єктів на переглядається WWW-сторінці (єдине, що він може зробити, це змінити WWW-навігатор).
По-друге, Web-сторінки статичні. При використанні протоколу HTTP, на клієнтську систему передаються тільки пасивні дані, але не методи об'єктів. Із загальних міркувань очевидна обмежений- ність подібного підходу. Даний недолік, зрозуміло, пов'язаний з першим. Об'єкт сам повинен знати, як себе показувати - точніше кажучи, він повинен це з'ясувати, проаналізувавши клієнтське ок- Ружені.
По-третє, Web-сервіс має досить обмеженими інтерактив- вими можливостями, які зводяться до заповнення користувачем чисто текстових форм з подальшою відправкою на сервер. Така форма спілкування цілком влаштовувала користувачів терміналів ЄС ЕОМ років 15 тому. Зараз її явно недостатньо.
Java-технологія дозволяє усунути всі зазначені недоліки. Як саме - буде ясно з подальшого викладу. В результаті Web-сервіс, і без того мав величезну популярність, отримав як би новий імпульс. Цей експрес понісся вперед з подвоєною швидкістю, захоплюючи за собою і Java.

3. Java, Joe, NEO


У вузькому сенсі слова Java - це об'єктно-орієнтована мова, нагадує C + +, але більш простий для освоєння і використання- ня. У більш широкому сенсі Java - це ціла технологія прог- раммірованія, спочатку розрахована на інтеграцію з Web-сер- вісом, тобто на використання в мережевому середовищі, Оскільки Web- навігатори існують практично для всіх апаратно-програм- них платформ, Java-середу повинна бути як можна більш мобільною, в ідеалі повністю незалежною від платформи.
З метою вирішення перелічених проблем були прийняті, крім ін- теграціі з Web-навігатором, два інших найважливіших постулату.
- Була специфікована віртуальна Java-машина, на якій повинні виконуватися (інтерпретуватися) Java-програми. Визна- лени архітектура, подання елементів даних і система ко- манд Java-машини. Вихідні Java-тексти транслюються в коди цієї машини. Тим самим, при появі нової апаратно-програм- ної платформи в портуванні потребуватиме тільки Java-маши- на; всі програми, написані на Java, підуть без змін.
- Визначено, що при редагуванні зовнішніх зв'язків Java-прог- Рамі і при роботі Web-навігатора прозорим для користувача чином може здійснюватися пошук необхідних об'єктів не тільки на локальній машині, але й на інших комп'ютерах, доступ- них по мережі (зокрема, на WWW-сервері). Знайдені об'єкти завантажуються, а їхні методи виконуються потім на машині корис- теля.
Безсумнівно, між двома сформульованими положеннями суті- ет тісний зв'язок. В модульна середовищі важко дистанціюватися від апаратних особливостей комп'ютера, як важко (хоча і мож- но) реалізувати прозору динамічну завантаження по мережі. З іншого боку, прийом об'єктів ззовні вимагає підвищеної осто- рожності при роботі з ними, а, значить, і з усіма Java-програм- мами. Вживати необхідних заходів безпеки найпростіше в ін- терпретіруемой, а не модульна середовищі. Взагалі, мобільність, динамізм і безпека - супутники інтерпретатора, а не комп- лятора.
Прийняті рішення зробили Java-середовище ідеальним засобом роз- лення клієнтських компонентів Web-систем. Особливо відзначимо прозорості- ву для користувача динамічну завантаження об'єктів по мережі. З цього випливає таке найважливіше гідність, як нульова вар- тість адміністрування клієнтських систем, написаних на Java. Досить оновити версію об'єкта на сервері, після чого клі- ент автоматично отримає саме її, а не старий варіант. Без цього реальна робота з розвиненою мережевий інфраструктурою прак- тично неможлива. З іншого боку, за наявності динамічної завантаження дійсно можлива поява пристроїв класу Java-терміналів, спочатку містять тільки WWW-навігатор, а все інше (і програми, і дані) отримують по мережі.
Тут доречно відзначити чудову точність у виборі основних посилок проекту Java. З мінімуму припущень випливає максі- мум нових можливостей при збереженні практичності реалізації.
У той же час, інтеграція з WWW-навігатором і интерпретируемая природа Java-середовища ставлять цілком певні рамки для реаль- ного використання Java-програм (хоча, звичайно ж, мова Java Проте універсальний, ніж, скажімо, C + +). Наприклад, відомо, що інтерпретація, в порівнянні з прямим виконанням, приблизно на півтора порядку повільніше. Важко сказати, наскільки можуть поліпшити становище компіляція "на льоту" і використання спеціа- лу Java-процесорів, але поки використання Java на серверній стороні представляється проблематичним.
Далі, хоча технологія Інтранет, заснована на використанні Web-сервісу в якості інформаційної основи організації, є по- ється величезним кроком вперед, існують і інші сервіси, як успадковані, так і сучасні (наприклад, реляційні СУБД), які обов'язково повинні входити до складу корпоративної сис- теми. Якщо вся зв'язок між клієнтами і згаданими серверами буде здійснюватися через сервер WWW, останній стане вузьким місцем, а рішення Інтранет ризикують втратити такого найважливішого гідності, як масштабованість. Значить, необхідна пряма зв'язок між клієнтськими системами, написаними на мові Java, і довільними сервісами (рис. 6).
Рис. 6. Прямий зв'язок між Java-клієнтами та корпоративними сер- вірами.
Як реалізувати такий зв'язок?
В загальному вигляді відповідь очевидна - потрібні кошти для повноцінної інтеграції Java в розподілену об'єктну середу. На серверної стороні компанія Sun Microsystems має відповідну техно- логію - NEO (NEtworked Objects, мережеві об'єкти). Технологія NEO задовольняє специфікаціям CORBA (Common Object Request Broker Architecture), що є промисловим стандартом. При реалізації корпоративних інформаційних систем з використанням NEO найбільш природним є використання треху- ровневой архітектури з серверами додатків, побудованими на об'єктних принципах, на другому рівні і з базовими і успадкує- ванними серверами на третьому рівні (рис. 7).
Рис. 7. Трирівнева архітектура корпоративної інформаційної системи.
До сожелению, настільки загальний відповідь ніяк не допомагає здійснювати прямий зв'язок між Java-клієнтом і NEO-сервером. Звичайно, можна скористатися стандартними засобами програмування в се- тевой середовищі (а Java допускає використання бібліотек, написаний- них на C / C + +, так само як і вставку машинних кодів), але якщо це було б єдиною можливістю, Java ризикувала залишитися на рівні "ожівлялок" для MS-Windows. В кінці березня 1996 ком- панія SunSoft оголосила про появу нового продукту з ім'ям Joe, якраз і призначеного для істотного полегшення вбудовування Java-клієнтів в інформаційні системи Інтранет, побудовані в трирівневій архітектурі з використанням середовища NEO (рис. 8).
Рис. 8. Розподіл ролей між Java, Joe і NEO.
Таким чином, склалася повна і дивовижно красива картина організації сучасних Інтранет-систем. У даній статті ми приділимо основну увагу технології Java. Далі буде коротко розглянуті можливості, що надаються системою Joe.

4. Java - мова і технологія


* 4.1. Мова Java


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

4.1.1. Об'єктна модель мови Java


Коли говорять про об'єктно-орієнтованої мови програмування- ня, передбачають підтримку трьох механізмів:
- Інкапсуляція
- Успадкування
- Поліморфізм.
Інкапсуляція і спадкування в мові Java реалізуються за допомогою поняття класу.

4.1.1.1. Класи


Поняття класу в мовах Java і C + + дуже близькі. Клас є шаблоном для створення об'єктів; він може містити дані і ме- методи. Наведемо приклад класу, що описує точки в двовимірному просторі (тут і далі номери рядків використовуються для пос- ледующіх пояснень і не є частиною Java-програм).
1 class Point extends Object {
2 private double x;
3 private double y;
4 Point (double x, double y) {
5 this.x = x;
6 this.y = y;
7 }
8 Point () {
9 this (0.0, 0.0);
10 }
11 public void setX (double x) {
12 this.x = x;
13 }
14 public void setY (double y) {
15 this.y = y;
16 }
. . .
17 }
У мові Java не можна відривати визначення методу (функції) від опису заголовка. Синтаксична конструкція class повністю включає в себе всю інформацію про клас. Зокрема, реалі- ції методів зобов'язані утримуватися усередині цієї конструкції.
Для позначення успадкування використовується ключове слово extends (рядок 1). Клас Object - це корінь дерева наследова- ня. В Java не буває класів-"сиріт": у всіх класів, окрім Object, є попередник. Детальніше спадкування і предопре- поділені класи будуть розглянуті далі.
Режими доступу до елементів класу (private, protected, public) ті ж, що і в C + +, за одним важливим виключенням. Якщо режим доступу опущений, передбачається, що відповідний елемент доступний в межах пакету (див. далі).
У рядку 9 наведено приклад явного виклику одного конструктора з іншого.
Інші наведені вище рядки не потребують пояснень крім одній - відсутньою. У мові Java не буває деструкторів. Причина в тому, що управління пам'яттю автоматизовано (в фоно- вом режимі працює збирач сміття). Для вивільнення інших ресурсів, асоційованих з об'єктом, служить спеціальний метод finalize. Цей метод викликається складальником сміття в момент ути- лізації пам'яті, що займалася об'єктом.
Ключове слово this (див., наприклад, рядки 5 і 9) використовується для посилання на самого себе. Аналогічну роль по відношенню до ро- батьківського класу грає слово super:
1 class ThreePoint extends Point {
2 protected double z;
3 ThreePoint () {
4 super ();
5 z = 0.0;
6 }
7 ThreePoint (double x, double y, double z) {
8 super (x, y);
9 this.z = z;
10 }
11 }
У рядках 4 і 8 викликаються конструктори батьківського класу.
Наведені приклади показують, що в мові Java, як і C + +, методи можуть бути перевантаженими, тобто під одним ім'ям мо- гут фігурувати різні методи з різним набором параметрів.
Як і C + +, з помщь ключового слова static можна визначити дані і методи, які є загальними для всіх об'єктів класу. (Зазначимо принагідно, що функцій, які не належать якому- або класу, в мові Java не буває.) Наступний приклад містить фрагменти стандартного пакета java.lang.
1 public final
2 class Character extends Object {
3 public static final int MAX_RADIX = 36;
4 static char downCase[];
5 static {
6 char down[] = new char[256];
7 for (int i = 0 ; i < 256 ; i++) {
8 down[i] = (char) i;
9 }
10 for (int lower = 'a' ; lower <= 'z' ; lower++) {
11 int upper = (lower + ('A' - 'a'));
12 down[upper] = (char)lower;
13 }
14 for (int lower = 0xE0; lower <= 0xFE; lower++) {
15 if (lower != 0xF7) { // multiply and divide
16 int upper = (lower + ('A' - 'a'));
17 down[upper] = (char)lower;
18 }
19 }
20 downCase = down;
21 }
22 public static boolean isLowerCase(char ch) {
23 return (upCase[ch] != ch);
24 }
25 }
Прокоментуємо цей приклад з точки зору відмінностей Java від C + +.
Рядки з 5 по 21 представляють собою ініціалізацію статичних даних класу, яка здійснюється в момент завантаження класу в Java-машину. По суті цей код грає роль конструктора класу
Character.
У рядках 1 і 3 зустрічається ключове слово final. У рядку 1 це слово позначає заборону на спадкування від класу Character. У рядку 3 його сенс аналогічний описувач const в
C++.
Якщо слово final використано в заголовку методу, то даний ме- тод не може бути перевизначений в класах-спадкоємців.
Як і в C + +, в мові Java класи можуть бути абстрактними, то є не до кінця конкретизованими. Це означає, що в клас- се описані методи, визначення яких відсутні. Такі мето- ди (як і сам клас) повинні забезпечуватися описувачем abstract. Абстрактні методи повинні конкретизуватися в похідних класах.
У мові Java є зумовлена ​​ієрархія класів, що містить жащіхся в пакеті java.lang. На рис. 9 ця ієрархія представлена графічно.
Рис. 9. Ієрархія визначених класів мови Java.
В цій ієрархії дещо осібно стоїть клас Class. Програм- мист не може створити об'єкт класу Class (правда, існують і інші класи з цією властивістю). Посилання на об'кти класу Class можна отримати за допомогою методу getClass, визначеного для об- 'ектов класу Object.
Об'єкти класу Class використовуються для отримання під час виконан- ня інформації про "класових" властивості об'єкта. До об'єктів класу Class, крім інших, застосовні наступні методи:
1 public native String getName();
2 public native Class getSuperclass();
3 public static native Class forName(String className)
throws ClassNotFoundException;
Метод forName дозволяє отримати посилання на клас по його імені. Описувач native свідчить про те, що метод реалізується засобами, зовнішніми по відношенню до Java-системі (наприклад, пі- шется мовою C).

4.1.1.2. Спадкування


Модель спадкування в мові Java істотно відрізняється від мо- діли C + +. По-перше, в Java немає множинного наслідування. По-друге, у мові передбачено кошти для заборони далекої- шего спадкування (ключове слово final перед визначенням класу). По-третє, у мові Java присутня нове по відношенню- нію до C + + поняття інтерфейсу.
Інтерфейс являє собою набір описів методів. Приклад:
public interface Verbose {
public void drawOn (Graphics g);
public void printOn (OutputStream os);
}
public class Star extends Polygon implements Verbose {
public void drawOn (Graphics g) { / / Конкретна реалізація відтворення
}
public void printOn (OutputStream os) { / / Конкретна реалізація друку
}
}
public class Text extends StringBuffer implements Verbose {
public void drawOn (Graphics g) { / / Конкретна реалізація відтворення
}
public void printOn (OutputStream os) { / / Конкретна реалізація друку
}
}
public class Blackboard extends Canvas {
public void drawVerbose (Verbose d) {
Graphics g = getGraphics ();
d.drawOn (g);
}
}
Інтерфейс Verbose містить два методи. Перший призначений для малювання в графічному контексті, другий - для роздруківки в вихідний потік.
Клас Star предствляет собою підклас багатокутників (Polygon). Крім іншого, ми хочемо малювати об'єкти цього класу на дошці (Blackboard) і виводити їх опис у файл.
Для об'єктів класу Text ми хочемо мати можливість накреслити текст на дошці і виводити його в файл.
Клас Blackboard - спадкоємець класу Canvas, спеціально предназ- значене для малювання. Як ми бачимо, цей клас за допомогою єдиного методу справляється з малюванням об'єктів, не име- чих загального предка (крім класу Object).
Таким чином, за допомогою інтерфейсів можна компенсувати від- присутність множинного наслідування. В контексті спадкування інтерфейс можна розглядати як абстрактний клас, не містить жащій даних.

4.1.1.3. Життєвий цикл об'єкта


Об'єкти створюються за допомогою оператора new. Ініціалізація об'єктом та проводиться за допомогою відповідного конструктора. Ці операції розділити не можна - за new слід конструктор. Приклад.
Point myPoint = new Point ();
Інших способів створення об'єктів (крім оператора new) мова Java не надає.
Об'єкт існує до тих пір, поки на нього є посилання (тобто поки він прямо чи опосередковано доступний хоча б з однієї змін- ної). У мові відсутні явні кошти видалення об'єктів. Після того, як об'єкт став недоступний, він виявляється кандида- тому для утилізації складальником сміття.
Об'єкт може стати недоступним, якщо зберігати його змінної присвоєно нове значення або якщо ця змінна перестала бути доступною (стався вихід з блоку). Приклад.
Point p = new Point (100.0, 100.0);
. . .
p = new Point (1.0, 1.0); / / На точку з координатами (100, 100) посилань більше немає
{
String s = new String ("Local string");
System.out.println (s);
} / / На рядок "Local string" посилань більше немає
У момент утилізації об'єкта складальником сміття буде викликаний метод finalize. Через те, що збирач сміття працює у фоновому ре- жимі, виклик finalize є асинхронним.

4.1.2. Примітивні типи даних


У мові Java існує набір вбудованих типів даних, які не є об'єктами. Їх не так багато.
Представлення чисел в мові Java фіксоване і, тим самим, не залежить від апаратної платформи.
- Цілі числа: - Byte - 8 біт, - Short - 16 біт, - Int - 32 біта, - Long - 64 біта. Всі числа зі знаком, специфікатор unsigned в мові відсутня.
- Числа з плаваючою крапкою: - Float - 32 біта, - Double - 64 біта. Подання має відповідати стандарту IEEE 754.
- char Значення типу char є 16-розрядне число без знака (діапазон 0-65535). Кодування відповідає стандарту Unicode. У резуль- Таті з самого початку закладається здорова основа для рішення проблеми локалізації Java-програм.
- boolean Містить значення true і false, які не можуть бути перетворень- зовано в інший тип.
У мові Java, зрозуміло, присутні масиви. Ці масиви ти- пізіровани. Декларація
Point myPoints[];
описує змінну myPoints як масив об'єктів типу Point. Завести масив певного розміру можна за допомогою інструкції виду
myPoints = new Point[10];
Значення елементів масиву при цьому встановлюються рівними спеціальної величиною null.
Розмір масиву може бути отриманий під час виконання програм- ми:
howMany = myPoints.length;
Інших структурних типів (що не є об'єктами) в мові Java немає, тобто немає структур, об'єднань і т.п. Немає в Java і ука- показників.
Зазначимо, що рядки символів є об'єктами типу String (Текстові константи) або StringBuffer (змінювані рядки). Приклад,
String hello = "Hello world!";

4.1.3. Пакети


Класи в мові Java об'єднуються в пакети. Всі класи, що входять в один пакет, є дружніми по відношенню один до дру- гу, тобто мають взаємний доступ до змінних і методам, якщо противне не обумовлено явно допомогою специфікаторів private або protected.
Пакети розмежовують простору імен. "Просто глобальних" імен у мові Java не буває.
Пакет оформляється за допомогою синтаксичної конструкції виду
package my_packages.pack1:
Інструкція package повинна стояти першою у файлі з вихідним Java-текстом. Вона діє до кінця файлу.
Пакети можуть імпортуватися іншими пакетами допомогою інст- рукции import. Приклади,
import java.util;
import java.util.HashTable;
import java.util.*;
Перша інструкція import дозволяє звертатися до класів пакета util наступним чином:
util.Vector
util.HashTable
. . .
Друга інструкція імпортує лише клас HashTable, дозволяючи в надалі звертатися до цього класу за коротким імені, без префікса util.
Третя інструкція import дозволяє звертатися по коротких име- нам до всіх класів пакета util.

4.1.4. Керуючі конструкції


Керуючі конструкції мови Java цілком традиційні, за позов- лючением засобів виходу з вкладених блоків (зокрема, з вкладених циклів). Приклад.
test:
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (i > 3) {
break test;
}
}
}
Для передачі управління можна застосовувати як конструкцію break, так і continue (перехід до наступної ітерації циклу).
Інструкція goto в мові Java відсутня.

4.1.5. Виняткові ситуації


Для обробки виняткових ситуацій, що виникають під час ви- нання програми, в мові Java використовується конструкція try / catch / finally. Блок try містить інструкції, виконання може привести до виникнення виняткових ситуацій. Наступні за ним один або кілька блоків catch призначені для обробки виняткових ситуацій. Нарешті, блок finally містить інстр- рукції, які будуть виконані незалежно від виникнення виняткової ситуації в блоці try. При виході з try-частини за допомогою інструкцій передачі управління (break, return і т.п.) блок finally також буде виконаний.
Для передачі інформації про виняткову ситуації використовуються об'єкти класів - спадкоємців класу Throwable. Наприклад, клас ArrayIndexOutOfBoundsException відповідає за контроль виходу ін- дексу за межі масивів, клас OutOfMemoryException - за ре- акцію на вичерпання вільної пам'яті, клас ClassCastException - За помилки при перетворенні типів, клас InterruptedException - за обробку переривання поточного потоку і т.д. Компонентою всіх цих класів є поле типу String, в яке поміщається текст повідомлення про помилку. Метод getMessage повертає цей текст.
У подібних об'єктах може міститися і додаткова інфор- ція. Наприклад, об'єкти класу InterruptedIOException містять поле, в яке заноситься число байт, переданих до виникнення- ня виняткової ситуації.
Наступний фрагмент програми роздруковує повідомлення з масиву messages. При цьому ми не намагаємося з'ясувати розмір цього масиву- ва, а просто покладаємося на механізм обробки виняткових ситуацій. (Звичайно, ми не радимо писати програми в такому стилі).
try {
for (int i = 0; i < 100; i++) {
System.out.println (messages[i]);
}
}
catch (ArrayOutOfBoundException e) {
System.out.println ("No more messages");
}
catch (Exception e) {
System.out.println ("Unexpected exception");
System.out.println (e.getMessage());
}
finally {
System.out.println ("Work done");
}
Іскобчітельние ситуації можуть збуджуватися програмно при помо- щі інструкцій виду
throw new MyException ("Something's wrong");
Специфікації мови Java поділяють виняткові ситуації на дві категорії. До першої категорії (клас Error) відносяться ситу- ації, на які програма не зобов'язана реагувати (це свідомо зробить Java-машина). До другої категорії (клас Exception) від- носяться ситуації, які програма повинна обробляти зобов'язань тельно. Якщо при виконанні методу може виникати виключ- ва ситуація другого типу, він повинен або обробляти її сам з допомогою конструкції try / catch / finally, або в його визначенні повинна фігурувати конструкція
throws Exception1, Exception2, ...
Приклад.
class Foo extends Object {
. . .
public void readFromFile (String fn) throws InvalidFormatException {
FileInputStream fis;
try {
fis = new FileInputStream (fn); / / Читаємо дані з файлу.
. . . / / Якщо файл має неправильний формат, / / Вожбуждаем виняткову ситуацію:
throw new InvalidFormatException ("Wrong format");
. . .
}
catch (FileNotFoundException e) { / / Робимо відповідні дії
}
finaly {
if (fis != null ) fis.close (); / / завжди закриваємо файл, якщо він був відкритий
}
}
. . .
}
У цьому прикладі в методі readFromFile можуть виникнути дві искл- ве ситуації. Перша пов'язана з тим, що потрібний файл не- доступний. Ця ситуація обработивается всередині методу readFromFile. Друга виняткова ситуація може вознкнуть, якщо файл має неправильний формат. Ця ситуація передається для обробки наверх.

4.1.6. Механізм потоків


Механізм потоків - обов'язкова риса сучасних операційних середовищ. За рахунок потоків забезпечується масштабованість програм- них систем, оптимальне використання апаратних ресурсів, ви- сокая швидкість відгуку на запити користувачів. Тому немає нічого дивного в тому, що в мові Java механізм потоків представлений з самого початку і в повному обсязі.
У мові Java потоки представлені допомогою класу Thread, ін- терфейс Runnable, специфікатора методу synchronized і методів класу Object wait і notify.
4.1.6.1. Клас Thread і інтерфейс Runnable
Потік (thread) являє собою окремий потік управління в межах процесу. Таким чином, у кожного потоку є початок, послідовність дій, поточний стан і кінець.
Потік запускається за допомогою виклику методу start () класу Thread. Послідовність дій, що виконуються в рамках пото- ка, задається в методі run (). Підкреслимо, що метод run () ис- користується тільки для завдання помледовательності дій; явно викликати його не тільки не потрібно, а й просто шкідливо.
Потік закінчується або при завершенні виконання методу run (), або за допомогою явних викликів методів класу Thread stop () або destroy (). Відновити роботу завершеного потоку неможливо.
Для тимчасового призупинення роботи потоку з наступним возоб- становою служать методи suspend (), sleep () і yeild ().
Зазвичай потік, припинений за допомогою методу suspend, возоб- новлять роботу за допомогою методу resume ().
Виклик методу sleep () призводить до припинення потоку на заданий число мілісекунд.
Виклик методу yeild () означає добровільну поступку процесора іншому потоку; первинний потік залишається готовим до виконан- нению.
Java-потоки мають пріоритетами. У специфікаціях обумовлює- ся, що Java-машина реалізує витісняючу багатопотоковості. Це означає, що потік з великим пріоритетом може перервати виконан- ня менш пріоритетного потоку. Однак, специфікації не тре- буют наявності поділу часу. Це означає, що для передачі управління потоку з тим же пріоритетом, взагалі кажучи, вимагають- ся явні дії з боку початкового потоку - виклик ме- тодов suspend (), sleep () або yeild ().
На рис. 10 представлена ​​діаграма станів потоків.
Рис. 10. Діаграма станів потоків.
Наступний приклад містить фрагмент одного з численних ва- риант рішення задачі "виробник / споживач". Він заімст- вован з листа, який написав Mark Tillotson до групи сеті- вих новин comp.lang.java.
class my_producer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_producer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("producer to_do = " + items_to_do) ;
Integer item = new Integer (items_to_do*items_to_do) ;
the_buffer.insert (item) ;
items_to_do-- ;
}
System.out.println ("producer exiting") ;
}
}
Даний виробник поміщає в буфер квадрати цілих чисел.
У наведеному простому прикладі клас my_producer є нас- льодовиком класу Thread, що робить його потоком з послідовник- ністю дій, заданої методом run (). У реальних програмах, як правило, об'єкт повинен успадковувати у якого предшест- Венніка змістовні властивості, а можливість паралелльно виконання йому надається інтерфейсом Runnable. Цей ін- терфейс містить єдиний метод - run (). Приклад.
1 class SomethingToRun extends BaseRunner implements Runnable {
2 private Thread aThread;
3 public void run () { / / Виконувані дії
. . .
4 }
5 SomethingToRun () {
6 aThread = new Thread (this);
7 aTread.start ();
8 }
9 }
У рядку 6 створюється новий потік. Аргументом конструктора є- ється обєкт класу SomethingToRun, а, значить, послідовність виконуваних дій потоку буде визначатися методом run () цього класу. Виклик методу start () в рядку 7 ставить потік в чергу готових до виконання.

4.1.6.2. Засоби синхронізації потоків


Як і у всякій багатопроцесорний або многопотоковой середовищі, в Java існує проблема синхронізації доступу до поділюваних ресурсів. Прикладом такого ресурсу є буфер в задачі "про- виробниками / споживач ".
Для досвідчених програмістів відзначимо, що модель синхронізації, прийнята в мові Java, спирається на концепцію монітора, запропонованого- женную в 70-і роки Брінк-Хансеном.
В Java-програмах можна виділяти критичні інтервали, які позначаються ключовим словом synchronized. Якщо критичним ін- інтервалом є метод, специфікатор synchronized поміщається в його (методу) заголовок. Для перетворення довільної інструкції (Зазвичай це блок) в критичний інтервал служить конструкція
synchronized (вираз) інструкція;
де результатом вираження повинен бути об'єкт або масив.
Виконання критичного інтервалу починається тільки після напів- чення потоком монопольного доступу до відповідного об'єкту. До настання цього моменту потік блокується.
Виклик wait () всередині критичного інтервалу призводить до того, що поточний потік поступається монопольне право на критичний інтер- вал і припиняється до тих пір, поки з будь-якого друго- го потоку не буде зроблено виклик notify () або notifyAll (). Хоро- шей ілюстрацією використання коштів синхронізації потоків є згадувана вище програма Марка Тіллотсона.
class my_buffer
{
Object [] vec = new Object [8] ;
int ip = 0 ;
int ep = 0 ;
synchronized void insert (Object item)
{
do
{
if (ip-ep < 8)
{ vec [(ip++) & 7] = item ; if (ip-ep == 1) notify (); / / Повідомити, якщо буфер був порожній
return ;
}
try wait () ; catch (InterruptedException e) ;
} while (true) ;
}
synchronized Object extract ()
{
do
{
if (ip > ep)
{ Object result = vec [(ep++) & 7] ; if (ip-ep == 7) notify (); / / Повідомити, якщо буфер був сповнений
return result ;
}
try wait () ; catch (InterruptedException e) ;
} while (true) ;
}
}
class my_producer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_producer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("producer to_do = " + items_to_do) ;
Integer item = new Integer (items_to_do*items_to_do) ;
the_buffer.insert (item) ;
items_to_do-- ;
} System.out.println ("Виробник закінчує роботу");
}
}
class my_consumer extends Thread
{
int items_to_do ;
my_buffer the_buffer ;
my_consumer (my_buffer buf, int count)
{ super() ;
the_buffer = buf ;
items_to_do = count ;
}
public void run ()
{
while (items_to_do > 0)
{ System.out.println ("consumer to_do = " + items_to_do) ;
Object item = the_buffer.extract () ;
System.out.println ("consumer got " + item) ;
items_to_do-- ;
} System.out.println ("Споживач закінчує роботу");
synchronized (this){ notify (); / / Посилаємо повідомлення про завершення роботи / / (Див. con.wait () в main ())
}
}
}
public class threaded3
{
public static void main (String [] args) throws InterruptedException
{
my_buffer the_buffer = new my_buffer () ;
my_producer prod = new my_producer (the_buffer, 40) ;
my_consumer con = new my_consumer (the_buffer, 40) ;
Thread.currentThread().setPriority (5) ; prod.setPriority (4); / / Виробник отримує більш високий пріоритет con.setPriority (3); / / порівняно зі споживачем
prod.start() ;
con.start() ;
synchronized (con)
{ con.wait (); / / Чекаємо повідомлення від виробника про закінчення / / Його роботи
} System.out.println ("Виробник і споживач закінчили роботу");
}
}
Наведена програма написана в дуже хорошому, зрозумілому стилі. Ми прокоментуємо лише один момент. У методах insert () і extract () класу my_buffer виклик wait () міститься всередині біс- кінцевого циклу. Справа в тому, що виклик notify () відноситься до про- 'екту в цілому. "Розбуджений" об'єкт повинен проаналізувати свій стан і вирішити, що робити далі. Так, якщо "заснув" метод insert (), то після відновлення роботи необхідно прове- рить, що буфер уже не повний і додавання нового елемента стало можливим. Якщо це не так, метод insert () засне знову.

* 4.2. Технологія Java


4.2.1. Технологічний цикл обробки Java-програм


В принципі, технологічний цикл підготовки, трансляції, редак- тирования зовнішніх зв'язків, тестування, налагодження та виконання Java-програм той же, що і для інших інтерпретованих мов програмування, але з однією істотною відмінністю - при редак- туванні зовнішніх зв'язків необхідні компоненти можуть доставляти- ся по мережі (рис. xxx).
Рис. xxx. Технологічний цикл Java-програми
Важливо зазначити, однак, що Java-програми можуть поставати як би в двох іпостасях - як самостійний додаток і як аплет, тобто сукупність об'єктів, що виконуються в середовищі WWW-навігатора.
З точки зору програміста, аплет і додаток відрізняються в Насамперед точками входу і життєвим циклом.
Додаток в якості точки входу має метод
public static void main (String args[]);
цей метод повинен бути визначений в тому public-класі, який міститься в файлі, що виконується віртуальною Java-машиною. У параметр args передається масив рядків - параметрів командного рядка.
Приклад: програма, друкуюча свої аргументи
public class myTop {
public static void main (String args[]){
int argc = args.length;
for (int i = 0; i < argc; i++)
System.out.println (argc[i]);
}
}
Аплет виконується в контексті навігатора і його життєвий цикл визначається такими методами класу Applet:
public void init () викликається навігатором при завантаження аплета; public void start (); викликається навігатором при показі сторінки; public void stop (); викликається навігатором, коли той йде з Web-сторінки; public void destroy (); цей метод призначений для звільнення ресурсів; аналог деструктора, але не викликається автоматично; завжди викликає stop (); завжди викликається при виході з навігатора і при перезавантаженні аплета.
Найпростіший аплет виглядає так:
1 import java.awt.Graphics;
2 import java.applet.Applet;
3 class SimpleApplet extends Applet {
4 public void paint (Graphics g) {
5 g.drawString ("Hello world!", 10, 10);
6 }
7 }
Метод public void paint (Graphics g) (рядки 4-6) визначає, як аплет перемальовує себе в той момент, коли віконний ме- неджер посилає WWW-навігатора запит на перемальовування.
Включення аплета в WWW-сторінку проводиться таким чином. У мові HTML 2.0 передбачені спеціальні конструкції і. Перша з них задає ім'я завантажуваного класу і раз- заходи області у вікні навігатора, що виділяється аплету. Конструкція служить для передачі інформації з WWW-сторінки в ту се- ду, в якій буде виконуватися аплет.
Нижче наведено простий приклад вкллюченія аплета в WWW-сторінку.

Якщо ви бачите цей текст, то ваш навігатор не підтримує Java


Оскільки WWW-навігатори ігнорують невідомі конструкції, в новігаторі, не підтримує Java, буде видно текст

Якщо ви бачите цей текст, то ваш навігатор не підтримує Java


Опитати значення, передані за допомогою конструкції , Можна наступним чином:
public void init () {
String fontname = getParameter ("name");
String fontSizestring = getParameter ("size");
int theSize = Int.parseInt (fontSizeString);
. . .
}

4.2.2. Java-машина


Java-компілятор переводить транслює вихідні тексти Java- програм в коди Java-машини. Взагалі кажучи, Java-машина являє- ся віртуальної в тому сенсі, що вона не існує у вигляді ре- альних мікросхем та інших пристроїв, а являє собою прог- раммной емулятор, що виконується на будь традиційної ап- паратно платформі. Ймовірно, вже найближчим часом слід очікувати появи і все більш широкого розповсюдження і прямих апаратних реалізацій Java-машини.
Ідея мовних процесорів, зрозуміло, не нова. Відомі попит- ки впровадити так званий P-код в якості стандарту на ре- зультат роботи Паскаль-компіляторів; свого часу багато писали про мову і машині Форт; була виконана апаратна реалізація ре- фал-машини, і список цей можна продовжувати і продовжувати.
В контексті проекту Java специфікація віртуальної машини є- ється частиною комплексу заходів, спрямованих на стандартизацію Java- середовища і на забезпечення її незалежності від апаратно-програм- ної платформи. Крім того, слід враховувати ту специфічну середовище, в якому повинні готуватися і працювати Java-програми. Якщо Web-сторінка містить Java-аплети, ці аплети будуть пере- даватися по мережі. Значить, дуже бажано, щоб Java-код був як можна більш компактним, інакше час завантаження сторінки ризикує стати дратівливо великим. Відповідно, ар- хітектура і система команд Java-машини проектувалися таким чином, щоб всіляко сприяти компактіфікаціі коду. З іншого боку, формат команд Java-машини досить простий (звичайні- але команди не мають операндів і займають один байт), тому можлива її (машини) ефективна емуляція. З цієї причини програми, підготовлені для виконання на Java-машині, часто називають байт-кодами.
Ми опишемо архітектуру Java-машини досить коротко. Подальше виклад спирається на версію специфікацій 1.0.

4.2.2.1. Типи даних, підтримувані Java-машиною


Java-машина підтримує такі стандартні типи даних:
- Byte - однобайтні цілі Цісла в двійковому додатковому коді;
- Short - двухбайтние цілі числа;
- Int - четирехбайтний цілі числа;
- Long - восьмібайтние цілі числа;
- Float - четирехбайтний речові числа в форматі IEEE-754;
- Double - восьмібайтние речові числа;
- Char - двухбайтние беззнакові символи в кодуванні Unicode.
Оскільки Java-компілятор в змозі перевірити типи даних під час трансляції, при виконанні немає потреби асоціювати допол- Передачі інформацію зі значеннями стандартних типів. Замість цього генеруються команди, розраховані на обробку даних певних типів. Наприклад, для складання цілих чисел буде сгенерирована команда iadd, а для складання дійсних чисел подвійної точності - команда dadd.
Значення типу boolean представляються однобайтнимі цілими числа- ми і обробляються за допомогою відповідних команд.
Є ще два стандартних типи даних:
- Object - четирехбайтний посилання на об'єкт (масиви трактуються як об'єкти);
- ReturnAddress - четирехбайтний адресу повернення з методу.
Специфікації Java-машини не описують внутрішньої структури об- 'ектов. У реалізації Sun Microsystems значення типу object ука- викликають на описувач, який зберігає два посилання - на таблицю методів і на дані об'єкта. Можливі й інші уявлення.
Java-машина є 32-розрядної. Довші значення (Long, double) представляються як пара четирехбайтний величин. Чи не оговорівается, в якому порядку розташовуються елементи пари; більш того, верифікатор байт-кодів зобов'язаний виявляти і відкидати програми, які намагаються "вручну" складати довгі значення.

4.2.2.2. Регістри


В Java-машині повинні підтримуватися наступні регістри:
- Pc - лічильник команд; вказує на код операції для команди, яка буде виконуватися наступною.
- Vars - базовий регістр для доступу до локальних змінних те- кущего методу.
- Optop - покажчик на вершину стека операндів. Java-машина є при- ляется стекової, тому основна частина команд бере операнди з стека і туди ж поміщає результат.
- Frame - покажчик на структуру, яка містить оточення часу виконання.
У свою чергу, оточення часу виконання використовується для реалізації трьох цілей: динамічного завантаження, повернення з мето- дів і обробки виняткових ситуацій.
Для забезпечення динамічного завантаження, оточення часу виконан- гання містить посилання на таблицю сівмолов поточного методу і те- кущего класу. Перед початком виконання методу виконується ре- дактірованіе його зовнішніх зв'язків (налагодження посилань на зовнішні методи і зовнішні дані). Подібна пізня настройка посилань де- гавкає згенерований код стійким по відношенню до змін у зовнішніх класах.
Для забезпечення нормального повернення з методів виконується відновлення реєстрового оточення викликає методу.
Для обробки виняткових ситуацій Java-машина виконує прохід по стеку виклику методів і відшукує саму внутрішню конструкцію catch, обробну трапилося подія.
В принципі оточення часу виконання може містити до- Передачі інформацію, необхідну, наприклад, для налагодження, але в специфікаціях Java-машини це залишено на розсуд авторів реалізації.

4.2.2.3. Збір сміття


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

4.2.2.4. Система команд Java-машини


Команда Java-машини складається з однобайтное коду операції, за яким слідують операнди (якщо такі є). Можна виділити такі групи команд:
- Команди завантаження констант і змінних в стек операндів. Для кожного типу даних є свої команди завантаження. Наприклад, команда з кодом операції dload і операндом, що задає зсув, завантажує в стек з локальної змінної дійсне число подвійної точності, а команда aload робить те ж для посилання на об'єкт.
- Команди запам'ятовування даних з стека в локальних змінних.
- Команди управління масивами. Наприклад, команда newarray з операндом, що задає тип елементів, витягує з стека потрібний розмір масиву, створює його і поміщає в стек посилання на масив. Зазначимо, що для створення масивів з елементами-об'єктами слу- жит інша команда, anewarray. За рахунок подібної спеціалізації досягається ефективність інтерпретації Java-програм.
- Команди роботи зі стеком. До цієї групи відносяться команди, які видаляють, дублюють, міняють місцями верхні елементи стека операндів, а також виконують інші, більш складні мані- популяції зі стеком.
- Арифметичні команди. Операнди витягуються з стека; туди ж поміщається результат.
- Логічні команди (зсув, і, або, що виключає або).
- Команди перетворення до іншого типу.
- Команди передачі управління. Наприклад, в команді jsr (перехід на підпрограму) операндом служить відносна адреса переходу; адресу команди, наступної за jsr, поміщається на вершину стека операндів. Є команди для реалізації перемикачів.
- Команди повернення з функції. Для повернення результатів різних типів використовуються команди з різними кодами операції. Крім то- го, є команда breakpoint, яка зупиняє нормаль- ний хід виконання та передає управління обробникові цього со- буття.
- Команди маніпулювання з полями об'єктів (установіть/прочі- тать звичайне / статичне поле).
- Команди виклику методів. Їх чотири. Команда invokevirtual ви- зують (віртуальний) метод на основі аналізу інформації часу виконання. Команда invokenonvirtual здійснює виклик на ос- нове інформації часу компіляції - наприклад, виклик методу ро- батьківського класу. Команда invokestatic викликає статичний метод класу. Нарешті, команда invokeinterface викликає метод, представлений інтерфейсом. Виконання всіх перерахованих ко- манд пов'язано не тільки з передачею управління, але і з аналізом різного роду таблиць.
- Команда збудження виняткової ситуації - athrow.
- Інші об'єктні операції (створити об'єкт, перевірити тип об- 'екта).
- Команди сіхронізаціі (увійти в критичний інтервал, вийти з нього).
Ми бачимо, що не існує семантичного розриву між мовою Java і Java-машиною. Як уже зазначалося, це важливо для компакт- ності скомпільованих Java-програм і для забезпечення високої швидкості трансляції.

4.2.3. Java і безпека


Концепція завантаження об'єктів по мережі прозорим для користувача чином настільки ж приваблива, наскільки й небезпечна. Якщо не припускає- рінімать ніяких заходів і не накладати ніяких обмежень на можливості Java-аплетів, вхід на яку Web-сторінку може при- вести до непередбачуваних наслідків. На щастя, розробники мови Java з самого початку приділяли найпильнішу увагу питань інформацііонной безпеки.
З мови видалені багато потенційно небезпечні можливості, такі як оператор goto або тип даних "покажчик". Інтерпретується характер виконання дозволяє не допустити виходу за межі масиву, звернення по порожній посиланням і т.п. Свого часу за по- добная обережність виступав автор мови Паскаль Ніклаус Вірт, відзначали, що при традиційному підході програміст нагадує моряка, який носить рятувальний круг тільки на суші.
Ми, однак, не будемо докладно зупинятися на "звичайній" бе- пеки і приділимо основну увагу виконанню потенційно ворожих аплетов. Суміжний питання - перевірка справжності апле- тов, забезпечених електронним підписом, мабуть, буде вирішено в наступних версіях Java-систем.
Перш за все, аплетів, завантаженим по мережі, заборонені читання і запис файлів з локальної файлової системи, а також виконання мережевих з'єднань з усіма хостами, крім того, з якого був отримано аплет. Крім того, таким аплетів не дозволяється запус- кати програми на клієнтської системі (говорячи мовою ОС UNIX, для них недоступні системні виклики fork і exec), їм заборонено завантажувати нові бібліотеки і викликати програми, зовнішні по від- носіння до Java-машині.
Насправді, перераховані обмеження не є частиною специфікації Java-системи і можуть виконуватися з більшою або меншою акуратністю. Так, в Netscape Navigator 2.0 читання і запис локальних файлів дійсно повністю заборонені. У той Водночас, середа розробки JDK 1.0 компанії Sun Microsystems допускає завдання списку каталогів, з якими аплети можуть ра- ботати.
Більш точно, поза дозволеного списку каталогів аплет не може:
- Перевіряти існування файлів;
- Читати / писати / перейменовувати файли;
- Створювати каталоги;
- Перевіряти атрибути файлу - тип, час останньої модифікації, розмір.
Щоб у JDK зробити каталог доступним для аплета, слід по- відшкодувати в файл ~ / .hotjava / properties рядка виду
acl.read=/home/welcome
acl.write=/tmp
Перед початком роботи аплетів вони перевіряються верифікатором бай- т-кодів. Верифікатор переконується, що завантажений аплет соот- ветствует специфікаціям, заданим при компіляції викликає програми, що не порушений формат скомпільованого файлу, що немає переповнення або вичерпання стека, немає некоректних преоб- разованій типів, неправильних дій з регістрами і т.п. Всі ці перевірки верифікатор здійснює на основі аналізу потоків даних. Особливо ретельно перевіряються конструкції finally об- розробник виняткових ситуацій.
Слід зазначити, що вірний вибір балансу між можливостями завантажуваних аплетов та безпекою клієнтської системи є дуже тонким питанням. Ряд компаній, наприклад, Argus System Group, пропонують реалізувати на клієнтської системі посилені заходи безпеки, щоб успішно протистояти загрозам з боку ворожих аплетов без обмеження свободи дій для "благо- надійних "програм. На жаль, запропоновані рішення залежать від операційної платформи, що суперечить вимозі абсолют- ної переносимості Java-програм. Можна припустити, що інфор- маціонно безпеку ще довгий час буде залишатися одним з найбільш складних і спірних питань, що стосуються проекту Java.

4.2.4. Java WorkShop


В кінці березня 1996 року компанія Sun Microsystems оголосила про випуск версії 1.0 середовища розробки Java WorkShop. У цього середовища є два чудових властивості: вона повністю написана на язи- ке Java і має інтерфейс, витриманий в Web-стилі. На рис. y1 показаний вид екрану при роботі в Java WorkShop.
Рис. y1. Так виглядає екран при роботі в Java WorkShop.
Слід зазначити, що гіпертекстовий інтерфейс є, поже- луй, найбільш природним для інструментальних середовищ. Більше то- го, неявно він давно використовується, наприклад, при переході у включається файл або в місце помилки. Принципово важливо, що тепер гіпертекст став явною концептуальною основою.
Java WorkShop містить повний набір інструментів, необхідних для проектування, розробки, тестування, налагодження й опору- водіння програм. До його складу входять:
- Менеджер проектів - інструмент організації інформації, сос- тавляет проект, а також засіб специфікації оточення для проекту.
- Будівник - інструмент побудови результуючих програм проекту. Будівник відає перекомпіляцією файлів після вніс- ня змін, видачею гіпертекстового списку повідомлень про помилках і т.п.
- Публікатор - інструмент підтримки колективної роботи над проектами. Дозволяє організувати сховище проектів, наданих тавлять Web-сторінки проектів для використання іншими прог- раммістамі, здійснювати доступ до проектів колег, задавати права доступу до проектів.
- Переглядач аплетов - засіб контрольованого виконання Java-програм.
- Переглядач вихідних текстів - інструмент вивчення програм із урахуванням їх об'єктної структури.
- Редактор вихідних текстів. Редактор інтегрований з іншими компонентами Java WorkShop, а також з популярними системами уп- равленія версіями.
- Усунення несправностей. Крім традиційних можливостей, відладчик Java WorkShop дозволяє контролювати стан декількох потоків виконання, що необхідно для розвинених Java-програм. На рис y2 представлений образ екрана при роботі в відладчик.
Рис. y2. Так виглядає екран при роботі з відладчиком Java
WorkShop.
- Довідкова підсистема.
Java WorkShop може працювати як на платформі SPARC / Solaris і Intel / Solaris, так і під Microsoft Windows 95/NT. Якихось осо- Бих вимог до апаратури Java WorkShop не пред'являє. Дос- таточно 45 Мб дискового простору, 32 (для Solaris) або 16 (Для Windows) Мб оперативної пам'яті.
Чудово, як у правильно спроектованій системі различ- ні компоненти не просто ідеально підходять один до одного але й підсилюють міць один одного.

* 4.3. Зв'язок Java з оточенням: віконний інструментарій


4.3.1. Загальні положення


Одне з важливих переваг Java полягає в тому, що це не тільки мову, а й стандартизована об'єктно-орієнтована середу ви- нання. Цікаво простежити, як в рамках Java вирішуються тра- діціонние програмістські проблеми. Ми зупинимося на віконному графічному інтерфейсі.
Разом з різними приємними (головним чином для користувачів ля) властивостями, віконний інтерфейс привносить і досить неприємний- ві (для розробника) проблеми. Одна з них - це терпи- тість додатків між різними платформами. Переносимість є- ється проблемою і без графічного інтерфейсу, однак наявність такого робить її багаторазово складніше.
Справа в тому, що кожна віконна середу - це складний світ, зі сво- ними законами, набором будівельних блоків та прийомів програмування- вання. Motif не схожий на MS-Windows і віконну систему Macintosh. По-різному подаються примітивні елементи ін- терфейс, по-різному обробляються зовнішні події, по-різному проісжодіт малювання на екрані і т.д.
Разом з тим, за своєю суттю віконна середу - просто ідеальне поле діяльності для об'єктного програмування. Навіть людиною ку, недосвідченому в об'єктно-орієнтованих методах проектування- вання, ясно, що такі речі, як кнопки, текстові поля, меню, цілком заслуговують назви об'єктів, як би це слово ні поні- малось. Інакше кажучи, цілком зрозуміло, що таке "кнопка вооб- ще "," список взагалі "і т.д.
Все це дає підстави сподіватися, що за допомогою об'єктно-оріє- тованої підходу можна отримати по-справжньому високоуровне- вую і переноситься віконну середу, засновану на абстрактних ти- пах даних.
Дана особливість віконних середовищ проявилася, зокрема, в по- явище досить великої кількості різних класових біблії- набряк, "загортання" оригінальні віконні системи. В якості прикладів можна привести MFC, OWL, Zink і багато інших.
Ось і серед стандартних Java-бібліотек присутній AWT або Abstract Windowing Toolkit - абстрактний віконний інструменту- рий.
AWT є системою класів для підтримки програмування в віконної середовищі. Його "абстрактність" проявляється в тому, що все, залежне від конкретної платформи, добре локалізовано і спря- тано. В AWT реалізовані такі прості і зрозумілі речі, як кнопки, меню, поля введення; прості і зрозумілі засоби організа- ції інтерфейсу - контейнери, панелі, менеджери геометрії. Це добре видно на рис. x1.
Рис. x1. Основні елементи ієрархії класів AWT.
Всі залежності від платформи містяться в гілці, позначеної як Peer.
Далі ми розглянемо деякі особливості AWT, не претендуючи на повноту викладу. Наша мета - дати загальне ппредставленіе про тех- нології програмування графічного віконного інтерфейсу в середовищі Java.

4.3.2. З чого будується графічний інтерфейс (компоненти і

контейнери)
Якщо подивитися на будь віконне додаток, то легко побачити, що інтерфейсна частина складається з об'єктів, об'єднаних в групи. В AWT об'єкти називаються компонентами (насправді вони всі є спадкоємцями класу Component), а групи про- 'ектов реалізовані за допомогою так званих контейнерів. Отме- тім, що будь-контейнер - це теж компонента, тому групи об'єктів можуть бути вкладені один в одного. Як завжди, меню сто- ят особняком. Ієрархія компонент показана на рис. x2. (Автором цього і двох наступних малюнків є Charles L. Perkins,
clp@home.HarvardSq.com.)
Рис. x2. Ієрархія компонент AWT
На рис. x3 пояснюються позначення, використані на рис. x2.
До числа примітивних компонент відносяться:
- Button
- Checkbox
- Label
- List
- ScrollBar
- TextArea
- TextField
Основні контейнери:
- Dialog
- FileDialog
- Frame
- Panel
- Window
Взаємодія інтерфейсних компонент з користувачем реалізована вано за допомогою апарату подій, про який буде розказано ні- ж.

4.3.3. Як організувати інтерфейс


Ми вже відзначали, що інтерфейс складається з компонент, поміщених в контейнери. Однак, залишається відкритим питання про те, як раз- сполучати компоненти один щодо одного всередині контейнера. Наївний підхід (прийнятий, проте, у багатьох системах) полягає в завданні відносних координат компонент в кон- контейнера. Варіації цього підходу полягають, як правило, в можли- ності задавати різні одиниці довжини (пікселі, тисячні дюй- ма, "діалогові одиниці"). Недоліком подібної моделі размеще- ня компонент є те, що при перекладі програми на дру- гую платформу і навіть на інший комп'ютер, зовнішній вигляд додатку ня змінюється погано передбачувано.
AWT намагається вирішити дану проблему в такий спосіб. Якщо не можна уникнути змін зовнішнього вигляду додатків при запуску їх на різних платформах, треба постаратися хоча б зробити ці зміни передбачуваними і в деякому сенсі природними. Для проведення цієї програми в життя використовуються об'єкти під загальною назвою Layout (розташування). Layout керує тим, як компоненти будуть розташовуватися усередині контейнера, слідуючи певним принципам або рецептами.
Всього в AWT є 5 зумовлених розташувань:
- BorderLayout
- CardLayout
- FlowLayout
- GridLayout
- GridBagLayout
Їх розташування в ієрархії класів показано на рис. x4.
Рис. x4. Розташування і ієрархія класів AWT.
Розташування є прямими спадкоємцями класу Object і все реалізують протокол LayoutManager.
Об'єкт типу LayoutManager міститься в класі Container. В класі Container визначені 3 методи add, призначені для додавання нових компонент в контейнер. Куди саме буде до- Бавли компонента за допомогою методу add, залежить від конкретного типу LayoutManager даного контейнера. Для завдання LayoutManager є метод setLayout.
Розглянемо коротко, як працюють наведені вище схеми размеще- ня.

4.3.3.1. BorderLayout


BorderLayout ділить прямокутний контайнер на 5 прямокутних областей: північ, південь, захід, схід і центр:
[Image]
Компонента додається у відповідну область за допомогою ме- тода
add (string, component);
Приклад.
setLayout (new BorderLayout());
buttonN = new Button ("one");
add ("North", buttonN); / / ... додавання інших кнопок

4.3.3.2. CardLayout


[Image]
Контейнер складається з декількох площин. У кожен момент на- верху тільки одна площина. Таким чином, CardLayout предс- тавляет собою як би блокнот з багатьма сторінками. Сторінки позначаються за допомогою рядків.
Метод додавання компонент до контейнера:
add (string, component);
де string - ім'я "сторінки", а component - додається компо- ненту. Як правило, ці компоненти самі будуть контейнерами (Сторінка блокнота наврядчи буде складатися з однієї великої кноп- ки):
setLayout (new CardLayout ());
add ("one", create (new FlowLayout ()));
add ("two", create (new BorderLayout ()));
add ("three", create (new GridLayout (2, 2)));
add ("four", create (new BorderLayout (10, 10)));
add ("five", create (new FlowLayout (FlowLayout.LEFT, 10, 10)));
add ("six", create (new GridLayout (2, 2, 10, 10)));

4.3.3.3. FlowLayout


FlowLayout реалізує модель построчного заповнення контейнера. Після заповнення рядка починається наступна. При зраді- нии розмірів контейнера відбувається перерозподіл компонент по рядках.
[Image]
setLayout (new FlowLayout ());
add (new Button ("OK"));
add (new Button ("Cancel"));
add (new Button ("Resume"));
Нові компоненти додаються в контейнер за допомогою методу
add (component).
Ряди компонент можуть бути вирівняні вправо, вліво, або центри- рова.

4.3.3.4. GridLayout


Контейнер розбивається на клітини. Для цього задається число рядків і стовпців. При додаванні нових компонент, клітини заповнюються по рядках. Можливість робити пропуски відсутня.
Нові компоненти додаються в контейнер за допомогою методу
add (component)
[Image]
Приклад.
setLayout (new GridLayout (2, 3)); / / 2 рядки, 3 стовпця
add (new Button ("1"));
add (new Button ("2"));
add (new Button ("3"));
add (new Button ("I"));
add (new Button ("II"));

4.3.3.5. GridBagLayout


GridBagLayout дозволяє розділити контейнер на нерівні прямоу- гольние області. Це досягається за допомогою об'єднання сусідніх клітин в клітини більшого розміру. Крім того, GridBagLayout дозволяє заповнювати грати з пропусками. Конкретний алгоритм заповнення визначається об'єктом класу GridBagConstraints.
В об'єктах цього класу є більше 10 параметрів, визначаю- щих розміщення наступної частини. Програма, що використовує GridBagConstraints, може виглядати наступним чином:
GridBagLayout gridbag = new GridBagLayout ();
GridBagConstraints c = new GridBagConstraints ();
setLayout (gridbag);
/ / Встановлюємо характеристики
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
. . .
Button button1 = new Button ("1");
gridbag.setConstraints (button1, c);
add (button1);
. . . / / Тут можна змінити деякі установки / / Об'єкті класу GridBagConstraints, / / Наприклад
// c.fill = GridBagConstraints.NONE;
Button buttonX= new Button ("X");
gridbag.setConstraints (buttonX, c);
add (buttonX);

4.3.4. Події


В AWT, як і в інших віконних середовищах, події як програмні об'єкти відповідають зовнішнім подіям. Типовий приклад - натис- нення на кнопку, в результаті чого в AWT відбувається подія
ACTION_EVENT.
Таким чином, інтерактивна частина програм в AWT відповідає моделі програми, керованої подіями. Іншими словами, при- ложения або аплети повинні відслідковувати події та обробляти їх.
Розглянемо докладніше, як це відбувається в AWT. Кожен віконний інтерфейс можна розглядати як набір (можливо, вкладених один в одного) компонент. Коли відбувається подія, пов'язана з якимось елементом інтерфейсу (наприклад, кнопкою), то викликає- ся метод handleEvent. За умовчанням цей метод нічого не робить, а просто передає подія наверх, тобто того об'єкту, в кото- ром міститься ініціатор події (наприклад, охоплюючого вікна). Таким чином, якщо подія ніхто не перехоплює, воно досягнень- гает фрейма (якщо це додаток) або аплета.
Цей базовай механізм обробки подій при наївному застосуванні нав'язує програмістові одну з двох моделей обробки подій.
- По-перше, можна дозволити всім подіям спливати до самого верху і вже на рівні фрейму писати метод, який займається розбором і обробкою подій.
- По-друге, можна створити безліч спеціалізованих клас- сов, в кожному з яких перевизначений метод handleEvent.
Обидва цих крайніх підходу небездоганні. Перший сприяє на- писанню монолітних програм, другий призводить до дуже великим числу класів.
У реальному житті використовується компромісна ідеологія - handleEvent перевизначається для складових об'єктів, поєдную- щих кілька елементів інтерфейсу і відповідають за ясно визна- ленну частина роботи програми (наприклад, різного роду діалогу- ги).
Крім того, можливі й інші моделі обробки подій, направ- лені на краще отделенін логіки програми від її інтерфейсу. В Як один із прикладів реалізації альтернативної моделі можна вказати пакет "The Command Class for AWT objects", кото- рий написав Jan Newmarch, jan@ise.canberra.edu.au.

4.3.5. Методи класу Component, пов'язані з обробкою подій


Нижче перераховані методи класу Component, пов'язані з обработ- кой подій.
- PostEvent (). Цей метод, як правило, викликається автоматичні- ки при настанні відповідної події.
- Обробляються події за допомогою методу handleEvent (). За умовчанням цей метод, в залежності від типу події, викликає один із спеціалізованих обробників подій, таких як
- - action()
- - keyUp()
- - mouseDown()
- - gotFocus()
і т.д.
Метод handleEvent () може бути перевизначений. В цьому випадку, як правило, вся обробка відповідної події буде про- виходити саме в цьому методі, проте, якщо handleEvent () возв- ращается false, то викликається handleEvent () для контейнера, со- тримає цю компоненту.
Події в AWT представляються за допомогою об'єктів класу Event, в якому визначено такі змінні:
public Object target; / / ініціатор події public long when; / / час, коли подія відбулася public int id; / / тип події (KEY_PRESS, MOUSE_DOWN ...) public int x; / / координати public int y; / / курсора public int key; / / код клавіші public int modifiers ;/ / код модифікатора (control, shift ...) public Object arg; / / допоміжні дані public Event evt; / / поле для з'єднання подій в списки
Наведемо типовий приклад обробки подій, коли всі вони обра- ться на верхньому рівні (в даному випадку на рівні апле- та).
class MyApplet extends Applet {
. . .
public boolean action( Event evt, Object arg) {
. . .
if ((ev.target instanceof Button) && arg.equals ("OK")) { / / Виконати відповідні дії
. . .
return true;
} else { / / Інші випадки
. . .
}
. . .
return false;
}
. . .
}
У цьому прикладі, якщо ініціатор події має тип Button з име- ньому "OK", то виконуються відповідні дії і повертає- ся значення true, тобто подія далі не передається.
Інший спосіб обробити подія полягає в створенні спеціа- лізованої компоненти. Приклад.
class OKButton extends Button {
. . .
public boolean action (Event e, Object arg) { / / Виконати відповідні дії
. . .
return true;
}
}
Ми бачимо, наскільки глибоко продумана в проекті Java зв'язок з операційним оточенням. Вдалося досягти вдалого поєднання бо- багатства можливостей з переносимістю.

5. Joe - технологія зв'язування Java-програм

з об'єктними бізнес-додатками
Вище, в розділі "Java, Joe і NEO", ми писали про те, що новий продукт компанії SunSoft - Joe - покликаний здійснювати зв'язок між клієнтськими компонентами, написаними на мові Java, і об'єктними серверами додатків, створеними в середовищі NEO. При цьому Joe бере на себе всі (або майже все) технічні пробле- ми, пов'язані з роботою в розподіленої об'єктної середовищі, забезпе- печива в той же час для Java-програм повноцінне взаємодій- ствие з довільними об'єктними сервісами.
У попередніх випусках Jet Info була опублікована жартівлива "Ево- Люція програміста ". Ми додамо до неї ще два розділи. Перший з наведених нижче прикладів написаний на мові Java і можеі ис- користуватися у складі звичайних, локально працюючих аплетів.
1 import java.awt.Font;
2 import java.awt.Color;
3 public class JAVAhello extends java.applet.Applet {
4 Font f = new Font ("TimesRoman", Font.BOLD, 36);
5 public void init () {
6 resize (150, 25);
7 }
8 public void paint (Graphics g) {
9 g.setFont (f);
10 g.setColor (Color.blue);
11 g.drawString ("Hello, World!", 50, 25);
12 }
13 }
Тепер модифікуємо програму для Joe, щоб забезпечити можли- ність роботи в середовищі клієнт / сервер.
1 import sunw.services.*;
2 import java.awt.Graphics;
3 import java.awt.Font;
4 import java.awt.Color;
5 public class JOEhello extends sunw.services.JOEApplet {
6 sunw.corba.ObjectRef obj;
7 Hello.HelloWorldRef hiThere;
8 Font f = new Font("TimesRoman", Font.BOLD, 36);
9 public void init () {
10 super.init ();
11 resize (150, 25);
12 obj = find ("HelloWorldServer");
13 hiThere = Hello.HelloWorldStub.narrow (obj);
14 }
15 public void paint (Graphics g) {
16 g.setFont (f);
17 g.setColor (Color.red); / / Отримаємо рядок з віддаленого об'єкта, реалізованого на C + +, / / І виведемо її.
18 g.drawString (hiThere.sayHello (), 50, 25);
19 }
20 }
Пояснимо сенс нових рядків, що з'явилися в другому варіанті прог- Рамі.
У рядку 1 імпортується опис надаваних об'єктних сервісів.
У рядку 5 оголошується, що клас Hello буде спадкоємцем
JOEApplet.
У рядку 6 декларується узагальнена (не типізована) посилання на NEO-об'єкт. Вона буде використана для збереження результату пошуку об'єкта по імені.
У рядку 7 описана типізована посилання на NEO-об'єкт, яка буде використовуватися для маніпулювання віддаленим об'єктом (в Зокрема, для виклику методів) засобами мови Java.
У рядку 12 ми отримуємо від служби імен NEO посилання на потрібний нам серверний об'єкт.
У рядку 13 виконується операція приведення узагальненої посилання до типизированном увазі.
Нарешті, у рядку 18 виконується виклик методу віддаленого об'єктом та, написаного, взагалі кажучи, не на мові Java (наприклад, на C + +). Втім, вид цього оператора не залежить ні від удаленнос- ти, ні від мови реалізації об'єкта.
Процес розробки програм в середовищі Joe досить простий. Він сос- тоит з наступних етапів:
- Трансляція інтерфейсу до NEO-об'єктів, написаного на мові IDL (Interface Definition Language), в клас на мову Java. Цей етап підтриманий входять до складу Joe компілятором IDL - Java. Результат трансляції містить сурогатні методи, які під взаємодії з брокером об'єктів забезпечують взаємодію з віддаленими об'єктами, не відрізняється від локального випадку. В свою чергу, брокер об'єктів, що входить до складу Joe, прозорості- вим для клієнтської сторони чином завантажується в WWW-навігатор разом з Java-аплети.
- Написання клієнтського коду на мові Java з використанням згенерованого інтерфейсу і засобів Joe для взаємодії з віддаленими об'єктами.
Далі Java-програма компілюється і виконується звичайним обра- зом.
Підкреслимо, що описана об'єктна середу забезпечує повно- цінне, двостороння взаємодія між клієнтом і сервером. Зокрема, вилучені серверні об'єкти можуть викликати методи в об'єктах-клієнтах. Для забезпечення цієї можливості в складі Joe є транслятор Java-класів в IDL-інтерфейси.

6. Висновок


Інтранет і Java - ось два ключові слова, які символізують сов- ремінний етап розвитку інформаційних технологій. Інтранет поз- воля переглянути підхід до користування інформаційними ресур- самі, що у величезній мірі збільшує продуктивність праці окремих працівників і компаній в цілому. Крім того, тех- технологій Інтранет дозволяє домогтися небаченої раніше масштаби- руемості - від локальної мережі до Інтернет.
Java знімає обмеження Web-сервісу, роблячи останній інтерактивне- нормативним і об'єктно-орієнтованим. Java вводить новий - абсолют- ний - стандарт на переносимість програмного забезпечення. При- мечательно, що безпрецедентні за своєю потужністю можливості вво- дятся при повному збереженні інформаційної безпеки.
У поєднанні з продуктами Sun Microsystems - Joe і NEO - Java забезпечує поширення концепції Інтранет на довільні сервіси, що відкриває реальну можливість створення корпоратив- тивних інформаційних систем нового покоління.


Артур ван Хофф отримав освіту в Голландії, потім працював в провідних європейських комп'ютерних компаніях. Протягом трьох років, починаючи з 1993 року, працював в Sun Microsystems. Артур ван Хофф брав участь у розробці мови Java, в проектуванні програмного інтерфейсу для додатків на Java, їм написаний пер- вий Java-компілятор на мові Java.
У 1996 році він і його колеги Семі Шайо і Кім Корисний утворили незалежну компанію з наміром розробляти програмне забезпечення на Java.
Артур ван Хофф бере активну участь у популяризації Java, він бере участь в найбільш відомих конференціях і є авто- ром низки статей і готується до видання навесні 1996 року книги
"Hooked on Java".
Питання. Internet, Web і Java є зрушення парадигми в інформаційних технологіях. Громадська реакція на цей зрушення не має прецендент в комп'ютерній індустрії - провідні компанії оголосили про підтримку Java, на цю тему в комп'ютерній і діловій пресі було опубліковано неймовірну кількість ста- тей, вартість акцій тих компаній, які пов'язані з цими тех- нології, різко підскочила, технічні керівники банків та великих корпорацій підтримують застосування Java в пілотних про- єктах.
У той же час всі існуючі сьогодні програми цих техноло- гий обмежені в основному невеликими завданнями, такими як мар- кетингу в Internet, поширення інформації, Java-ігри і т.д. І навіть передбачувані в майбутньому програми не відрізняються ради- кальной новизною.
Що ж особливого в цих технологіях, ніж можна насправді пояснити ті реакцію та інтерес, які ми можемо спостерігати се- годні?
Відповідь. Соврешенно очевидно, що Java і Internet представляють собою цілий світ нових можливостей для комп'ютерної індустрії, однак існуючі сьогодні програми поки залишаються простими, бо ще немає відповідного досвіду у вирішенні деяких внутрішніх проблем. Тим не менш, ринок дуже швидко зсувається в напрямку цього нового світу, щодня оголошуються нові продукти і технології. Саме це і свідчить про те, що Java і Internet представляють собою величезний зсув парадигми, створює нові можливості. Ця подія порівнянне за масштабом з поява пероснальних комп'ютерів, але сьогодні воно захопило всіх набагато швидше.
У чому ж специфіка Java і Internet? Я думаю, що вони в змозі нии забезпечити комп'ютерної індустрії і користувачам саме те, чого ті завжди чекали: простий доступ до необмежених об- 'емам інформації та додатків.
Питання. Як будь-яка технологія, Java має союзників і оппонен- тов. Хто, на Вашу думку, становить найбільшу небезпеку для майбутнього Java (продукт, компанія або хтось особисто)? Які можуть бути відповідні конкуруючі починання оппонетов Java?
Відповідь. Найбільша небезпека полягає в тому, що в найближчі роки ми повинні прийти до нового середовища, цілком написаної на Java, але з бібліотеками від різних постачальників. Це означає, що ми напів- чім лише новий, поліпшений мову реалізації і нічого більше. За- дача ж полягає в тому, щоб створити загальноприйняту середу, не за- висить від платформи.
У той же час, було б нерозумно з мого боку, будучи стронники Java, ділитися з моїми опонентами ідеями про те, як будувати атаку на Java, чи не так?
Питання. Яким буде вплив зсуву комп'ютерної парадигми, представленої Internet, Web і Java, на основних дійових осіб поточної прадігми (IBM, Sun, HP, DEC, Compaq, Oracle і дру- гих)?
Відповідь. У сучасних умовах покупка комп'ютера призводить до по- життєвої необхідності для власника купувати програмне забезпечення у одного постачальника. Це не може тривати бесконеч- але. Якщо всі комп'ютери зможуть виконувати будь програмне забезпе- печення на Java, то замок, у вигляді прихильності до певної платформі, буде знято і такі монополісти, як Microsoft, будуть змушені битися на рівних з більш дрібними фірмами. Таким чином буде вирівняно ігрове поле і виникне середу з біль- шими можливостями для конкуренції, а результатом, в остаточному підсумку, будуть продукти кращої якості, більшою мірою ори- ентірованние на споживача.
Питання. Росія, поряд з Китаєм та Індією, - одна з країн, хо- рошо відомих високим профессинальной рівнем програмістів. До сожалаенію, російські програмісти запізнилися до першої хвилі "Гаражних комп'ютерів" на початку 80-х років. Потім настала по- Лосано домінування на ринку великих компаній, потрапити на ринок і добитися якихось успіхів стало практично неможливо. Широ- до поширена думка про те, що з приходом Java виникне нова хвиля "гаражного програмування", і в ній зможуть прийняти участь і російські програмісти. Яке, на вашу думку, напрям у програмних продуктах і додатках на Java най- більш перспективно для "гаражних програмістів"?
Відповідь. Саме сьогодні попит на Java-програмістів чудовисько. Глобальність Internet надає будь програмісту можливість пре- тендовать на участь в будь-якому проекті, в будь-якій частині світу на рівних. Що нам реально потрібно, так це всесвітні організації розробників, які допомагали б окремим програмістам участовать в різноманітних проектах.
Питання. Які нові технології привнесе з собою Java?
Відповідь. Поява нової мови дає можливість, придбавши новий досвід, спроектувати заново існуючі прикладні програмні інтерфейси, наприклад, для 3D-програмування. Використовуючи Java, можна побудувати об'єктно-орієнтовані і багатопотокових 3D- бібліотеки, які на інших язиах реалізувати складно. Сущест- вующие бібліотеки складаються з сотень викликів функцій і тому ними складно керувати. Якщо переписати їх на Java, то 3D-прог- раммірованіе стане набагато доступнішим для рядових програміста- тов.
Питання. Сьогодні про Internet, Web і Java пишуть багато, і комп'ютерах терни професіонали, і журналісти. Ви - один з основних учасників проекту Java і володієте унікальною можливістю побачити виникають при цьому проблеми. Чи є щось суттєво- ное, що інші люди втрачають або недостатньо розуміють в цих техноло- гіях, в їхній вплив на комп'ютерну індустрію і на наше життя взагалі?
Відповідь. Мабуть головне, чого не вистачає, так це захопленості по відношенню до Java. Поява нового універсально мови для Internet - гігантський прорив вперед. Відкриваються можливості можна порівняти тільки з появою персональних комп'ютерів. Саме тому ми вирішили піти з Sun для того, щоб створити власну фірму і писати програмної забезпечення на Java.
Питання. Netscape і Microsoft борються за лідерство на ринку Web- навігаторів. Netscape володіє 70% цього ринку, а Microsoft - головний гравець на ринку програмного забезпечення для персональні них комп'ютерів. Цілком очевидно, що в цій битві для третій компанії місця не залишається. У той же час Sun разраба- ють HotJava - свій власний Web-навігатор. Може бути, існує щось таке, чого ні Netscape, ні Microsoft не ви- дять сьогодні або в майбутньому, що забезпечить Sun перемогу?
Відповідь. Як колишній керівник проекту HotJava, я відчуваю, що у HotJava є хороші шанси стати значною силою в Internet. І Netscape Navigator, і Internet Explorer стають дуже складними, вони більше не відповідає простим запитам середніх користувачів. З навігатором HotJava Sun повертає си- туацію на землю, пропонуючи продукт, повністю написаний на Java. Саме завдяки простоті і можливості для розширення, заснованих на використанні Java, він придбає значні переваги в порівнянні з конкурентами.
Питання. Що стане наступною дествітельно ВЕЛИКОЇ річчю в ін- формаційних технологіях після Internet, Web і Java?
Відповідь. Поки Internet - це пристрій для поширення ін- формації. Наступна революція відбудеться тоді, коли в Internet увійдуть технології для коммункацій в реальному часі, такі як телефонія, відео і віртуальна реальність. Розвиток йде дуже швидко і чекати доведеться не так вже довго!
Питання. Ваш улюблений сорт кави?
Відповідь. Вже звичайно не OLE!

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


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

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

Ваш отзыв

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

*

*