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安全, 编译器, 虚拟机