Сергей Свердлов (доцент факультета прикладной математики и компьютерных технологий Вологодского педагогического университета, кандидат технических наук) о языке Java:
Простота. Ко времени появления Явы чрезмерная сложность Си++ уже вполне осознавалась сообществом программистов. В языке Ява многие сложные и запутанные механизмы Си++ были отвергнуты. Однако, объективные данные, характеризующие сложность языков, показывают, что тезис о том, что Ява существенно проще Си++, не вполне оправдан. Результаты этих исследований будут приведены далее. Да и вообще, разве можно назвать простым язык, спецификация которого — это книга объемом более 700 страниц. Кроме того, многие из программирующих на Си++ в действительности используют его просто как «улучшенный» Си, не применяя объектных возможностей. В то время как писать программы на языке Ява, не освоив объектно-ориентированного подхода, затруднительно. А методология ООП отнюдь не проста.
Объектная ориентированность. Стремление разработчиков Явы к чистой объектной ориентации, своего рода объектный экстремизм лишили язык ряда полезных свойств.
Программа на Яве состоит только из классов. Отсутствует понятие модуля. Из-за этого классы играют две совершенно разные роли. Во-первых, класс — это тип объектов, во-вторых — контейнер, содержащий описания статических данных, не имеющих никакого отношения к объектам данного класса. Такое объединение представляется противоестественным, трудным для понимания и объяснения и концептуально ущербным.
Все, кроме элементарных данных, — объекты. В том числе строки. Это уже не просто массивы символов. Записать s [i], чтобы получить i-й символ строки s нельзя. Нужно отправить объекту s сообщение: s. charAt (i) . Уровень абстракции при этом, конечно, повышается, но насколько это оправданно?
Все объекты существуют только в динамической форме. Память для них распределяется в куче. Неоправданным представляется отказ от простого и эффективного статического и автоматического (стекового) распределения памяти под массивы и записи (структуры, объекты), что является одной из причин снижения эффективности Ява-программ.
Часто говорят, что в Яве нет указателей. Правильнее было бы сказать, что нет арифметики указателей. А переменные-массивы и переменные-объекты представляют в Яве именно указатели на массивы и указатели на объекты. Поэтому, например, массив из массивов оказывается не матрицей, а массивом из указателей на массивы. Особой гибкости это не добавляет, а неудобства и путаницу создает. Многомерные массивы в обычном понимании стали вообще невозможны.
Все это издержки «чистой» объектной ориентации.
Надёжность. Переняв принцип строгой типизации от языков, происходящих от Паскаля, Ява действительно обеспечивает высокую надежность при обращении с данными. Но проявила себя ненадежность иного рода.
Первые реализации технологии Ява (компилятор, виртуальная машина, библиотеки) не были избавлены от ошибок. Система в целом оказалась довольно громоздкой. Виртуальная машина языка Ява выполняет непростые функции. Кроме собственно интерпретации байт-кода должна обеспечиваться динамическая загрузка классов по сети, контроль безопасности и т. д. Все это делает реализацию виртуальной машины для различных платформ не слишком простой задачей. Библиотеки, составляющие интерфейс прикладного программирования (API — Application Programming Interface) и являющиеся важнейшим компонентом технологии, также весьма сложны. В их составе заметную долю составляют так называемые
«родные методы» (native methods) — подпрограммы, существующие в виде машинного кода того процессора, на котором работает виртуальная машина. Такие методы программируются, как правило, на языке Си (виртуальная машина по заявлению ее разработчиков также запрограммирована на ANSI Си) и должны отлаживаться отдельно для каждой реализации виртуальной машины. Встраивание виртуальной машины в браузеры также сопряжено с возможностью внесения ошибок.
В результате пришлось столкнуться с тем, что отладка программ на языке Ява, в частности аплетов, была сопряжена с преодолением ошибок и нестыковок новой технологии. Методом проб приходилось находить решения, которые бы приемлемо работали в различных браузерах. И тем не менее полной уверенности в работоспособности аплетов в любой среде так и не возникало.
Проблемы сохранялись и через пять лет после появления технологии. Вот показательный пример. В январе 2001 года я несколько раз заглядывал на страницу веб-сервера компании Sun, посвященную истории языка Ява (
http://java.sun.com/ features/1998/05/birthday.html). Из трех имевшихся на этой странице аплетов работали только два. Третий аплет, иллюстрирующий сортировку, не загружался (сообщение «load: class Sortltem not found»). И это происходило на сайте компании — автора технологии, с одним из первых написанных на Яве аплетов! Именно этот аплет был продемонстрирован на одной из первых презентаций технологии Ява и, как говорится на упомянутой странице, произвел на участников презентации неизгладимое впечатление.
Независимость от архитектуры и переносимость. Безусловно, язык Ява машинно-независим, не привязан ни к какой конкретной платформе. Но получить программу, которая бы одинаково работала в любой среде, оказывается не всегда просто. Я уже упоминал трудности, с которыми пришлось столкнуться при отладке аплетов в среде различных браузеров. Довелось также слышать мнения разработчиков корпоративных информационных систем, которые были вынуждены отказаться от использования Явы для создания программного обеспечения клиентских рабочих мест. Они столкнулись с тем, что одинакового поведения на разных платформах удавалось добиться только для относительно простых программ. По мере же усложнения приложений трудности, связанные с переносимостью, возрастали.
Сама компания Sun в 2000 году предлагала реализацию технологии Ява для операционных систем Windows, Solaris, Mac OS и Linux, в то время как некоторые альтернативные технологии реализуются разработчиками для гораздо большего числа систем.
Интерпретируемость и высокая эффективность. Хотя программы на Яве обычно выполняются с помощью интерпретатора, но программа не исполняется непосредственно по ее исходному тексту. Присутствует этап компиляции с языка Ява в байт-код. Получается, что от интерпретации Яве достались недостатки (низкая скорость выполнения), а многие преимущества (отсутствие промежуточных файлов, отсутствие затрат времени на компиляцию, отсутствие необходимости в отдельном инструменте-компиляторе) оказались невостребованными. Часть программистов предпочитает при создании интернет-приложений работать с системами, которые выполняют интерпретацию программы прямо по ее исходному тексту. В этом случае отпадает необходимость освоения и использования при разработке сразу нескольких инструментов, выполнения нескольких этапов обработки программы, не нужно возиться с множеством создаваемых компилятором файлов1. В результате, популярностью пользуются системы, основанные на более примитивных языках, таких как JavaScript и Перл.
Как показал опыт применения Явы, низкая скорость работы программ оказалась одним из главных недостатков технологии. Это проявлялось уже при первом знакомстве. Достаточно было взглянуть на работу написанного на Яве браузера Hotjava, как недостаточная производительность сразу же бросалась в глаза. Не решали проблему и встроенные в виртуальную машину компиляторы байт-кода, которые преобразуют файлы классов в машинные команды процессора во время загрузки, «на лету». Такие системы были не в состоянии выполнить серьезную оптимизацию получаемого кода. В результате этот код не мог сравниться по скорости с кодом, порождаемым оптимизирующими компиляторами. Не добавляют производительности программам на Яве и отказ от эффективных механизмов статического и автоматического распределения памяти, представление строк как объектов, отсутствие многомерных массивов. Так что заявления авторов технологии о высокой производительности можно расценивать скорее как попытку выдать желаемое за действительное.
В языке Java все параметры методов передаются только по значению.
В языке Си параметры также передаются по значению, но существует возможность в качестве фактического параметра указать адрес, а в качестве формального — ссылку. В Си++ есть возможность передачи параметров по ссылке. Отсутствие в Яве адресов и ссылок и передача параметров только по значению не позволяют запрограммировать метод, имеющий выходные или изменяемые параметры примитивных типов (int, char и др.). На Яве нельзя, к примеру, написать метод для обмена значениями двух целых, подобный procedure Swap (var х, у: integer). Необходимость решения этого вопроса породила одну из самых неуклюжих конструкций языка Ява — классы-фантики (wrapper classes).
Запутанный многословный синтаксис. Многие конструкции, унаследованные из языка Си, не способствуют получению понятных программ: операторы-выражения, стимулирующие побочный эффект, условная операция, большое число уровней приоритета операций. Управление областями действия (областями видимости) объектов программы при отсутствии ясной модульной структуры приводит к необходимости использования многочисленных модификаторов доступа.
Причины появления в Яве некоторых громоздких конструкций плохо объяснимы. Сравните, например, описание экспортируемой вещественной константы в Обероне и Яве. На Обероне: CONST Pi*=3.14159; На Яве: public static final float Pi=3.14159f;
Распространение языка ЯваЯзык Ява был представлен в первую очередь как средство программирования для Интернета. При этом уже в первых версиях JDK — инструментального комплекта средств разработки, содержались библиотеки для создания не только аплетов, но и приложений с оконным пользовательским интерфейсом. Такие программы тоже имели возможность взаимодействовать с Интернетом.
Благодаря бесплатному распространению компанией Sun средств разработки на Яве возможность поэкспериментировать с аплетами получили множество программистов. Самым распространенным сюжетом для аплетов стали простенькие игры, играть в которые можно прямо на веб-странице.
Были предприняты и попытки реализовать на Яве крупномасштабные программные комплексы. Главным мотивом при этом было стремление получить не зависящие от платформы системы. Так, известная канадская компания Corel взялась за создание на Яве набора офисных приложений: текстовый процессор, электронная таблица и т. д. Проект завершился неудачей. Corel Office for Java ни по производительности, ни по функциональным возможностям, ни по устойчивости работы не мог соперничать с конкурирующими продуктами. Бесславно закончился и проект так называемого «сетевого компьютера». Его замысел состоял в том, чтобы уменьшить стоимость пользовательского рабочего места за счет того, что все необходимые программы (написанные, конечно же, на Яве), загружаются в такой компьютер по сети. Выпущенные компанией Sun компьютеры JavaStation, способные исполнять Ява-программы и работающие под управлением Java OS, не получили распространения.
Все эти неудачи позволили скептикам заявить, что Ява годится только для написания игрушечных программ, предназначенных для показа движущихся картинок на веб-страницах. Но и ситуация с аплетами оказалась непростой. Появилось сразу несколько альтернативных технологий, позволяющих помещать на страницы динамические элементы, в том числе обеспечивающие интерактивное взаимодействие с пользователем. В первую очередь в ряду таких технологий надо назвать скриптовый язык JavaScript. Программа на таком языке прямо в исходном виде включается в текст веб-страницы. На JavaScript можно написать в том числе и несложные игры.
Как средство оживления веб-страниц, JavaScript стал намного популярней Явы. Для проверки этого тезиса был проведен (в начале 2001 года) простой опыт. С помощью поисковой системы AltaVista были взяты 20 первых страниц, выданных по запросу на слово «dynamic». Оказалось, что на 13 из этих 20 страниц присутствуют программы на JavaScript, и только на одной — аплет, написанный на Яве. Подобный опыт в русском Интернете дал такие результаты: из 20 первых страниц, выданных поисковой системой Яндекс на запрос по слову «динамический», на 9 присутствовали скрипты на JavaScript и ни на одной странице не обнаружилось аплета.
В начале 2000-х годов можно было наблюдать продвижение Явы в сферу корпоративных информационных систем, на роль языка серверных приложений и в качестве средства программирования мобильных устройств. Эта роль оказалась достаточно заметной. На многих веб-сайтах стали использоваться Ява-скриптлеты и Ява-сервлеты. Уже в 2003 году многие массовые модели мобильных телефонов были оснащены виртуальной Ява-машиной (упрощенный вариант для мобильных устройств) и могли использовать написанные на Яве программы. Но эти программы, в основном простые игры, исполняли совсем не главную роль, не имея отношения к основной функции телефона.
Улучшились характеристики эффективности Ява-систем. Использование продвинутых технологий компиляции в сочетании с ростом быстродействия компьютеров позволило снять проблему низкой производительности.
Фактором, который, по мнению экспертов, сдерживает распространение Ява-технологии, является отсутствие международного стандарта языка. Sun Microsystems предпочитает получать доход от продажи торговой марки другим фирмам, разрабатывающим собственные реализации. Все спецификации Ява-технологии до сих пор остаются ведомственными стандартами Sun.
В нашей стране распространение языка Ява в конце 1990-х годов было, судя по всему, незначительным. Подтверждением этому служит, например, тот факт, что книг по Яве на русском языке выпускалось в несколько раз меньше, чем по Delphi и Си++ (в отдельности). Пик издательской активности пришелся на 1997 год. Не просуществовав и года, в 1998 году прекратил издаваться журнал «Java World/Россия». Среди причин такого положения, кроме свойств самой технологии, можно назвать очень высокую долю используемых в России IBM PC-совместимых компьютеров и операционных систем семейства Windows. Поэтому любые разговоры о важности межплатформенной переносимости приложений в наших условиях оказывались не слишком актуальны.
При всей неоднозначности оценок язык Ява обладает рядом неоспоримых достоинств. Он, например, гораздо лучше подходит на роль языка для обучения программированию, чем несостоятельные в этом отношении Си и Си++. Нет сомнения в том, что язык Ява займет, в конце концов, достойное место среди прочих языков программирования, но надежды на то, что он революционизирует всю технологию разработки программ, вряд ли оправданы.