Глава 1. Введение
Содержание
Язык программирования Java® — это универсальный, конкуретный, объектно-ориентированный язык. Его синтаксис похож на C и C++, но он опускает многие особенности, которые делают C и C++ сложными, запутанными и небезопасными. Платформа Java первоначально была разработана для решения проблем разработки программного обеспечения для сетевых потребительских устройств. Она была разработана для поддержки нескольких архитектур хостов и для обеспечения безопасной доставки компонентов программного обеспечения. Для удовлетворения этих требований скомпилированный код должен был выдерживать транспортировку по сетям, работать на любом клиенте и гарантировать клиенту, что его безопасно запускать.
Популярность Всемирной паутины сделала эти атрибуты намного более интересными. Веб-браузеры позволили миллионам людей просматривать сеть и получать доступ к медийному контенту простыми способами. Наконец-то появился носитель, где то, что вы видели и слышали, было по существу одинаковым, независимо от используемого вами компьютера и от того, был ли он подключен к быстрой сети или медленному модему.
Посетители веб-сайтов вскоре обнаружили, что контент, поддерживаемый форматом HTML-документов веб-сайтов, был слишком ограничен. Расширения HTML, такие как формы, только подчеркивали эти ограничения, одновременно делая очевидным, что ни один браузер не может включать все функции, которые пользователи хотели. Ответ — расширяемость.
Браузер HotJava впервые продемонстрировал интересные свойства языка и платформы Java, сделав возможным встраивать программы в HTML-страницы. Программы прозрачно загружаются в браузер вместе с HTML-страницами, в которых они отображаются. Перед тем, как быть принятыми браузером, программы тщательно проверяются, чтобы убедиться, что они безопасны. Как и HTML-страницы, скомпилированные программы независимы от сети и хоста. Программы ведут себя одинаково независимо от того, откуда они происходят или на какой тип компьютера они загружаются и на котором выполняются.
Веб-браузер, включающий платформу Java, больше не ограничен предопределенным набором возможностей. Посетители веб-страниц, содержащих динамический контент, могут быть уверены, что их компьютеры не будут повреждены этим контентом. Программисты могут написать программу один раз, и она будет работать на любом компьютере, предоставляющем среду выполнения Java.
Виртуальная машина Java является краеугольным камнем платформы Java. Это компонент технологии, отвечающий за независимость от аппаратного обеспечения и операционной системы, небольшой размер скомпилированного кода и способность защищать пользователей от вредоносных программ.
Виртуальная машина Java — это абстрактная вычислительная машина. Как и реальная вычислительная машина, она имеет набор команд и манипулирует различными областями памяти во время выполнения. Довольно обычным является реализация языка программирования с использованием виртуальной машины; наиболее известной виртуальной машиной может быть машина P-Code языка UCSD Pascal.
Первый прототип реализации виртуальной машины Java, выполненный в Sun Microsystems, Inc., эмулировал набор команд виртуальной машины Java в программном обеспечении, размещенном на портативном устройстве, напоминающем современный персональный цифровой помощник (PDA). Нынешние реализации Oracle эмулируют виртуальную машину Java на мобильных, настольных и серверных устройствах, но виртуальная машина Java не предполагает какой-либо конкретной технологии реализации, аппаратного обеспечения хоста или операционной системы хоста. Она не является по своей сути интерпретируемой, но может быть реализована путем компиляции ее набора команд в набор команд кремниевого процессора. Она также может быть реализована в микрокоде или непосредственно в кремнии.
Виртуальная машина Java не знает ничего о языке программирования Java, только о конкретном двоичном формате, формате файла class. Файл class содержит инструкции виртуальной машины Java (или байткоды) и таблицу символов, а также другую вспомогательную информацию.
В целях безопасности виртуальная машина Java накладывает сильные синтаксические и структурные ограничения на код в файле class. Однако любой язык с функциональностью, которая может быть выражена в терминах действительного файла class, может быть размещен виртуальной машиной Java. Привлеченные общедоступной машинонезависимой платформой, разработчики других языков могут обратиться к виртуальной машине Java в качестве платформы доставки для своих языков.
Здесь описанная виртуальная машина Java совместима с платформой Java SE 24 и поддерживает язык программирования Java, описанный в Спецификации языка Java, издание Java SE 24.
Глава 2 дает обзор архитектуры виртуальной машины Java.
Глава 3 описывает компиляцию кода, написанного на языке программирования Java, в набор команд виртуальной машины Java.
Глава 4 определяет формат файла class, машино- и операционной системе независимый двоичный формат, используемый для представления скомпилированных классов и интерфейсов.
Глава 5 определяет запуск виртуальной машины Java и загрузку, связывание и инициализацию классов и интерфейсов.
Глава 6 определяет набор команд виртуальной машины Java, представляя команды в алфавитном порядке мнемоники кода операции.
Глава 7 предоставляет таблицу мнемоники кода операции виртуальной машины Java, индексированную по значению кода операции.
Во втором издании Спецификации виртуальной машины Java®, глава 2 давала обзор языка программирования Java, который был предназначен для поддержки спецификации виртуальной машины Java, но сам по себе не являлся частью спецификации. В Спецификации виртуальной машины Java, издание Java SE 24, читатель направляется к Спецификации языка Java, издание Java SE 24 для получения информации о языке программирования Java.
Во втором издании Спецификации виртуальной машины Java®, глава 8 подробно описывала низкоуровневые действия, которые объясняли взаимодействие потоков виртуальной машины Java с общей основной памятью. В Спецификации виртуальной машины Java, издание Java SE 24, читатель направляется к главе 17 Спецификации языка Java, издание Java SE 24 для получения информации о потоках и блокировках. Глава 17 отражает Модель памяти Java и спецификацию потоков, разработанную группой экспертов JSR 133.
В данной спецификации мы ссылаемся на классы и интерфейсы, взятые из API платформы Java SE. Всякий раз, когда мы ссылаемся на класс или интерфейс (кроме тех, которые объявлены в примере) с использованием одного идентификатора N, предполагается ссылка на класс или интерфейс, именованный N в пакете java.lang. Мы используем полное имя для классов или интерфейсов из пакетов, отличных от java.lang.
Всякий раз, когда мы ссылаемся на класс или интерфейс, объявленный в пакете java или в одном из его подпакетов, предполагается ссылка на этот класс или интерфейс, как загруженный загрузчиком класса Bootstrap (§5.3.1).
Всякий раз, когда мы ссылаемся на подпакет пакета, именованного java, предполагается ссылка на этот подпакет, как определенный загрузчиком класса Bootstrap.
Внутренняя ссылка в этой спецификации показана как (§x.y). Иногда мы ссылаемся на понятия в Спецификации языка Java, издание Java SE 24 с помощью ссылок в формате (JLS §x.y).
Использование шрифтов в этой спецификации таково:
-
Шрифт
fixed widthиспользуется для типов данных виртуальной машины Java, исключений, ошибок, структур файловclass, кода Prolog и фрагментов кода Java. -
Курсив используется для «ассемблерного языка» виртуальной машины Java, его кодов операций и операндов, а также элементов областей данных виртуальной машины Java во время выполнения. Он также используется для введения новых терминов и просто для выделения.
Ненормативный текст, предназначенный для пояснения нормативного текста данной спецификации, представлен более мелким, вложенным текстом.
Это ненормативный текст. Он предоставляет интуицию, обоснование, рекомендации, примеры и т. д.
Читатели приглашаются сообщить об технических ошибках и неясностях в Спецификации виртуальной машины Java® в jls-jvms-spec-comments@openjdk.org.
Вопросы, касающиеся генерации и обработки файлов class компилятором javac (эталонным компилятором для языка программирования Java), можно отправлять в compiler-dev@openjdk.org.
© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.