more readme
This commit is contained in:
parent
12840c12f9
commit
78bbc32779
20
README.md
20
README.md
@ -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>||</code> | 逻辑或 | 从左到右 |
|
| <code>||</code> | 逻辑或 | 从左到右 |
|
||||||
| `=` | 赋值 | 从右到左 |
|
| `=` | 赋值 | 从右到左 |
|
||||||
|
|
||||||
|
- 同级表达式的求值顺序与结合性一致。
|
||||||
- 加减号支持整数之间,指针与整数,指针之间的运算。
|
- 加减号支持整数之间,指针与整数,指针之间的运算。
|
||||||
|
- 算术运算的结果总是被提升为 `int` 类型。布尔值用 `int` 类型表示。
|
||||||
|
- 由于空指针就是 `0`,因此指针和整数之间的比较运算没有禁止。
|
||||||
- 逻辑与和逻辑或支持短路求值。
|
- 逻辑与和逻辑或支持短路求值。
|
||||||
|
- 表达式没有左值和右值之分。可以认为右值总是存在一个临时的变量中。
|
||||||
|
- 赋值不检查类型。强制类型转换可以用赋值给特定类型的变量实现。
|
||||||
|
- 函数的参数类型和个数不会检查,返回值会参与类型检查。
|
||||||
|
|
||||||
### 其它支持与不支持
|
### 其它支持与不支持
|
||||||
|
|
||||||
- 支持全局变量和局部变量,局部变量遮挡全局变量。
|
- 支持全局变量和局部变量,局部变量遮挡全局变量。
|
||||||
- 重名的局部变量为同一变量,不支持局部变量之间的遮挡。
|
- 不支持局部变量之间的遮挡,重名的局部变量为同一变量。
|
||||||
- 函数只支持最多八个参数。支持可变参数。
|
- 支持函数声明,可以通过函数声明来调用 C 语言库。不支持变量声明。
|
||||||
- 支持函数声明,不支持变量声明。
|
- 函数只支持最多八个参数。函数声明中支持可变参数,仅用于兼容 C 语言库。
|
||||||
- 类型检查做的较少,若 C 编译器报错,而本语言编译通过,就可以认为是 UB。
|
- 类型检查可能有遗漏,若 C 编译器报错,而本语言编译通过,就可以认为是 UB。
|
||||||
|
|
||||||
## 限制
|
## 限制
|
||||||
|
|
||||||
|
1
boot.c
1
boot.c
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user