Глава 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 11 и поддерживает язык программирования Java, описанный в Спецификации языка Java, издание Java SE 11.
В главе 2 даётся обзор архитектуры виртуальной машины Java.
В главе 3 представлена компиляция кода, написанного на языке программирования Java, в набор инструкций виртуальной машины Java.
В главе 4 описывается формат файла class, независимый от аппаратного обеспечения и операционной системы двоичный формат, используемый для представления скомпилированных классов и интерфейсов.
В главе 5 описывается запуск виртуальной машины Java и загрузка, связывание и инициализация классов и интерфейсов.
В главе 6 описывается набор инструкций виртуальной машины Java, представляя инструкции в алфавитном порядке мнемоники кодов операций.
В главе 7 приводится таблица мнемоники кодов операций виртуальной машины Java, индексированная по значению кода операции.
Во втором издании Спецификации виртуальной машины Java® глава 2 давала обзор языка программирования Java, который предназначался для поддержки спецификации виртуальной машины Java, но сама по себе не являлась частью спецификации. В Спецификации виртуальной машины Java, издание Java SE 11 читатель отсылается к Спецификации языка Java, издание Java SE 11 для получения информации о языке программирования Java. Ссылки вида: (JLS §x.y) указывают, где это необходимо.
Во втором издании Спецификации виртуальной машины Java®, глава 8 подробно описывала низкоуровневые действия, которые объясняли взаимодействие потоков виртуальной машины Java с общей основной памятью. В Спецификации виртуальной машины Java, издание Java SE 11 читатель отсылается к главе 17 Спецификации языка Java, издание Java SE 11 для получения информации о потоках и блокировках. Глава 17 отражает Модель памяти Java и спецификацию потоков, разработанную экспертной группой JSR 133.
В этой спецификации мы ссылаемся на классы и интерфейсы, взятые из API платформы Java SE. Всякий раз, когда мы ссылаемся на класс или интерфейс (кроме тех, которые объявлены в примере) с помощью единственного идентификатора N, предполагается ссылка на класс или интерфейс с именем N в пакете java.lang. Мы используем полное имя для классов или интерфейсов из пакетов, отличных от java.lang.
Всякий раз, когда мы ссылаемся на класс или интерфейс, который объявлен в пакете java или любом его подпакете, предполагается ссылка на этот класс или интерфейс, загруженный загрузчиком базового класса (§5.3.1).
Всякий раз, когда мы ссылаемся на подпакет пакета, названного java, предполагается ссылка на этот подпакет, определяемый загрузчиком базового класса.
Использование шрифтов в этой спецификации следующее:
-
Шрифт
fixed widthиспользуется для типов данных виртуальной машины Java, исключений, ошибок, структур файловclass, кода Prolog и фрагментов кода Java. -
Курсив используется для «ассемблерного языка» виртуальной машины Java, её кодов операций и операндов, а также элементов областей данных виртуальной машины во время выполнения. Он также используется для введения новых терминов и просто для выделения.
Ненормативная информация, предназначенная для уточнения спецификации, приводится мельче, с отступами.
Это ненормативная информация. Она предоставляет интуицию, обоснование, советы, примеры и т. д.
Читатели приглашаются сообщить о технических ошибках и неясностях в Спецификации виртуальной машины Java® в jls-jvms-spec-comments@openjdk.java.net.
Вопросы, касающиеся генерации и обработки файлов class компилятором javac (компилятором по умолчанию для языка программирования Java) можно направить по адресу compiler-dev@openjdk.java.net.
© Oracle and/or its affiliates. All rights reserved.
Licensed under the Oracle Technology Network License Agreement.