utilizados scripts script mas lenguajes entre diferencia javascript code-generation v8

javascript - scripts - ¿Cómo puedo ver el código de máquina generado por v8?



diferencia entre un scripting y un scripts (5)

¿Alguien sabe cómo puedo ver el código de máquina real que v8 genera desde Javascript? He llegado tan lejos como Script::Compile() en src/api.cc pero no sé a dónde ir desde allí.


Estás en el camino correcto, creo.

Parece que necesita obtener de Script :: Compilar a Compilar :: Compilar, que lo llevará a los generadores de código (codegen * .cc y .h).

Todo esto para decir que, al mirar codegen-ia32.cc, si defines ENABLE_DISASSEMBLER cuando construyes, creo que tu desensamblaje debería imprimirse.

Por supuesto, todo esto es solo una rápida búsqueda de una copia antigua de la fuente que tengo aquí, así que YMMV, pero creo que esto debería funcionar.

(Mirando su publicación nuevamente, veo que está buscando el lenguaje de la máquina, no el ensamblador, no estoy seguro, pero puede que tenga que modificar la lógica si desea la salida del código ensamblado en lugar de su desensamblaje)


No sé cómo invocar el desensamblador desde el código C ++, pero hay una manera rápida y sucia de obtener un desmontaje del shell.

Primero, compile v8 con soporte de desensamblador:

scons [your v8 build options here] disassembler=on sample=shell

Ahora puede invocar el shell con la opción "--print_code":

./shell --print_code hello.js

Lo cual debería darte algo como esto:

--- Raw source --- print("hello world"); --- Code --- kind = FUNCTION Instructions (size = 134) 0x2ad0a77ceea0 0 55 push rbp 0x2ad0a77ceea1 1 488bec REX.W movq rbp,rsp 0x2ad0a77ceea4 4 56 push rsi 0x2ad0a77ceea5 5 57 push rdi 0x2ad0a77ceea6 6 49ba59c13da9d02a0000 REX.W movq r10,0x2ad0a93dc159 ;; object: 0xa93dc159 <undefined> 0x2ad0a77ceeb0 16 4952 REX.W push r10 0x2ad0a77ceeb2 18 49ba688b700000000000 REX.W movq r10,0x708b68 0x2ad0a77ceebc 28 493b22 REX.W cmpq rsp,[r10] 0x2ad0a77ceebf 31 0f824e000000 jc 115 (0x2ad0a77cef13) 0x2ad0a77ceec5 37 488b462f REX.W movq rax,[rsi+0x2f] 0x2ad0a77ceec9 41 4883ec18 REX.W subq rsp,0xlx 0x2ad0a77ceecd 45 49ba094b3ea9d02a0000 REX.W movq r10,0x2ad0a93e4b09 ;; object: 0xa93e4b09 <String[5]: print> 0x2ad0a77ceed7 55 4c8955e0 REX.W movq [rbp-0x20],r10 0x2ad0a77ceedb 59 488945d8 REX.W movq [rbp-0x28],rax 0x2ad0a77ceedf 63 49ba014d3ea9d02a0000 REX.W movq r10,0x2ad0a93e4d01 ;; object: 0xa93e4d01 <String[11]: hello world> 0x2ad0a77ceee9 73 4c8955d0 REX.W movq [rbp-0x30],r10 0x2ad0a77ceeed 77 49baa06c7ba7d02a0000 REX.W movq r10,0x2ad0a77b6ca0 ;; debug: statement 0 ;; code: contextual, CALL_IC, UNINITIALIZED, argc = 1 0x2ad0a77ceef7 87 49ffd2 REX.W call r10 0x2ad0a77ceefa 90 488b75f8 REX.W movq rsi,[rbp-0x8] 0x2ad0a77ceefe 94 4883c408 REX.W addq rsp,0xlx 0x2ad0a77cef02 98 488945e8 REX.W movq [rbp-0x18],rax 0x2ad0a77cef06 102 488be5 REX.W movq rsp,rbp ;; js return 0x2ad0a77cef09 105 5d pop rbp 0x2ad0a77cef0a 106 c20800 ret 0x8 0x2ad0a77cef0d 109 cc int3 0x2ad0a77cef0e 110 cc int3 0x2ad0a77cef0f 111 cc int3 0x2ad0a77cef10 112 cc int3 0x2ad0a77cef11 113 cc int3 0x2ad0a77cef12 114 cc int3 0x2ad0a77cef13 115 49ba60657ba7d02a0000 REX.W movq r10,0x2ad0a77b6560 ;; code: STUB, StackCheck, minor: 0 0x2ad0a77cef1d 125 49ffd2 REX.W call r10 0x2ad0a77cef20 128 488b7df0 REX.W movq rdi,[rbp-0x10] 0x2ad0a77cef24 132 eb9f jmp 37 (0x2ad0a77ceec5) RelocInfo (size = 10) 0x2ad0a77ceea8 embedded object (0xa93dc159 <undefined>) 0x2ad0a77ceecf embedded object (0xa93e4b09 <String[5]: print>) 0x2ad0a77ceee1 embedded object (0xa93e4d01 <String[11]: hello world>) 0x2ad0a77ceeed statement position (0) 0x2ad0a77ceeef code target (context) (CALL_IC) (0x2ad0a77b6ca0) 0x2ad0a77cef06 js return 0x2ad0a77cef15 code target (STUB) (0x2ad0a77b6560) hello world

Tu producción variará, por supuesto. Lo anterior es del tronco v8 compilado para Linux x64.


Necesita construir v8 con soporte de desensamblador.

Descargue el código fuente v8.

git clone https://chromium.googlesource.com/v8/v8.git

Construir con soporte de desensamblador.

make dependencies make ia32.release objectprint=on disassembler=on

Llame a d8 (shell v8) usando ciertos indicadores, dependiendo de lo que desee.

out/ia32.release/d8 --code-comments --print-code <app.js>

Para referencia:

  • --code-comments : incluye comentarios de código.
  • --print-code : imprime el código en stdout .
  • --print-code-stubs : imprime stubs de código.
  • --print-opt-code : imprime código optimizado.
  • --trace-hydrogen : imprime el código IR (representación intermedia) en hydrogen.cfg. Este archivo se puede abrir con C1Visualizer de Java .

Eche un vistazo a v8_root/build/features.gypi , y encontrará los conmutadores de características de tiempo de compilación y muchos otros de compilación para V8.


Prueba con NodeJS o Chrome:

  1. -print-opt-code : código generado al optimizar el compilador.
  2. -print-bytecode : código de bytes generado por el intérprete.
  3. -trace-opt y -trace-depot : qué funciones están (de) optimizadas.

Consulta este artículo de @Franziska Hinkelmann:

https://medium.com/dailyjs/understanding-v8s-bytecode-317d46c94775

Además, también puedes probar

D8 : Te ayudará a compilar V8 y ver el código ensamblado generado desde JavaScript.

Para uso y detalles:

http://www.mattzeunert.com/2015/08/19/viewing-assembly-code-generated-by-v8.html