diff --git a/README.md b/README.md index 86a2024..91db7ee 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # RVBTCC -- 约 1800 行的轻量级自举编译器。 +- 约 1900 行的轻量级自举编译器。 - 编译器和自举编译器行为一致。 - 语法类似 C,输出 RISC-V 汇编。 - 依赖几个 libc 函数用于输入输出。 @@ -12,7 +12,6 @@ ### 真机运行 - 编译运行程序,src 为本语言源代码。可以编译 demo 文件夹下的实例。 ```sh @@ -25,19 +24,6 @@ $ sh run-native.sh $ sh boot-native.sh ``` -输出六个文件: - -| 源代码 | 编译器 | 汇编 | 可执行 | 命名 | -| ----------------- | --------- | ------- | --------- | ---------------------- | -| boot.c boot-lib.c | gcc | | gcc.out | 自制编译器 | -| boot.c boot-lib.h | gcc.out | boot1.s | boot1.out | 自举自制编译器 | -| boot.c boot-lib.h | boot1.out | boot2.s | boot2.out | 自举自举自制编译器 | -| boot.c boot-lib.h | boot2.out | boot3.s | | 验证自举自举自制编译器 | - -后三次编译时,boot-lib.h 的内容被手动导入 boot.c 开头进行编译,boot-lib.c 提供的库通过链接引入。 - -自举的目标为 boot1.s == boot2.s == boot3.s - ### 模拟运行 安装以下依赖 @@ -58,27 +44,31 @@ $ sh run.sh $ sh boot.sh ``` +### 自举过程 + + +自举会输出六个文件,三个汇编文件和三个可执行文件: + +| 源代码 | 编译器 | 汇编 | 可执行 | 代号 | 命名 | +| ----------------- | --------- | ------- | --------- | ---- | ---------------------- | +| boot.c boot-lib.c | gcc | | gcc.out | G | 自制编译器 | +| boot.c boot-lib.h | gcc.out | boot1.s | boot1.out | B1 | 自举自制编译器 | +| boot.c boot-lib.h | boot1.out | boot2.s | boot2.out | B2 | 自举自举自制编译器 | +| boot.c boot-lib.h | boot2.out | boot3.s | | B3 | 验证自举自举自制编译器 | + +后三次编译时,boot-lib.h 的内容被手动导入 boot.c 开头进行编译,boot-lib.c 提供的库通过链接引入。 + +整个自举及其验证的过程如下图所示: + +![](bootstrapping.png) + +自举的目标为 G、B1、B2 的可执行文件行为一致,也就是说 B1、B2、B3 的汇编代码一致。 + ## 语言文档 -### 关键字 +### 注释 -本语言包含的关键字即为支持的标量类型的关键字和流程控制的关键字,还有 `const`。 - -### `const` 关键字 - -`const` 关键字可以在类型中使用,在大部分情况下会被直接忽略。支持它是为了更好兼容 C 程序。 - -但是当在出现 - -- 全局,标量(即不是数组) -- 类型为 `const int` 或 `const int const` -- 带有初始化 - -的声明时,将会被解析为整数常量。 - -整数常量在使用的时候会被直接替换为对应的右值,失去作为全局变量左值的性质。 - -使用 `int const` 或 `int` 可以避免这样的特殊处理。 +支持多行 `/* ... */` 和单行 `//` 两种注释 ### 支持六个基本类型 @@ -103,6 +93,25 @@ $ sh boot.sh - `break` `continue` - `return` +### 关键字 + +本语言包含的关键字即为支持的标量类型的关键字和流程控制的关键字,还有 `const`。 + +#### `const` 关键字 + +`const` 关键字可以在类型中使用,在大部分情况下会被直接忽略。支持它是为了更好兼容 C 程序。 + +但是当在出现 + +- 全局,标量(即不是数组) +- 类型为 `const int` 或 `const int const` +- 带有初始化 + +的声明时,将会被解析为整数常量。 + +整数常量在使用的时候会被直接替换为对应的右值,失去作为全局变量左值的性质。 + +使用 `int const` 或 `int` 可以避免这样的特殊处理。 ### 支持以下运算符 @@ -121,7 +130,8 @@ $ sh boot.sh | | | 按位或 | 从左到右 | | `&&` | 逻辑与 | 从左到右 | | || | 逻辑或 | 从左到右 | -| `=` | 赋值 | 从右到左 | +| `?:` | 条件 | 从右到左 | +| `=` `+=` `-=` `*=` `/=` `%=` `<<=` `>>=` `&=` `^=` |= | 赋值 | 从右到左 | | `,` | 逗号 | 从左到右 | - 同级表达式的求值顺序与结合性一致。 diff --git a/bootstrapping.png b/bootstrapping.png new file mode 100644 index 0000000..221b03a Binary files /dev/null and b/bootstrapping.png differ