python字节码解析_【虚拟机系列】JS虚拟机——生成字节码

d1aaa2e49ebf4d17b5a057d82f3e2cd1.png
bajdcc/clibjs​github.com
f30d5123817978e99aa67a7b6c9e99b5.png

经过一番的折腾,clibjs又前进了一步,虽然C++等于重复造轮子,不过也乐在其中,虽然clibjs预计代码量庞大,有几次都想弃坑了,不过还是没有放弃。有趣的是,本专栏前面的project无一不是想中途放弃的,一句话,坚持就是胜利。

有时候也在想clibjs的方向,不过目前的一点打算是用clibjs成就的js语言来替代掉bajdcc/clibalgserver中的c语言,只是在性能上有所损失,但是在语法分析上比clibalgserver是更进一步的。

还有一点就是之前所有的语法分析在形成字节码之后都是无法追溯的,或者说不到位,因此痛定思痛,大刀阔斧,加以改进,如题图。在整个词法分析、语法分析、AST的过程中,有四样东西是记录的:行、列、源代码起始、源代码结束,这样就能形式全面的词法信息。

在思考字节码的基础上,我发现v8引擎的太高大上了,学不来,所以就抄了一下python的字节码定义,这样同时也可以加以对比,反正js和python在语法层面差不多,有函数、闭包、类等。这样其实也相当于做了一个js->python的转换器了,不过虚拟机的部分还是要以自己思考为主。

用dis对简单的python加以解析,发现由指令、常量池组成,这与之前的bajdcc/jMiniLang还是很相似的,题图中的index忘记加一了,完整的如下:

var a = b = c = 1;
var d = a + b * c;

C [#000] [NAME  ] a
C [#001] [NAME  ] b
C [#002] [NAME  ] c
C [#003] [NAME  ] d
C [#000] [NUMBER] 1.000000
C [0001:017] LOAD_CONST           00000000          (1)
C [0001:005] DUP_TOP                                (a)
C [0001:005] STORE_NAME           00000000          (a)
C [0001:009] DUP_TOP                                (b)
C [0001:009] STORE_NAME           00000001          (b)
C [0001:013] STORE_NAME           00000002          (c)
C [0002:009] LOAD_NAME            00000000          (a)
C [0002:013] LOAD_NAME            00000001          (b)
C [0002:017] LOAD_NAME            00000002          (c)
C [0002:013] BINARY_MULTIPLY                        (b * c)
C [0002:009] BINARY_ADD                             (a + b * c)
C [0002:005] STORE_NAME           00000003          (d)

后面的难点:闭包、面向对象、GC。


最近bajdcc/clibalgserver的关注度较多,它的部署很简单,或者在readme中点开下载链接,运行exe就可,或者下vs2019自己编译。然后网页为8080端口。

目前来说除了语法层面不支持面向对象以外,clibalgserver还是可以一战的,暂时也没有改进的想法了,也希望在clibjs完善之后,可以接手clibalgserver的编译后端。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值