Какими свойствами обладает платформа java

На появление первой версии Java в 1996 году откликнулись не только специализирующиеся на вычислительной технике газеты и журналы, но даже такие солидные издания, как The New York Times, The Washington Post и Business Week. Java — единственный язык программирования, удостоившийся десятиминутного репортажа на Национальном общественном радио в США. Для разработки и сопровождения программных продуктов только на этом языке программирования был учрежден венчурный фонд в 100 млн. долларов. Это было удивительное время. Тем временам и последующей истории развития языка Java посвящена эта статья.

Программная платформа Java

В первом издании этой книги о Java было сказано следующее: “Как язык програм­мирования, Java перевыполнил рекламные обещания. Определенно Java — хороший язык программирования. Несомненно, это один из лучших языков, доступных серьез­ным программистам. Потенциально Java имел все предпосылки, чтобы стать великим языком программирования, но теперь время для этого уже, вероятно, упущено. Как только появляется новый язык программирования, сразу же возникает неприят­ная проблема его совместимости с созданным раньше программным обеспечением”.

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

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

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

Характерные особенности и достоинства Java

Создатели Java написали руководство, в котором объяснялись цели и достоинства нового языка. В этом документе приведено одиннадцать характерных особенностей Java. Этот язык:

  • простой;
  • объектно-ориентированный;
  • распределенный;
  • надежный;
  • безопасный;
  • не зависящий от архитектуры компьютера;
  • переносимый;
  • интерпретируемый;
  • высокопроизводительный;
  • многопоточный;
  • динамичный.

В данном разделе блога мы:

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

НА ЗАМЕТКУ! Руководство по Java

Простота

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

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

Если вы привыкли к визуальной среде программирования (например, Visual Basic), язык Java может показаться вам сложным. Его синтаксис некоторые считают стран­ным, хотя понять его не составляет большого труда. Но важнее другое: пользуясь Java, приходится больше программировать. Начинающие программисты нередко предпо­читают язык Visual Basic, поскольку его визуальная среда программирования позволя­ет почти автоматически создавать инфраструктуру приложения. Чтобы достичь того же результата средствами Java, придется вручную написать довольно большой объем кода. Существуют, однако, интегрированные среды разработки (ИСР) от независи­мых производителей, которые позволяют программировать в стиле перетаскивания.

“Другой аспект простоты — краткость. Одна из целей языка Java — обеспечить разработку независимых программ, способных выполняться на машинах с ограни­ченным объемом ресурсов. Размер основного интерпретатора и средств поддержки классов составляет около 40 Кбайт; стандартные библиотеки и средства поддержки потоков, в том числе автономное микроядро, занимают еще 175 Кбайт”.

На то время это было впечатляющим достижением. Разумеется, с тех пор библио­теки разрослись до гигантских размеров. Но теперь существует отдельная платформа Java Micro Edition с компактными библиотеками, более подходящая для встроенных устройств.

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

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

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

Поддержка распределенных вычислений в сети

“Язык Java предоставляет разработчику обширную библиотеку программ для пере­дачи данных по протоколу TCP/IP, HTTP и FTP. Приложения на Java способны от­крывать объекты и получать к ним доступ по сети с такой же легкостью, как и в локальной файловой системе, используя URL для адресации”.

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

Надежность

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

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

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

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

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

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

В первом издании мы предостерегали: “Никогда не говорите никогда”, и оказа­лись правы. Вскоре после выхода первой версии Java Development Kit группа экспер­тов по вопросам безопасности из Принстонского университета обнаружила первые ошибки в системе защиты Java 1.0. Компания Sun Microsystems развернула иссле­дования в области безопасности программ на Java. В частности, она обнародовала спецификацию и код виртуальной машины и библиотек, ответственных за защиту. Это ускорило выявление и устранение ошибок. Так или иначе, создатели Java силь­но затруднили задачу обхода ее механизмов безопасности. Обнаруженные с тех пор ошибки носили лишь технический характер и были совсем не многочисленны.

Ниже перечислены некоторые виды нарушения защиты, которые с самого начала предотвращает система безопасности Java.

  • Намеренное переполнение стека выполняемой программы — один из распро­страненных способов нарушения защиты, используемых вирусами и “червями”.
  • Повреждение данных на участках памяти, находящихся за пределами простран­ства, выделенного процессу.
  • Несанкционированное чтение файлов и их модификация.

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

НА ЗАМЕТКУ!

Независимость от архитектуры компьютера

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

Эта идея не нова. Более тридцати лет назад она была предложена Никлаусом Виртом (Niclaus Wirth) для языка Pascal. Эта же технология была реализована в си­стеме UCSD Pascal.

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

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

Переносимость

“В отличие от С и C++, ни один из аспектов спецификации Java не зависит от реа­лизации. Разрядность примитивных типов данных и арифметические операции над ними строго определены”.

Например, тип int в Java всегда означает 32-разрядное целое число. А в С и C++ тип int может означать как 16-, так и 32-разрядное целое число. Единственное огра­ничение состоит в том, что разрядность типа int не может быть меньше разрядности типа short int и больше разрядности типа long int. Фиксированная разрядность числовых типов данных позволяет избежать многих неприятностей, связанных с вы­полнением программ на разных компьютерах. Двоичные данные хранятся и пере­даются в неизменном формате, что также позволяет избежать недоразумений, свя­занных с разным порядком следования байтов на различных платформах. Строки сохраняются в стандартном формате Unicode.

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

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

Интепретируемость

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

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

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

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

На ранней стадии развития Java многие пользователи были не согласны с утверж­дением, что производительности “более чем достаточно”. Но теперь динамические компиляторы (называемые иначе JIT-компиляторами) настолько усовершенствованы, что могут конкурировать с традиционными компиляторами, а в некоторых случаях они даже дают выигрыш в производительности, поскольку имеют больше доступной информации. Так, например, динамический компилятор может отслеживать код, который выполняется чаще, и оптимизировать по быстродействию только эту часть кода. Динамическому компилятору известно, какие именно классы были загружены. Он может сначала применить встраивание, когда определенная функция вообще не переопределяется на основании загруженной коллекции классов, а затем отменить, если потребуется, такую оптимизацию.

Многопоточность

“К преимуществам многопоточности относится более высокая интерактивная реакция и поведение программ в реальном масштабе времени”.

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

Динамичность

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

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

НА ЗАМЕТКУ!

Вас заинтересует / Intresting for you:

Источник