Nodejs/V8 съхранява ли компилиран машинен код някъде на диска?

Редактиране: Node използва байт код от Node 8.3, преди това изходните кодове бяха компилирани директно в машинен код.

Правя много кодиране на Python и винаги има байт код в .pyc файловете.

Чудех се дали node съхранява своя машинен код в подобни файлове, например би имало смисъл да запазите представянето на машинния код на диска и да го използвате повторно, ако източникът на файл е непроменен.

Ако е така, къде node/v8 съхранява този машинен код?

Редактиране 2: Както @dystroy споменава по-долу, това е дублиране на Как мога да видя машинния код, генериран от v8?


person mikemaccana    schedule 21.05.2013    source източник
comment
Отговорите тук вече са остарели. Вижте v8project.blogspot.com/2015/07/code-caching.html   -  person EricLaw    schedule 16.02.2017
comment
@EricLaw 1. Чувствайте се свободни да добавите отговор и аз ще го маркирам като приет. 2. Здравей!   -  person mikemaccana    schedule 18.02.2017
comment
Възможен дубликат на Как мога да видя машинния код, генериран от v8?   -  person mikemaccana    schedule 21.05.2018


Отговори (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