Kotlin
与 Java 同一套写法,语法更短。
在手机上怎么跑
vml run examples/kotlin/test/sysinfo.kt
编译要等一会儿(C 那种要一两分钟,脚本类语言几秒)。程序跑起来后屏幕底部就是手柄,方向键 + 四个动作键都在;点右上角返回可以回到命令行。
写法要点
- 入口
fun main() - 与 Java 一样直接调用
ui_* - 状态数组写在
main里面(见下面那条坑)
示例
| 文件 | 演示什么 |
|---|---|
test/catch.kt | 接方块 |
test/sysinfo.kt | 设备信息 |
同目录还有:app/gomoku.kt、app/minesweeper.kt、app/puzzle15.kt、app/snake.kt、demo/demo_std.kt、fibonacci/main.kt、geometry/main.kt、test/libs.kt、tty/demo_tty.kt、ui/demo_ui.kt
实测踩过的坑
- ⚠ 文件级(顶层)的
arrayOf读回是 0 —— 状态数组请写在main内部。 - ⚠
step是前端保留字,别拿它当变量名。
下面的内容是从 VML 源码里直接带的(third_party/vml/VMLPrepares/KotlinCompiler/): README 讲这个前端支持什么、怎么编;语言规范 讲语法本身。上游一改,这里重新生成就是最新的。
语言规范
Kotlin 语言编译器规范说明
版本:v1.0 | 日期:2026-07-06 | 修订者:深圳市探索智能科技有限公司
规范标准
| 字段 | 值 |
|---|---|
| 目标标准 | Kotlin 1.0+ (最小子集) |
| 发布年份 | 2016 |
| 完成度 | ~93% |
| MCU完成度 | ~91% |
| 测试 | 29 通过 |
| 更新 | 2026-05-21: data class toString/equals 实现; sealed class 穷尽性检查升级为编译错误; when 表达式返回值确认已实现 |
概述
本编译器支持 Kotlin 语言子集,将 Kotlin 源代码编译为 VML 汇编。编译器采用 Lexer → Parser → CodeGenerator 三阶段架构,代码规模约 1200 行 C#。
支持的语言特性
1. 数据类型和字面量
- ✅ 整数:
42,-10 - ✅ 浮点:
3.14 - ✅ 布尔:
true,false - ✅ 字符串:
"hello"(支持\n转义) - ✅ String 模板:
"Hello, $name!","${expr}"(代码生成内联处理) - ✅ 类型标注:
: Int,: String等 (仅语法解析,不执行类型检查)
2. 变量声明
- ✅
val— 不可变变量 - ✅
var— 可变变量 - ✅
val x: Int = 42— 带类型标注(解析但忽略类型)
3. 函数
- ✅
fun关键字声明函数 - ✅ 参数列表(参数名 + 可选类型标注)
- ✅ 返回值类型标注(解析但忽略)
- ✅
return返回语句 - ✅ Lambda 表达式:
{ x, y -> x + y } - ✅ 函数体简写:
fun add(a: Int, b: Int) = a + b
4. 控制流
- ✅
if/else— 条件分支 - ✅
while— 前置条件循环 - ✅
for (i in start..end)— 范围循环(解析和代码生成均实现) - ✅
when (x) { 1 -> ...; 2 -> ...; else -> ... }— 多路分支(含 in 范围、is 类型检查) - ✅ 比较链:
a < b,x in 1..10,x is Int - ✅ 复合赋值:
+=,-=,*=,/=(解析和代码生成均实现)
5. 类
- ✅
class ClassName(val prop1: Type, var prop2: Type)— 主构造函数类 - ✅
data class— 数据类(自动生成 toString/equals) - ✅
ClassName(args)— 构造调用(堆分配,SYSCALL #40) - ✅ 成员方法:
fun ClassName.method(params) { body } - ✅ 成员访问:
obj.property,obj.method(args)
6. 内置函数
- ✅
println(expr)— 输出整数 + 换行 (SYSCALL #6 + #4) - ✅
print(expr)— 输出整数不换行 (SYSCALL #6) - ✅
println("string")— 输出字符串 (SYSCALL #4)
7. 运算符
- ✅ 算术:
+,-,*,/,% - ✅ 比较:
==,!=,<,>,<=,>= - ✅ 逻辑:
&&,||,! - ✅ 赋值:
=,+=,-=,*=,/= - ✅
..范围运算符 (用于 for 和 in) - ✅
in成员检查 /is类型检查 - ✅ 一元:
-,!
代码生成 (VML)
| Kotlin 语法 | VML 指令 |
|---|---|
| val/var 声明 | STORE 到 R12-relative 局部变量帧 |
| 算术运算 | ADD SUB MUL DIV MOD |
| 条件 if/else | JZ/JNE/JMP + LABEL |
| while/for 循环 | LABEL + 比较 + JZ/JMP |
| when 表达式 | PUSH 主语; 比较分支条件; JNE 下一个; 匹配则 JMP end |
| println(x) | MOVE R0, x; SYSCALL #6; MOVE R0, #10; SYSCALL #4 |
| 类构造 | SYSCALL #40 堆分配; STORE 属性; RET 返回地址 |
| data class | 自动生成 toString/equals 方法 |
| 函数调用 | PUSH R15, PUSH R12, MOVE R12 R13 (prologue), 调用者清理 R13 |
| return | MOVE R13 R12, POP R12, POP R15, RET (epilogue) |
| Lambda | PUSH R15/R14, MOVE R14 R13, 闭包体, POP R14, POP R15, RET |
缺失功能
高级语言特性
- ❌ 协程 (coroutine)
- ✅ 密封类 (sealed class) — 解析、when 穷尽性检查
- ❌ 扩展函数 (extension function)
- ❌ 空安全 (
?,!!,?:) - ❌ 智能类型转换 (smart cast)
- ✅ when 作为表达式返回值
标准库
- ❌ 标准库
Lib/kotlin/目录(待创建) - ❌
readLine()— 输入 - ❌ 字符串函数 (length, substring 等)
- ❌ 集合类 (List, Map, Set)
浮点与64位编译模式
与所有 VML 编译器相同的三参数控制:
| 参数 | 可选值 | 默认值 | 说明 |
|---|---|---|---|
--float32 | hard/soft/none | hard | 32位浮点 (Float) |
--float64 | hard/soft/none | soft | 64位浮点 (Double) |
--int64 | hard/soft/none | soft | 64位整数 (Long) |
编译方式
# 直接编译
dotnet run --project VMLTool -- input.kt -o output.vml
# 运行
dotnet run --project VMLEmulators/ConsoleEmulator -- -r output.vml
完成度评估
| 组件 | 完成度 |
|---|---|
| 词法分析 | ~98% (完整 token 集,含 data 关键字) |
| 语法分析 | ~95% (fun/val/var/if/while/for/when/class/data class/is/in/lambda/range/sealed/when穷尽性) |
| 代码生成 | ~93% (表达式/控制流/字符串/类/data class/Lambda/内联汇编/SafeCall/Elvis/泛型擦除) |
| 标准库 | ~50% (Lib/kotlin/ 基础函数已内联) |
| 总体 | ~93% |
🆕 字符串类型 (v1.65.19)
该语言编译器默认使用 .wstring (UTF-16LE) 作为内部字符串存储。
| 模式 | 默认编码 | VML 伪指令 | SYSCALL 输出 |
|---|---|---|---|
| MCU (默认) | .string (UTF-8) | .string | #1 |
| OS | .wstring (UTF-16LE) | .wstring | #391 |
预定义宏: VML_WSTRING — OS 模式下自动定义,MCU 模式未定义 输出函数: OS 模式自动使用 shared_print_wstr (UTF-16LE→UTF-8 自动转换)
// 用户代码可通过宏判断编码
#ifdef VML_WSTRING
// 默认字符串为 wstring (UTF-16LE)
#else
// 默认字符串为 UTF-8
#endif
编译器 README
Kotlin 1.0 编译器
路径: VMLPrepares/KotlinCompiler/ 完成度: ~93% | 🟢 生产可用 标准库: Lib/kotlin/(待创建)
功能
- ✅ 语法分析 + 代码生成(Lexer/Parser/CodeGenerator ~1200行)
- ✅ 变量: val/var + 类型标注
- ✅ 控制流: if/else/while/for-in/when
- ✅ when 表达式: 值匹配 / in 范围检查 / is 类型检查
- ✅ 函数: fun 定义/Lambda/单表达式体
- ✅ class: 主构造函数/成员方法/属性访问
- ✅ data class: toString/equals 自动生成
- ✅ 运算符: 算术/比较/逻辑/复合赋值/..范围/in/is
- ✅ 内置函数: println/print (字符串和整数)
- ✅ POKE/PEEK 内存操作 (MMIO)
- ✅ 共享内置函数库 (builtins.vml)
缺失功能
- ❌ 协程 (coroutine)
- ❌ 空安全 (?, !!, ?:)
- ❌ 扩展函数
- ✅ 密封类 (sealed class) — 解析 + when 穷尽性检查
- ❌ 标准库 (Lib/kotlin/)
编译模式
MCU 模式(默认 --mode mcu)
MCU 模式针对单片机/裸机环境(Arduino/STM32/8051 等)优化,自动跳过不兼容操作系统的特性。
跳过(遇到这些语法不生成代码):
- coroutine
保留(由 BIOS 实现底层):
- class(堆分配 SYSCALL #40)、data class
- POKE/PEEK 内存映射 I/O (MMIO)
- 基本类型运算、控制流、函数调用
- println/print 映射到 SYSCALL
OS 模式(--mode os,预留)
OS 模式针对带操作系统环境(如 Linux 嵌入式、RTOS 等),届时支持全部语言特性(文件系统、多线程、异步、异常、反射等)。
使用
dotnet run --project VMLTool -- input.kt -o output.vml
测试
29 测试通过(内嵌在编译器源代码验证中)