Кто-нибудь может объяснить этот байт-код Google V8 CreateObjectLiteral? - PullRequest
0 голосов
/ 14 апреля 2020

Это исходный код JavaScript.

const obj = {
    name: 'hello',
    age: 12
};

console.log(obj);

А это байт-код Google V8, созданный с использованием опции node js --print-bytecode.

[generated bytecode for function: ]
Parameter count 6
Frame size 12
    0 E> 17543D4A @    0 : a0                StackCheck 
   12 S> 17543D4B @    1 : 79 00 00 29 fa    CreateObjectLiteral [0], [0], #41, r1
         17543D50 @    6 : 27 fa fb          Mov r1, r0
   54 S> 17543D53 @    9 : 13 01 01          LdaGlobal [1], [1]
         17543D56 @   12 : 26 f9             Star r2
   62 E> 17543D58 @   14 : 28 f9 02 03       LdaNamedProperty r2, [2], [3]
         17543D5C @   18 : 26 fa             Star r1
   62 E> 17543D5E @   20 : 57 fa f9 fb 05    CallProperty1 r1, r2, r0, [5]
         17543D63 @   25 : 0d                LdaUndefined 
   70 S> 17543D64 @   26 : a4                Return 
Constant pool (size = 3)
17543CFD: [FixedArray] in OldSpace
 - map: 0x3a0841e5 <Map>
 - length: 3
           0: 0x17543cdd <BoilerplateDescription[4]>
           1: 0x3a6927a1 <String[7]: console>
           2: 0x3a685b69 <String[3]: log>
Handler Table (size = 0)

Любая помощь будет благодарна.

1 Ответ

0 голосов
/ 14 апреля 2020

Как следует из названия, CreateObjectLiteral создает объект из литерала, в данном случае {name: 'hello', ...}. Чтобы сделать это более эффективным, V8 использует то, что он называет «шаблонными» объектами, которые являются частично заполненными «чертежами», которые можно быстро скопировать для создания нового экземпляра; после этого заполняются любые свойства Dynami c (то есть, которые не являются константами времени компиляции). У вас нет ни одного из них в этом примере, поэтому вы этого не видите. Обратите внимание на разницу в следующем слегка измененном примере:

function foo(n, a) {
    const obj = {name: n, age: a};
    console.log(obj);
}

foo("hello", 12);
...