Почему v8 сохраняет исходный код встроенного javascript в сгенерированных двоичных файлах?

Я изучаю источник v8, особенно в том, как инструмент "mksnapshot" содержит скомпилированное изображение собственных файлов javascript (runtime.js, json.js...) в двоичных файлах v8 и заметил, что он также включает (несколько) мини-версию источника. Например, при проверке содержимого исполняемого файла d8 я вижу следующий фрагмент:

var $JSON=global.JSON;

function Revive(a,b,c){
var d=a[b];
if((%_IsObject(d))){
if((%_IsArray(d))){
var g=d.length;

и в начале 'src/json.js' я вижу:

var $JSON = global.JSON;

function Revive(holder, name, reviver) {
  var val = holder[name];
  if (IS_OBJECT(val)) {
    if (IS_ARRAY(val)) {
      var length = val.length;

ясно, что оба фрагмента эквивалентны, но второй был преобразован в первый в процессе компиляции.

Я бы понял, был ли исходный код включен для проверки с помощью 'toString', но когда я вхожу в 'JSON.stringify' в d8, все, что я вижу, это 'function stringify() {[native code]}', так что точка этого?

Ответ 1

Фактически моментальный снимок не включает все встроенные в скомпилированную форму.

V8 в целом предпочитает ленивую компиляцию, чтобы сэкономить место и время. Если вы компилируете вещи, которые не используются, вы теряете память для сгенерированного кода (а код, созданный не оптимизирующим компилятором, довольно "подробный" ) и время (либо при компиляции, либо при десериализации, если речь идет о моментальном снимке).

Итак, все, что можно легко компилировать, V8 компилируется лениво, и это включает встроенные функции. Таким образом, моментальный снимок на самом деле не содержит скомпилированные версии для всех функций, и источник необходим для компиляции покоя.

Еще одна вещь, которая становится возможной, когда источник присутствует, - это оптимизация: V8 должен иметь доступ к источнику для применения своего адаптивного маршрута оптимизации.

Ответ 2

Возможно, потому, что кеширование двоичного файла - это то, что делает v8 настолько невероятно быстрым: он был построен очень быстро. Поэтому они предприняли крайние шаги, чтобы сделать это быстро. Предварительно сгенерированные двоичные файлы собственного кода отвлекают мышление от клиента, заставляя его работать намного быстрее. Есть такие оптимизации, как это во всем v8.:)