Страницы

Поиск по вопросам

понедельник, 15 апреля 2019 г.

Как устроены примитивные типы в Java?

Типы-обёртки (вроде Integer) это классы, которые вполне можно "пощупать" в исходниках и понять как они устроены и работают. Как реализованы примитивные типы на уровне языка?


Ответ

Честно говоря опасаюсь, что не понимаю суть вопроса, но ответить всё же попробую. Возьмём для примера
public class Example { public static void test() { int i = 69; }
public static void main(String[] args) { test(); } }
После компиляции исходный код превратится в class-файл содержащий байткод - инструкции виртуальной машины. В частности int i = 69 превратится в два байткода
0: bipush 69 2: istore_0
Команда java Example запустит виртуальную машину, которая загрузит файл Example.class в память, создаст главный поток и вызовет в нём метод main. При создании главного потока в off-heap памяти виртуальной машины для него будет создан стек. В момент вызова метода test в этом стеке будет создан фрейм. Каждый фрейм содержит массив 32-битных ячеек для хранения локальных переменных и аргументов метода, а также стек операндов. Да-да, стек в стеке. JVM - стековая виртуальная машина, в ней стек операндов служит тем же целям, что и регистры в процессоре. Виртуальная машина начнёт выполнять байткод метода с нулевого смещения, по которому расположен опкод bipush с операндом 69. Этот опкод поместит константу 69 на вершину стека операндов. Следующий опкод istore_0 возьмёт элемент с вершины стека операндов и поместит в 1-й элемент массива локальных переменных.

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

Комментариев нет:

Отправить комментарий