abdussamedulutas/saqut
GitHub: abdussamedulutas/saqut
一个将编译各阶段(词法、AST、符号表、优化、IR)均作为可独立查询输出的「玻璃盒」式过程式语言编译器,面向编译器教学与工具链开发。
Stars: 0 | Forks: 0
# saQut
```
saqut tokens file:fib.sqt → token stream, JSON
saqut ast file:fib.sqt → full AST, JSON
saqut ast file:fib.sqt --optimized → constant-folded + DCE'd AST
saqut run file:fib.sqt → execute via IR + bytecode VM
```
大多数编译器都是黑盒。而 saQut 是一个**玻璃盒**。
## 它是什么?
saQut 是一个用 C++ 编写的**过程式语言编译器**。
该语言刻意设计得很小巧且具有 C 语言风格——它只是一种载体,而不是最终产品。
最终产品是**一个编译 pipeline,其中的每个阶段都是命名的、可查询的、且机器可读的。**
你可以将 `saqut ast` 管道传输到你自己的工具中。
你可以将优化后的 AST diff 交给审查脚本。
一个无法访问源代码的陌生人,仅凭 `saqut symbols` 的输出就能编写出一个 LSP。
这就是 saQut 旨在通过的测试。
## 语言外观如下
```
int fibonacci(int n) {
if (n <= 1) {
return n;
}
return fibonacci(n - 1) + fibonacci(n - 2);
}
int fibonacciIterative(int n) {
int first = 0;
int second = 1;
for (int i = 0; i < n; i = i + 1) {
int next = first + second;
first = second;
second = next;
}
return first;
}
int main() {
int n = 10;
print(fibonacci(n));
print(fibonacciIterative(n));
return 0;
}
```
- 没有强制的 `class` / `main` 样板代码
- 类型化函数、`struct`、`int[]` 数组
- `int`、`float`、`bool`、`string` 字面量类型
- 值语义——没有对用户可见的指针
- 单一 FFI 接口 (`callhost`)——通往外部世界的唯一通道
**刻意缺失的特性:** OOP、闭包、泛型、隐式 int↔float 强制转换、`auto`。
## 构建
**环境要求:** C++17、CMake ≥ 3.16、Ninja
```
git clone https://github.com/abdussamedulutas/saqut
cd saqut
cmake -B build -G Ninja
cmake --build build
```
生成的二进制文件位于 `build/saqut`。
**测试环境:** Linux (x86-64, Manjaro)。macOS 和 Windows 未经测试,但不包含特定于平台的代码。
## CLI
| 命令 | 输出结果 |
|---|---|
| `saqut tokens file:src.sqt` | 带有位置的 token 流 |
| `saqut ast file:src.sqt` | 完整的 AST(JSON 格式) |
| `saqut ast file:src.sqt --optimized` | 经过常量折叠 + 死代码消除后的 AST |
| `saqut symbols file:src.sqt` | 符号表转储 |
| `saqut check file:src.sqt` | 仅进行语义分析——错误和警告,JSON 格式 |
| `saqut ir file:src.sqt` | IR 指令转储 |
| `saqut run file:src.sqt` | 通过字节码 VM 编译并运行 |
每种输出都经过精心设计,可以被管道传输、比较或供其他工具使用。
## Pipeline
```
Source
│ Lexer + Tokenizer
▼
Tokens ──────────────────── saqut tokens
│ Pratt parser + recursive descent
▼
AST ─────────────────────── saqut ast
│ Symbol collector (two-pass)
▼
Symbol Table ────────────── saqut symbols
│ Type checker + structural validator
▼
Annotated AST
│ Optimization Manager (clone — original untouched)
│ ├─ Constant Folding pass
│ └─ Dead Code Elimination pass
▼
Optimized AST ───────────── saqut ast --optimized
│ IR Generator
▼
IR ──────────────────────── saqut ir
│ Bytecode VM (interpreter loop)
▼
Output ──────────────────── saqut run
```
优化器在 AST 的**克隆**上进行操作——保留原始版本。
常量折叠和 DCE 在一个不动点循环中运行,直到没有任何变化为止。
## 目前已实现的功能
| 阶段 | 状态 |
|---|---|
| Lexer / Tokenizer | ✅ |
| Pratt 解析器 | ✅ |
| AST + JSON 序列化 | ✅ |
| 符号表(两遍收集器) | ✅ |
| 类型检查器 | ✅ |
| 结构验证器 | ✅ |
| 常量折叠(int、bool、逻辑、一元) | ✅ |
| 死代码消除 | ✅ |
| IR 生成器 + 字节码 VM | ✅ |
| `saqut run` 执行 fibonacci | ✅ |
| `string` 类型 | ✅ |
| `struct` | 🚧 |
| `int[]` 数组 | 🚧 |
| 超出 `print` 范围的标准库 / FFI | 🚧 |
## 两句话理念
**玻璃盒:**每个编译阶段都是一个稳定、可查询的输出——tokens、AST、符号、IR——全部可独立检查和通过管道传输。
**牢笼:**没有用户指针,值语义,单一的 FFI 通道——VM 是确定性的,这使得记录与重放以及时间旅行调试成为自然的扩展,而不是事后补充。
详细版本请见 [`docs/architecture.md`](docs/architecture.md)。
## 设计记录
架构决策位于 `docs/` 中:
| 文件 | 涵盖内容 |
|---|---|
| [`docs/fikirler.md`](docs/fikirler.md) | ADR-001–005:后端策略、解析器、header-only、token、IR |
| [`docs/adr-frontend-analiz.md`](docs/adr-frontend-analiz.md) | ADR-006–019:分析、优化、执行模型、FFI、内存 |
| [`docs/roadmap-frontend.md`](docs/roadmap-frontend.md) | 分阶段实施计划 |
| [`docs/architecture.md`](docs/architecture.md) | 完整的架构参考(土耳其语) |
## 许可证
源代码可见,商业用途受限。
免费适用于:个人使用、学习、编写和运行 saQut 程序、内部工具。
需要授权的情况:作为服务托管、商业嵌入子组件、作为产品重新分发。
完整条款请见 [`LICENSE.md`](LICENSE.md)。
商业授权:saqutsoftware+gitea@gmail.com
标签:Bash脚本, C++, Homebrew安装, odt, SOC Prime, 开发工具, 抽象语法树, 数据擦除, 生成式AI安全, 编译器, 虚拟机