Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Matx

Matx 是一个面向教学与实验的语言编译器和运行时,目标是实现一种可以静态分析的类 Python 语言。目前已经打通一条完整链路:读取带类型标注的 Python 函数,将 Python AST 转换成 Matx IR,生成 C++,编译为动态库,再从 Python 中加载和调用本地函数。

Python 函数
    ↓ inspect + ast.parse
Python AST
    ↓ SimpleParser
Matx IR
    ↓ Visitor / SourceRewriter
C++ 源码
    ↓ C++ 编译器
动态库
    ↓ Runtime / FFI
Python 可调用对象

Matx 不是完整的 Python 实现,也不打算复刻 CPython 的全部对象模型。它选择一个规模可控的语言子集,用来观察语法、类型、对象、代码生成与动态执行怎样组成一个编译系统。

项目愿景

Matx 是一套 C++ 语言模型技术栈中的语言层。长期设想是让用户通过类 Python 语言组织文本处理、Tensor、模型和训练过程,而底层数据结构与执行系统主要由 C++ 实现。

在这套设想中:

  • Text 提供 Tokenizer 等文本处理组件;
  • Zero 提供 Tensor、Autograd、Module 与 Optimizer;
  • Matx 处理语言语法、对象、容器、控制流和模块调用;
  • Tensor 编译器将 Tensor IR 降低为 CPU、CUDA 或其他硬件上的 Kernel。
                 类 Python 脚本语言
                          │
                          ▼
                    Matx 语言编译器
                          │
             ┌────────────┴────────────┐
             ▼                         ▼
       Text 文本处理               Zero 训练框架
             │                         │
             └────────────┬────────────┘
                          ▼
                    Tensor Operator
                          │
                          ▼
                    Tensor 编译器
                          │
              ┌───────────┼───────────┐
              ▼           ▼           ▼
             CPU         CUDA       其他硬件

当前仓库只实现其中的语言编译器、Runtime 和动态模块边界。Text、Zero 的接入以及 Tensor 编译器仍属于后续方向。

编译过程

以一个最小函数为例:

def add(a: int, b: int) -> int:
    return a + b

Python Frontend 会把它转换成由 PrimFuncPrimVarPrimAddReturnStmt 组成的 Matx IR。Rewriter 随后生成真正执行计算的 C++ 函数:

int64_t add(int64_t a, int64_t b) {
  return (a + b);
}

生成文件还包含一个 C ABI 包装函数。它检查并拆出 Value 参数,调用 add,再包装返回结果。模块注册表则记录函数名称与包装函数之间的关系,使 Runtime 可以在加载动态库后通过 "add" 找到它。

Python 参数
    ↓
Value[]
    ↓
add__c_api
    ↓
C++ add
    ↓
Value 返回值
    ↓
Python 值

整个实现由几层结构配合完成:

  • Runtime:对象所有权、动态值、类型索引和标量数据类型。
  • Container:AST 使用的类型容器,以及动态的 ListDictSetTuple
  • Function:类型擦除调用、参数转换和全局函数注册表。
  • AST:表达式、语句、类型、函数与模块的内部表示。
  • Visitor:节点分派、可读打印和 C++ 代码生成。
  • Python Frontend:源码获取、作用域管理、类型检查与语法降低。
  • FFI:Python 对象转换、C ABI、动态库加载与函数发现。

语言子集

Python Frontend 目前支持一个受限子集:

  • 带类型标注的函数参数和返回值;
  • intfloatboolstrNone 和运行时 Handle;
  • 算术、比较、布尔、单目和条件表达式;
  • 带类型兼容检查的局部赋值;
  • ifwhilefor ... in range(...)
  • listdictset 字面量、索引、赋值和部分方法;
  • 受限的类构造、字段和实例方法。

遇到不支持的 Python 语法时,Frontend 会在编译阶段报错。完整 Python 兼容、继承、闭包、关键字参数、切片和任意函数调用不属于当前范围。详细边界见 python/CLASS_SUBSET.md

构建

Matx 需要支持 C++17 的编译器、CMake 3.24 以上版本、Python 开发头文件,以及 Unix 风格的动态库加载环境。

首先构建 C++ Runtime:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

然后构建 Python 扩展:

g++ -shared -fPIC case_ext.cc \
  $(python3-config --includes) \
  -I. -Lbuild -lcase \
  -o case_ext.so

运行 Python 程序前,需要让动态加载器找到 libcase.so

export LD_LIBRARY_PATH="$PWD/build:${LD_LIBRARY_PATH:-}"
export PYTHONPATH="$PWD/python:${PYTHONPATH:-}"

可以创建一个 demo.py

from ffi_system import module_loader, simple_compile


def add(a: int, b: int) -> int:
    return a + b


assert simple_compile(add, "add.so")
module = module_loader("./add.so")
native_add = module.get_function("add")
print(native_add(10, 20))

运行后应输出 30

python3 demo.py

仓库中的 python/run_*_test.py 用于覆盖不同语法与运行时路径。项目仍处于实验阶段,接口、语言范围和部分回归用例会随实现调整。

目录结构

.
├── src/       # Runtime、AST、Visitor、代码生成、C API 与模块加载
├── python/    # Python Frontend、绑定、编译入口与回归用例
├── apps/      # C++ 测试和开发程序
├── docs/      # 当前语法与实现文档
├── Book/      # 较早的 Runtime 和编译器设计笔记
└── case_ext.cc

文档

Matx 目前更适合作为教学项目:它不以完整语言兼容为目标,而是希望用一条可以运行的编译链路,展示类 Python 语言怎样从源码、AST 和 Runtime 走到 C++ 与本地执行。

About

Implementation of an Python -> C++ Compiler

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Used by

Contributors

Languages