多线程Javascript解释器的大致架构
由于一个完整的解释器类似Google V8的解释器需要的工作量非常的大如需要实现如下的模块:
词法分析,语法分析器,AST转Byte模块,解释执行模块和JIT模块,当然也包括了垃圾回收模块和全局控制器模块, 而JIT模块需要对不同平台进行细分具体有IA32, ARM 两个平台的实现.
所以这个解释器在实现的模块上虽然也和其他解释器相同,但是不包括垃圾回收模块和JIT模块. 但是包括了一个多线程模块,用来扩展Javascript的多线程能力,功能类似与Java的线程模型,具有synchronized和Thread类.
该解释器的基本架构如下图:
1. Lex+Parse模块是通过输入String或者一个Stream来获得一个组织完成的AST中间表示, 如果中间出现错误,则可以进行提示.
2. EVAL模块是根据ECMAScript-262 3th Edition中10-15章的算法描述组织的解释执行模块.
3. VM模块是该软件的总控模块,每一个VM持有一个Global全局对象池,而通过共享Global对象池,实现同进程中不同线程的资源共享。
3.1 其中Engine代表了具体某个执行的线程表示, 而Context代表了上下文,同一个Engine下的Context需要竞争Engine来获得调用EVAL的功能.
4. Util模块中包括了Node等常用的数据结构, 来支持整个软件.
如下是该解释器和系统之间通信模式:
组件解析:
1. File.js :具体的某个脚本
2. 词法分析: Javascript引擎的词法分析部分, 把File.js 中的字符流进行归类到某个Token, 如function关键字使用tFUNCTION 这个Token表示该意思, 并且把词法分析独立出来有利于对部分输入源的解耦, 如String输入流,File输入流等不同的输入方式。
3. 语法分析: 将词法分析得到的Token根据具体的ECMAScript语法构建AST(抽象语法树)
4. 虚拟机: 使用AST, 结合Javascript语言的具体机制来完成对AST的具体解释运行, 在运行过程中, 会使用到各个对象来完成I/O操作, 如File对象, Socket对象等, 并且通过这些对象完成了对脚本语言和操作系统的联系,使得Javascript能够在Server上运行任务。
5. Host对象: 操作系统相关的对象, 如File 它代表了具体某个文件的基本信息(大小, 可读属性, 是否已经被打开,用户权限等), Socket它代表了操作系统的socket操作(建立TCP连接, 发送字节流, 接受字节流,关闭一个连接等)
6. 内部对象: 提供基本型的对象类型, 如语言中经常使用的String类型以及它的相关操作(substr, charAt)等等.
上述的基本架构就是本次项目的基本介绍, 具体的设计会结合现在已经存在的标准建立。
而选用Linux平台作为运行环境(Linux 有免费的编译环境 ~~)