【问题标题】:How to save Node compiled JavaScript output ( byte code) into a separate file如何将 Node 编译后的 JavaScript 输出(字节码)保存到单独的文件中
【发布时间】:2017-09-18 21:26:23
【问题描述】:

我在节点上工作,想查看编译后的字节码。有没有办法我们可以编译一个 js 文件并使用 node 将字节码保存在一个单独的文件中??

【问题讨论】:

  • javascript 没有被编译(在传统意义上)——它是一种解释性语言
  • 是的,我的意思是按节点解释/编译成字节码。 Node 确实将 JS 编译成字节码。我没有收到您的评论。
  • 基本答案是“不”。
  • Node(或者更确切地说是 Node 运行的 V8 JS 引擎)不会编译成字节码,而是即时编译成本机代码。如果您希望查看生成的本机代码,this answer 可能有用。
  • 注意其他JS引擎确实有字节码;例如Mozilla 使用的 SpiderMonkey 确实有字节码。 Rhino 将 JavaScript 编译为 JVM。但是,Node 没有使用这些。

标签: javascript node.js


【解决方案1】:

您可以使用--trace_ignition 来获取中间字节码:

#node --trace_ignition a.js
 -> 0x3aa1c02bf66e @    0 : 80                StackCheck 
 -> 0x3aa1c02bf66f @    1 : 13 13             LdaImmutableCurrentContextSlot [19]
      [ accumulator <- 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
 -> 0x3aa1c02bf671 @    3 : 1f f7             Star r3
      [ accumulator -> 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
      [          r3 <- 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
 -> 0x3aa1c02bf673 @    5 : 21 f7 00 04       LdaNamedProperty r3, [0], [4]
      [          r3 -> 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
      [ accumulator <- 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
 -> 0x3aa1c02bf677 @    9 : 1f f8             Star r2
      [ accumulator -> 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
      [          r2 <- 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
 -> 0x3aa1c02bf679 @   11 : 21 02 01 06       LdaNamedProperty <this>, [1], [6]
      [      <this> -> 0xd88d0f9a329 <a NativeModule with map 0x11929f412849> ]
      [ accumulator <- 0x3aa1c02bb969 <String[6]: events> ]
 -> 0x3aa1c02bf67d @   15 : 1f f6             Star r4
      [ accumulator -> 0x3aa1c02bb969 <String[6]: events> ]
      [          r4 <- 0x3aa1c02bb969 <String[6]: events> ]
 -> 0x3aa1c02bf67f @   17 : 45 f8 f7 02 02    CallProperty r2, r3-r4, [2]
      [          r2 -> 0x3aa1c02bcb49 <JS Function NativeModule.getSource (SharedFunctionInfo 0x3aa1c02b8c51)> ]
      [          r3 -> 0xd88d0f93ce9 <JS Function NativeModule (SharedFunctionInfo 0x3aa1c02b86a1)> ]
      [          r4 -> 0x3aa1c02bb969 <String[6]: events> ]
      [ accumulator <- 0xd88d0f956f1 <Very long string[15201]> ]
 -> 0x3aa1c02bf684 @   22 : 1f f9             Star r1
      [ accumulator -> 0xd88d0f956f1 <Very long string[15201]> ]
      [          r1 <- 0xd88d0f956f1 <Very long string[15201]> ]

您可以使用--print_code 获取本机生成的代码:

#node --print_code -e 'console.log("hello")' > code.txt
#head -100 code.txt
    --- Raw source ---
    (){
      var originAssert = this.assert;
      originAssert.apply = Function.prototype.apply;
      this.assert = assertWrapper;
      assertWrapper.toString = () => originAssert.toString();
      function assertWrapper(){
        if (!!arguments[0]) return;
        originAssert.apply(null, arguments);
      }
    })

    --- Code ---
    source_position = 9
    kind = FUNCTION
    compiler = full-codegen
    Instructions (size = 500)
    0x29b8195043c0     0  55             push rbp
    0x29b8195043c1     1  4889e5         REX.W movq rbp,rsp
    0x29b8195043c4     4  56             push rsi
    0x29b8195043c5     5  57             push rdi
    0x29b8195043c6     6  488b4f2f       REX.W movq rcx,[rdi+0x2f]
    0x29b8195043ca    10  488b4907       REX.W movq rcx,[rcx+0x7]
    0x29b8195043ce    14  83411b01       addl [rcx+0x1b],0x1
    0x29b8195043d2    18  41ff75a0       push [r13-0x60]
    0x29b8195043d6    22  b801000000     movl rax,0x1
    0x29b8195043db    27  e80038f3ff     call FastNewFunctionContextFunction  (0x29b819437be0)    ;; code: BUILTIN
    0x29b8195043e0    32  488bf0         REX.W movq rsi,rax
    0x29b8195043e3    35  488945f8       REX.W movq [rbp-0x8],rax

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    可以看到字节码

    如果想看V8的JavaScript代码字节码,可以打印出来 通过使用标志调用 D8 或 Node.js(8.3 或更高版本) --打印字节码。对于 Chrome,使用 --js-flags="--print-bytecode" 从命令行启动 Chrome,请参阅使用标志运行 Chromium。

    在此处阅读全文Understanding V8 Byte code

    不确定如何打印到文件中。

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 2013-01-29
      相关资源
      最近更新 更多