как об®екты);
- returnAddress - четырехбайтный адрес возврата из метода.
Спецификации Java-машины не описывают внутренней структуры об-
®ектов. В реализации Sun Microsystems значение типа object ука-
зывает на описатель, хранящий две ссылки - на таблицу методов и
на данные об®екта. Возможны и другие представления.
Java-машина является 32-разрядной. Более длинные значения
(long, double) представляются как пара четырехбайтных величин.
Не оговоривается, в каком порядке располагаются элементы пары;
более того, верификатор байт-кодов обязан выявлять и отвергать
программы, пытающиеся "вручную" составлять длинные значения.
4.2.2.2. Регистры
В Java-машине должны поддерживаться следующие регистры:
- pc - счетчик команд; указывает на код операции для команды,
которая будет выполняться следующей.
- vars - базовый регистр для доступа к локальным переменным те-
кущего метода.
- optop - указатель на вершину стека операндов. Java-машина яв-
ляется стековой, поэтому основная часть команд берет операнды
из стека и туда же помещает результат.
- frame - указатель на структуру, содержащую окружение времени
выполнения.
В свою очередь, окружение времени выполнения используется для
реализации трех целей: динамической загрузки, возврата из мето-
дов и обработки исключительных ситуаций.
Для обеспечения динамической загрузки, окружение времени выпол-
нения содержит ссылки на таблицу сивмолов текущего метода и те-
кущего класса. Перед началом выполнения метода выполняется ре-
дактирование его внешних связей (настройка ссылок на внешние
методы и внешние данные). Подобная поздняя настройка ссылок де-
лает сгенерированный код устойчивым по отношению к изменениям
во внешних классах.
Для обеспечения нормального возврата из методов выполняется
восстановление регистрового окружения вызывающего метода.
Для обработки исключительных ситуаций Java-машина выполняет
проход по стеку вызова методов и отыскивает самую внутреннюю
конструкцию catch, обрабатывающую случившееся событие.
В принципе окружение времени выполнения может содержать допол-
нительную информацию, необходимую, например, для отладки, но в
спецификациях Java-машины это оставлено на усмотрение авторов
реализации.
4.2.2.3. Сбор мусора
Для создания об®ектов во время выполнения выделяется область
динамической памяти. Язык Java рассчитан на то, что эту область
обслуживает сборщик мусора, поскольку в языке нет средств для
освобождения памяти. Как именно работает сборщик мусора, опре-
деляется реализацией Java-машины.
4.2.2.4. Система команд Java-машины
Команда Java-машины состоит из однобайтного кода операции, за
которым следуют операнды (если таковые имеются). Можно выделить
следующие группы команд:
- команды загрузки констант и переменных в стек операндов. Для
каждого типа данных имеются свои команды загрузки. Например,
команда с кодом операции dload и операндом, задающим смещение,
загружает в стек из локальной переменной вещественное число
двойной точности, а команда aload делает то же для ссылки на
об®ект.
- команды запоминания данных из стека в локальных переменных.
- команды управления массивами. Например, команда newarray с
операндом, задающим тип элементов, извлекает из стека требуемый
размер массива, создает его и помещает в стек ссылку на массив.
Отметим, что для создания массивов с элементами-об®ектами слу-
жит другая команда, anewarray. За счет подобной специализации
достигается эффективность интерпретации Java-программ.
- команды работы со стеком. К этой группе относятся команды,
которые удаляют, дублируют, меняют местами верхние элементы
стека операндов, а также выполняют другие, более сложные мани-
пуляции со стеком.
- арифметические команды. Операнды извлекаются из стека; туда
же помещается результат.
- логические команды (сдвиг, и, или, исключающее или).
- команды преобразования к другому типу.
- команды передачи управления. Например, в команде jsr (переход
на подпрограмму) операндом служит относительный адрес перехода;
адрес команды, следующей за jsr, помещается на вершину стека
операндов. Имеются команды для реализации переключателей.
- команды возврата из функции. Для возврата результатов разных
типов используются команды с разными кодами операции. Кроме то-
го, имеется команда breakpoint, которая останавливает нормаль-
Читать дальше