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

Python

写起来最快的一门。语法几乎就是桌面 Python,改一行跑一次很舒服。

在手机上怎么跑

vml run examples/python/test/sysinfo.py

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

写法要点

示例

文件演示什么
app/tetris.py俄罗斯方块
test/sysinfo.py设备信息

同目录还有:app/breakout.py、app/calendar.py、app/notepad.py、app/stock.py、app/weather.py、app/wordle.py、demo/demo_std.py、test/libs.py、tty/demo_tty.py、ui/demo_ui.py

实测踩过的坑


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

语言规范

Python 语言编译器规范说明

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

规范标准

字段值
目标标准Python 3.0 (2008)
发布年份2008
完成度~90%
更新2026-05-18: list/dict/tuple/set 全部实现堆分配
测试6 通过

版本 1.0 | 2026-04-19 | 编译器路径: VMLPrepares/PythonCompiler/


1. 目标与范围

将 Python 子集编译为 VML 汇编,运行在 VML 虚拟机上。 VML 是寄存器+栈混合架构,16 个通用寄存器(R0–R15),支持整数和浮点运算。

不实现: class、async/await、装饰器、类型注解、列表推导、生成器运行时


2. 保留字

保留字语义ParserCodeGen
False/True/None字面量✅✅→0/1/0
and/or/not逻辑运算✅ 短路✅ 跳转链
if/elif/else条件✅✅ 条件跳转
while/for循环✅ 含else✅ 循环+else
break/continue循环控制✅✅ JMP
def函数定义✅✅ 栈帧约定
return返回✅✅ epilogue
pass空语句✅✅ NOP
lambda匿名函数✅⚠️ 桩
assert断言✅⚠️ 桩
del删除✅⚠️ 桩
global/nonlocal作用域✅⚠️ 桩
import/from模块导入✅⚠️ 桩
raise抛异常✅⚠️ 桩
try/except/finally异常✅⚠️ 桩
with上下文✅⚠️ 桩
yield生成器✅⚠️ 桩
match/case模式匹配✅ 常量模式⚠️ 桩(已生成跳转)
in/is成员/身份✅ 比较⚠️ 桩(→0)
as别名✅—
//除法✅✅ //
_通配符✅⚠️ →0

3. 数据类型

3.1 字面量
类型语法Lexer TokenCodeGen
十进制整数42, 1_000INTEGERLOAD RR0 #42
十六进制0xFFINTEGERLOAD RR0 #255
八进制0o77INTEGERLOAD RR0 #63
二进制0b1010INTEGERLOAD RR0 #10
浮点数3.14, 1e10FLOATLOADF RR0 #3.14
字符串"hello", 'world'STRINGdataSection + LOAD RR0 [addr]
三引号"""multi"""STRINGdataSection
布尔True/FalseTRUE/FALSELOAD RR0 #1/#0
NoneNoneNONELOAD RR0 #0
列表[1, 2, 3]LBRACKET✅ 堆分配 [长度+元素]
字典{k:v}LBRACE✅ 堆分配 [对数+键值对]
元组(1, 2)LPAREN✅ 堆分配 [长度+元素]
集合{1, 2, 3}LBRACE✅ 堆分配 [长度+元素]

字典 vs 集合歧义: {expr} 为集合,{expr:expr} 为字典,{} 为空字典。

3.2 类型兼容

VML 无动态类型,运行时所有值为整数(int)或浮点(float)。bool→int,None→0。字符串为特殊数据段引用(地址),暂不支持运行时字符串操作。


4. 运算符优先级(从低到高)

Level 1  lambda x: expr                    # 最松,右结合
Level 2  x if cond else y                 # 三元
Level 3  or                                # 短路
Level 4  and                               # 短路
Level 5  not x                             # 一元
Level 6  in | is | < <= > >= != ==         # 比较(链式:a<b<c → (a<b)&(b<c))
Level 7  |                                 # 按位或
Level 8  ^                                 # 按位异或
Level 9  &                                 # 按位与
Level 10 << >>                             # 移位
Level 11 + -                               # 加减
Level 12 * / // %                          # 乘除模整除
Level 13 -x +x ~x                          # 一元
Level 14 **                                # 幂(右结合)
Level 15 await x                           # 一元(暂不实现运行时)
Level 16 x[i] x.attr f(args)              # 下标/属性/调用(最高)
运算符的 VML 映射
运算符VML 指令备注
+ADD RR0 RR0 RR1
-SUB RR0 RR0 RR1
*MUL RR0 RR0 RR1
/DIV RR0 RR0 RR1浮点
//DIV RR0 RR0 RR1 + 取整整除
%MOD RR0 RR0 RR1
**循环 MUL暂简化
&AND RR0 RR0 RR1
|OR RR0 RR0 RR1
^XOR RR0 RR0 RR1
~NOT RR0 RR0
<<SHL RR0 RR0 RR1
>>SHR RR0 RR0 RR1
-x (neg)SUB RR0 #0 RR0
==CMP + JE/JNE
!=CMP + JNE/JE
<CMP + JL
<=CMP + JLE
>CMP + JG
>=CMP + JGE
and短路跳转链A为0则跳过B
or短路跳转链A非0则跳过B
notCMP RR0 #0 + 取反

5. 语句与 VML 语义映射

5.1 函数定义
def foo(a, b, c):
    return a + b + c

VML 栈帧约定:

调用方: PUSH c, PUSH b, PUSH a  (右到左)
       CALL foo                  (压返回地址)
被调用方 prologue: PUSH R15, PUSH R12, MOVE R12 R13
被调用方 epilogue: MOVE R13 R12, POP R12, POP R15, RET
栈布局 (R12=帧指针):
  arg0  ← R12+12
  arg1  ← R12+8
  arg2  ← R12+4
  ret   ← R12+0  (隐式)
  saved R15 ← R12-4
  saved R12 ← R12-8
  local0 ← R12-12
  local1 ← R12-16
5.2 if/elif/else
if a > 0:
    x = 1
elif a == 0:
    x = 0
else:
    x = -1

VML:

    LOAD RR0 [R12-a]
    CMP RR0 #0
    JLE elif_0
    LOAD RR0 #1
    STORE [R12-x] RR0
    JMP endif_0
elif_0:
    LOAD RR0 [R12-a]
    CMP RR0 #0
    JNE else_0
    LOAD RR0 #0
    STORE [R12-x] RR0
    JMP endif_0
else_0:
    LOAD RR0 #-1
    STORE [R12-x] RR0
endif_0:
5.3 while 循环
while i < n:
    i = i + 1
else:
    result = -1

VML:

while_0:
    LOAD RR0 [R12-i]
    CMP RR0 [R12-n]
    JGE endwhile_0
    # body: i = i + 1
    LOAD RR0 [R12-i]
    PUSH RR0
    LOAD RR0 #1
    MOVE RR1 RR0
    POP RR0
    ADD RR0 RR0 RR1
    STORE [R12-i] RR0
    JMP while_0
endwhile_0:
    # else branch (执行条件: while 条件为 False 且未被 break 跳出)
    LOAD RR0 #-1
    STORE [R12-result] RR0

while-else 语义: else 在循环正常结束(条件为假)时执行;被 break 跳出时不执行。实现方式:break 跳转到 endwhile 之后。

5.4 for 循环
for i in range(n):
    x = i * 2

VML:

    LOAD RR0 #0           # i = 0
    STORE [R12-i] RR0
for_0:
    LOAD RR0 [R12-i]
    CMP RR0 [R12-n]
    JGE endfor_0
    # body: x = i * 2
    LOAD RR0 [R12-i]
    PUSH RR0
    LOAD RR0 #2
    MOVE RR1 RR0
    POP RR0
    MUL RR0 RR0 RR1
    STORE [R12-x] RR0
    # increment
    LOAD RR0 [R12-i]
    PUSH RR0
    LOAD RR0 #1
    MOVE RR1 RR0
    POP RR0
    ADD RR0 RR0 RR1
    STORE [R12-i] RR0
    JMP for_0
endfor_0:
5.5 match/case
match n:
    case 1:
        print(100)
    case 2:
        print(200)
    case _:
        print(999)

VML:

    LOAD RR0 [R12-n]
    PUSH RR0
    LOAD RR0 #1
    CMP RR0 RR1
    JE case_0_end
    LOAD RR0 #100
    PUSH RR0
    SYSCALL #4
    ADD RR13 RR13 #4
    JMP match_end
case_0_end:
    LOAD RR0 #2
    CMP RR0 RR1
    JE case_1_end
    LOAD RR0 #200
    PUSH RR0
    SYSCALL #4
    ADD RR13 RR13 #4
    JMP match_end
case_1_end:
    # _ wildcard: always matches
    LOAD RR0 #999
    PUSH RR0
    SYSCALL #4
    ADD RR13 RR13 #4
    JMP match_end
match_end:
    POP RR0

语义: 将匹配值压栈,每个 case 比较;_ 通配符无条件匹配。匹配成功执行 body 后 JMP match_end。

5.6 lambda
f = lambda x, y: x + y

VML:

lambda_f_0:
    PUSH R15, PUSH R12, MOVE R12 R13
    # x = R12+12, y = R12+8
    LOAD RR0 [R12+12]
    PUSH RR0
    LOAD RR0 [R12+8]
    MOVE RR1 RR0
    POP RR0
    ADD RR0 RR0 RR1
    MOVE RR13 R12, POP R12, POP R15, RET
# f 指向 lambda_f_0 的地址
5.7 assert
assert x > 0, "x must be positive"

VML:

    # evaluate x > 0 → bool in RR0
    CMP RR0 #0
    JNE assert_ok_0
    # failure: print message, halt
    LOAD RR0 #-1
    SYSCALL #99          # 异常退出
assert_ok_0:
5.8 赋值与增强赋值
x = 10
x += 5

VML:

    LOAD RR0 #10
    STORE [R12-x] RR0
    LOAD RR0 [R12-x]
    PUSH RR0
    LOAD RR0 #5
    MOVE RR1 RR0
    POP RR0
    ADD RR0 RR0 RR1
    STORE [R12-x] RR0
5.9 三元表达式
result = 1 if a > 10 else 0

VML:

    LOAD RR0 [R12-a]
    CMP RR0 #10
    JG cmp_true_0
    LOAD RR0 #0
    JMP cmp_end_1
cmp_true_0:
    LOAD RR0 #1
cmp_end_1:
    STORE [R12-result] RR0

6. 内置函数

函数VML参数返回值
print(x)SYSCALL #4栈上1个int无
input()SYSCALL #7无RR0=整数
len(x)桩—RR0=0
range(n)for循环展开—特殊处理
abs(x)内联RR0RR0
int(x)内联RR0RR0
str(x)桩—RR0=0

7. 缩进规则(Lexer)


浮点与64位编译模式

VML 工具链通过三个编译参数控制浮点和 64 位整数的处理策略:

参数可选值默认值说明
--float32hard / soft / nonehard32位浮点处理模式
--float64hard / soft / nonesoft64位浮点 (float) 处理模式
--int64hard / soft / nonesoft64位整数 (int) 处理模式
32位浮点 (float32)

Python 的 float 类型在 VML 编译时映射为 64 位双精度浮点。32 位浮点运算用于内部中间结果处理:

64位浮点 (double)

Python 的 float 类型原生为 IEEE 754 双精度 64 位浮点,按以下模式编译:

64位整数 (int64)

Python 3 的 int 类型为任意精度整数。VML 编译时按以下模式处理 64 位范围内的整数:

软件模拟库

以上软件模拟库均位于 Lib/shared/ 目录,使用 C 语言编写并由 C 编译器编译为 VML,所有语言共享:

库文件用途核心函数
softfloat.cQ15.16 定点数 32 位浮点模拟__vml_float_add/sub/mul/div/neg/abs/cmp、__vml_int2float/float2int
softdouble.cIEEE 754 双精度 64 位浮点模拟__vml_double_add/sub/mul/div/neg/abs/cmp、__vml_int2double/double2int、__vml_float2double/double2float
softint64.c64 位整数双寄存器模拟__vml_i64_add/sub/neg/and/or/xor/not/shl/shr

8. 不支持的 Python 特性

特性原因
class / __init__ / 继承类系统复杂度
async / await需事件循环
装饰器 @语法糖优先级低
类型注解 x: int编译期检查暂不需要
f-string字符串插值复杂
列表推导 [x*2 for x in ...]需迭代器
生成器 yield 运行时需状态机
with __enter__/__exit__简化为空实现
match 完整模式(解构/守卫)仅常量+通配符
*args/**kwargs可变参数
多重赋值 a, b = 1, 2解包
海象运算符 :=暂不实现

9. 变更记录

日期版本变更
2026-04-190.1初始版本
2026-04-191.0加入 VML 语义映射、栈帧约定、缩进规则、while/for-else 语义

🆕 字符串类型 (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

Python 3 编译器

路径: VMLPrepares/PythonCompiler/ 完成度: ~90% | 🟢 生产可用 标准库: Lib/python/

功能

编译模式

MCU 模式(默认 --mode mcu)

MCU 模式针对单片机/裸机环境(Arduino/STM32/8051 等)优化,自动跳过不兼容操作系统的特性。

跳过(遇到这些语法不生成代码):

保留(由 BIOS 实现底层):

OS 模式(--mode os,预留)

OS 模式针对带操作系统环境(如 Linux 嵌入式、RTOS 等),届时支持全部语言特性(文件系统、多线程、异步、异常、反射等)。

RAM 级别
MCU 安全编码提示

使用

dotnet run --project VMLPrepares/PythonCompiler input.Py -o output.vml

测试

Test/Py/ — 0 测试文件(测试目录待创建)