【问题标题】:How can I transfer JS to native machine code (using v8)如何将 JS 转换为本机代码(使用 v8)
【发布时间】:2017-11-27 22:57:50
【问题描述】:

我已经尝试了网址中的建议: How can I see the machine code generated by v8?

这是我所做的:

git clone https://chromium.googlesource.com/chromium/tools/depot_tools

sudo apt-get install libv8-dev
sudo apt-get install g++
sudo apt-get install libgtk2.0-dev
sudo apt-get install g++-multilib

export PATH="$PATH":`pwd`/depot_tools

fetch v8

gclient sync

make ia32.release objectprint=on disassembler=on

v8/out/ia32.release/d8 --print-all-code hello.js > output.txt

(脚本就是:print("hello"))

以下是输出:

kind = STUB
major_key = JSEntryStub
compiler = unknown
Instructions (size = 131)
0x35d06040     0  55             push ebp
0x35d06041     1  89e5           mov ebp,esp
0x35d06043     3  6a02           push 0x2
......
0x35d060c2    82  c3             ret
Handler Table (size = 12)

RelocInfo (size = 23)
0x35d06047  external reference (Isolate::context_address)  (0xa9533dc)
0x35d06050  external reference (Isolate::c_entry_fp_address)  (0xa953410)
......
kind = STUB
major_key = JSEntryStub
compiler = unknown
Instructions (size = 131)
0x35d06120     0  55             push ebb
......

确实,我有一批代码,但它与输入脚本没有什么不同。 顺便说一句,对于一个简单的脚本来说,输出肯定太多了(大约 13M 文本)。

谢谢。

【问题讨论】:

  • 我怀疑您正在尝试做一些没有意义的事情。另见:meta.stackexchange.com/questions/66377/what-is-the-xy-problem
  • 您将看到的大部分由 jit 生成的代码很可能来自 V8 运行时库,其中 (1) 很多,并且 (2) 对于不同的脚本相同。尝试在输出中搜索代码中的一些唯一标识符。

标签: javascript code-generation v8


【解决方案1】:

对于当前的 V8 版本(5.9 或更高版本),您可能需要 --print-opt-code 标志:最初,V8 为其解释器生成字节码(您可以使用 --print-bytecode 检查);一旦一个函数“热”(即花费大量时间执行它),它就会被发送到优化编译器为其生成机器代码。

请注意,您不能将 V8 用作通用的 JavaScript 到机器代码的编译器。上面提到的标志是用于调试的;没有(受支持或简单的)方法可以从其输出中生成工作二进制文件。

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多