Взгляд изнутри. Язык программирования Java

Автор: Девид Райли

java_inside_decal__50932

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

Java (т.е. Ява) — это остров в Индонезии, сорт кофе и язык программирования. Три совершенно разных значения, и все они по-своему важны. Впрочем, для большинства программистов интерес представляет именно язык программирования Java. За последние несколько лет (начиная с конца 1995 г.) Java смог завоевать сообщество разработчиков. Ее феноменальный успех сделал Java самым быстроразвивающимся языком программирования за всю историю. Вокруг языка и его возможностей создалась довольно большая шумиха. И многие программисты, а также конечные пользователи, не до конца понимают, что же представляет из себя и какие возможности предоставляет язык Java.

Java — это революционный язык программирования

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

Давайте подробнее взглянем на некоторые из свойств этого языка:

  • объектно-ориентированность
  • переносимость
  • поддержка многопоточности
  • автоматическая «сборка мусора»
  • надежность
  • поддержка работы с сетью и «Интернетом»
  • простота и лёгкость в использовании

Объектно-ориентированность

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

Некоторые из процедурных языков позволяли даже получить адрес данных в памяти. Зная этот адрес, можно было считывать или дописывать данные спустя некоторое время, либо случайно записать новую информацию поверх старой.

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

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

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

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

Есть и другие типы языков — интерпретируемые. Интерпретируемый код считывается программным приложением (интерпретатором), которое выполняет указанные действия. Интерпретируемый код чаще всего компилировать не нужно — он транслируется по мере выполнения. Из-за этого интерпретируемый код работает довольно медленно, но он позволяет переносить программы между различными операционными системами и процессорами с разной архитектурой.

Java берет от обеих техник самое лучшее. Код Java компилируется в платформо-независимый машинный код, который называется Java-байткод. Специальный интерпретатор, Виртуальная машина Java или «Java Virtual Machine (JVM)» считывает и обрабатывает байткод. На Рис. 1 представлена схема небольшого приложения на Java. Байткод, отмеченный стрелкой, представлен в текстовом виде, но при компиляции для экономии места он представляется в виде байтов.

bytecode
Рис. 1 — Разборка байткода для «HelloWorld»

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

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

Если вы когда-либо писали сложные приложения на C или на PERL, то, скорее всего, вы уже сталкивались с концепцией нескольких процессов. Приложение может делить себя на отдельные копии, работающие параллельно. Каждая копия дублирует код и данные, что ведет к увеличению потребления памяти. Заставить эти копии взаимодействовать довольно непросто. Создание каждого процесса требует обращения к операционной системе, что лишний раз расходует время работы ЦПУ.

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

Автоматическая «сборка мусора»

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

Такие языки как C++ требуют от программистов вручную выделять и очищать память для данных и объектов. Это усложняет программу и ведет к возникновению другой проблемы — утечек памяти. Когда программисты забывают очищать память, количество свободной памяти, доступной для использования, уменьшается. Программы, в которых объекты часто создаются и уничтожаются, могут со временем заполнить всю доступную память. В Java программисту не нужно заботиться о таких вещах, поскольку JVM проводит автоматическую «сборку мусора» для объектов.

Надежность

Безопасность играет в Java очень важную роль. Поскольку апплеты Java загружаются удаленно и выполняются в браузере, безопасности уделяется много внимания. Мы бы не хотели, чтобы апплеты получали доступ к нашим личным документам, могли удалять наши файлы или наносить какой-либо вред. На уровне API существуют строгие ограничения по безопасности, когда речь идет о доступе апплетов к файлам и к сети. Кроме того, для проверки целостности загружаемого кода имеется поддержка цифровых подписей. На уровне байткода проверяются очевидные взломы, такие как манипуляция стеком или неверный байткод. Мощные механизмы обеспечения безопасности в Java помогают защититься от неумышленных или преднамеренных нарушений безопасности, но важно не забывать, что идеальных систем не бывает. Самым слабым звеном в этой цепи является Java Virtual Machine, в которой всё и работает — JVM может быть подвержена атакам, поскольку у нее есть известные слабые стороны. Стоит отметить, что хотя в JVM и было найдено несколько уязвимостей, такое происходит очень редко и обычно быстро исправляется.

Поддержка работы с сетью и «Интернетом»

Java создавался с оглядкой на «Internet» и на поддержку сетевого программирования. API Java предоставляет обширную поддержку сетевых функций, от сокетов и IP-адресов до URL и HTTP. Нет ничего проще, чем написать на Java сетевое приложение. При этом получившийся код можно будет перенести на любую платформу. В таких языках как C/C++ код, работающий с сетью, нужно переписывать заново для каждой операционной системы, и обычно он имеет более сложную структуру. Поддержка работы с сетью в Java позволяет сэкономить много времени и сил.

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

Простота и лёгкость в использовании

Язык Java своими корнями уходит в язык C++. C++ очень популярен и широко распространен. И, тем не менее, он считается сложным языком, имеющим такие функциии, как множественное наследование, шаблоны и указатели, которые являются контр-продуктивными. В свою очередь, Java — это скорее «чисто» объекто-ориентированный язык. Здесь нет доступа к указателям памяти, а вместо них используются ссылки на объекты. Поддержку множественного наследования тоже убрали. Это позволило добиться более понятных и простых схем классов. Библиотеки ввода/вывода и работы с сетью очень просты в использовании. API Java предоставляет разработчикам большое количество кода для экономии их времени (функции работы с сетью и структуры данных). Поработав с Java некоторое время, большинство разработчиков неохотно возвращаются к другим языкам из-за простоты и элегантности Java.

Заключение

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

Оригинал


Комментарии:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>