Сохраняет ли nodejs/V8 скомпилированный машинный код где-нибудь на диске?

Изменить: Node использует байт-код, начиная с Node 8.3, до этого исходники компилировались непосредственно в машинный код.

Я много программирую на Python, и в файлах .pyc всегда есть байт-код.

Мне было интересно, хранит ли node свой машинный код в подобных файлах, например, было бы целесообразно сохранить представление машинного кода на диске и повторно использовать его, если источник файла не изменился.

Если да, то где node/v8 хранит этот машинный код?

Редактировать 2: как упоминает @dystroy ниже, это обман Как посмотреть машинный код, сгенерированный v8?


person mikemaccana    schedule 21.05.2013    source источник


Ответы (3)


V8 представила интерпретатор байт-кода Ignition в 2016 году. Вы можете распечатать байт-код с помощью --print-bytecode (Node 8.3 и новее).

$ node --print-bytecode incrementX.js -e 'function incrementX(obj) {return 1 + obj.x;} incrementX({x: 42});`
...
[generating bytecode for function: incrementX]
Parameter count 2
Frame size 8
  12 E> 0x2ddf8802cf6e @    StackCheck
  19 S> 0x2ddf8802cf6f @    LdaSmi [1]
        0x2ddf8802cf71 @    Star r0
  34 E> 0x2ddf8802cf73 @    LdaNamedProperty a0, [0], [4]
  28 E> 0x2ddf8802cf77 @    Add r0, [6]
  36 S> 0x2ddf8802cf7a @    Return
Constant pool (size = 1)
0x2ddf8802cf21: [FixedArray] in OldSpace
 - map = 0x2ddfb2d02309 <Map(HOLEY_ELEMENTS)>
 - length: 1
           0: 0x2ddf8db91611 <String[1]: x>
Handler Table (size = 16)

См. Понимание байт-кода V8.

Чтобы увидеть машинный код, используйте --print-opt-code --code-comments.

person user835611    schedule 18.08.2017
comment
Но вы можете видеть только байт-код. :/ Я бы тоже хотел его запустить. - person Klaider; 27.08.2017
comment
Это интересно, но на самом деле не отвечает на вопрос о том, хранит ли (и где) node.js хранит скомпилированный код, например. между пробегами. - person natevw; 24.01.2020

V8 — это своевременный компилятор. Таким образом, JavaScript не может быть скомпилирован только один раз, как компилятор Python, который является статической компиляцией. Он компилируется по мере необходимости.

Вы не можете увидеть сгенерированный машинный код для JavaScript, потому что он не сохраняется. Не имеет смысла хранить скомпилированный машинный код, так как компиляция выполняется многократно и на нее влияет оптимизация во время выполнения. Вы не получаете фиксированный машинный код, как для Python, каждый раз, когда это происходит.

person user568109    schedule 21.05.2013
comment
Я не согласен с тем, что нет смысла хранить машинный код. На самом деле это имеет большой смысл. JavaScript вышел за рамки использования коротких сценариев для добавления функций на веб-страницы, и существует множество крупномасштабных программ, которые его используют. Время запуска для этих приложений усугубляет повторяющееся сидение. Если бы байт-код был кэширован, время запуска значительно сократилось бы. .NET, Python, кэш-машина Java (или байт-код), скомпилированный код в качестве оптимизации для решения этой проблемы. Я не понимаю, почему двигатель V8 не может сделать то же самое. - person Todd; 10.02.2020

На странице проекта:

V8 компилирует исходный код JavaScript непосредственно в машинный код при первом выполнении. Нет промежуточных байт-кодов, нет интерпретатора.

Поэтому байт-кода вы не найдете, его нет.

Что касается нового вопроса после вашего редактирования, я думаю, что это связано вопрос в основном отвечает на него. Конечно, V8 вообще не имеет смысла записывать машинный код на диск с настройками по умолчанию. Поскольку этот код сильно меняется (см. ссылку выше, объясняющую, как создаются динамические классы), это было бы гигантскими накладными расходами.

person Denys Séguret    schedule 21.05.2013
comment
V8, являющийся своевременным компилятором, никогда не будет генерировать статический машинный код для javascript, как компилятор python, поэтому вы не можете увидеть скомпилированный машинный код. - person user568109; 21.05.2013
comment
@denys-séguret Но есть ли ~~байткод~~, простите, кэш машинного кода? Значение: он обнаруживает неизмененные файлы .js и повторно использует уже сгенерированный машинный код? (В этом смысле аналог кеша байт-кода PHP) - person Frank Nocke; 19.05.2016