clox编译器

clox

(持续更新中,目前到scanner)

clox是由Bob Nystrom基于c编写的编译器,最终解释结果编译成字节码,通过编写学习,可以了解编译器的基本原理
主流程主要分为三步:

  1. 扫描
  2. 编译
  3. 执行(虚拟机)

github代码库:zaizizaizai

推荐:原文教程请戳这里

极度推荐项目库:project-based-learning

目录结构

文件说明

文件名 功能
common 通用引用库文件
memory 数组增删的逻辑,基础的内存管理
chunk chunk节点:结构定义,属性的更改;储存源代码
value 常量池,常量类型结构的定义及实现
debug 反汇编提示信息
main 主函数
vm 虚拟机-指令执行器;解释执行源代码
compiler 编译
scanner 扫描代码段

流程

clox编译器整个代码逻辑流程

clox整个流程

执行减法的流程

计算器(执行操作码)

结构

chunk结构

1
2
3
4
5
6
7
typedef struct {
int count; //实际使用大小
int capacity; //分配数组的容量
uint8_t* code; //指令
int* lines; //线信息
ValueArray constants; //常量列表
} Chunk;

chunk
chunk扩展容量过程

  1. 分配具有更多容量的新数组
  2. 将现有元素从旧数组复制到新数组
  3. 更新capacity
  4. 删除旧数组
  5. 更新code指向新数组
  6. 既有空间,也可将元素储存在新数组中
  7. 更新cout

ValueArray结构

1
2
3
4
5
typedef struct{
int capacity; //容量
int count; //实际使用大小
Value* values; //数值
} ValueArray;

VM结构

1
2
3
4
typedef struct {
Chunk* chunk;
uint8_t* ip; //指令指针(PC机中的程序计数器)
} VM;

函数以及参数说明

reallocate函数

传递两个参数给reallocate()控制要实现的操作

oldsize newSize 操作
0 非0  分配新块
非0 0 重置为空
非0 < oldSize 缩小现有分配
非0 > oldSize 增加现有分配

OP_CONSTANT

OP_CONSTANT采用单字节操作数制定从块的常量数组加载哪个常量
format

-------------本文结束感谢您的阅读-------------
显示 Gitment 评论