Изучаем Java. Язык программирования Java (Ява)

Язык Java. Введение.

Долгое время трудно было представить себе компьютерный журнал без статьи, посвященной языку Java. О нем писали даже такие популярные газеты и журналы, как The New York Times, The Washington Post и Business Week.

Невозможно припомнить, чтобы национальное общественное радио (National Public Radio) когда-либо посвящало языку программирования десятиминутную передачу. Хорошо это или плохо, зависит от точки зрения. А инвестиции объемом 100 миллионов долларов, вложенные в производство программного обеспечения, создаваемого с помощью конкретного языка программирования?! Телекомпании CNN, CNBC и другие средства массовой информации только и говорили, да и сейчас говорят, о том, как язык Java и то сможет, и это сделает.

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

На первых порах между рекламными обещаниями и реальными возможностями языка Java лежала пропасть. По мере его созревания технология становилась все более стабильной и надежной, а ожидания снизились до разумного уровня. Сейчас язык Java все шире используется для создания "промежуточного программного обеспечения" (middleware), поддерживающего связь между клиентами и ресурсами серверов (например, базами данных).

Несмотря на то, что эти важные приложения не поражают воображение, именно в этой области язык Java оказался наиболее полезным благодаря своей машинной независимости, многопоточности и возможностям сетевого программирования. Кроме того, язык Java захватил лидерство в области встроенных систем (embedded systems), став фактическим стандартом портативных устройств, виртуальных киосков, бортовых автомобильных компьютеров и т.п. Однако первые попытки переписать на языке Java широко распространенные программы для персональных компьютеров не увенчались успехом - полученные приложения оказались маломощными и медленными. С появлением новой версии некоторые из этих проблем удалось решить, и все же нужно признать, что пользователям, в общем-то, совершенно безразлично, на каком языке написаны купленные ими программы. Мы полагаем, что основные преимущества языка Java проявятся при создании новых видов устройств и приложений, а не при переписывании уже существующих программ.

Язык Java как средство программирования

Как язык программирования Java перевыполнил свои рекламные обещания. Несомненно, это один из лучших языков, доступных серьезным программистам. Потенциально Java имеет все предпосылки, чтобы стать великим языком программирования, однако, вероятно, сейчас уже слишком поздно. Когда появляется новый язык программирования, немедленно возникает неприятная проблема его совместимости с программным обеспечением, созданным ранее. Более того, даже если изменения в эти программы можно внести без вмешательства в их текст, создателям языка, который так горячо приветствовался публикой, как, например, язык Java, сложно прямо сказать: "Да, возможно мы ошиблись при разработке версии X, но версия Y будет лучше". В итоге, ожидая появления дальнейших улучшений, мы должны констатировать, что структура языка Java в ближайшем будущем существенно не изменится.

Возникает очевидный вопрос: "Как удалось улучшить язык Java? ". Оказывается, это сделано не за счет усовершенствования собственно языка программирования, а путем коренного изменения библиотек программ, написанных на языке Java. Компания Sun Microsystems изменила все: начиная с имен отдельных библиотечных функций (сделав их более осмысленными) и методов работы графических модулей (изменив способ обработки событий и частично переписав рабочие программы), и заканчивая созданием новых свойств языка, например, средств вывода информации на печать, которых не было в версии Java 1.0. В результате получилась гораздо более полезная программная платформа, чем все предыдущие версии языка Java.

Компания Microsoft выпустила в свет свой собственный продукт под названием J++, имеющий отношение к языку Java. Язык J++ интерпретируется виртуальной машиной, совместимой с виртуальной машиной языка Java (Java Virtual Machine) при выполнении байт-кода, но интерфейсы с внешними кодами у этих языков значительно различаются. Языки J++ и Java имеют практически одинаковый синтаксис. Однако компания Microsoft создала дополнительные языковые конструкции. Все они имеют довольно сомнительную ценность, за исключением интерфейса Windows API. Помимо того, что у этих языков одинаковый синтаксис, их основные библиотеки (строки, утилиты, средства сетевого программирования, средства поддержки многопоточности, математические библиотеки и т.п.), по существу, также совпадают.

Однако графические библиотеки, пользовательский интерфейс и доступ к удаленным объектам у этих языков совершенно разные. В настоящее время компания Microsoft больше не поддерживает язык J++, разработав новый язык С#, имеющий много общего с Java, но использующий другую виртуальную машину. В этой книге ни язык J++, ни язык С# не описываются.

Преимущества языка Java

1) Одно из основных преимуществ языка Java - независимость от платформы, на которой выполняются программы : один и тот же код можно запускать под управлением операционных систем Windows, Solaris, Linux, Machintosh и др.
Это действительно необходимо, когда программы загружаются через Интернет для последующего выполнения под управлением разных операционных систем.

2) Другое преимущество заключается в том, что синтаксис языка Java похож на синтаксис языка C++, и программистам, знающим языки С и C++, его изучение не составляет труда . Правда, для программистов, владеющих языком Visual Basic, этот синтаксис, возможно, будет непривычен.

Если вы никогда не программировали на языке C++, некоторые термины, использованные в этом разделе, будут вам непонятны. В этом случае можете пропустить его. Пока вы доберетесь до конца главы 6, эти термины станут для вас привычными.

3) Кроме того, Java - полностью объектно-ориентированный язык, даже в большей степени, чем C++ . Все сущности в языке Java являются объектами, за исключением немногих основных типов (primitive types), например чисел. (Поскольку с помощью объектно-ориентированного программирования легко разрабатывать сложные проекты, оно заменило собой более древнее структурное программирование. Если вы не знакомы с объектно-ориентированным программированием, главы 3-6 предоставят вам все необходимые сведения о нем.)

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

4) Исключена возможность явного выделения и освобождения памяти.
Память в языке Java освобождается автоматически с помощью механизма сборки мусора. Программист гарантирован от ошибок, связанных с неправильным использованием памяти.

5) Введены истинные массивы и запрещена арифметика указателей.
Теперь программисты в принципе не могут стереть данные из памяти вследствие неправильного использования указателей.

6) Исключена возможность перепутать оператор присваивания с оператором сравнения на равенство.
Теперь нельзя даже скомпилировать выражение if(ntries = 3) . . . (программисты на языке Visual Basic могут вообще не заметить здесь никакой проблемы, поскольку эта ошибка - источник большинства недоразумений в языках С и C++).

7) Исключено множественное наследование. Оно заменено новым понятием - интерфейсом, позаимствованным из языка Objective С.
Интерфейс дает программисту почти все, что тот может получить от множественного наследования, избегая при этом сложностей, возникающих при управлении иерархиями классов.

Характерные особенности языка Java

Простой
Интерпретируемый
Распределенный
Надежный
Безопасный
Машинонезависимый
Объектно-ориентированный
Высокопроизводительный
Многопоточный
Динамичный
Не зависящий от архитектуры компьютера

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

Простой

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

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

Например, синтаксис оператора switch в языке Java остался неизменным. Зная язык C++, перейти к синтаксису языка Java будет легко.
Если обычно вы используете визуальную среду программирования (например Visual Basic), язык Java покажется вам сложным.
Его синтаксис часто выглядит довольно странным (хотя понять смысл выражения не составляет труда). Важнее то, что при работе на языке Java приходится намного больше программировать. Прелесть языка Visual Basic заключается в том, что его визуальная среда программирования позволяет почти автоматически создавать инфраструктуру приложения. Чтобы достичь того же результата с помощью языка Java, необходимо программировать вручную, но при этом получаются намного более короткие программы.

Существует, однако, и третья разновидность сред программирования, позволяющих создавать программы с помощью технологии "перетащить-и-опустить" ("drag-and-drop").

Другой аспект простоты - краткость. Одна из целей языка Java - обеспечить разработку программ, которые можно было бы совершенно самостоятельно выполнять на небольших машинах. Размер основного интерпретатора и средств поддержки классов составляет около 40 Кбайт; стандартные библиотеки и средства поддержки потоков (особенно номное микроядро (self-contained microkernel)) занимают еще 17: Кбайт.
Это огромный успех. Заметим, однако, что библиотеки средств поддержки графического пользовательского интерфейса значительно крупнее.

Объектно-ориентированный

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

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

Механизмы отражения (глава 5) и сериализации объектов (глава 12) позволяют реализовать устойчивые объекты и средства для создания графических пользовательских интерфейсов на основе готовых компонентов.

Если вы никогда не программировали на объектно-ориентированных языках, внимательно изучите главы 4-6. В этих главах излагаются основы объектно-ориентированного программирования и показываются его преимущества при разработке сложных проектов над такими традиционными, процедурно-ориентированными языками, как язык С или Basic.

Распределенный

Java обладает большой библиотекой программ для передачи данных на основе таких протоколов TCP/IP (Transmission Control Protocol/Internet Protocol-протокол управления передачей/Интернет-протокол), как HTTP (Hypertext Transfer Protocol - протокол передачи гипертекстов) или FTP (File Transfer Protocol-протокол передачи файлов). Приложения, написанные на языке Java, могут открывать объекты и получать к ним доступ через сеть с помощью и URL-адресов (Uniform Resource Location - универсальный адрес ресурса) так желегко, как авлокальной сети.

Язык Java предоставляет мощные и удобные средства для работы в сети. Каждый, кто когда-либо пытался писать программы для работы в Интернет на других языках, будет приятно удивлен тем, как легко решаются на языке Java самые трудные задачи, например, открытие сетевых соединений (sockets connection). Элегантный механизм, состоящий из так называемых сервлетов (servlets), делает работу на сервере чрезвычайно эффективной.

Сервлеты поддерживаются многими популярными Web- серверами. (Работа в сети будет описана во втором томе.) Связь между распределенными объектами в языке Java обеспечивается механизмом вызова удаленных методов (эта тема также раскрывается во втором томе).

Надежный

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

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

Если раньше вы программировали на языках Visual Basic или COBOL, в которых указатели явно не используются, возможно, вам непонятно, почему это настолько важно. Программистам на языке С повезло намного меньше. Им нужны указатели для доступа к строкам, массивам, объектам и даже файлам. При программировании на языке Visual Basic ничего этого не требуется, и программист может не беспокоиться о распределении памяти для этих сущностей. С другой стороны, многие структуры данных в языке, не имеющем указателей, реализовать очень трудно. Для обычных структур, вроде строк и массивов, указатели не нужны. Вся мощь указателей проявляется лишь там, где без них нельзя обойтись, например, при создании связанных списков. Программист на языке Java навсегда избавлен от неверных указателей, неправильного распределения и утечки памяти.

Безопасный

Язык Java предназначен для использования в сетевой или распределенной среде. По этой причине большое внимание было уделено безопасности. Язык Java позволяет создавать системы, защищенные от вирусов и постороннего вмешательства.

В первом издании мы написали: "Никогда не говори никогда",- и оказались правы. Группа экспертов по вопросам безопасности из Принстонского университета обнаружила первые ошибки в системе защиты версии Java 1.0 вскоре после появления в продаже первой версии набора инструментальных средств JDK. Более того, и они, и другие специалисты продолжали и впоследствии находить все новые и новые ошибки в механизмах безопасности всех последующих версий языка Java.

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

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

Web-страница компании Sun, посвященная вопросам безопасности, имеет следующий URL-адрес: http://java.sun.com/sfaq/.

Перечислим некоторые ситуации, возникновение которых предотвращает система безопасности языка Java.

1) Переполнение стека выполняемой программы, к которюму приводил печально известный "червь", распространявшийся в Интернет.

2) Повреждение участков памяти, находящихся за пределами пространства, выделенного процессу.

3) Считывание и запись локальных файлов при использовании безопасного загрузчика классов, например Web-броузера, который запрещает такой доступ к файлам.

Все эти меры безопасности вполне уместны и обычно работают безупречно, однако осмотрительность никогда не повредит. Хотя обнаруженные к данному моменту ошибки были далеко не тривиальными, и все детали их поиска часто хранятся в секрете, следует признать, что доказать безопасность языка Java, вероятно, псе же невозможно.

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

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

Не зависящий от архитектуры

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

Это не новая идея. Более 20 лет назад и в системе реализации языка Pascal, разработанной Никлаусом Виртом (Niclaus Wirth), и в системе UCSD Pascal применялась та же самая технология. Использование байт-кодов дает большой выигрыш при выполнении программы (правда, синхронная компиляция во многих случаях его компенсирует). Разработчики языка Java прекрасно справились с разработкой набора команд байт-кода, которые отлично работают на большинстве современных компьютеров, легко транслируясь в реальные машинные команды.

Машинонезависимый

В отличие от языков С и C++, в спецификации Java нет аспектов, зависящих от системы реализации. И размер основных типов данных, и арифметические операции над ними точно определены.

Например, тип int в языке Java всегда означает 32-разрядное целое число. В языках С и C++ тип int может означать как 16-разрядное, так и 32-разрядное целое число, а также целое число произвольного размера, по выбору разработчика конкретного компилятора. Единственное ограничение заключается в том, размер типа int не может быть меньше размера типа short int и больше размера типа long int. Фиксированный размер числовых типов позволяет избежать многих неприятностей, связанных с выполнением программ на разных компьютерах. Бинарные данные хранятся и передаются в фиксированном формате, что также позволяет избежать недоразумений, связанных с разным порядком записи байтов на разных платформах (конфликт "big endian/little endian"). Строки сохраняются в стандартном формате Unicode.

Библиотеки, представляющие собой часть системы, определяют машинонезависимый интерфейс. Например, в языке предусмотрен абстрактный класс Window и его реализации для операционных систем Unix, Windows и Macintosh.

Каждый, кто когда-либо пытался написать программу, которая одинаково хорошо работала бы под управлением операционных систем Windows, Macintosh и десяти разновидностей системы Unix, знает, что это очень трудная задача. Версия Java предприняла героическую попытку решить эту проблему, предоставив простой инструментальный набор, адаптирующий обычные элементы пользовательского интерфейса к большому количеству программных платформ. К сожалению, библиотека, на которую было затрачено немало труда, не позволила достичь приемлемых результатов на разных платформах. (При этом на разных платформах в графических программах проявлялись разные ошибки.)

Однако это было лишь началом. Во многих приложениях машинная независимость намного важнее изысканности графического пользовательского интерфейса. Именно эти приложения выиграли от появления версии Java 1.0. Однако теперь инструментальный набор для создания графического пользовательского интерфейса полностью переработан и больше не зависит от интерфейса пользователя на главном компьютере. Новая версия более осмысленна и, по нашему мнению, более привлекательна для пользователя, чем предыдущие.

Интерпретируемый

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

Возможно, это дает преимущество при разработке приложений, однако приведенная цитата - явное преувеличение. В любом случае компилятор языка Java, входящий в набор инструментальных средств JSDK (Java Software Development Kit), работает довольно медленно. (Некоторые компиляторы, принадлежащие к третьей разновидности, например, компиляторы компании IBM, работают намного быстрее.) Скорость перекомпиляции - это всего лишь один из факторов, характеризующих эффективность среды программирования. Сравнив скорость работы сред программирования на языке Java и языке Visual Basic, вы, возможно, будете разочарованы.

Высокопроизводительный

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

Если для выполнения байт-кодов применяется интерпретатор, не следует употреблять словосочетание "высокая производительность". Однако на многих платформах возможен другой вид компиляции, обеспечиваемый синхронными компиляторами (just-in-time compilers-JIT). Они транслируют байт-код в машинозависимый код, сохраняют результат в памяти, а затем вызывают его при необходимости. Поскольку при этом интерпретация выполняется только один раз, этот подход во много раз увеличивает скорость работы.

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

МНОГОПОТОЧНЫЙ

Обеспечивает лучшую интерактивность и выполнение программы.

Если вы когда-либо пытались организовать многопоточные вычисления на каком- нибудь еще языке программирования, вы будете приятно удивлены тем, как это легко сделать на языке Java. Потоки в языке Java могут использовать преимущества многопроцессорных систем, если операционная система позволяет это сделать. К сожалению, реализации потоков на большинстве платформ сильно отличаются друг от друга, а разработчики языка Java не предпринимают никаких попыток достичь единообразия. Только код для вызова потоков остается одинаковым для всех машин; язык Java перекладывает реализацию многопоточности на базовую операционную систему или библиотеку потоков. (Потоки описываются во втором томе.) Несмотря на это, именно легкость организации многопоточных вычислений делает язык Java таким привлекательным для разработки программного обеспечения серверов.

Динамичный

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

Это очень важно в тех случаях, когда требуется добавить код в уже выполняемую программу. Ярким примером этого является код, который загружается из Интернет для выполнения броузером. В версии Java 1.0 получить информацию о ходе выполняемой программы было совсем не легко, однако нынешняя версия языка Java раскрывает перед программистом как структуру, так и поведение объектов выполняемой программы.
Это весьма ценно для систем, которые должны анализировать объекты в ходе выполнения программы. К таким системам относятся средства создания графического пользовательского интерфейса, интеллектуальные отладчики, сменные компоненты и объектные базы данных.

Язык Java и Интернет

Идея проста- пользователи загружают байт-коды языка Java из Интернет и выполняют их на своих машинах. Программы Java, работающие под управлением Web-броузеров, называются апплетами. Для использования апплета нужен Web-броузер, поддерживающий язык Java и способный интерпретировать байт-коды. Лицензия на исходные коды языка Java принадлежит компании Sun, настаивающей на неизменности как самого языка, так и структуры его основных библиотек. К сожалению, в реальности все не так. Разные версии броузеров Netscape и Internet Explorer поддерживают разные версии языка Java, причем некоторые из этих версий значительно устарели. Эта достойная сожаления ситуация создает все больше препятствий при разработке апплетов, позволяющих использовать преимущества последней версии языка Java. Чтобы решить эту проблему, компания Sun разработала программу Java Plug-in, позволяющую создавать наиболее современную среду для запуска программ на языке Java на основе броузеров Netscape и Internet Explorer.

Загрузка апплета напоминает внедрение изображения в Web-страницу. Апплет становится частью страницы, а текст обтекает занятое им пространство. Однако отличие заключается в том, что изображение теперь является живым (alive). Оно реагирует на команды пользователя, изменяет свой внешний вид и обеспечивает пересылку данных между компьютером, на котором просматривается апплет, и компьютером, управляющим этим апплетом.

Загрузка апплета напоминает вставку рисунка в Web-страницу. Апплет становится частью страницы, а текст обтекает занимаемое им место. Дело в том, что изображение является "живым". Оно реагирует на команды пользователя, изменяет свой внешний вид и выполняет пересылку данных между компьютером, на котором выполняется апплет, и компьютером, управляющим этим апплетом.

На рис. 1.1 показан хороший пример динамической Web-страницы, выполняющей сложные вычисления и применяющей апплет для изображения молекул. Чтобы лучше понять структуру молекулы, можно вращать ее либо изменять масштаб изображения, используя мышь. Такие манипуляции нельзя реализовать на статических Web- страницах, однако апплеты делают это возможным. (Этот апплет можно найти по адресу http: //jmol.sourceforge.net.)

Рис. 1.1. Апплет Jmol

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

Почти то же самое можно сделать с помощью языка Dynamic HTML, форм языка HTML (Hypertext Markup Language - язык разметки гипертекстов) или языка сценариев, например, языка JavaScript. Разумеется, первые апплеты предназначались для анимации: вращающиеся глобусы, танцующие персонажи мультфильмов, вычурные тексты и т.п. Однако большинство из перечисленного могут делать и анимированные GIF-файлы, а язык Dynamic HTML в сочетании с разработкой сценариев делает намного больше, чем апплеты.

В результате несовместимости броузеров и несогласованности процесса загрузки через медленные сетевые соединения апплеты, предназначенные для Web-страниц, не стали огромным достижением. В локальных сетях (intranets) ситуация совершенно иная. В них обычно не возникают проблемы, связанные с пропускной способностью канала, поэтому время загрузки апплетов несущественно. В локальной сети можно выбирать нужный броузер или применять программу Java Plug-In. Сотрудники не могут переместить программу, доставленную через сеть, в неправильное место или неверно ее установить, а системному администратору не нужно обходить все клиентские машины и обновлять на них программы. Большое количество программ, предназначенных для учета товаров, планирования отпуска, возмещения транспортных расходов и тому подобного, были разработаны многими корпорациями в виде апплетов, использующих броузеры.

Пока мы писали книгу, маятник вновь качнулся от клиентских программ в сторону программирования серверных приложений (server-side programming). В частности, прикладные серверы (application servers) могут использовать мониторинговые возможности виртуальной машины Java для автоматического выравнивания нагрузки, объединения связей с базой данных, синхронизации объектов, безопасного завершения работы и повторной загрузки, а также для выполнения других процессов, необходимых для масштабируемых серверных приложений, которые почти невозможно корректно реализовать. Таким образом, программисты, создающие приложения, получили возможность купить эти сложные механизмы, вместо того, чтобы разрабатывать их самостоятельно. Это повысило производительность труда программистов - они сосредоточились на логике своих программ, не отвлекаясь на детали, связанные с работой серверов.

Java - это язык программирования. Он позволяет программистам писать инструкции для компьютера, используя команды на английском языке, вместо того, чтобы писать в цифровом коде. Java - язык программирования высокого уровня, потому что его код легко писать и читать. Как и в обычных языках, Java имеет набор правил, которые определяют, как написаны инструкции. Эти правила называются "синтаксисом". Готовый высокоуровневый код Java транслируется в машинопонятный цифровой код, который исполняется компьютером.

Кто создал язык программирования Java?

Java была создана в начале 90-х командой программистов во главе с Джеймсом Гослингом для компании Sun Microsystems. Изначально Java создавалась для разработки на мобильных устройствах. Но когда в 1996 году вышла Java 1.0, основной фокус этого языка сместился на использование в интернете. Java дала больше интерактивности с пользователями, позволяя разработчикам создавать анимированные страницы. Со временем Java стала успешным языком программирования как для интернета, так и в других областях.

Спустя 20 лет, Java все еще остается невероятно популярным языком с более 6,5 миллионами разработчиков по всему миру.

Почему стоит выбрать Java?

Java создавалась на основе нескольких ключевых принципов:

1. Легкость в использовании.

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

2. Надежность.

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

3. Безопасность.

Поскольку изначально Java проектировалась исключительно для мобильных устройств, которые бы обменивались данными через сети, то безопасность с самого начала была на самом высоком уровне. На данный момент Java является, наверное, самым безопасным языком программирования.

4. Платформонезависимость.

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

Команда Sun Microsystems успешно скомбинировала ключевые принципы. Своей популярностью Java обязана надежности, безопасности, простоте в использовании и портабельности.

С чего начать изучение Java?

1. Установить JDK

Чтобы начать программировать на Java, нужно скачать и установить Java development Kit (пакет разработчика Java, JDK). Как только вы установите JDK на компьютер, вы сразу сможете начать писать свою первую программу.

2. Выбрать IDE

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

3. Первые шаги

Неизбежно первой программой любого новичка становится простая программа "Hello World", которая просто выводит это название. Такая простая программа продемонстрирует вам компиляцию, запуск и работу приложения в среде разработки типа NetBeans.

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

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

4. Как выбрать свое первое приложение на Java

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

Скажем, вы ничего не знаете о том, как писать программы на Java, но решили начать с простого калькулятора. Вы уже знаете, что такое калькулятор и как он выглядит. Вопросов к дизайну нет, есть вопросы о реализации. Вы узнаете, что в процессе создания программы вы будете постоянно задавать себе вопросы в духе "А как сделать это?.." И их будет много. Но чем больше будет вопросов, тем больше вы узнаете о языке.

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

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

Самое главное - сделать первую рабочую программу. Не думайте о том, чтобы сразу сделать все оптимально. Это придет с опытом, когда вы наберетесь уверенности в программировании на языке Java. А пока что единственная цель - заставить код на Java скомпилироваться и выполниться. Даже если программа не будет работать как было задумано, это даст начало изучению.

5. Другим путем

Если вы чувствуете, что в одиночку справиться с изучением языка программирования, особенного такого серьезного и масштабного, как Java, вам не удастся, попробуйте пойти на специализированные курсы, где изучаются основы программирования. Например,

Java - язык программирования, разработанный компанией SunMicrosystems. Приложения Java обычно компилируются в специальный байт-код, поэтому они могут работать на любой виртуальной Java-машине(JVM) независимо от компьютерной архитектуры. Дата официального выпуска - 23 мая 1995 года. Сегодня технология Java предоставляет средства для превращения статических Web-страниц в интерактивные динамические документы и для создания распределенных не зависящих от платформы приложений.

Программы на Java транслируются в байт-код, выполняемый виртуальной машиной Java (JVM) -программой, обрабатывающей байтовый код и передающей инструкции оборудованию как интерпретатор.

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

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

Применение технологии трансляции байт-кода в машинный код непосредственно во время работы программы (JIT-технология) с возможностью сохранения версий класса в машинном коде,

Широкое использование платформенно - ориентированного кода (native-код) в стандартных библиотеках,

Аппаратные средства, обеспечивающие ускоренную обработку байт-кода (например, технология Jazelle, поддерживаемая некоторыми процессорами фирмы ARM).



Основные возможности языка:

Автоматическое управление памятью;

Расширенные возможности об работки исключительных ситуаций;

Богатый набор средств фильтрации ввода/вывода;

Набор стандартных коллекций, таких как массив, список, стек и т.п.;

Наличие простых средств создания сетевых приложений (в том числе с использованием протокола RMI);

Наличие классов, позволяющих выполнять HTTP-запросы и обрабатывать ответы;

Встроенные в язык средства создания многопоточных приложений;

Унифицированный доступ к базам данных:

На уровне отдельных SQL-запросов-на основе JDBC,SQLJ;

На уровне концепции объектов, обладающих способностью к хранению в базе данных-на основе Java Data Objects и Java Persistence API;

Поддержка шаблонов (начиная с версии 1.5);

Параллельное выполнение программ .

1.4.3 Язык программирования C#

В июне 2000 года стало известно о новом языке программирования, родившемся в недрах компании Microsoft. Он стал частью новой технологии Microsoft, названной.NET (читается «Dot Net»). В рамках этой технологии предусмотрена единая среда выполнения программ (Common Language Runtime, CLR), написанных на разных языках программирования. Одним из таких языков, основным в этой среде, и является C# (C#, читается «C sharp», «Си шарп»). Названием языка, конечно же, хотели подчеркнуть его родство с Си++, ведь # - это два пересекшихся плюса. Но больше всего новый язык похож на Java . И нет сомнений, что одной из причин его появления стало стремление Microsoft ответить на вызов компании Sun.

Хотя официально авторы C# не называются, но на титульном листе одной из предварительных редакций справочника по языку обозначены Андерс Хейльсберг (Anders Hejlsberg) - создатель Турбо Паскаля и Дельфи, перешедший в 1996 году в Microsoft, и Скотт Вилтамут (Scott Wiltamuth).

Единая среда выполнения программ основана на использовании промежуточного языка IL (Intermediate Language - промежуточный язык), исполняющего почти ту же роль, что и байт-код виртуальной машины языка Ява. Используемые в рамках технологии.NET компиляторы с различных языков транслируют программы в IL-код. Так же как и байт-код Явы, IL-код представляет собой команды гипотетической стековой вычислительной машины. Но есть и разница в устройстве и использовании IL.

Во-первых, в отличие от JVM, IL не привязан к одному языку программирования. В составе, предварительных версий Microsoft.NET имеются компиляторы с языков Си++, C#, Visual Basic. Независимые разработчики могут добавлять другие языки, создавая компиляторы с этих языков в IL-код.

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

«C# - простой, современный, объектно-ориентированный язык с безопасной системой типов, происходящий от Си и Си++. C# будет удобен и понятен для программистов, знающих Си и Си++. C# сочетает продуктивность Visual Basic и мощность Си++.» Такими словами начинается описание C#.

Рассмотрим технические особенности языка:

Единицей компиляции является файл (как в Си, Си++, Яве). Файл может содержать одно или несколько описаний типов: классов (class), интерфейсов (interface), структур (struct), перечислений (enum), типов-делегатов (delegate) с указанием (или без указания) об их распределении по пространствам имен;

Пространства имен (namespace) регулируют видимость объектов программы (как в Си++). Пространства имен могут быть вложенными. Разрешено употребление объектов программы без явного указания пространства имен, которому этот объект принадлежит. Достаточно лишь общего упоминания об использовании этого пространства имен в директиве using (как в Турбо Паскале). Предусмотрены псевдонимы для названий пространств имен в директиве using (как в языке Оберон);

Элементарные типы данных: 8-разрядные (sbyte, byte), 16-разрядные (short, ushort), 32-разрядные (int, uint) и 64-разрядные (long, ulong) целые со знаком и без знака, вещественные одиночной (float) и двойной (double) точности, символы Unicode (char), логический тип (bool, не совместим с целыми), десятичный тип, обеспечивающий точность 28 значащих цифр (decimal);

Структурированные типы: классы и интерфейсы (как в Яве), одномерные и многомерные (в отличие от Явы) массивы, строки (string), структуры (почти то же, что и классы, но размещаемые не куче и без наследования), перечисления, несовместимые с целыми (как в Паскале);

Типы-делегаты или просто «делегаты» (подобны процедурным типам в Модуле‑2 и Обероне, указателям на функции в Си и Си++);

Типы подразделяются на ссылочные (классы, интерфейсы, массивы, делегаты) и типы-значения (элементарные типы, перечисления, структуры). Объекты ссылочных типов размещаются в динамической памяти (куче), а переменные ссылочных типов являются, по сути, указателями на эти объекты. В случае типов-значений переменные представляют собой не указатели, а сами значения. Неявные преобразования типов разрешены только для случаев, когда они не нарушают систему безопасности типов и не приводят к потере информации. Все типы, включая элементарные, совместимы с типомobject, который является базовым классом всех прочих типов. Предусмотрено неявное преобразование типов-значений к типу object, называемое упаковкой (boxing), и явное обратное преобразование - распаковка (unboxing);

Автоматическая сборка мусора (как в Обероне и Яве);

Обширный набор операций с 14 уровнями приоритета. Переопределение операций (как в Алголе-68, Аде, Си++). С помощью операторов checked и unchecked можно управлять контролем переполнения при выполнении операций с целыми;

Методы с параметрами значениями, параметрами-ссылками (ref) и выходными параметрами (out). Слова ref и out нужно записывать перед параметром не только в описании метода, но и при вызове. Наличие выходных параметров позволяет контролировать выполнение определяющих присваиваний. По правилам языка любая переменная должна гарантированно получить значение до того, как будет предпринята попытка ее использования;

Управляющие операторы: if, switch, while, do, for, break, continue (как в Си, Си++ и Яве). Оператор foreach, выполняющий цикл для каждого элемента «коллекции», несколько разновидностей оператора перехода goto;

Обработка исключений (как в Яве);

Свойства - элементы классов (объектов), доступ к которым осуществляется так же, как и к полям (можно присвоить или получить значение), но реализуется неявно вызываемыми подпрограммами get и set (как в Объектном Паскале - входном языке системы Delphi);

Индексаторы - элементы классов (объектов), позволяющие обращаться к объектам так же, как к массивам (указанием индекса в квадратных скобках). Реализуются неявно вызываемыми подпрограммами get и set. Например, доступ (для чтения) к символам строки может выполняться как к элементам массива благодаря тому, что для стандартного класса string реализован индексатор;

События - элементы классов (поля или свойства) процедурного типа (делегаты), к которым вне класса, где они определены, применимы только операции += и –=, позволяющие добавить или удалить методы-обработчики событий для объектов данного класса;

Небезопасный (unsafe) код, использующий указатели и адресную арифметику, локализуется в частях программы, помеченных модификатором unsafe;

Препроцессор, предусматривающий, в отличие от Си и Си++, только средства условной компиляции .

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

Сравнивая C# с Явой, можно увидеть много общих черт. Правда, если Ява-системы многоплатформны, то реализация C# существует пока только для операционной системы Windows и только одна. Но, несмотря на тяжеловесность, можно ожидать, что язык будет реализован и для других систем. Кроме того, сама платформа Microsoft .NET с единой средой выполнения программ может быть продвинута на альтернативные архитектуры, в первую очередь на UNIX-системы.

C# представляется более реалистичным языком, чем Ява. В отличие от Явы, он самодостаточен. То есть на C# можно написать любую программу, не прибегая к другим языкам. Это возможно благодаря наличию «небезопасных» блоков кода, которые открывают доступ непосредственно к аппаратуре. В языке Ява для доступа к средствам низкого уровня должны использоваться «родные методы» (native methods), которые необходимо программировать на других языках.

И, разумеется, перспективы C# в первую очередь связаны с теми усилиями, которые, конечно же, приложит компания Microsoft для его продвижения .

Простой

«Мы, хотели создать систему, которая легко программируется, не требует дополнительного обучения и учитывает сложившуюся практику и стандарты программирования. Поэтому, несмотря на то, что мы считали язык C++ неподходящим для этих целей, язык Java был разработан максимально похожим на него, чтобы, сделать систему более доступной. В языке Java нет многих редко используемых, малопонятных и невразумительных средств языка C++, которые, по нашему мнению, приносят больше вреда, чем пользы. Синтаксис языка Java, по существу, представляет собой очищенный вариант синтаксиса языка C++. В этом языке нет заголовочных файлов, арифметики указателей (и самих указателей), структур, объединений, перегрузки операторов, виртуальных базовых классов и т.п.»

Однако разработчики не стремились исправить все недостатки языка C++. Например, синтаксис оператора switch в языке Java остался неизменным. Зная язык C++, перейти к синтаксису языка Java будет легко. Одна из целей языка Java - обеспечить разработку программ, которые можно было бы совершенно самостоятельно выполнять на небольших машинах. Размер основного интерпретатора и средств поддержки классов составляет около 40 Кбайт; стандартные библиотеки и средства поддержки потоков (особенно авто-

номное микроядро (self-contained microkernel)) занимают еще 175 Кбайт. Это огромный успех. Заметим, однако, что библиотеки средств поддержки графического пользовательского интерфейса значительно крупнее.

Объектно-ориентированный

«Попросту говоря, объектно-ориентированное программирование - это метод программирования, в центре внимания которого находятся данные (т.е. объекты) и средства доступа к ним».

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

Распределенный

«Язык Java обладает большой библиотекой программ для передачи данных на основе таких протоколов TCP/IP (Transmission Control Protocol/Internet Protocol - протокол управления передачей/Интернет-протокол), как http (Hypertext TransjerProtocol- протокол передачи гипертекстов) или FTP (File Transfer Protocol - протокол передачи файлов). Приложения, написанные на языке Java, могут открывать объекты и получать к ним доступ через сеть с помощью URLrodpecoe (Uniform Resource Location - универсальный адрес ресурса) так же легко, как и в локальной сети.»

Язык Java предоставляет мощные и удобные средства для работы в сети. Каждый, кто когда-либо пытался писать программы для работы в Интернет на других языках, будет приятно удивлен тем, как легко решаются на языке Java самые трудные задачи, например, открытие сетевых соединений (sockets connection). Элегантный механизм, состоящий из так называемых сервлетов (servlets), делает работу на сервере чрезвычайно эффективной. Сервлеты поддерживаются многими популярными Web-серверами. Связь между распределенными объектами в языке Java обеспечивается механизмом вызова удаленных методов(эта тема также раскрывается во втором томе).

Надежный

«Язык Java предназначен для создания программ, которые должны надежно работать в любых ситуациях. Основное внимание в языке Java уделяется раннему обнаружению возможных ошибок, динамической проверке (во время выполнения программы), а также исключению ситуаций, подверженных ошибкам... Единственное значительное отличие языка Java от языка C++ заключается в модели указателей, принятой в языке Java, которая исключает возможность перезаписи участка памяти и повреждения данных.»

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

Если раньше вы программировали на языках Visual Basic или COBOL, в которых указатели явно не используются, возможно, вам непонятно, почему это настолько важно. Программистам на языке С повезло намного меньше. Им нужны указатели для доступа к строкам, массивам, объектам и даже файлам. При программировании на языке Visual Basic ничего этого не требуется, и программист может не беспокоиться о распределении памяти для этих сущностей. С другой стороны, многие структуры данных в языке, не имеющем указателей, реализовать очень трудно. Для обычных структур, вроде строк и массивов, указатели не нужны. Вся мощь указателей проявляется лишь там, где без них нельзя обойтись, например, при создании связанных списков. Программист на языке Java навсегда избавлен от неверных указателей, неправильного распределения и утечки памяти.

Безопасный

«Язык Java предназначен для использования в сетевой, распределенной среде. По этой причине большое внимание было уделено безопасности. Язык Java позволяет создавать системы, защищенные от вирусов и постороннего вмешательства.»

Группа разработчиков языка Java заявила о своей полной нетерпимости к любым ошибкам в системе защиты и немедленно приступила к исправлению всех проблем, обнаруженных в механизме безопасности аплетов. В частности, опубликовав внутренние спецификации интерпретатора языка Java, компания Sun намного облегчила поиск скрытых ошибок в системе безопасности и привлекла к их поиску независимых специалистов. Это повысило вероятность того, что все ошибки в системе защиты будут вскоре обнаружены. В любом случае обмануть систему защиты языка Java чрезвычайно трудно. Обнаруженные до сих пор ошибки были почти неуловимыми, к тому же их количество (относительно) невелико.

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

Не зависящий от архитектуры

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

Это не новая идея. Более 20 лет назад и в системе реализации языка Pascal, разработанной Никлаусом Виртом (Niclaus Wirth), и в системе UCSD Pascal применялась таже самая технология. Использование байт-кодов дает большой выигрыш при выполнении программы (правда, синхронная компиляция во многих случаях его компенсирует). Разработчики языка Java прекрасно справились с разработкой набора команд байт-кода, которые отлично работают на большинстве современных компьютеров,

легко транслируясь в реальные машинные команды.

Машинонезависимый

«В отличие от языков С и C++, в спецификации Java нет аспектов, зависящих от системы реализации. И размер основных типов данных, и арифметические операции над ними точно определены. Например, тип int в языке Java всегда означает 32-разрядное целое число. В языках С и C++ тип int может означать как 16-разрядное, так и 32-разрядное целое число, а также целое число произвольного размера, по выбору разработчика кон кретного компилятора. Единственное ограничение заключается в том, "что размер типа int не может быть меньше размера типа shortint и больше размера типа

Фиксированный размер числовых типов позволяет избежать многих неприятностей, связанных с выполнением программ на разных компьютерах. Бинарные данные хранятся и передаются в фиксированном формате, что также позволяет избежать недоразумений, связанных с разным порядком записи байтов на разных платформах (конфликт "big endian/little endian"). Строки сохраняются встандартном формате Unicode.

Интерпретируемый

«Интерпретатор языка Java может пересылаться на любую машину и выполнять байт-код непосредственно на ней. Поскольку редактирование связей - более легкий процесс, разработка программ может стать намного быстрее и эффективнее.»

Возможно, это дает преимущество при разработке приложений, однако приведенная цитата - явное преувеличение. В любом случае компилятор языка Java, входящий в набор инструментальных средств JSDK (Java Software Development Kit), работает довольно медленно. (Некоторые компиляторы, принадлежащие к третьей разновидности, например, компиляторы компании IBM, работают намного быстрее.) Скорость перекомпиляции - это всего лишь один из факторов, характеризующих эффективность среды программирования. Сравнив скорость работы сред программирования на языке Java и языке Visual Basic, вы, возможно, будете разочарованы.

Высокопроизводительный

«Хотя обычно интерпретируемые байт-коды имеют более чем достаточную производительность, бывают ситуации, в которых требуется еще более высокая эффективность. Байт-коды можно "на лету" (во время выполнения) транслировать в машинные коды для конкретного процессора,на котором выполняется данное приложение.»

Если для выполнения байт-кодов применяется интерпретатор, не следует употреблять словосочетание "высокая производительность". Однако на многих платформах возможен другой вид компиляции, обеспечиваемый синхронными компиляторами (just-in-time compilers-JIT). Они транслируют байт-код в машинозависимый код, сохраняют результат в памяти, а затем вызывают его при необходимости. Поскольку при этом интерпретация выполняется только один раз, этот подход во много раз увеличивает скорость работы. Несмотря на то что синхронные компиляторы все равно медлительнее, чем машинозависимые компиляторы, они во всяком случае работают намного быстрее интерпретаторов, обеспечивая для некоторых программ 10-ти и даже 20-кратное ускорение. Эта технология постоянно совершенствуется и в конце концов может достичь той скорости, которую никогда не превзойдут традиционные компиляторы. Например, синхронный компилятор может определить, какой фрагмент кода выполняется чаще, и оптимизировать его по скорости выполнения.

Многопоточный

«Многопоточностъ обеспечивает лучшую интерактивность и выполнение программы.» Если вы когда-либо пытались организовать многопоточные вычисления на каком-нибудь еще языке программирования, вы будете приятно удивлены тем, как это легко сделать на языке Java. Потоки в языке Java могут использовать преимущества многопроцессорных систем, если операционная система позволяет это сделать. К сожалению, реализации потоков на большинстве платформ сильно отличаются друг от друга, а разработчики языка Java не предпринимают никаких попыток достичь единообразия. Только код для вызова потоков остается одинаковым для всех машин; язык Javaперекладывает реализацию многопоточности на базовую операционную систему или библиотеку потоков. (Потоки описываются во втором томе.) Несмотря на это, именно легкость организации многопоточных вычислений делает язык Java таким привлекательным для разработки программного обеспечения серверов.

Динамичный

«Во многих отношениях язык Java является более динамичным, чем языки С или C++. Он был разработан так, чтобы легко адаптироваться к постоянно изменяющейся среде. В библиотеки можно свободно добавлять новые методы и объекты, не причиняя никакого вреда. Язык Java позволяет легко получать информацию о ходе выполнения программы.»

Это очень важно в тех случаях, когда требуется добавить код в уже выполняемую программу. Ярким примером этого является код, который загружается из Интернет для выполнения браузером. В версии Java 1.0 получить информацию о ходе выполняемой программы было совсем не легко, однако нынешняя версия языка Java раскрывает перед программистом как структуру, так и поведение объектов выполняемой программы. Это весьма ценно для систем, которые должны анализировать объекты в ходе выполнения программы. К таким системам относятся средства создания графического пользовательского интерфейса, интеллектуальные отладчики, сменные компоненты и объектные базы данных.

Язык Java был создан в 1995 году, и за 22 года своего существования покорил сердца миллионов программистов. Как ему это удалось? Почему за это время не появилось ни одной достойной замены? Чтобы разобраться в этом, поговорим об особенностях языка Java.

Компания Sun Microsystems при выпуске языка заложила 5 парадигм потенциального успеха:

  1. простота, объектная ориентированность и понятность;
  2. надёжность и безопасность;
  3. переносимость и независимость от платформы;
  4. высокая производительность;
  5. интрепретируемость, поточность и динамичность.

Рассмотрим каждую из них подробнее.

Простота

Синтаксис языка был унаследован от C++. Сегодня на фоне Python, Groove или Go его трудно назвать простым, однако тогда эволюционный вид позволил привлечь внимание Си-разработчиков.

Стандартная программа “Hello World” выглядит следующим образом:

public static void main(String args)
{
System.out.println("Hello World");
}

Такая форма конструкций не увеличивает скорость набора, однако читать, понимать и воспроизводить его просто.

Надёжность

Надёжность обеспечивается двумя принципами:

  • ООП. Иерархия наследования увеличивает читаемость кода и снижает количество невынужденных ошибок.
  • Строгая типизация. Разработчику приходится выполнять больший объём работы, но данные интерпретируется однозначно.

Кроме того, первоначально в Java предполагался запрет прямого доступа к памяти, что также повышало бы надёжность. Но разработчики оставили несколько лазеек, например бэкдор sun.misc.Unsafe, которые этот запрет обходят.

Безопасность

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

Удобство

Дословно концепция Java звучит как: «Write once, run anywhere». То есть исполняемость кода не зависит от используемой операционной системы или установленного ПО. Достигается это благодаря транслированию в байт-код виртуальной машиной JVM.

Как нельзя кстати пригодилась эта особенность java на android. Разнообразие производителей, моделей телефонов, характеристик - всё это могло бы негативно сказаться на работе приложений, если бы не существование такого универсального инструмента.

Производительность

Особенность ява, связанная с транслированием в байт-код, положительно сказывается и на производительности конечных продуктов. По скорости исполнения однотипные программы на java уступают в 1,5-2 раза программам на C/C++, при этом превосходят JavaScript, Ruby, Python.

Развитая экосистема

За 22 года жизни язык оброс десятками IDE и фреймворков, сотнями сообществ и форумов, тысячами библиотек и плагинов. Всё это благоприятно сказывается на пороге вхождения в профессию, востребованности и качеству производимых с помощью java продуктов.

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