Java - это всего лишь один из многих переносимых языков программирования
Сетевые компьютеры и карманные устройства постепенно становятся альтернативой традиционным ПК, и разработчикам приложений следует с особым вниманием отнестись к возможности создания переносимого ПО.
Сама по себе переносимая программа - не новое изобретение. Например, спецификация Ada гарантирует, что написанное на этом языке приложение будет компилироваться и выполняться на любой комбинации компьютера и ОС, для которых имеется компилятор с Ada.
Однако есть разница между работой программы в соответствии со спецификацией и идентичностью ее выполнения на различных платформах. Например, Ada позволяет задавать минимальную десятичную точность чисел, но оптимизирующий компилятор может принудительно обеспечить большую точность, чем требуется, если это - естественное следствие использования самого эффективного для конкретного процессора формата данных.
Напротив, Java предлагает стандартный список типов числовых данных и гарантирует идентичность поведения ПО на всех платформах. Этот язык столь же последователен, как и Ada, и обеспечивает сравнимую производительность, но не предоставляет присущей Ada возможности задания точных требований к приложению.
Конкретная проблема с числовыми данными и переносимостью арифметики представляет собой лишь небольшой пример более глубокой истины: разработчики не должны писать приложений, ориентируясь на какую-то одну платформу и надеясь, что те будут одинаково работать на всех платформах. Для обеспечения устойчивой производительности переносимой программы следует тщательнее обдумывать цель создания приложения.
Если разработчик делает приложение, ориентируясь на ту задачу, которую оно должно решить, а не пишет “эталонную реализацию”, надеясь на идентичность ее работы на всех платформах, то ему легче будет добиться переносимости, обеспечивающей долговременный выигрыш от более удобного в сопровождении кода.
Для создания переносимого кода необходимо, чтобы в языке программирования был достигнут баланс между полнотой языка и компактностью его семантических конструкций. Например, ANSI Common LISP имеет встроенную функцию сортировки, в то время как в большинстве других языков подобные функции размещаются в библиотеках.
Перенесение функций в библиотеки ускоряет работу приложений, не нуждающихся в подобных средствах, но означает, что разработчики не могут рассчитывать на наличие на любой базовой платформе согласованных, хорошо проработанных вспомогательных алгоритмов.
Библиотеки классов, например Microsoft Foundation Classes, содержат много полезных функций подобного рода, которые для многих разработчиков становятся неотъемлемой частью языка. Это приводит к тому, что единственная реализация языка (например, Visual C++ корпорации Microsoft) может быстро стать доминирующим вариантом, и программы третьих фирм разрабатываются в предположении наличия той или иной библиотеки.
Совсем другой подход используется в библиотеках классов Java API (особенно из пакета java.lang), которые формально включены в описание языка. Версии Java разных производителей могут различаться по качеству реализации, но торговая марка Java подразумевает, что все они будут функционировать одинаково.
Тем не менее разработчик по-прежнему обязан осознавать различие между соответствием спецификации и идентичностью поведения во всех возможных условиях.
Например, класс Date языка Java строит объект “дата/время” из таких дискретных значений, как год, месяц, день месяца и т. д. Реализации корпораций Microsoft и Sun Microsystems различаются трактовкой неправильных значений, например 128 с. В версии корпорации Microsoft это число правильно интерпретируется как 2 мин 8 с, а в версии корпорации Sun происходит переполнение байтового поля и это значение становится отрицательным.
Программист должен знать разницу между поведением, которое гарантируется на всех платформах, и поведением, традиционно реализуемым на одной платформе, но не гарантируемым на других.
Существует множество других аспектов переносимости приложений, в том числе касающихся средств графического интерфейса пользователя (ГИП), операций с файловыми системами и взаимодействием сетей. Ни у одной из подобных проблем еще нет удачного решения, но Internet подталкивает разработчиков к поиску путей сближения различных платформ.
Питер Коффи (PC Week Labs)
ПЕРСПЕКТИВНЫЕ ВАРИАНТЫ МНОГОПЛАТФОРМНОГО ГИП
Многообразие свойств и остроумные решения позволяют выработать стандарты, облегчающие создание и развертывание приложений
Novell
ПО AppWare Foundation корпорации Novell было задумано как суперкомплект всех популярных ГИП, но его непрерывное совершенствование для нужд различных платформ оказалось крайне дорогостоящим делом.
JAVA
Abstract Windowing Toolkit языка Java гарантирует единообразный внешний вид приложений на всех платформах, но его перенос на новые платформы требует значительных усилий. К тому же этот комплект содержит лишь минимальный набор таких компонентов, как шрифты и меню.
HTML
HTML-браузеры становятся универсальными ГИП, обеспечивающими сближение сред Macintosh, ПК и Unix, что прежде казалось недостижимым. Internet-стандарты все чаще используются для управления файлами и сетями.