Какими свойствами обладает платформа 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:
Источник