每种语言独立编译器,统一输出 VML 汇编,共享 Lib/ 标准库生态
所有语言编译器遵循统一的四阶段流水线
共享基类提供通用能力,减少重复代码
| 基类 | 位置 | 适用语言 | 提供能力 |
|---|---|---|---|
| LexerBase | CompilerBase/LexerBase.cs | 全部 22 种 | 字符读取、行号跟踪、Token 生成框架 |
| CodeGeneratorBase | CompilerBase/CodeGeneratorBase.cs | 全部 22 种 | VML 指令发射、标签管理、寄存器分配 |
| CLikeCodegen | CompilerBase/CLikeCodegen.cs | C/Go/Rust/JavaScript | 表达式求值、运算符优先级、类型系统 |
| OopCodegen | CompilerBase/OopCodegen.cs | C++/Java/C#/Swift/Kotlin | 类/对象/继承/虚函数/vtable (继承 CLikeCodegen) |
| VmlEmitter | CompilerBase/VmlEmitter.cs | 全部 22 种 | VML 文本格式化输出、标签管理 |
Lexer.cs → Parser*.cs → ASTNode.cs → CodeGenerator*.cs → *Compiler.cs (入口)
🟢 全部 22 个编译器,16 个达到生产可用级别 (90%+),6 个新增 (教学可用)
| 语言 | 扩展名 | 完成度 | MCU可用 | 代码生成器基类 | 调用约定 |
|---|---|---|---|---|---|
| 🟢 C | .c | ~96% | 🟢 生产可用 | CLikeCodegen | cdecl |
| 🟢 BASIC | .bas | ~92% | 🟢 生产可用 | CodeGeneratorBase | CCv2 |
| 🟢 Pascal | .pas | ~92% | 🟢 生产可用 | CodeGeneratorBase | pascal |
| 🟢 Forth | .fth | ~94% | 🟢 生产可用 | CodeGeneratorBase | 栈式 |
| 🟢 Ladder | .ld | ~93% | 🟢 生产可用 | CodeGeneratorBase | — |
| 🟢 Lua | .lua | ~91% | 🟢 生产可用 | CodeGeneratorBase | stdcall |
| 🟢 Rust | .rs | ~93% | 🟢 生产可用 | CLikeCodegen | stdcall |
| 🟢 C++ | .cpp | ~93% | 🟢 生产可用 | OopCodegen | cdecl |
| 🟢 Go | .go | ~90% | 🟢 生产可用 | CLikeCodegen | stdcall |
| 🟢 Python | .py | ~90% | 🟢 生产可用 | CodeGeneratorBase | stdcall |
| 🟢 JavaScript | .js | ~94% | 🟢 生产可用 | CLikeCodegen | stdcall |
| 🟢 C# | .cs | ~90% | 🟢 生产可用 | OopCodegen | stdcall |
| 🟢 Java | .java | ~90% | 🟢 生产可用 | OopCodegen | stdcall |
| 🟢 Swift | .swift | ~90% | 🟢 生产可用 | OopCodegen | stdcall |
| 🟢 Kotlin | .kt | ~93% | 🟢 生产可用 | OopCodegen | stdcall |
| 🟢 Scheme | .scm | ~93% | 🟢 生产可用 | CodeGeneratorBase | stdcall |
| 🟡 Ruby | .rb | ~85% | 🟡 教学可用 | CodeGeneratorBase | stdcall |
| 🟡 Dart | .dart | ~80% | 🟡 教学可用 | CodeGeneratorBase | stdcall |
| 🟡 ObjC | .m | ~80% | 🟡 教学可用 | CodeGeneratorBase | cdecl |
| 🟡 R | .r | ~80% | 🟡 教学可用 | CodeGeneratorBase | stdcall |
| 🟡 D | .d | ~80% | 🟡 教学可用 | CodeGeneratorBase | stdcall |
| 🟡 Fortran | .f90 | ~80% | 🟡 教学可用 | CodeGeneratorBase | stdcall |
完成度 ~96%,支持 C99 核心 + 扩展,MCU 模式生产可用
// blink.c — STM32 闪烁 LED
#include "vmlib.h"
__interrupt__ void TIM2_IRQ() {
GPIOA_ODR ^= (1 << 5); // 翻转 PA5
}
int main() {
RCC_APB1ENR |= 1; // 使能 TIM2 时钟
TIM2_PSC = 7999; // 预分频
TIM2_ARR = 999; // 自动重载
TIM2_DIER |= 1; // 使能中断
asm("STI"); // 开全局中断
while (1);
}
支持 QBasic 兼容语法:SCREEN/CIRCLE/LINE/PSET 图形、DATA/READ 数据语句、PRINT USING 格式化、DECLARE SUB/FUNCTION。可运行经典 QBasic 游戏。
支持 record/set of/枚举/forward 声明/嵌套过程/exit/seek/sizeof/CASE-OF。使用 pascal 调用约定(被调用者清理栈、从左到右压参)。
IEC 61131-3 梯形图语言。支持常开/常闭触点、线圈输出、定时器 (TON/TOF/TP)、计数器 (CTU/CTD/CTUD)、SET/RST、数学运算、比较指令。
栈式语言。支持 CONSTANT/VARIABLE/DO-LOOP/BEGIN-AGAIN/IF-ELSE-THEN/CASE-OF-ENDCASE/LEAVE。栈操作 DUP/SWAP/OVER/DROP/ROT。浮点支持 F+/F-/F*/F/。
支持 print/控制流/def/lambda/list/dict/tuple/set/class/装饰器/match-case。MCU 模式保留 class/list/dict/tuple,跳过 async/yield/import。
支持 table(哈希表)/metatable/闭包/string 库/math 库/bit_* 位运算/多变量赋值/#长度符。MCU 模式保留 table 和 metatable。
支持 Enum/match(含OR模式)/所有权/引用/借用检查/Trait/vtable/Closure/Generics/移动语义/drop()。MCU 模式保留 Vec/String 堆容器。
支持控制流/defer/多返回值/map/slice/interface/switch/goto。MCU 模式保留 map/slice/interface 动态分发,跳过 goroutine/chan。
支持 function/var/let/const/闭包/对象字面量/数组/class/constructor/super()/extends/解构赋值/switch/do-while/位运算。MCU 跳过 async/Promise。
支持 class/struct/enum/interface/属性/泛型/delegate/event/LINQ 表达式/switch 模式匹配/foreach/null coalescing。MCU 跳过 async/Task/reflection。
支持 class/interface/泛型/enum/assert/位运算/标注break/continue/foreach/string switch/try-catch。MCU 跳过 Thread/synchronized/GC。
支持 protocol/extension/closure/enum 关联值/struct/guard/defer/repeat-while/break/continue。MCU 跳过 async/await/Actor。
支持 class/继承/多态/模板类+实例化引擎/命名空间/引用/Lambda/new-delete/STL容器(vector/string)。MCU 保留 new/delete/STL,跳过异常/RTTI。
支持 class/lambda/when/in/is/字符串模板/null 安全/数据类/sealed class/if-expr/break/continue/泛型擦除/Elvis/SafeCall。MCU 跳过 coroutine/reflection。
支持 lambda/quote/cons/car/cdr/list/let/cond/define/named let/letrec/闭包/尾调用优化/map/filter/apply/vector/case/when/unless。MCU 保留 lambda 闭包和 list 操作。
支持 def/class/module/if/unless/while/until/for/case-when/block/yield/array/hash/symbol。MCU 模式跳过 GC/Thread。
支持 class/extends/implements/mixin/async/await/Future/Stream/List/Map/Set。MCU 跳过 async/await/isolate。
支持 @interface/@implementation/@property/Protocol/Category/消息传递/Block。MCU 跳过 ARC/Block/动态运行时。
支持 <- 赋值/向量/c()/list()/data.frame/formula ~/%in%/矩阵运算。MCU 保留向量和矩阵运算,跳过绘图。
支持 class/struct/enum/foreach/UFCS/static if/mixin template/@safe/@nogc。MCU 保留 RAII 和模板。
支持 subroutine/function/module/allocate/deallocate/array/implicit none。MCU 保留数组运算和数值计算。
各语言默认参数传递与栈清理策略
| 约定 | 使用语言 | 参数传递 | 栈清理 | 示例 |
|---|---|---|---|---|
| cdecl | C / C++ | 从右到左压栈 | 调用者 | ADD R13, #8 在 CALL 之后 |
| CCv2 | BASIC | R0-R3 前4参数,其余压栈 | 调用者 | MOVE R0, #3; MOVE R1, #5; CALL |
| pascal | Pascal | 从左到右压栈 | 被调用者 | 函数内 RET #8 清理参数 |
| stdcall | 其余 19 种 | 从右到左压栈 | 被调用者 | 函数内 RET #N 清理参数 |
C/C++ 编译器支持 __cdecl__ / __stdcall__ / __fastcall__ 三种关键字修饰,可覆盖默认约定。__fastcall__ 前 2 参数通过 R0-R1 传递。
计算 1+2+...+100 求和,全部编译为 VML
int main() {
int sum = 0;
for (int i = 1; i <= 100; i++)
sum += i;
printf("%d\n", sum);
return 0;
}
sum = 0
for i in range(1, 101):
sum += i
print(sum)
fn main() {
let mut sum = 0;
for i in 1..=100 {
sum += i;
}
println!("{}", sum);
}
package main
func main() {
sum := 0
for i := 1; i <= 100; i++ {
sum += i
}
println(sum)
}
sum = 0
FOR i = 1 TO 100
sum = sum + i
NEXT i
PRINT sum
program SumDemo;
var i, sum: integer;
begin
sum := 0;
for i := 1 to 100 do
sum := sum + i;
writeln(sum);
end.