怎样剥离一个解释器的执行部分?
程序员文章站
2022-06-01 21:57:47
...
想在资源受限的嵌入式设备上,只保留解释器的执行部分,把其他部分分离出去。
怎么样分析一个解释器,把它的执行部分整理出来??
这个JavaScript引擎的执行部分是一个解释器,而且是边parse边解释的那种,连AST都不构造。这种实现方式让我想起了最早期的PHP…这是实现解释器最慢的做法“之一”了…
所以它的解释器主体就在这个文件里:
Espruino/jsparse.c at master · espruino/Espruino · GitHub
它依赖jslex.[h|c]与jsvar.[h|c]。jslex负责词法分析,jsvar负责内存管理(包括对象结构体的定义以及一个超简易的mark-sweep GC等)。
src目录里剩下的文件,
话说有个同样是不构造AST直接边parse边解释执行的JavaScript实现,tiny-js,也非常小。官网:Pur3.co.uk :: TinyJS
而它其实就是Espruino的JavaScript实现的前身。难怪会用同样的思路去实现…呃
Espruino - Press
====================================
题主问的Python解释器MicroPython看起来比Espruino大一些。它至少包括了很完整的编译器+字节码解释器+GC,这核心可裁剪的东西不太多了。能动的主要是外围包含的库了…
怎么样分析一个解释器,把它的执行部分整理出来??
回复内容:
题主问的JavaScript引擎是Espruino,这个解释器已经非常非常非常小了,不知道题主还需要剥离哪些东西出去?这个JavaScript引擎的执行部分是一个解释器,而且是边parse边解释的那种,连AST都不构造。这种实现方式让我想起了最早期的PHP…这是实现解释器最慢的做法“之一”了…
所以它的解释器主体就在这个文件里:
Espruino/jsparse.c at master · espruino/Espruino · GitHub
它依赖jslex.[h|c]与jsvar.[h|c]。jslex负责词法分析,jsvar负责内存管理(包括对象结构体的定义以及一个超简易的mark-sweep GC等)。
src目录里剩下的文件,
- jswrap开头的都是用于实现JavaScript标准库的,这些如果有用不到的可以删掉;
- 然后剩下的js开头的文件(例如jsdevice.[h|c])主要都是跟操作嵌入式设备相关的,这些也可以看题主的需求裁剪。
话说有个同样是不构造AST直接边parse边解释执行的JavaScript实现,tiny-js,也非常小。官网:Pur3.co.uk :: TinyJS
而它其实就是Espruino的JavaScript实现的前身。难怪会用同样的思路去实现…呃
Espruino - Press
As a Linux user Gordon was aware that whatever tools were used had to work reliably on multiple platforms without needing extra software, so building an interpreter into the microcontroller seemed the obvious way forwards. BASIC interpreters for microcontrollers have been around for a while (like the amazing Maximite), but until recently the amount of built-in RAM and Flash in microcontrollers has been a stumbling block for more complex languages. When Gordon saw the STM32F1 development boards with 128kb of Flash and 8kb of RAM he realised he could use the lessons learned from his TinyJS JavaScript interpreter (originally built for Morphyre) to produce something that would run within those limits - and so Espruino started!
====================================
题主问的Python解释器MicroPython看起来比Espruino大一些。它至少包括了很完整的编译器+字节码解释器+GC,这核心可裁剪的东西不太多了。能动的主要是外围包含的库了…