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

2021-05-22 19:43:14 +08:00
 foxyier

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

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

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

2589 次点击
所在节点    JavaScript
9 条回复
Mohanson
2021-05-22 20:04:37 +08:00
可以看我的 minits 项目: https://github.com/nervosnetwork/minits

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

当年在 W3C 讨论组分享过, 应该是最符合你题目的项目了, 技术不深, 入个门还是 ok 的
ch2
2021-05-22 20:20:27 +08:00
语义分析,照别人的抄就行了
lambdafate
2021-05-22 20:30:14 +08:00
啊,梦回编译原理。
no1xsyzy
2021-05-22 23:31:43 +08:00
SICP 第五章,但我是看不进去。
3dwelcome
2021-05-22 23:50:45 +08:00
"每个 AST 节点对应的汇编语言操作"
通常来说就是指 LLVM 对应的 IR 运行机制,那种伪汇编不是很难,但需要花不少时间去学习。
个人不是很推荐钻研,写这东西特别费时间,又没太大实用价值。
reiji
2021-05-23 09:27:32 +08:00
@Mohanson 这个博客太有趣了,估计这几天的时间都要花在这上面了
Mohanson
2021-05-23 10:33:01 +08:00
@reiji 感谢支持, 花了很多时间在上面
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
2021-05-23 14:28:58 +08:00
生成 AST 了, 直接遍历 AST 转成一个一个汇编的脚本, 完成以后直接编译生成的汇编脚本就可以了。 编译原理计算机专业都学过的吧。里面有的。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/778582

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX