За всю историю существования компьютеров было создано и нашло успешное применение немало различных языков программирования. Однако лишь немногие из них произвели столь стремительный и масштабный эффект, как Java - новый язык программирования от фирмы Sun Microsystems. За последние несколько месяцев весть о нем дошла, вероятно, до каждого, за исключением разве что тех, кто волею судьбы оказался на необитаемом острове. Этот язык - близкий "родственник" Cи++, но в отличие от него синтаксис Java лучше продуман, набор средств не столь обширен, а освоение - проще. Гораздо важнее то, что это один из претендентов на роль официального языка программирования для разработок в World-Wide Web.
С помощью Java достаточно легко подготовить HTML- документ, который будет выводить в некоторой панели, расположенной в нижней части нужной страницы, непрерывно меняющуюся анимацию либо нарисует гистрограмму на основании данных, вводимых пользователем. Имеется даже возможность создани программных комплексов (скажем, Word и Excel), дл доступа к которым формируются URL адреса, и выполняютс они в среде вашего Web браузера. Поскольку Java программы выполняются локально, эффективно используютс вычислительная мощь компьютера и нагрузки на удаленные Web-серверы. А благодаря платформенной независимости этого языка программа, составленная на Java, одинаково пригодна для рабочей станции Sun, ПК с системой Windows 95, компьютера Macintosh или любого другого, Web- браузер которого обладает средствами для работы с Java.
Итак, что же это такое - Java? На что он похож? Как Java- программы встраиваются в Web-страницы и как это скажется на дальнейшем использовании Web? Вашему вниманию предлагается обзор основных особенностей этого языка, а также некоторые из уже существующих его применений.
Язык Java создан в начале 1990-х гг. группой разработчиков из компании Sun Microsystems, задачей которых была подготовка программного обеспечени реального масштаба времени для встраивания в системы бытовой электроники. После долгих попыток преодолени ряда ограничений, свойственных языку Cи++, они решили внести изменения непосредственно в язык, а не в алгоритмы своих программ. В первоначальной версии Java многое было позаимствовано из Cи++ и других объектно-ориентированных языков, таких, как Objective C и Smalltalk. Средства, предназначенные специально дл Internet, появились позднее, где-то в 1993 г.
Взрыв всеобщего интереса к языку Java произошел в начале 1995 г., когда фирмой Netscape было объявлено, что Navigator 2.0 будет выполнять Java-программы, встраиваемые в Web-страницы. Подразумевалось, что авторы HTML-документов получают в свое распоряжение некоторые возможности создания интерактивных документов, просмотр которых можно будет проводить с помощью Web-браузеров, обладающих средствами для работы с Java. Теперь составленные на языке Java программы, называемые здесь утилитами (applets), скомпилирует Java-компилятор. Обращение к откомпилированной программе - байт-коду - организуется через URL указатель в HTML-документе, а за ее выполнение несет ответственность интерпретатор, встроенный в Web- браузер. Теоретически подобное необычное сочетание компилятора и интерпретатора должно обеспечить Java как высокое быстродействие, присущее компилируемым языкам, так и переносимость, характерную для интерпретируемых языков, благодаря независимости байт- кода от платформы. Кроме того, должна повыситься степень защищенности программ, поскольку интерпретатор мог бы проверять каждый байт-код перед его исполнением
Прослеживается значительное сходство языков Java и Cи++. Java целиком и полностью - объектно- ориентированный язык, за исключением переменных, образованных простыми типами данных, такими, как int и float, все, даже строки и массивы, - объекты. Из объектов формируются классы, объединяющие параметры (свойства) и функции (методы), так что каждый объект наделен собственными характеристиками и поведением. Аналогично Cи++-классы могут быть подготовлены "с нуля" или как производные от уже существующих классов. Производные классы наследуют методы и свойства своих "предков".
Для создания объектов в языке Java используетс оператор new - очень похожий на оператор new из арсенала Cи++. Итак, сотворим новый объект из класса по имени Window, а затем обратимся к его методу show:
Window myWindow;
myWindow = new Window ();
myWindow.show ();
Как можно заметить в приведенных предложениях, между языками Java и Cи++ существует ряд важных отличий. Так, в Cи++ предложение
Window myWindow;
приведет к созданию в кадре стека нового экземпляра
класса Window. Однако в языке Java нет средств дл
работы с объектами из стека. Поэтому, если попадетс
такое предложение, Java сгенерирует под именем myWindow
переменную, содержащую ссылку на Window объект.
Первоначально в эту переменную помещается нулева
ссылка, однако после выполнения предложения
myWindow = new Window ();
объект будет создан, а в переменной myWindow
окажется ссылка на него. Обратите внимание на различную
трактовку синтаксиса ключевого слова new в этих двух
языках. Если в Cи++ в этом слове передается указатель
на объект (pointer), то в Java ссылка (reference).
Поскольку в языке Java нет такого понятия, как
указатель, здесь не применяются предложения типа
myWindow->show ();
Отсутствие указателей предотвращает программе доступ к не принадлежащему ей участку памяти. Более того, устраняется ряд наиболее типичных оснований для ошибок при программировании на языках Cи и Cи++. (Краткий перечень других различий между Java и Cи++ приведен во врезке "Java и Cи++: "Сводные братья"?".)
Важная составляющая любого объектно-ориентированного языка программирования - библиотека классов, содержаща готовые программы. В языке Java такие библиотеки именуются наборами ("packages"), представленными стандартным перечнем классов для работы программистов с наборами Java API Packages. Наборы снабжены именами - например, java.util и java.awt; и с помощью ключевого слова import вы можете импортировать их в рабочую программу. Например, используя следующее предложение
import java.awt.*;
вы сможете импортировать все классы, относящиеся к
набору java.awt. Эквивалентное предложение языка Cи++
выглядит так:
#include <awt.h>
В состав API набора java.awt входят описания классов для работы окон, меню, диалоговых окон и прочих объектов интерфейса пользователя, "awt" - это сокращение от "Abstract Window Toolkit" (Набор иструментов обобщенных средств оконного интерфейса). Еще один API набор - java.lang - содержит описание классов для обслуживания строк, потоков и других основных типов объектов; он автоматически импортируетс во все Java-программы.
Одна из отличительных особенностей языка Java - различие понятий "утилита" (applet) и "прикладна программа" (application). Первая - это любая программа, предназначенная для встраивания в HTML документы и выполняющаяся в среде Web-браузера. Вторая - это автономная программа, работающая вне Web-браузера. Любой компилируемый класс, имеющий функцию main, можно запустить как самостоятельную программу. Перед вами пример простого класса, задача которого - вывод на экран строки "Hello, world":
class HelloApp {
public static void main
(String args[]) {
System.out.println ("Hello,
world");
}
}
В процессе выполнения этого класса Java- интерпретатор обращается к его функции main, которая в свою очередь выводит на экран строку "Hello, world". Метод println принадлежит классу PrintStream языка Java; System.out - статическая переменная со ссылкой на объект PrintStream. System - один из стандартных API-классов языка Java из набора java.lang.
Возможность разработки автономных программ, конечно, заслуживает внимания. Однако значительно интереснее утилиты, поскольку с их помощью можно создавать Web- страницы с различными динамическими эффектами. Образцы основных функций подобной утилиты вы найдете в классе Applet - составной части набора java.applet. Результаты работы утилит представлены объектами, созданными из класса Graphics, описание которого имеется в наборе java.awt. Покажем, как выглядит исходный текст утилиты, выполняющей, как и приведенная выше программа, вывод на экран строки "Hello, world"
import java.awt.*;
import java.applet.*;
public class HelloApplet extends
Applet {
public void paint (Graphics g) {
g.DrawString ("Hello, world",
8, 8);
}
}
Класс HelloApplet, производный от класса Applet, задает поведение этой утилиты. В нашем примере HelloApplet отменяет метод paint унаследованный из Applet, и теперь строка "Hello, world" выводится с помощью метода drawString, принадлежащего объекту Graphics. Обращение к методу paint происходит в тех случаях, когда возникает необходимость обновлени содержимого "окна" утилиты - прямоугольной области на Web-странице. Модель "прорисовки по запросу" подобна схемам, используемым в Windows, Macintosh OS и других операционных средах с оконным интерфейсом. В классе Applet языка Java предусмотрено и множество других методов, которые можно переопределить на свой вкус дл выполнения разнообразных полезных функций. Вообще говоря, утилиты тем и уникальны, что в каждой из них переопределяются разные методы (а точнее, чем они заменяются).
После компиляции HelloApplet создается файл нового класса под именем HelloApplet.class, содержащий байт- код данной утилиты. Для включения утилиты в HTML- документ следует указать имя файла ее класса в теге (управляющем коде)<APPLET>:
<APPLET CODE=HelloApplet.class
WIDTH=100 HEIGHT=100>
</APPLET>
В параметрах WIDTH и HEIGHT задаются размеры прямоугольника на экране, отводимого под интерфейс этой утилиты, - в данном случае 100х100 пиксел. Параметр CODE предназначен для имени файла класса с полученным после компиляции кодом данной утилиты. (Помимо перечисленных параметров в теге <APPLET> могут быть и другие.) В нашем примере файл HelloApplet.class и HTML- файл для нужной Web-страницы должны храниться в одном каталоге. Обнаружив тег <APPLET>, браузер загружает из HelloApplet.class объект HelloApplet и для запуска утилиты обращается к его методу int. После этого вызывается метод paint данной утилиты с инструкцией отобразить на экране рабочее окно утилиты.
Исходные тексты некоторых утилит могут насчитывать до нескольких тысяч предложений. Например, можно подготовить утилиту, состоящую из не более чем 50 предложений, которая будет циклически исполнять несложный анимационный ролик из повторяющейс последовательности растровых картинок.
Чтобы познакомиться со всевозможными забавными вещами, которые можно реализовать с помощью Java-утилит, обратитесь к Web- странице "Cool Java Applets We've Written" (Шедевры Java утилит) фирмы Sun по адресу: http://java.sun.com/applets/applets.html. Для просмотра этих утилит вам понадобится Netscape Navigator 2.0, но для загрузки их исходного текста подойдет любой другой браузер. Если же вы хотите взглянуть на реально существующие Web-страницы, при формировании которых использовались Java-утилиты, ознакомьтесь со списком по адресу: http://java.sun.com/applets/pastFeaturedPages.html.
Если вы готовы заняться изучением языка Java, прежде всего обратитесь к собственной Java-странице по адресу http://java.sun.com и загрузите комплект инструментальных средств разработчика (JDK - Java Developer's Kit) вместе с документацией к нему. В ближайшем будущем ожидается появление инструментальных средств разрабки на языке Java от других фирм (в том числе Microsoft), но к моменту подготовки данной статьи Sun JDK оказался единственным в своем роде. Существует три его версии: для Windows 95 и Windows NT, дл Macintosh и для Sun Solaris. Будьте внимательны - вам нужна версия, согласованная с системой, в среде которой вы будете заниматься своими разработками. Однако после компиляции утилита, созданная средствами JDK, выполняется в любой операционной системе, оснащенной браузером со средствами для работы с Java.
В комплект поставки JDK входят не только API-наборы языка Java, но также исходные тексты самых разнообразных примеров программ. Кроме этого, предусмотрены следующие средства:
Java-компилятор преобразует файлы исходных текстов на языке Java (.java) в файлы классов (.class). Java- интерпретатор выполняет Java- программы, а программа просмотра Java-утилит выполняет их в режиме имитации Web-браузера. Вы сможете посмотреть работу образцов демонстрационных утилит из каталога demo пакета JDK, набрав слово appletviewer и вслед за ним им соответствующего HTML-файла, даже если на вашем компьютере нет Web-браузера со средствами работы с Java.
Какое же влияние окажет язык Java на возможности Web? Если быть кратким, благодаря Java авторы Web- страниц получают большую, чем когда-либо прежде, свободу в выражении своих идей. Отныне Web-страницы перестанут быть статичными объектами, отданными во власть имеющегося на сервере сценария, согласно которому отклики на те или иные запросы пользовател были самыми примитивными. Теперь Web-страницы фактически уравнялись в возможностях с существующими ныне прикладными программами. В настоящее время уже есть возможность обратиться к Web-страницам со средствами Java, чтобы ознакомиться со ставками налогообложения, получить сводку текущих биржевых котировок, воспроизвести музыкальные рождественские поздравления, да и просто поиграть в Solitaire. Отныне Web благодаря Java становится все более привлекательной - и это только начало.
Процедура обработки Java-программы
Java-программы компилируются в некую промежуточную стадию, именуемую байт кодом, и платформенно-независисую, которая затем в процессе работы интерпретатора трансформируется в конкрентные для каждой машины команды. Перед исполнением каждый байт код (или последовательности байт-кодов) пропускается через процессор верификации дл проверки на соответствие правилам языка и ограничениям, обусловленным требованиям безопасности.
Стадия компиляции Стадия исполнения Исходный текст программы --> Загрузчик байт-кода | | | Java-компилятор | Верификатор байт-кода | | | Байт-код ------------> Java-интерпретатор | Машинная команда
Java и Cи++: "сводные братья"?
У языков Java и Cи++ больше сходства, чем различий. Однако, по мнению сторонников языка Java, некоторые существенные отличия этих двух языков обеспечивают преимущества Java: простота освоения и более простая среда для разработки программ. В данной статье мы не задавались целью перечислить все различия между этими языками, остановимся лишь на наиболее заметных.
- В языке Cи++ допустимо множественное наследование, а в Java - нет. Однако в Java разрешено наследование классом нескольких интерфейсов, что аналогичных обобщенным базовым классам в Cи++. По мнению создателей языка Java, механизм наследования через интерфейс обладает большинством достоинств, присущих принятому в Cи++ множественному наследованию, позволяя при этом избежать многих из его "подводных камней".
- В языке Java все функции и переменные должны быть частью какго-либо класса. И напротив, в языке Cи++, так же как и в Си, функции и переменные можно объявить как глобальные.
- В Java программе все объекты создаются с помощью оператора new в хипе, но никогда в стеке. Кроме того, Java относится к разряду языков, имеющих специальные средства для удаления не используемых более объектов. Тем самым отпадает необходимость отслеживать наличие для каждого оператора new соответствующего delete - распространенная причина потери участков памяти для составленных на Cи++ программ. В действительности же в языке Java вообще нет оператора delete.
- В Java не предусмотрена возможность использования шаблонов, а также переопределени операторов.
- В Java нет препроцессора и, следовательно, макроконструкций для него. В результате выигрывают программисты: в текстах программ отсутствуют трудночитаемые (хотя чаще всего полезные) фрагменты, попадающиеся при слишком активном использовании макрокоманды #define на языках Си и Си++.
- В Java не применяются указатели (pointer). Оператор new передает ссылку (reference) на создаваемый объект, аналогичную ссылкам в Cи++. Поскольку указателей нет, нет и необходимости всяких замысловатых арифметических действий над ними и исключаются попытки доступа программы к тем участкам памяти, которые ей не принадлежат.
- В отличие от Cи++ в языке Java аргументы функций не могут быть заданы по умолчанию.
- Неотъемлемая часть языка Java - многопотоковость, реализуемая с помощью класса Thread, который инкапсулирует потоки выполнения. В Java предусмотрен развитый механизм синхронизации действий двух или более потоков, пытающихс одновременно получить доступ к одному и тому же объекту. Конечно, возможность создания многооптовых программ существует и в Cи++, однако для этого вам придется обращаться к соответствующим функциям, встроенным в конкретную операционную систему.