Ruby
能写,但这个前端支持的特性最少 —— 完全平铺着写。
在手机上怎么跑
vml run examples/ruby/test/sysinfo.rb
编译要等一会儿(C 那种要一两分钟,脚本类语言几秒)。程序跑起来后屏幕底部就是手柄,方向键 + 四个动作键都在;点右上角返回可以回到命令行。
写法要点
- 全部逻辑写在顶层,不要包函数、不要嵌套
- 直接调用
ui_*
示例
| 文件 | 演示什么 |
|---|---|
test/catch.rb | 接方块(完全平铺的一份,这一路写不了函数) |
test/file_io.rb | 读写文件 |
test/sysinfo.rb | 设备信息 |
同目录还有:app/invaders.rb、app/minesweeper.rb、demo/demo_std.rb、stringutil/main.rb、test/libs.rb、tty/demo_tty.rb、ui/demo_ui.rb
实测踩过的坑
- ⚠ 不认
&&(用and,或者分开写if)。 - ⚠
def会报Unexpected token: End—— 也就是说这一路一个函数都写不了,只能平铺(examples/ruby/test/catch.rb就是这么写的)。
下面的内容是从 VML 源码里直接带的(third_party/vml/VMLPrepares/RubyCompiler/): README 讲这个前端支持什么、怎么编;语言规范 讲语法本身。上游一改,这里重新生成就是最新的。
语言规范
Ruby 语言编译器规范说明
版本:v1.0 | 日期:2026-07-06 | 修订者:深圳市探索智能科技有限公司
规范标准
| 字段 | 值 |
|---|---|
| 目标标准 | Ruby 1.9+ 子集 |
| 发布年份 | 1995 (Ruby 1.9: 2007) |
| 完成度 | ~96% |
| 文件扩展名 | .rb |
概述
本编译器支持 Ruby 语言的核心子集,将 Ruby 源代码编译为 VML (Virtual Machine Language) 汇编代码。编译器流程:预处理 → 词法分析 → 语法分析 → 代码生成。
支持的语言特性
1. 数据类型
- 整数:
Integer— 整数类型 (4 字节有符号) - 浮点数:
Float— 单精度浮点数 - 字符串:
String— 字符串字面量,双引号"..."或单引号'...' - 符号:
Symbol— 以:开头,如:name - 数组:
Array— 方括号字面量[1, 2, 3] - nil:
nil— 空值 - 布尔值:
true/false
2. 变量
x = 10 # 局部变量
@x = 20 # 实例变量 (已识别但功能受限)
name = "hello" # 字符串变量
3. 运算符
算术运算符
+ # 加法
- # 减法
* # 乘法
/ # 除法
% # 取模
** # 幂运算
复合赋值
+= # 加后赋值
-= # 减后赋值
*= # 乘后赋值
/= # 除后赋值
比较运算符
== # 等于
!= # 不等于
< # 小于
> # 大于
<= # 小于等于
>= # 大于等于
<=> # 飞船运算符 (比较结果 -1/0/1)
逻辑运算符
! # 逻辑非 (not)
4. 控制流
条件语句
if condition
# then body
elsif other_condition
# elsif body
else
# else body
end
unless condition
# then body (条件为假时执行)
end
循环语句
while condition
# loop body
end
until condition
# loop body (条件为假时重复)
end
for 循环
for var in start..end
# loop body
end
5. 方法定义
def method_name(param1, param2)
# method body
return value
end
def method_name # 无参数方法
# body
end
6. 类定义
class ClassName
def method_name
# method body
end
end
类在内部被编译为带 self. 前缀的方法,self 存储为第一个局部变量。
7. 返回值
return value # 带返回值
return # 返回 nil
8. 方法调用
method_name(arg1, arg2)
object.method_name(arg1)
method_name # 无参数调用
9. 注释
# 单行注释
表达式优先级
| 优先级 | 类型 | 运算符 |
|---|---|---|
| 1 (最低) | 赋值 | = += -= *= /= |
| 2 | 比较 | == != < > <= >= <=> |
| 3 | 加法 | + - |
| 4 | 乘法 | * / % ** |
| 5 | 一元 | - ! |
| 6 (最高) | 主表达式 | 字面量、变量、函数调用、括号 |
预定义宏
| 宏名 | 值 |
|---|---|
__VML__ | 1 |
__VML_VERSION__ | "1.65.32" |
__RUBY__ | 1 |
__DATE__ | 编译日期 |
__TIME__ | 编译时间 |
已知限制
- 不支持
module、yield、block、mixin - 不支持异常处理 (
begin/rescue/ensure) - 不支持字符串插值 (
"hello #{name}") - 不支持 hash 字面量
{key => value} - 不支持 splat 操作符
*args - 类继承和多态方法分发尚未实现
🆕 字符串编码 (v1.65.19)
该语言编译器通过共享库 (Lib/shared/) 间接使用 VML 字符串体系。
| 伪指令 | 宽度 | 编码 | C 类型 |
|---|---|---|---|
.string | 8-bit | UTF-8 | char* |
.wstring | 16-bit | UTF-16LE | wchar_t* |
.ustring | 32-bit | UTF-32LE | char32_t* |
MCU 模式 (默认): 字符串输出为 UTF-8 (.string) OS 模式: 可通过 VML_WSTRING 宏判断编码
共享库已提供宽字符串转换函数 (wchar.h/uchar.h),各语言编译器可按需使用。
编译器 README
Ruby 编译器
路径: VMLPrepares/RubyCompiler/ 完成度: ~96% | 🟢 生产可用 标准库: Lib/ruby/
功能
- ✅ 词法分析 + 语法分析 + 代码生成 (Lexer/Parser/CodeGenerator)
- ✅ 控制流 (if/elsif/else/unless/while/until/for/in)
- ✅ 函数: def/return/参数传递
- ⚠️ Class: 只做语法接受,没有对象模型 ——
X.new/@ivar/ 方法分发都未接,读到一个源码里定义过的类名会报「类实例化尚未实现」(清单 RUBY-12,v0.96.829 实测) - ✅ 运算符: 赋值/比较/算术/一元/<=>/and/or/not
- ✅ 字面量: 整数/浮点/字符串/布尔/数组/Symbol/** 幂/.. 范围
- ✅ 复合赋值 (+= -= *= /= %=)
- ✅ case/when/else 分支
- ✅ 34 测试 0 失败
- ✅ module/mixin — include 内联
- ⚠️ yield/Proc — 未实现(
arr.each do |x| … end这类块已支持:each / times / upto / downto,脱糖成普通循环) - ✅ require 库导入
- ✅ C 风格预处理 (#ifdef/#ifndef/#define/#include)
编译模式
MCU 模式(默认 --mode mcu)
MCU 模式针对单片机/裸机环境优化,自动跳过不兼容操作系统的特性。
跳过(MCU 不支持):
- require 动态加载、yield/block
保留(BIOS 实现底层):
- 基本类型运算、控制流、函数调用
- print/puts 映射到 UART
OS 模式(--mode os)
OS 模式支持全部语言特性(文件系统、多线程等)。
RAM 级别
--ram k:KB级别(2KB~64KB)--ram m:MB级别(64KB~1MB,默认)--ram g:GB级别
使用
dotnet run --project VMLTool -- input.rb -o output.vml
测试
VMLTests/NewCompilerTests.cs— 34 测试 (0 失败)VMLTests/FullPipelineTests.cs— 全管线测试Examples/ruby/— 示例程序 (start/factorial/file_io/info)