NC News
WebWideMedia Advertising
 
Front Page Java Chat Tool Write To Us!
Гейтс говорит, что СК означает "несовместимый". Действительно ли Java - подходящий язык для построения встроенных приложений?

19 июня 1997


Язык Java настолько хорошо известен, что он добился почти 100-процентного признания. Почти каждый разработчик встроенных систем рассматривает использование Java как языка для разработки.

Действительно ли Java подходящий язык для создания встроенных приложений? Какой критерий оправдывает выбор Java, а не двух более широко используемых, зрелых и надежных языков выкого уровня - C и C++?

Хорошее начало в исследование этих вопросов - это посмотреть на некоторые из отличий между Java и C/C++, концентрируясь на свойствах, которые влияют на программистов на стадии разработки, а не на стадии кодирования. Из многих различий три имеют наибольшее воздействие. Во-первых, язык Java не имеет независимых функций в стиле C. Во-вторых, он также не имеет указателей и нуждается в сборщике мусора. В-третьих, в отличие от C, Java имеет встроенный обработчик исключений.

Основной организационной единицей Java-программы является класс, а не функция. Все Java-функции, называемые методами, (подчеркнем это отличие) могут существовать только в контексте класса.

В C программисты могут создавать функции, которые вызывают друг друга и передают данные. Напротив, в Java канонический способ разработки программ осуществляется путем определения классов с требуемыми свойствами. Затем, когда ваша программа выполняется, она будет создавать объекты этих классов и эти объекты будут общаться друг с другом, посылая сообщения. Сообщения в Java являются всего лишь одним из методов (действий). Концептуально посылка сообщения объекту с помощью команды send(объект, тип_сообщения, параметры) в точности эквивалентна команде объект.тип_сообщения(параметры), которая применяет к объекту метод тип_сообщения, передавая ему аргументы - параметры.

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

Тот факт, что Java не имеет указателей и нуждается в сборщике мусора является другим интересным аспектом этого языка. Указатель - своего рода "goto" в данных; он позволяет доступ к данным без ограничения, также как goto позволяет неограниченное ветвление. Исключая указатели, Java получает преимущества подобные тем, которые возникли, когда были выкинуты "goto". К примеру, теперь ошибка в одной части программы не может повлиять на значение переменной в другой, несвязанной с ней части, так как это происходит в C. В Java просто отсутствует механизм для доступа и изменения произвольного куска памяти. Ошибки такого рода нарушают даже наиболее тщательно выполненную модульность.

Оборотной стороной устранения указателей как языкового конструкта является необходимость в чем-либо типа сборщика мусора. Объекты создаются программно, но для того, чтобы проследить, что на объект больше нет ссылок, требутся глобальный подход, что снова нарушает принципы модульности. Разработчики Java встроили в язык сборщик мусора, который может самостоятельно определить, когда объект больше не используется и затем безопасно удалить его.

В терминах обработчика исключениий Java заимствует и расширяет концепцию C++: если при попытке выполнения блока кода возникает исключительное условие, это исключение отлавливается специальным обработчиком. Обработчики исключений, которые отделяют основной код от кода обработки ошибок - другая техника, обеспечивающая то, что модули (т.е. классы) действительно могут инкапсулировать все необходимое как часть определения модуля и исключать все остальное.

Существуют и другие отличия Java от C, но эти три - правильная ориентация объекта, отсутствие указателей при наличии сборки мусора и встроенная обработка исключений - делают Java подходящим языком для построения больших программ из отдельно созданных частей.

Но Java не останавливается на этом; он превосходит и C++. Вместо добавления возможностей C++, как было сделано с C, Java воздерживается от применения некоторых особенно проблемных особенностей C++. Разработчики Java пришли к выводу, что эти особенности в итоге не принесут выгоды, если сравнить затраты при их применении с получаемыми от этого преимуществами.

Первой из опущенных особенностей является множественное наследование, которое Java не поддерживает. Это не значит, что множественное наследование не нужно. Просто сложность использования и осуществление множественного наследия высоки. Java пришлось бы во время выполнения программы определять к какому классу принадлежал унаследованный метод. Множественное наследование можно реализовать, так как и Smalltalk, и C++, среди прочих языков, имеют его. Однако семантика и код, необходимые для определения метода, который был унаследован, сложны и трудны для обработки.

Вместо этого Java использует интерфейсы - специальный вид полностью абстрактных классов. Интерфейс обеспечивает только определение возможности; отсутствует код, ассоциированный с ним. Когда класс реализует один или более интерфейсов, происходят две вещи. Во-первых, он должен обеспечить код для реализации функциональности, определенную в интерфейсе, а также код, который определен самим классом. Затем, другим классам позволяется обращаться с этим классом, как если бы он был того же типа, что и интерфейс. Другими словами, класс может быть использован так, как если бы он был наследован от двух родителей.

Для примера возьмем класс под названием Circle (круг), который реализует интерфейс Drawable (то, что можно нарисовать). Экземпляры класса Circle содержат все члены Circle и члены, определенные в Drawable. Это означает, что с ними можно обращаться и как с кругами и как с объектами класса Drawable. Все было бы хорошо, но проблема с множественным наследованием случается, когда метод с одним и тем же именем присутсвует в обоих родительских классах. C++ позволяет множественные реализации, и C++ выбирает какую использовать. Так как интерфейсы полностью абстрактны, не может быть более чем одной конкретной реализации метода, а следовательно неопределенность отсутствует. На практике интерфейсы дают 80 процентов функциональности множественного наследования при 20 процентах усилий.

Цена слишком высока

Второй опущенной особенностью является поддержка шаблонов, также известная как общие или параметризуемые типы. Недавно команда Java похвалила работу по параметризируемым типам, сделанную в Массачусетском Институте Технологии, но сделала заключение, - несмотря на их очевидное желание добавить такую возможность языку Java, что сложность была слишком высока. Опять-таки, нет сомнения, что общие типы полезны. Просто дополнительные затраты (сложность) перевесили дополнительные преимущества.

Третьей значительной возможностью C++, которая отсутсвует в Java, является способность перегружать операторов. C++ позволяет программисту переопределить или расширить значение большинства символов операторов. Типичным примером может послужить раширение оператора добавки "+", обрабатывать сложные числа, позволяя разработчику писать "A + B", где A и B были элементами класса Complex. Теоретически, эта добавленная возможность - плюс, но на практике это делает программу трудной для понимания и, следовательно, более дорогостоящей для поддержания. И опять разработчики Java чувствовали, что преимущества не стоили дополнительных сложностей, и поэтому убрали перегрузку операторов из языка.

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

Источник: Electronic Engineering Times


Copyright © 1997 NCNS News. Все права защищены.
 

Click Here!