本项目为《Crafting Interpreters》一书中clox
的实现。我实现了执行lox
脚本所需的词法解析器,语法解析器,虚拟机以及垃圾回收等功能。
lox
是一个简单且图灵完备的编程语言。没有太多的语法特性,但是它有完整的控制流和函数,且支持闭包和面向对象的特性。用它来构建一个简单的解释器再合适不过了。
clox
是一个C++项目(严格来说只用到了C的语法:)),因此你需要安装一些工具。
在clox
中,我们使用cmake
来管理整个工程。因此,你需要先安装cmake
。可以在cmake
的官网下载。版本要求是3.10
。
clox
使用C++
作为主要编程语言。因此,你需要安装一个支持C++
的编译器。在Windows平台请先安装MSVC,在Linux平台请先安装GCC。
在clox
的根目录下,建立build
目录。用于存放编译后的产物。
为了防止编译产物和源码混淆,所以在根目录下建立
build
目录。
在build
的目录下,执行以下命令:
cmake ..
cmake --build ./ --target clox -j 10
运行完成后,在build/build/Debug
目录下,会生成clox
的可执行文件。
可以在控制台运行该程序,如果以不带参数运行,默认会打开一个prompt
,在其中输入print "Hello, world!";
,然后回车,控制台就会输出Hello, world!
。
其他的一些输出是GC的日志。
clox
的有些配置项目位于include\common.h
中。
#define NAN_BOXING
#define DEBUG_PRINT_CODE
#define DEBUG_TRACE_EXECUTION
#define DEBUG_STRESS_GC
#define DEBUG_LOG_GC
NAN_BOXING
:用于开启是否使用nan boxing
来表示值。开启之后不在使用C
的union
来表示值,而是统一使用一个64 bit的value
来表示数值、布尔值、nil
以及对象等。DEBUG_PRINT_CODE
:用于开启是否打印编译后的字节码。DEBUG_TRACE_EXECUTION
:用于开启是否打印虚拟机执行时的调试信息。DEBUG_STRESS_GC
:用于开启是否进行强制垃圾回收,不开启则会默认进行自适应垃圾回收。DEBUG_LOG_GC
:用于开启是否打印垃圾回收的日志。