Продолжаю разбираться как внутри устроен V8. Из интересного - доклад про Ignition - интерпретатор JS который V8 использует при первом исполнении JS кода:
При многократном выполнении код компилируется оптимизирующим компилятором TurboFan (с ним пока не разбирался).
Начал копать memory layout по исходникам. Начал с src/objects.h - там общая иерархия объектов описана. Если в кратце то V8 имеет следующие типы объектов(OBJECT_TYPE_LIST):
При многократном выполнении код компилируется оптимизирующим компилятором TurboFan (с ним пока не разбирался).
Начал копать memory layout по исходникам. Начал с src/objects.h - там общая иерархия объектов описана. Если в кратце то V8 имеет следующие типы объектов(OBJECT_TYPE_LIST):
- Smi - immediate small integer
- LayoutDescriptor
- HeapObject - superclass for everything allocated in the heap
- Primitive
- Number
- Numeric
В V8 используется хитрая схема тэгирования указателей (tagging scheme) - так как все что они читают/пишут из памяти выровненно по границе машинного слова (4/8 байт) то младшие биты указателя всегда должны быть равны нулю. Они используют их для тэгирования значения хранящегося в области памяти. Если младший бит ноль - то это вовсе не указатель а Smi -целочисленное значение хранящиеся в верхних 31 бите указателя. Если младший бит равен 1 - то это указатель на HeapObject. Второй с конца бит используется для тэгирования WeakObject. Если второй бит равен 1 то это указатель на WeakHeapObject.
Реализация лежит в include/v8-internal.h
В добавок ко всему этому если архитектура 64-битная то Node.js умеет сжимать указатели (также как и Java Runtime).
Из источников информации отдельно хочется отметить https://github.com/danbev/learning-v8 Автор провел просто фантастическую работу по разбору кишков V8 с отладчиком в руках. И не поленился все это задокументировать. Вообще сама по себе идея документировать то что ты исследуешь в github очень крутая. У этого же автора еще штук пять подобных репозиториев где он разбирает libuv, node.js и прочее.
Еще для понимания очень полезным оказался V8’s Object Model Using Well-Defined C++
Комментариев нет:
Отправить комментарий