← 都来码← 文档索引R原文English

R

向量语言,写法与桌面 R 接近。

在手机上怎么跑

vml run examples/r/test/sysinfo.r

编译要等一会儿(C 那种要一两分钟,脚本类语言几秒)。程序跑起来后屏幕底部就是手柄,方向键 + 四个动作键都在;点右上角返回可以回到命令行。

写法要点

示例

文件演示什么
test/catch.r接方块
test/file_io.r读写文件
test/parserexpf_demo.r调用共享库解析表达式
test/sysinfo.r设备信息

同目录还有:demo/demo_std.r、test/libs.r、tty/demo_tty.r、ui/demo_ui.r


下面的内容是从 VML 源码里直接带的(third_party/vml/VMLPrepares/RCompiler/): README 讲这个前端支持什么、怎么编;语言规范 讲语法本身。上游一改,这里重新生成就是最新的。

语言规范

R 语言编译器规范说明

版本:v1.0 | 日期:2026-07-06 | 修订者:深圳市探索智能科技有限公司

元数据

项目说明
标准R 4.x 子集 (S 语言兼容)
语言诞生年份1993
完成度~96%
文件扩展名.r
编译器入口RCompiler.RCompiler.Compile()
插件注册RCompilerPlugin : CompilerPluginExBase
语言分类统计分析语言

概述

R 语言是一种用于统计计算和图形展示的编程语言和环境。本编译器实现了 R 语言的核心语法子集,支持向量化数据操作、统计函数、控制流和自定义函数定义。编译产物为 VML 汇编,可进一步翻译到 16 种目标架构。

编译器架构遵循标准 VML 前端模式:

R 源码 (.r) → Lexer (Lexer.cs) → Token 流
             → Parser (Parser.cs) → AST (ASTNode.cs)
             → CodeGenerator (CodeGenerator*.cs) → VML 程序

入口文件 RCompiler.cs 编排整个编译流水线,包括预处理、词法分析、语法分析、代码生成和标准库链接。

支持的特性

数据类型
类型R 表示内部表示说明
numeric42, 3.14, 1.5e-10int / float整数和浮点数。R 中 integer 可加 L 后缀(如 42L),解析时 L 被去除
character"hello", 'world'string (data section)字符串字面量,支持双引号、单引号、反引号三种定界符
logicalTRUE, FALSEint (1 / 0)布尔值映射为整数
NULLNULLint (0)空值,R0 置零
NANAint (int.MinValue)缺失值,使用哨兵值表示
InfInffloat (float.PositiveInfinity)无穷大

注意:当前实现中 numeric 的 integer 和 float 在运行时不做严格类型区分。科学计数法(如 1.5e-10、2E+3)被完整支持。

赋值运算符

R 支持三种赋值形式,优先级从高到低:

# 1. 左赋值(推荐风格)
x <- 42
y <- c(1, 2, 3)

# 2. 等号赋值(函数参数风格)
x = 42

# 3. 超级赋值(父环境赋值)
x <<- 42
算术运算符
运算符语法说明
加法a + b数值相加
减法a - b数值相减
乘法a * b数值相乘
除法a / b浮点除法
幂运算a ^ b指数运算
取模a %% b整数取余(注意必须为两个 % 符号)
比较运算符
运算符语法说明
等于a == b相等比较
不等于a != b不等比较
小于a < b小于比较
大于a > b大于比较
小于等于a <= b小于或等于
大于等于a >= b大于或等于

比较结果返回整数 1 (TRUE) 或 0 (FALSE)。

逻辑运算符
运算符语法说明
逻辑与a & b短路求值 (映射为 &&)
逻辑或a | b短路求值 (映射为 ||)
逻辑非!a一元取反

注意:当前实现不区分向量化的 &/| 和短路求值的 &&/||,所有逻辑运算均执行短路求值。R0 = 0 视为 FALSE,非零视为 TRUE。

函数
# 函数定义
add <- function(a, b) {
    return(a + b)
}

# 无参函数
greet <- function() {
    return("Hello")
}

# 隐式返回:函数体最后一个表达式的值即为返回值
square <- function(x) {
    x * x
}
控制流
if / else
if (x > 0) {
    print("positive")
} else {
    print("non-positive")
}

# else if 链(嵌套解析)
if (x > 0) {
    print("positive")
} else if (x < 0) {
    print("negative")
} else {
    print("zero")
}

条件表达式求值后与 0 比较:CMP R0, 0; JE。非零为真。

while 循环
i <- 1
while (i <= 10) {
    print(i)
    i <- i + 1
}

前测试循环:条件为假时跳过循环体。

for 循环
for (i in 1:5) {
    print(i)
}

for (x in c(10, 20, 30)) {
    print(x)
}
repeat 循环
repeat {
    # 必须包含 break 条件,否则为无限循环
    if (condition) {
        break
    }
}

无限循环,必须使用 break 显式退出。

break 和 next
# break: 退出最内层循环
for (i in 1:10) {
    if (i > 5) {
        break
    }
}

# next: 跳过当前迭代,进入下一次循环
for (i in 1:10) {
    if (i %% 2 == 0) {
        next
    }
    print(i)  # 只打印奇数
}
向量 (Vectors)
# c() 构造函数
x <- c(1, 2, 3, 4, 5)
y <- c(TRUE, FALSE, TRUE)
z <- c()  # 空向量,返回 NULL

# 范围运算符
1:10    # 整数序列,解析为特殊调用
索引
x <- c(10, 20, 30, 40)
a <- x[1]   # 10 (R 索引从 1 开始)
b <- x[3]   # 30
注释
# 这是单行注释
x <- 1  # 行尾注释

仅支持 # 开头的单行注释。不支持多行注释。

科学计数法
x <- 1.5e-10   # 1.5 × 10^-10
y <- 2.0E+5    # 200000
z <- 3e8        # 300000000

词法分析器完整解析科学计数法:尾数、小数点、e/E、可选符号、指数。

标识符规则
source() 导入
source("lib/utils.r")

source() 调用以正则表达式从源码中提取(预处理阶段前解析),将指定的 .r 文件内容链接到当前程序。这是一个编译时机制,非运行时函数调用。

表达式优先级表

优先级从高到低排列(数字越小优先级越高):

优先级运算符结合性说明
1() [] $ : f()左结合分组、索引、成员访问、范围、函数调用
2- (一元) ! + (一元)右结合一元负号、逻辑非、一元正号
3^右结合幂运算
4* / %%左结合乘、除、取模
5+ -左结合加、减
6== != < > <= >=左结合比较运算符
7&左结合逻辑与
8|左结合逻辑或
9<- <<- =右结合赋值

预定义宏

编译器在预处理阶段(Preprocessor)注入以下宏:

宏名称典型值说明
__VML__1指示代码正在 VML 工具链中编译
__VML_VERSION__"1.65.32"VML 工具链版本号
__R__1指示当前编译语言为 R
__DATE__"Jun 02 2026"编译日期
__TIME__"15:30:00"编译时间

这些宏可以通过预处理器指令 #ifdef、#ifndef、#if 等使用,支持条件编译。

限制与不支持的特性

当前实现为🟢 生产可用级别,以下 R 语言核心特性尚未支持:

对象系统
数据结构
函数式编程
公式接口
向量化运算
包和库
其他

编译器实现细节

文件结构
VMLPrepares/RCompiler/
├── Token.cs                      # Token 类型定义与值载体
├── Lexer.cs                      # 词法分析器(继承 LexerBase)
├── ASTNode.cs                    # 抽象语法树节点定义
├── Parser.cs                     # 递归下降语法分析器
├── CodeGenerator.cs              # 代码生成主入口
├── CodeGenerator.Expressions.cs  # 表达式代码生成
├── CodeGenerator.Statements.cs   # 语句代码生成
├── RCompiler.cs                  # 编译器入口与流水线编排
├── RCompilerPlugin.cs            # 插件注册
├── Program.cs                    # CLI 入口
└── RCompiler.csproj              # 项目文件
寄存器约定

遵循 VML 标准调用约定:

寄存器用途
R0累加器 / 函数返回值
R12帧指针 (BP)
R13栈指针 (SP)
R15返回地址 (RA)
内存模型
函数调用约定
字符串处理
标准输出

当前编译器无内置 print() 实现。输出需通过 VML SYSCALL 或 BIOS 调用实现,或链接 C 共享库中的 printf 函数。

R 转换为 VML 的典型映射
R 构造VML 指令序列
x <- 10MOVE R0, 10; MOVE [R12-x], R0
a + bMOVE R0, [R12-a]; MOVE R0, [R12-b]; ADD R0, R0, R0
if (x) { ... }MOVE R0, [R12-x]; CMP R0, 0; JE else_label; ...; LABEL else_label
while (x) { ... }LABEL while_start; MOVE R0, [R12-x]; CMP R0, 0; JE wend; ...; JMP while_start; LABEL wend
for (i in c(1,2,3)) { ... }索引初始化 + 条件检查循环 + 每次迭代加载序列元素值
return(x)MOVE R0, [R12-x]; POP R12; RET
f(x, y)MOVE R0, [R12-y]; PUSH R0; MOVE R0, [R12-x]; PUSH R0; CALL func_f
v[i]计算基址 + (i-1)*4,间接加载
c(1, 2, 3)SYSCALL 2 (malloc 12) + 依次存储元素 + 恢复基址到 R0

🆕 字符串编码 (v1.65.19)

该语言编译器通过共享库 (Lib/shared/) 间接使用 VML 字符串体系。

伪指令宽度编码C 类型
.string8-bitUTF-8char*
.wstring16-bitUTF-16LEwchar_t*
.ustring32-bitUTF-32LEchar32_t*

MCU 模式 (默认): 字符串输出为 UTF-8 (.string) OS 模式: 可通过 VML_WSTRING 宏判断编码

共享库已提供宽字符串转换函数 (wchar.h/uchar.h),各语言编译器可按需使用。

编译器 README

R 编译器

路径: VMLPrepares/RCompiler/ 完成度: ~96% | 🟢 生产可用 标准库: Lib/r/

功能

编译模式

MCU 模式(默认 --mode mcu)

MCU 模式针对单片机/裸机环境优化。

跳过:

保留:

OS 模式(--mode os)

OS 模式支持全部语言特性。

RAM 级别

使用

dotnet run --project VMLTool -- input.r -o output.vml

测试