clox
(持续更新中,目前到scanner)
clox是由Bob Nystrom基于c编写的编译器,最终解释结果编译成字节码,通过编写学习,可以了解编译器的基本原理
主流程主要分为三步:
- 扫描
- 编译
- 执行(虚拟机)
极度推荐项目库:project-based-learning
目录结构
文件说明
文件名 | 功能 |
---|---|
common | 通用引用库文件 |
memory | 数组增删的逻辑,基础的内存管理 |
chunk | chunk节点:结构定义,属性的更改;储存源代码 |
value | 常量池,常量类型结构的定义及实现 |
debug | 反汇编提示信息 |
main | 主函数 |
vm | 虚拟机-指令执行器;解释执行源代码 |
compiler | 编译 |
scanner | 扫描代码段 |
流程
clox编译器整个代码逻辑流程
执行减法的流程
结构
chunk结构
1 | typedef struct { |
- 分配具有更多容量的新数组
- 将现有元素从旧数组复制到新数组
- 更新capacity
- 删除旧数组
- 更新code指向新数组
- 既有空间,也可将元素储存在新数组中
- 更新cout
ValueArray结构
1 | typedef struct{ |
VM结构
1 | typedef struct { |
函数以及参数说明
reallocate函数
传递两个参数给reallocate()控制要实现的操作
oldsize | newSize | 操作 |
---|---|---|
0 | 非0 | 分配新块 |
非0 | 0 | 重置为空 |
非0 | < oldSize | 缩小现有分配 |
非0 | > oldSize | 增加现有分配 |
OP_CONSTANT
OP_CONSTANT采用单字节操作数制定从块的常量数组加载哪个常量