1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | Оглавление текущего номера /138, 1996 г./ | Бонус | Поиск  

Тема номера

Подогретый кофе

Александр Звозин


© 2004, Еженедельник «Компьютерра» | http://www.computerra.ru/offline
Этого материала на сайте "Компьютерры", к сожалению, нет

Не так давно, приблизительно год назад, Sun Microsystems официально представила свою новую программную технологию Java. За год она приобрела мало с чем сравнимую популярность, которая продолжает устойчиво расти. Несколько номеров назад Сергей Королев открыл эту тему для "Компьютерры", наметив основные вехи статьей "Горячий кофе за 55 минут"; давайте продолжим знакомиться с этой увлекательной технологией.

Прежде всего, об одном недоразумении Часто путают Java и Hot Java. Дело в том, что Java-название собственно технологии и, в частности, языка программирования, a Hot Java – это WWW-браузер, налисанный на Java с целью демонстрации возможностей языка. Эти два названия часто употребляют вместе, к тому же Hot Java входил в комплект альфа- и бета-версий JDK (Java Development Kit), что еще больше усугубляло путаницу.

Чем же Java так поразила мир? Ничего принципиально нового эта технология собой не представляет основной идеей являются вычисления, распределенные по гетерогенным окружениям. Реализуется это с помощью P-Code интерпретации машинно-независимых кодов на виртуальной машине. Текст на языке Java компилируется в байт-коды и исполняется с помощью виртуальной машины, тем самым устраняются различия в архитектуре процессоров и операционных систем (как то Little-Big Endian различия, механизм доставки сообщений к окнам и т. д.). Виртуальная машина, в свою очередь, является приложением соответствующей операционной системы, обеспечивая Java-программе интерфейс к функциям ОС. Конечно, интерпретация байт-кодов забирает довольно много времени при исполнении приложения, но зато одно и то же приложение может исполняться на большом числе аппаратных платформ без каких бы то ни было изменений. Кроме того, интерпретация не является единственной техникой исполнения байт-кодов существует еще компиляция "на лету", а если вам совсем уж невмоготу, можете перекомпилировать байт-коды в коды, естественные для данного процессора и ОС. Согласно наблюдениям бета-тестеров, скорость исполнения одной и той же программы в виде байт-кодов в виртуальной машине и в виде "натурального" кода различается примерно в 10 раз звучит это гораздо хуже, чем есть на самом деле.

Однако сегодня пыль стоит столбом именно вокруг интерпретируемых байт-кодов, и связано все это с понятием "программирование в Internet". До сих пор основным путем распространения программ по Internet являлся старый добрый FTP, но Java предлагает принципиально новую идеологию. Использование FTP помимо искомого software приносило немало головной боли тем, кто вместе с кодом "подхватывал", например, какой-нибудь малоприятный вирус, а избавиться от риска было невозможно. Какую модель предлагает взамен этому Java, вы наверняка уже можете представить себе сами вы "снимаете" из WWW программный код, который исполняется на изолированной виртуальной Java-машине и, отработав, пропадает. При должном уровне безопасности апплет просто не в состоянии будет нанести вашей системе хоть какой-нибудь вред, и именно этому разработчики уделили особое внимание. Безопасность исполнения кода – основная изюмина технологии Java.

В JDK существуют два понятия для обозначения программ на Java "application" и "applet", и они обозначают принципиально различные вещи. "Application" уже давно принято переводить как "приложение", и этот термин обозначает обычное приложение, которое написано на Java "Applet", в свою очередь, является уменьшительно-ласкательным для "application", точного перевода не имеет называют "это" то "апплеткой", то "апплетом". Которое из названий правильнее, решить не так-то просто, так как в английском языке понятия рода по сути нет. Я решил писать"апплет".

"Апплет" как раз и есть приложение, "снятое" из Internet. Что именно разрешено, а что запрещено апплету, решает виртуальная машина, но общепринятыми для WWW-браузеров, понимающих Java, являются запрет на любой доступ к файловой системе клиента, будь то чтение или запись, запрет на доступ к серверам Internet, отличным от сервера-источника апплета, запрет на запуск приложений на клиентской машине и запрет на определение методов и загрузку библиотек. Будучи практически полностью изолирован от клиентской машины, апплет при этом может ограниченно общаться со своим "сервером-хозяином", с которого он был "снят", с запущенными на нем Java-процессами и с виртуальной машиной клиентского браузера.

Такая модель распространения кода по глобальным сетям появилась настолько вовремя, что заинтересовала буквально всех. Очень многие software houses вступили в гонку за Java, стремясь занять достойное положение в новой области – Borland, Symantec, Netscape, многие другие начали разрабатывать свои аналоги этой технологии. Например, Билл Гейтс, любитель языковых технологий, неоднократно заявлял, что появление нового языка программирования, даже и Р-интерпретируемого, является внутренним делом сообщества программистов и нечего-де выносить сор из избы. Однако тем временем слухи о том, что Microsoft втихую разрабатывает свой аналог Java на базе Visual Basic, подтвердились следующий Visual Basic действительно будет снабжен инструментарием для программирования по Java-подобной технологии Internet Basic.

Сейчас на платформе Win32 для разработки на Java уже доступны Sun JDK, Symantec Cafe for Windows, RogueWave JavaTech, и скоро станет доступен Borland C++5.0, включающий в себя компилятор Java в коды процессоров i86 для Windows, отладчик(написанный целиком на Java) и прочий инструментарий для разработки приложений на Java. Как видите, у вас уже есть масса возможностей для практики, так что давайте вместе пройдем путь создания первого апплета на Java (традиционного "Hello, World", конечно :-) и заодно узнаем многое о языке и библиотеке классов JDK.

Язык

По словам Артура ван Хоффа, одного из членов группы разработчиков технологии, "можно сказать, что язык Java создавался под девизом "Давайте разберемся со всем устаревшим, дурацким и вредоносным мусором в C++!" Язык, который начал создаваться в 1990 году на базе C++, не был отягощен необходимостью сохранять полезными миллионы строк кода, поэтому все мешавшее и вредное просто вышвырнули, а основными критериями при отделении "зерна" от "плевел" сделали безопасность, удобство и красоту.

Получился потомок, похожий больше на пращуров – Objective С, Smalltalk, – чем на родителя. Вся семантика языка строится на понятии класса все функции являются методами классов, в том числе и метод mam() класса приложения, унаследованного от класса Application или Applet соответственно, сама программа также является классом, даже файлы с байт-кодом имеют расширение "class". Это автоматически упразднило ненужные более struct и union, так как понятие класса вобрало в себя все виды объединений примитивных данных Понятие string также было вынесено из семантики языка в стандартную библиотеку классов (в Java библиотеки классов называются packages), "встроенными" остались только простейшие типы вроде mt, char, float и т.п. При этом был введен жесткий контроль над типами, и сами типы стали абсолютно однозначно определенными, а не "не-меньше-не-больше", как в C++. При попытке надуть компилятор присваиванием несоответствующих типов вы вместо результата получите ошибку при выполнении.

Требования удобства и безопасности буквально вынудили разработчиков лишить будущих Java-программистов любимой игрушки C++ – адресной арифметики. Все объекты передаются в функции по ссылкам, но явно понятие указателя не выражено нигде. Конечно, понятие ссылки на объект осталось, но оно реализуется с помощью механизма object handlers, над которыми не позволено производить никаких арифметических операций вообще. Таким образом, если вы захотите создать ссылку на некую область памяти безотносительно к тому, кто ее в этот момент занимает, вряд ли у вас что-нибудь получится. Это убивает двух зайцев одним ударом хакеры-профессионалы не очень-то смогут залезть в чужую память, а начинающие программисты избавлены от самого трудноуловимого сорта ошибок -ошибок в адресной арифметике.

Виртуальная машина Java сама собирает ваш мусор, поэтому отпала нужда в операторе delete, так же как и в деструкторах. Вам гарантировано, что, когда вы покинете блок кода, в котором создан экземпляр объекта, Java за вами "подметет", и драгоценная память не будет занята ненужными более объектами. Существует и еще несколько небольших различий например, инструкция "goto" является зарезервированным словом Java, но не поддержана никаким кодом и не может быть использована при программировании, передача в функции переменного числа параметров (в C++ этот механизм называется varargs) не разрешена, существует также несколько уникальных служебных слов вроде "finally", описывающего границу фрагмента кода, который освобождает ресурсы после применения "try", некоторые операторы C++ устроены в Java чуть иначе.

В общем, в Java все уже очень хорошо знакомо, но все немножко не так. И прежде всего, Java вынуждает думать в категориях объектов, а не операторов, что может составить проблему для людей, закосневших в С и Pascal. Впрочем, Java настолько прост и так легко читается (в сравнении с C++), что "ломка" не должна занять много времени. И затем, Java предоставляет программисту еще одно могучее и опасное средство потоки (threads) Средства ветвления программ на потоки предоставляют возможности исполнять разные куски кода одновременно, синхронизируя их, если необходимо. Потоки известны как одна из самых "каменистых" областей программирования мультизадачных систем, и создатели Java сделали все возможное, чтобы пользоваться этим механизмом было как можно легче Интересная деталь в качестве модели для потоков Java специалисты Sun выбрали потоки Windows NT! Почему не потоки Solans? Дело в том, что встроенные в Solaris средства мультипоточности настолько мощны и сложны, что представляются избыточными для интерпретируемой системы Поэтому создатели Java разработали свои механизмы.

Итак, первое представление о языке нами получено. А за этим практически всегда следует одна и та же фраза на мониторе, будь то в окне Windows или в текстовом режиме DOS.

 

Здравствуй, Мир!

 

import Java.awt.Graphics;

public class HelloWorld extends Java.applet.Applet {

public void init()

{

resize (150, 25);

}

public void paint()

{

g.drawString( "Hello, World!", 50, 25);

}

}

 

Так выглядит текст нашего первого апплета "Hello, World1" После компиляции вы получите класс-файл HelloWorld class, который вам нужно будет включить в HTML-файл следующего вида:

<HTML>

<HEAD>

<TITLE> The Hello World applet <TITLE>

</HEAD>

<BODY>

 

Here's the output:

<APPLETCODE = "HelloWorld.class"WIDTH=150HEIGHT=25>

</APPLET>

</BODY>

</HTML>

 

Загрузив этот HTML в браузер, оснащенный интерпретатором Java (Netscape 2 0 или HotJava, например), вы с гордостью увидите плод своих трудов ваш первый апплет скажет: "Здравствуй, Мир!" Полюбуйтесь вдоволь, а затем давайте приступим к разложению по костям механизма работы апплета.

Тяжелая жизнь апплета

Первые две строки текста апплета очень мило символизируют легкую читаемость Java. Первая строка означает, что апплет собирается пользоваться библиотекой Graphics из AWT (Abstract Window Toolkit – этот package инкапсулирует абстрактный кросс-платформенный оконный интерфейс, скрадывая различия между XWindow, Windows и МасОреn. Вторая строка объявляет класс апплета, наследующий (дословно "расширяющий") базовый класс Applet Согласитесь, ведь так читать удобнее, чем пользуясь синтаксисом C++?

Следующие четыре строки текста "переопределяют" виртуальный метод mit(), находящийся в классе Applet В жизни каждого апплета существуют межевые столбы (создатели назвали это milestones) вроде загрузки, запуска, останова или окончания, которые отражены в виртуальных методах класса Applet Наш первенец переопределяет только метод imt(), ответственный за инициализацию апплета каждый раз, когда апплет загружается и запускается, вызывается этот метод.

В этой группе методов есть еще три – start(), stop() и destroy!) Метод start() предназначен для подготовки к запуску апплета. Мы не переопределяли этот метод, так как наш апплет фактически ничего не делает событий не обрабатывает, вычислений не производит, а только сообщает миру о своем существовании. Если же вы пишете апплет, выполняющий какие-либо полезные функции, то вам придется переопределять метод start(). В принципе, вы можете всю функциональность апплета прописать в своей реализации этого метода, но это некрасиво, и чаще делают по-другому в методе start() создают экземпляр класса, который с помощью своего метода типа mam() и выполняет то, что программист желает.

Методы stop() и destroy() предназначены для остановки и/или завершения апплета Метод stop() всегда вызывается до destroy(), и в принципе особой необходимости в destroy() нет. Однако те апплеты. которые должны перед завершением освободить экстра-ресурсы, могут сделать это, переопределив destroy(). А метод stop() как раз и выполняет всю основную работу по остановке апплета. Например, если апплет предназначен для демонстрации графики, вряд ли стоит заставлять его работать, когда окно браузера закрыто другим окном или когда пользователь покинул родную страницу апплета. В таких случаях и вызывается stop(). Переопределив его, вы получите контроль над тем, как закончит свою жизнь ваш апплет.

И последние четыре строки текста, разумеется, перегружают метод pamt(). Этот метод является основным способом рисовать, доступным апплетам. Класс Applet наследуетего от класса AWT Component. Вместе с paint() для повышения производительности можно применять метод update(), который родом оттуда же.

Так, если вкратце, устроен наш новорожденный апплет. Механизмы, на которые опирается его работа, еще не оформились окончательно, но все же стоит уделить им немного внимания.

UI

Это аббревиатура User Interface – термин, которым разработчики обозначают комплекс взаимоотношений человека с апплетом или приложением. Сюда входит не только стандартный GUI, но и классический текстовый stdin/stdout, возможность сохранять параметры состояния при останове (этот механизм называется properties), звук. На данный момент "отточен" только GUI, представленный в Java абстрактным набором оконных классов AWT, а все остальные элементы UI оставлены "для дальнейшей документации". С помощью AWT апплеты и приложения получают возможность пользоваться оконным интерфейсом.

AWT – средства для работы с абстрактной моделью оконного интерфейса, совместимой логически со всеми операционными окружениями, на которых существует реализация Java. В набор стандартных примитивов-элементов интерфейса входят кнопки, checkboxes, списки двух сортов (choices и lists), меню и текстовые поля. Помимо них есть еще несколько примитивов, а также контейнеры для образования сложных классов, применимых на практике. Центральный класс библиотеки Component содержит все виртуальные методы, необходимые для прорисовки элементов интерфейса и обработки сообщений (кстати, на данный момент метод handleEventf) позволяет обрабатывать только сообщения от мыши, но не от клавиатуры). Эта библиотека была одним из "камней преткновения" при разработке проекта, так как существуют принципиальные сложности с тем, чтобы "загнать в одну упряжку" механизмы обработки сообщений Windows 3.1 и XWindow, например. Нынешняя реализация AWT все еще достаточно "сыра" и, вероятно, сильно изменится.

Обструкция

Как видите, очень многое в библиотеке классов, без которой в Java жить невозможно, до сих пор еще не готово к серийному употреблению. Даже такие ключевые моменты, как механизм обработки сообщений, еще "сыры".

Но вы не потратите время зря, если возьметесь изучать Java более детально: Java уже портирован в Wm95/WmNT, MacOS, и в Sun, конечно же, в различных стадиях находятся проекты создания компиляторов и виртуальных машин еще для двух десятков платформ – Linux, Amiga, SCO и т.д. И даже если Java не станет стандартом (хотя все к тому идет), то по крайней мере займет достойное место среди программных технологий Internet, и вам волей-неволей придется с ним ознакомиться поближе

В этой статье не были даже затронуты вопросы написания обычных приложений (applications) на Java, так что дерзайте и получайте удовольствие от красоты и удобства языка. Как говорил все тот же ван Хофф: "Я не помню, когда я в последний раз был вынужден писать на C++, но помню, что это было очень болезненно". Команда разработчиков уже написала около 700000 строк кода на Java.

 

 


1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | Оглавление текущего номера /138, 1996 г./ | Бонус | Поиск  

© 2004, Издательский дом «Компьютерра» | http://www.computerra.ru
Телефон редакции: (095) 232-22-61
E-mail редакции: inform@computerra.ru