Технологии
Java и Juice: дуэль технологий?!
Руслан Богатырев
Итак, что бы вы предпочли: чашечку ароматного черного кофе или стакан свежего яблочного сока? Когда как.
Хотя... а причем здесь сок?
Все очень просто: в пышущей ароматом чашечке кофе многие программисты с недавних пор сразу безошибочно угадывают символ Java. А стакан сока – это символ новой Web-технологии с именем Juice (сок). И ныне она бросает смелый вызов самой Java.
Что такое Juice? И чем эта технология превосходит то, что нам знакомо по миру Java? Давайте попробуем в этом разобраться.
Технология Java, разработанная в стенах Sun Microsystems, опирается на новый язык объектно-ориентированного программирования Java. Во главу угла здесь ставятся два основных принципа – независимость от программно-аппаратной платформы (ОС + процессор) и безопасность (надежность) создаваемых приложений. Первый принцип реализуется через механизм виртуальной Java-машины (Virtual Java Machine) и через недавно анонсированную операционную систему JavaOS. Второй – прежде всего за счет языка Java (строгая типизация, запрет адресной арифметики, пакеты, автоматическая сборка"мусора"). Уникальность и неповторимость Java – это один из главных мифов, связанных с этим языком и технологией. Он настойчиво вбивается в умы программистов и пользователей на протяжении всех тех полутора лет, как официально появился на свет язык Java. Что ж, удивляться этому не приходится, подобные утверждения – всего лишь один из приемов в рекламной кампании по раскрутке Java-технологии. Факт остается фактом: в языке Java нет явных средств, обеспечивающих динамическую подгрузку и исполнение программных агентов на произвольной архитектуре. Это заложено в Java-технологию, а потому ряд уже существующих языков может быть безболезненно переориентирован на поддержку подобных схем!
Более того, уже разрабатывались схожие технологии, которые лишь в силу своего экспериментального характера не были известны широкой общественности. Технология Juice – один из весьма показательных примеров. Juice опирается не на Java, а на язык Oberon, который был разработан швейцарским профессором Никлаусом Виртом (Nik-laus Wirth), автором языков Pascal и Modula-2, еще в 1988 году. С тех пор Oberon прошел весьма серьезную обкатку, появилась более совершенная модификация Oberon-2, за последние пять лет он распространился в виде коммерческих систем программирования на большинстве известных платформ (DOS, Windows 3.x, Windows 95, Windows NT, OS/2 Warp, VAX/VMS, Alpha AXP OpenVMS, Linux, NeXT, IBM AIX, HP-UX, SunOS, Solaris, IRIX, MacOS и др.). С точки зрения надежности и безопасности исполняемых приложений язык Oberon ни в чем не уступает языку Java. И запрет адресной арифметики, и строгая типизация, и модульная инкапсуляция, и автоматическая сборка "мусора", и даже динамический контроль типов – все это было предусмотрено в языке с самого его рождения. А с точки зрения модульного и объектно-ориентированного программирования он выглядит куда более простым, лаконичным и сбалансированным.

Язык Oberon опирается на операционную систему с именем Oberon, которая так же, как и Java-OS, обеспечивает прослойку между приложениями и программно-аппаратной платформой. Система Oberon позволяет работать как на "голом" оборудовании, так и поверх уже существующей ОС. Помимо этого она обладает целым рядом новаций в области пользовательского интерфейса и в области интеграции программных компонентов и составных документов. Важным достоинством языка и системы Oberon является стабильность спецификаций (за прошедшие годы изменения были минимальными), полная открытость исходных текстов операционной системы, всех некоммерческих библиотек, компиляторов и конверторов. Для максимальной эффективности работы Oberon-приложений была построена Oberon-ориентированная архитектура, нашедшая свое воплощение в экспериментальных компьютерах Ceres. Наконец, ведущим центром поддержки Oberon является не промышленная фирма, а один из известнейших университетских центров Европы – Институт компьютерных систем ЕТН в Цюрихе.
Все это замечательно, но каким же образом достигается независимость от платформы, и как приложения на Oberon'e могут выполняться в среде Internet/intranet? Вот здесь-то и заключена изюминка технологии Juice. Да простит меня читатель за ряд технических подробностей, но если вам интересно разобраться в сути явления, придется немного сконцентрировать свое внимание. Давайте ненадолго вернемся к технологии Java.
Истинные приложения (applications) и мини-приложения (applets) языка Java перед своим выполнением проходят определенный путь преобразований. Сначала исходный текст с помощью специального конвертора (Java Compiler) транслируется в байт-код Java. Затем этот линеаризированный объектный код попадает в виртуальную Java-машину, которая и привязывает его к конкретной платформе. Но это еще не все. Здесь включается в работу загрузчик байт-кодов (Bytecode Loader). Затем загруженный код проходит своеобразное "чистилище" – специальный верификатор байт-кодов (Bytecode Verifier). Ведь в ходе передачи по каналам связи Internet/intranet возможно случайное или умышленное искажение объектного кода. Наконец, когда верификатор дает "добро", можно автоматически запускать интерпретатор байт-кода.
На самом деле истинная картина выглядит несколько сложнее1. Но и без того легко видеть, что верификация кода и его интерпретация являются наиболее узкими местами в реализации технологии Java. Насколько неуязвимым (в смысле информационной безопасности) является верификатор байт-кода, и как быстро может выполнять свою работу интерпретатор виртуальной машины? Для тщательной проверки верификатору придется проанализировать весь код, причем весьма замысловатым образом. Что касается интерпретатора, то он, как и следовало ожидать, работает крайне медленно. Это давно уже ни от кого не скрывают. Справедливости ради надо сказать, что здесь проблема уже частично решена за счет пост-компиляции: специальные just-in-time компиляторы разных фирм преобразуют байт-код в истинный исполняемый код конкретной платформы. Одна-
ко многого добиться столь замысловатый технологический путь все равно не позволяет.
Что касается технологии Juice, то она идет несколько иным путем. В основу положена динамическая кодогенерация по схеме Франца -один из побочных результатов проекта Oberon. В 1994 году Михаэль Франц все в том же институте Вир-та (Institute for Computer Systems, ETH Zurich) защитил диссертацию на тему "Динамическая (on-the-fly) кодогенерация – ключ к переносимому программному обеспечению". Идея состоит в том, что компилятор (причем не обязательно языка Oberon!) транслирует исходный текст в компактный промежуточный коддревовидной структуры, построенный на принципе семантического словаря.В отличие от известного с начала 70-х годов байт-кода здесь, как ни странно, одновременно достигается куда более высокая плотность кода и при этом не теряется (как в случае байт-кода) высокоуровневая информация о структуре программы, которая крайне необходима для контроля целостности и последующей эффективной оптимизации кода. Затем работает специальный загрузчик, который перед выполнением своих обычных функций осуществляет оптимизирующую генерацию загружаемого кода. Информационную безопасность обеспечивает специальный блок этого загрузчика. В отличие от верификатора Java ему не требуется выполнять огромную работу по анализу потоков данных и повторную работу по проверке целостности инструкций: за это отвечает Juice-дерево. На сегодня уже реализованы и свободно доступны соответствующие программные расширения (plug-in) для наиболее распространенного сетевого навигатора Netscape Navigator. Причем это сделано для двух платформ: Apple PowerPC Macintosh и Windows 95 / Windows NT. (Интересующихся отсылаем к Интернет-сайту http://www.ics.uci.edu/~juice.)
Главным идеологом технологии Juice является упомянутый 32-летний Михаэль Франц (Michael Franz). В среде Oberon-программистов он известен прежде всего как автор реализаций системы Oberon для Macintosh и PowerMac, а также как основной разработчик механизма OMI (Oberon Module Interchange) -важнейшей составляющей технологии Juice. Механизм OMI не просто позволял осуществлять динамическую кодогенерацию – он обеспе-

чивал также смешанную динамическую загрузку OMI-кода и родного объектного кода данного компьютера. Возникает вполне естественный вопрос: какой ценой удается добиться подобной гибкости? Цена не столь высока, как в случае Java. Динамическая компиляция ни в чем не уступает лучшим оптимизирующим компиляторам, и в этом смысле находится в более выгодном положении по сравнению с виртуальными машинами и пост-компиляцией. Удивляет также и компактность кода, – а ведь это играет важную роль при его передаче по каналам связи и при подкачке с диска в оперативную память. Размер Juice-кода (так называемый slim-binary код) приблизительно в 4 раза меньше соответствующего исходного текста. И все же платить приходится: накладные расходы на динамическую генерацию кода возникают во время загрузки.
Как показали эксперименты, для достаточно объемных приложений время подобной загрузки возрастает от 1,3 до 5 раз в зависимости от приложения и оборудования. Однако здесь гораздо показательней не абсолютная, а относительная оценка. Так, вся система Oberon загружается на Pentium-166 за 2,1 секунды с обычным исполняемым кодом и за 3,8 секунды с
Juice-кодом. Взгляните на результаты тестов, которые проводились для двух наиболее объемных пакетов системы Oberon: это Gadgets (пользовательский интерфейс; 2,3 Мбайт исходного текста) и Net (сетевые функции, 0,7 Мбайт). На диаграмме указан приведенный размер кода.
Еще одной платой за гибкость являются размеры кодогенерирую-щих загрузчиков. В среднем для разных платформ они составляют около 100 Кбайт.
Важно отметить, что технология Java позаимствовала для своей реализации принцип интерпретируемого байт-кода – который получил наибольшую известность благодаря разработке в начале 70-х годов Р-кода, служившего для обеспечения переносимости Pascal-программ на разные платформы. По иронии судьбы разработан этот код был группой ученых во главе с Ник-лаусом Виртом – крестным отцом технологии Juice.
Подведем некоторые итоги. Технология Juice, как и Java, призвана в первую очередь решать задачи не зависящего от платформы, быстрого и надежного исполнения самых разных приложений, прежде всего сетевых. В отличие от Java, которая изначально создавалась для встроенных приложений для бытовых приборов, Juice – более универсальная технология. Важно, что уже имеется практическая реализация этой технологии для языка Oberon, который (помимо возраста) превосходит Java в ряде немаловажных языковых аспектов. В то же время Java имеет огромную поддержку в компьютерной индустрии, и ныне с выходом JavaOS и началом активных работ по созданию специализированных Java-чипов (picoJava, mi-croJava) обладает безусловным приоритетом перед своими возможными конкурентами.
Каково нынешнее состояние дел по технологии Juice? Об этом говорить пока рано: прошло около месяца с момента ее официального объявления. Но кое-что можно сообщить уже сейчас. Михаэль Франц в конце прошлого года покинул стены ЕТН и отправился из Европы в Америку, в университет штата Калифорния в Ирвайне (University of California, Irvine). Здесь новоиспеченный профессор вместе с двумя своими студентами Томасом Кистлером (Thomas Kistler) и Мартином Бартшером (Martin Burtscher) продолжает "доведение" технологии Juice. Права на товарный знак Juice Франц передал Попечительскому совету калифорнийского университета в Ирвайне.
Интересно, что первой реакцией некоторых программистов на анонс новой технологии было недоумение по поводу столь простого и необычного названия. Оно и понятно: название, которое дается технологии, как и имя, которым нарекают человека, оказывает большое воздействие на всю дальнейшую судьбу. Сплетни быстро разносятся по свету. Вот уже и до нас дошли слухи 'из стана фирмы Borland, где родилась одна из первых реализаций пост-компилятора Java (AppAccelerator for Java) и где с особым пристрастием относятся ко всему, что так или иначе связано с Java. Первая реакция ее специалистов была следующая: "Что за странное название!" Действительно, почему не Borneo, не Sumatra и даже не Мосса++ ? Правда, с самим названием Java, как теперь выясняется, вышла небольшая промашка. Американцы, видно, не могли знать, что Java – это не только название экзотического острова, но и весьма популярный в Париже 1900-х годов танец с участием путан и их сутенеров. А вот Juice – вещь безобидная, хоть и пришедшая из Старого Света. В переводе с английского помимо слова "сок" juice обозначает также понятия "суть", "основа". Начальная буква "J" не только прозрачно намекает на связь с Java, но обладает еще и неким магическим действием. Как говаривал бессмертный Винни-Пух в известном мультфильме, "Джжж" – это неспроста! Взгляните на фирменную эмблему Juice. На ней тщательно замаскирована явно яблочная основа этого сока. Тому тоже есть несложное объяснение. И связано оно с автором технологии.


Запомните дату – 18 июля 1996 года. В этот день Михаэль Франц объявил в нескольких телеконференциях сети Internet об официальном рождении новой технологии Juice. Что символично, произошло это в преддверии празднования на Руси яблочного спаса. Яблоко, хоть и надкушенное, – символ фирмы Apple Computer, подарившей миру Macintosh-культуру. И вот один из преданных поклонников Macintosh наглядно доказал, что даже талантливый программист-одиночка в состоянии бросить серьезный вызов всесильной компьютерной индустрии. Правда, если за его спиной стоит настоящая школа и реальная поддержка коллег. Какая судьба ни постигнет теперь Juice, благодаря Францу старушка-Европа в очередной раз утерла нос хваленой Америке. Наша страна в какой-то мере тоже приложила к этому руку. Ведь, по мнению авторитетных специалистов, именно у нас, в новосибирском Академгородке, разработан и продолжает совершенствоваться один из лучших коммерческих компиляторов языка Oberon-2, способный создавать удивительно компактный код для множества популярных компьютерных платформ!
В заключение давайте вновь вернемся к чашечке черного кофе и стакану яблочного сока, с которых мы начали наше знакомство с технологией Juice. Сейчас уже основательно подзабыты многие полезные напитки, которые были в почете у наших мудрых предков. Среди них не последнее место занимает сидр, который одни называют яблочным вином, другие – яблочным напитком. Как мне удалось выяснить в одной из старинных книг, секрет его приготовления кроется не только в смешении сока двух разных сортов яблок (кислых и сладких), и не просто в отказе от использования сахара и воды. Все гораздо хитрее – в бутылку будущего сидра перед ее закупоркой обязательно кладут ровно две изюминки. Так вот, чтобы Juice из рядового яблочного сока превратился в настоящий сидр, нужны как раз-таки эти две изюминки. Одна из них – эффективная динамическая компиляция – у Juice уже имеется. Дело за малым – за реальной поддержкой технологии крупными компьютерными компаниями. Только тогда Juice сможет по-настоящему покорить мир и принести большую пользу многим и многим людям. Давайте пожелаем успеха всем ее нынешним и будущим разработчикам!
_________________________
1 Подробнее см.: Богатырев Р. Феномен технологии Java" // ComputerWeek Moscow. 1996. № 23. С. 23-24, 46.