more readme

This commit is contained in:
Yaossg 2024-11-18 14:04:01 +08:00
parent 12840c12f9
commit 78bbc32779
2 changed files with 13 additions and 8 deletions

View File

@ -1,6 +1,6 @@
# RVBTCC # RVBTCC
- 约 1400 行的轻量级自举编译器。 - 约 1500 行的轻量级自举编译器。
- 编译器和自举编译器行为一致。 - 编译器和自举编译器行为一致。
- 语法类似 C输出 RISC-V 汇编。 - 语法类似 C输出 RISC-V 汇编。
- 依赖几个 libc 函数用于输入输出。 - 依赖几个 libc 函数用于输入输出。
@ -60,8 +60,8 @@ $ sh boot.sh
- 注意指针类型不是复合得来的,而是被视作整体。因此也不存在二重指针。 - 注意指针类型不是复合得来的,而是被视作整体。因此也不存在二重指针。
- 函数和数组不是类型系统的一部分。 - 函数和数组不是类型系统的一部分。
- 可以认为数组的名字就是对应的指针类型。 - 可以认为数组的类型就是其元素对应的指针类型。
- 函数名字本身建议仅用于直接调用,其它行为可视为 UB。 - 函数保存了其返回值的类型,建议仅用于直接调用,其它操作可视为 UB。
- 数组只支持一维数组,且数组的元素不能是指针类型。 - 数组只支持一维数组,且数组的元素不能是指针类型。
- 全局变量不能是指针类型。 - 全局变量不能是指针类型。
- 整数和字符字面量的类型是 `int`,字符串字面量的类型是 `char*` - 整数和字符字面量的类型是 `int`,字符串字面量的类型是 `char*`
@ -92,16 +92,22 @@ $ sh boot.sh
| <code>&#124;&#124;</code> | 逻辑或 | 从左到右 | | <code>&#124;&#124;</code> | 逻辑或 | 从左到右 |
| `=` | 赋值 | 从右到左 | | `=` | 赋值 | 从右到左 |
- 同级表达式的求值顺序与结合性一致。
- 加减号支持整数之间,指针与整数,指针之间的运算。 - 加减号支持整数之间,指针与整数,指针之间的运算。
- 算术运算的结果总是被提升为 `int` 类型。布尔值用 `int` 类型表示。
- 由于空指针就是 `0`,因此指针和整数之间的比较运算没有禁止。
- 逻辑与和逻辑或支持短路求值。 - 逻辑与和逻辑或支持短路求值。
- 表达式没有左值和右值之分。可以认为右值总是存在一个临时的变量中。
- 赋值不检查类型。强制类型转换可以用赋值给特定类型的变量实现。
- 函数的参数类型和个数不会检查,返回值会参与类型检查。
### 其它支持与不支持 ### 其它支持与不支持
- 支持全局变量和局部变量,局部变量遮挡全局变量。 - 支持全局变量和局部变量,局部变量遮挡全局变量。
- 重名的局部变量为同一变量,不支持局部变量之间的遮挡。 - 不支持局部变量之间的遮挡,重名的局部变量为同一变量
- 函数只支持最多八个参数。支持可变参数 - 支持函数声明,可以通过函数声明来调用 C 语言库。不支持变量声明
- 支持函数声明,不支持变量声明 - 函数只支持最多八个参数。函数声明中支持可变参数,仅用于兼容 C 语言库
- 类型检查做的较少,若 C 编译器报错,而本语言编译通过,就可以认为是 UB。 - 类型检查可能有遗漏,若 C 编译器报错,而本语言编译通过,就可以认为是 UB。
## 限制 ## 限制

1
boot.c
View File

@ -511,7 +511,6 @@ void asm_sd(const char* rs1, int imm, const char* rs2) {
printf(" add t0, %s, t0\n", rs2); printf(" add t0, %s, t0\n", rs2);
printf(" sd %s, 0(t0)\n", rs1); printf(" sd %s, 0(t0)\n", rs1);
} }
} }
void asm_addi(const char* rd, const char* rs, int imm) { void asm_addi(const char* rd, const char* rs, int imm) {