V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐关注
Meteor
JSLint - a JavaScript code quality tool
jsFiddle
D3.js
WebStorm
推荐书目
JavaScript 权威指南第 5 版
Closure: The Definitive Guide
foxyier
V2EX  ›  JavaScript

「请教贴」如何把 js 的 AST 节点转换成汇编语言代码

  •  
  •   foxyier · 2021-05-22 19:43:14 +08:00 · 2865 次点击
    这是一个创建于 1314 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT 。最近想要实现一个基于 js 的「栈式虚拟机」。

    js 源代码 ---> AST 节点的过程相对简单且易于理解, 但是「每个 AST 节点对应的汇编语言操作」就不太懂了。

    想请教一下各位大佬有没有这方面的「工具, 书籍, 或者课程」等等。 想要去学习一下。

    9 条回复    2021-05-23 14:28:58 +08:00
    Mohanson
        1
    Mohanson  
       2021-05-22 20:04:37 +08:00   ❤️ 4
    可以看我的 minits 项目: https://github.com/nervosnetwork/minits

    配套演讲: http://accu.cc/content/misc/minits/

    当年在 W3C 讨论组分享过, 应该是最符合你题目的项目了, 技术不深, 入个门还是 ok 的
    ch2
        2
    ch2  
       2021-05-22 20:20:27 +08:00
    语义分析,照别人的抄就行了
    lambdafate
        3
    lambdafate  
       2021-05-22 20:30:14 +08:00
    啊,梦回编译原理。
    no1xsyzy
        4
    no1xsyzy  
       2021-05-22 23:31:43 +08:00
    SICP 第五章,但我是看不进去。
    3dwelcome
        5
    3dwelcome  
       2021-05-22 23:50:45 +08:00
    "每个 AST 节点对应的汇编语言操作"
    通常来说就是指 LLVM 对应的 IR 运行机制,那种伪汇编不是很难,但需要花不少时间去学习。
    个人不是很推荐钻研,写这东西特别费时间,又没太大实用价值。
    reiji
        6
    reiji  
       2021-05-23 09:27:32 +08:00
    @Mohanson 这个博客太有趣了,估计这几天的时间都要花在这上面了
    Mohanson
        7
    Mohanson  
       2021-05-23 10:33:01 +08:00
    @reiji 感谢支持, 花了很多时间在上面
    jiyinyiyong
        8
    jiyinyiyong  
       2021-05-23 11:51:33 +08:00
    感觉还挺难的, 前面给的 LLVM 是静态类型语言生成汇编的方案吧, 编译原理的内容, 但是生成代码需要类型提示的, 得跟 TypeScript 那样手写类型了, 不然要编译器实现类型推断.. 在 JavaScript 上做类型推断... 感觉不靠谱.

    Julia 语言因为是 LLVM 上实现的, 动态语言, 实现了基于动态语言生成 assembly. 我感觉挺厉害的, 不知道类型推断这块具体怎么做到的 https://discourse.julialang.org/t/understanding-generated-assembly-for-simple-loop/9698 .

    我觉得楼主先搞个 VM, 然后自己基于 VM 糊个语言出来, 应该也已经蛮厉害了 https://craftinginterpreters.com/a-virtual-machine.html .

    至于基于 JavaScript 搞这种, 我听朋友说好像得扒 https://bellard.org/quickjs/ 源码了(不会 C++ 飘过...
    jones2000
        9
    jones2000  
       2021-05-23 14:28:58 +08:00
    生成 AST 了, 直接遍历 AST 转成一个一个汇编的脚本, 完成以后直接编译生成的汇编脚本就可以了。 编译原理计算机专业都学过的吧。里面有的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3285 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 12:17 · PVG 20:17 · LAX 04:17 · JFK 07:17
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.