Глава 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 21 и поддерживает язык программирования Java, описанный в Спецификации языка Java, издание Java SE 21.
Глава 2 содержит обзор архитектуры виртуальной машины Java.
Глава 3 знакомит с компиляцией кода, написанного на языке программирования Java, в набор инструкций виртуальной машины Java.
Глава 4 описывает формат файла class — независимый от аппаратного обеспечения и операционной системы двоичный формат, используемый для представления скомпилированных классов и интерфейсов.
Глава 5 описывает запуск виртуальной машины Java и загрузку, связывание и инициализацию классов и интерфейсов.
Глава 6 описывает набор инструкций виртуальной машины Java, представляя инструкции в алфавитном порядке мнемоники операкодов.
Глава 7 содержит таблицу мнемоники операкодов виртуальной машины Java, индексированную значением операкода.
Во втором издании Спецификации виртуальной машины Java® глава 2 содержала обзор языка программирования Java, который предназначался для поддержки спецификации виртуальной машины Java, но сам по себе не являлся частью спецификации. В Спецификации виртуальной машины Java, издание Java SE 21 читатель отсылается к Спецификации языка Java, издание Java SE 21 для получения информации о языке программирования Java.
Во втором издании Спецификации виртуальной машины Java® глава 8 подробно описывала низкоуровневые действия, которые объясняли взаимодействие потоков виртуальной машины Java с общей основной памятью. В Спецификации виртуальной машины Java, издание Java SE 21 читателя отсылают к главе 17 Спецификации языка Java, издание Java SE 21 для получения информации о потоках и блокировках. Глава 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 21 через ссылки в формате (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.