经过一番的折腾,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的编译后端。