Java

Материал из Циклопедии
Перейти к навигации Перейти к поиску
Логотип

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

Oracle предоставляет компилятор Java и виртуальную машину Java, которые удовлетворяют спецификации Java Community Process, под лицензией GNU General Public License.

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

Java повлияла на развитие J++, который разрабатывался компанией Microsoft. Работа над J++ была остановлена из-за судебного иска компании Sun Microsystems, поскольку этот язык программирования был модификацией Java. Позже в новой платформе Microsoft.NET появился J#, облегчающий миграцию программистов J++ или Java на новую платформу. Со временем новый язык программирования С#, стал основным языком платформы, переняв многое из Java. J# включался в версию Microsoft Visual Studio 2005. Язык сценариев JavaScript имеет схожее с Java название и синтаксис, но не связан с Java.

История[править]

История версий

Язык программирования Java зародился в 1991 г. в лабораториях компании Sun Microsystems. Разработку проекта начал Джеймс Гослинг, сам проект назывался «Green» (Зеленый). Создание первой рабочей версии, которая называлась «Oak» (дуб), заняло 18 месяцев. Поскольку оказалось, что имя Oak уже использовалось другой фирмой, то в результате длительных споров вокруг названия нового языка среди ряда предложенных было выбрано название Java[1], в 1995 году язык был официально переименован.[2]

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

Довольно скоро почти все популярные тогдашние браузеры получили возможность запускать «безопасные» для системы Java-апплеты внутри веб-страниц. В декабре 1998 года Sun Microsystems выпустила Java 2, где было реализовано несколько конфигураций для различных типов платформ. Например, J2EE предназначалась для создания корпоративных приложений, а значительно урезана J2ME для приборов с ограниченными ресурсами, таких как мобильные телефоны.

13 ноября 2006 года Sun выпустили большую часть Java в качестве свободного и открытого программного обеспечения в соответствии с условиями GNU General Public License (GPL). 8 мая 2007 года корпорация закончила процесс, в результате которого все исходные коды Java были выпущены под GPL, за исключением небольшой части кода, на который Sun не было авторского права.

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

Платформа Java[править]

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

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

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

Основное преимущество использования байт-кода — это портативность. Тем не менее, дополнительные расходы на интерпретацию означает, что интерпретированы программы будут почти всегда работать медленнее, чем скомпилированные в машинный код, и именно поэтому Java получила репутацию «медленного» языка. Однако, этот разрыв существенно сократился после введения нескольких методов оптимизации в современных реализациях JVM.

Одним из таких методов является англ. just-in-time (JIT) компиляция, которая превращает Java байт-код в машинный при первом запуске программы, а затем кэширует его. В результате, такая программа запускается и выполняется быстрее, чем простой интерпретированный код, но ценой дополнительных затрат на компиляцию во время выполнения. Сложные виртуальные машины также используют динамическую перекомпиляцию, которая заключается в том, что ВМ анализирует поведение запущенной программы и выборочно рекомпилирет и оптимизирует некоторые ее части. С использованием динамической рекомпиляции можно достичь большего уровня оптимизации, чем за статической компиляции, поскольку динамический компилятор может делать оптимизации на базе знаний об окружающей среде периода выполнения и о загружены классы. К тому же, он может обнаруживать так называемые горячие точки — части программы, чаще всего внутренние циклы, которые занимают больше всего времени при выполнении. JIT-компиляция и динамическая рекомпиляция увеличивает скорость Java-приложений, не теряя при этом портативности.

Дюк, талисман Java

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

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

Обьектность[править]

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

В Java все объекты являются производными от главного объекта (он называется просто Object), из которого они наследуют базовую поведение и свойства.

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

Безопасность[править]

В намерениях проектировщиков Java была заменить C++ — объектного преемника языка C.[3] Проектировщики начали с анализа свойств C++, которые являются причиной наибольшего числа ошибок, чтобы создать простой, безопасный и безотказный язык программирования.

В Java существует система обработки исключительных ситуаций, например:

  • операции над элементом массива за его пределами или над пустым элементом
  • чтение с недоступного каталога или неправильного адреса URL
  • ввод недопустимых данных пользователем

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

Однако, язык программирования Java не рекомендуется использовать в системах, сбой в работе которых может привести к смерти, травмам или значительных физических повреждениям (например, программное обеспечение для управления атомными электростанциями, полетами, системами жизнеобеспечения или системами вооружения) из-за ненадежности программ, написанных на языке программирования Java.[4]

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

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

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

Java не имеет поддержки указателей в стиле C/C++. Это сделано для безопасности и надежности, чтобы позволить сборщику мусора перемещать объекты.

Структура Java-приложения[править]

Структура программы

Программы на Java образованы из классов и интерфейсов. Классы содержат переменные и константы, которые содержат данные, методы, которые выполняют действия, и конструкторы, которые создают экземпляры классов — объекты. Данные могут получить тип (например байт, целое число, символ) или быть ссылкой на объект. Язык Java является статически типизированным.

Лексическая структура[править]

Java-программы записываются в кодировке Unicode, также предоставляется лексическое преобразование, которое позволяет записывать символы Юникода руководящими кодами Unicode с помощью только множества символов ASCII. Язык Java представляет текст последовательностями 16-битных кодовых единиц, используя кодирование UTF-16. За исключением комментариев, идентификаторов и содержания символьных и строчных литералов, все входящие элементы программы на Java состоят из символов ASCII или соответствующих им руководящих кодов Unicode.

Типы данных[править]

Ссылочные типы данных

Java является строго типизированным языком, каждая переменная и выражение имеет тип, известный на этапе компиляции.

Типы данных Java принадлежат к двум категориям: простые (primitive) и определителю (reference). К простым типов принадлежит логический (логический) тип, числовые типы и символьный тип.

Числовые типы состоят из целых типов byte, short, int, long и действительных типов float, double. Символьный тип представлен типом char. Определителю типа состоят из классов, интерфейсов, массивов. Значением вказивникового типа есть указатель на объект — экземпляр класса или массива. Строки являются объектами класса String.

Критика[править]

Критика Java касается заимствования синтаксиса из C/C++ , использование обобщений, быстродействия, обработки чисел без знака, реализации вычислений чисел с плавающей точкой, больших массивов и др.

Использование другими компаниями[править]

Google[править]

При создании Android (операционной системы с открытым кодом) Google взяла за основу Java. Несмотря на то, что операционная система, построенная на ядре Linux, была написана в основном на C , Android SDK использует Java для разработки приложений для платформы Android.

7 мая 2012 года суд Сан-Франциско обнаружил, что если API защищено авторским правом, то Google, используя Java в Android, нарушает авторские права Oracle.[5] Был поднят вопрос о правовом статусе использования Java в Android-устройствах. Однако, уже 31 мая того же года федеральный судья США постановил, что API не могут быть защищены авторским правом.[6]

Графический интерфейс пользователя[править]

Для реализации графического интерфейса (GUI) в Java существуют два основных пакета классов:[7]

  • Abstract Window Toolkit (AWT)
  • Swing

Преимуществами первого является простота использования, интерфейс подобен интерфейсу операционной системы и несколько лучше быстродействие, поскольку базируется на средствах ОС, правда имеет ограниченный набор графических элементов. Второй пакет Swing реализует собственный Java-интерфейс. Этот пакет создавался на основе AWT, и имеет гораздо больше возможностей и большее количество графических элементов.[8] Swing-компоненты еще называют облегченными, поскольку они написаны полностью на Java и, поэтому, платформонезависимы.

Существуют также сторонние пакеты, самым популярным является Standard Widget Toolkit — стандартный инструментарий виджетов. Разработанный подразделением Rational фирмы IBM и компанией Object Technology International (OTI), сейчас развивается фондом Eclipse.

Источники[править]

Литература[править]

  • Кей С. Хорстманн. Java SE 8. Вводный курс. «Уильямс». ISBN 978-5-8459-1900-7.
  • Кей С. Хорстманн, Гари Корнелл (2013). Java. Библиотека профессионала, том 1. Основы. Девятое издание. «Уильямс». ISBN 978-5-8459-1869-7
  • Барри Берд (2013). Программирование на Java для чайников, 3-е издание. «Диалектика». ISBN 978-5-8459-1834-5
  • Bruce Eckel (2006). Thinking in Java (4th Edition). Prentice Hall PTR. ISBN 978-0131872486
  • Joshua Bloch (2008). Effective Java (2nd Edition). Prentice Hall PTR. ISBN 978-0321356680
  • James Gosling; Bill Joy, Guy Steele, Gilad Bracha (2005). The Java Language Specification, Third Edition. Addison-Wesley. ISBN 0-321-24678-0

Ссылки[править]

 
Используемые
в разработке

Ада A+ APL Atlast Forth AWL Язык ассемблера ActionScript ABAP/4 AutoIt AWK BeanShell Бейсик Си Кобол C++ C# Clarion Clojure ColdFusion Common Lisp D dBase Delphi DuAL Eiffel Erlang Euphoria F# Форт Фортран Gambas Go Groovy HAL/S Haskell IBM PL/S Icon IridiumJava JavaScript Limbo Lua Модула-3 Object Pascal Objective-C OCaml Oz Parser Паскаль Компонентный Паскаль Perl Pixilang PHP PowerBASIC Python ПЛ/1 Пролог Qi Ruby Scala Scheme Seed7 Smalltalk SQL PL/SQL Tcl TouchDesigner Vala Visual Basic (.NET) • X-Robot

Академические

Agda Clean Curry Idris Лого ML Оберон Planning C РЕФАЛ Симула

IEC 61131-3

Instruction List ST FBD Ladder Diagram (LD) • SFC

Прочие

Алгол Алгол 68 Модула-2 Миранда Hope НОРМИН Санда

Эзотерические

HQ9+/HQ9++ • INTERCAL Brainfuck Befunge Malbolge Piet Spoon Unlambda Whitespace FALSE LOLCODE Глагол

Визуальные

G (LabVIEW) • Microsoft VPL Sikuli VisSim Алиса ДРАКОН Скретч

Прочее

ДинамическиеКомпилируемыеС ключевыми словами не на английском языке С C-style синтаксисом СинтаксисYoptaScript

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