Показать сообщение отдельно
  #18 (permalink)  
Старый 18.02.2018, 00:55
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,127

Что за гадания на кофейной гуще. Все исходники в открытом доступе.
https://github.com/v8/v8/tree/f165df...rc/interpreter
Код не сложный и ни сказать что бы слишком большой. вполне по силам среднему разработчику.

Первое что делает интерпретатор строит лексическое дерево и на основании него генерирует байткод.
Никаких оптимизаций в этот момент не производится. Байткод сразу же готов к работе в своей вм.
Лексическое дерево разбивается на области видимости. Константы и логика в виде байт кода хранится отдельно а переменные параметры возвращаемое значение ссылки на другие области видимости хранятся в отдельной таблице ключ значение дальше в куче. смещение на эту кучу передается блоку кода при вызове ( Именно по этому работает такое понятие как поднятие переменных т.к. на момент исполнения блока кода имя переменной уже есть в таблице ключ значение для этого блока кода.). Данные хранятся отдельно от блока кода для того что бы работали такие вещи как замыкания и рекурсия.

т.е. под каждое имя в данной области видимости есть только одно место в таблице ключ значение (хеш таблица).
При интерпретации в виртуальной машине операторы строки выполняются согласно своим приоритетам каждый раз когда встречается идентификатор "arg1" идет обращение к одному и тому же месту в таблице.

Если блок кода (функция) вызывается часто или выполняется долго (интерпретатор считает время исполнения) то этот блок передается оптимизатору а там все сложно =).
Ответить с цитированием