首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >我用 PHP 手写了一个 Rust 编译器!

我用 PHP 手写了一个 Rust 编译器!

作者头像
Tinywan
发布2026-07-01 14:55:13
发布2026-07-01 14:55:13
740
举报
文章被收录于专栏:开源技术小栈开源技术小栈

用 PHP 编写的 Rust 编译器

一款用 PHP 编写的 Rust 编译器,可直接生成 x86-64 Linux ELF 可执行文件(无需 LLVM、无需汇编器、无需链接器)。

实现了所有权检查、借用检查、类型检查、移动语义、泛型、特征、闭包和迭代器。如果你需要在 2008 年的共享主机服务器上编译 Rust,而唯一安装的运行时是 PHP,那么它将非常有用。

安装

要运行 Rust 代码,首先当然需要安装 PHP。在 Windows 11 上可以用以下命令快速安装:

代码语言:javascript
复制
winget install PHP.PHP.8.4

这个编译器生成的是 Linux 平台的原生机器码,所以如果你用的是 Windows,最实用的方式是搭配 WSL(Windows Subsystem for Linux)。 先安装 Ubuntu(如果还没装过):

代码语言:javascript
复制
wsl --install

安装完成后重启电脑,然后从开始菜单打开 Ubuntu 完成初始设置。

使用方法

编译一个 .rs 文件:

代码语言:javascript
复制
php rustc.php main.rs -o main

然后在 WSL 中运行生成的二进制文件:

代码语言:javascript
复制
wsl ./main

查看程序的退出码:

代码语言:javascript
复制
wsl ./main; echo $?

小测试

我这里编写一个 HelloWorld.rs 文件

代码语言:javascript
复制
fn main() {
    println!("开源技术小栈!");
}

用 PHP 运行编译器编译上面的HelloWorld.rs 文件

代码语言:javascript
复制
php rustc.php HelloWorld.rs -o HelloWord

Windows 用户推荐在 WSL 中运行,执行二进制

代码语言:javascript
复制
wsl ./HelloWord

这会生成一个 HelloWord 可执行文件(Linux x86-64 ELF 格式)。

输出应该为

代码语言:javascript
复制
开源技术小栈!

已支持的功能

支持的类型

  • i32boolu8u16u32u64u128usize
  • String(堆分配字符串,支持移动语义)
  • &str 和字符串切片,支持索引(如 s[0]
  • &T&mut T 引用,包含借用检查
  • 结构体(命名字段、字段访问、方法调用)
  • 枚举(支持带元组数据的变体 + match
  • 单元类型 ()(可用于表达式、返回类型、泛型参数)
  • 函数、结构体、impl 块上的泛型
  • 内置 Option<T>Result<T, E>(支持 Some/NoneOk/Err,无需在源码中定义)

控制流

  • if / else(可作为表达式使用)
  • whileloopbreakcontinue
  • for x in start..end(范围迭代)
  • match(支持枚举分支和通配符 _
  • return

函数与闭包

  • 普通自由函数(支持多参数 + 显式返回类型)
  • const fn(被接受,但按普通函数处理)
  • impl 块支持 self&self&mut self
  • 特质(trait)定义 + impl Trait for Type
  • 特质方法的默认实现
  • 闭包(支持按值捕获,例如 |x: i32| x + captured_var

所有权与借用

  • Copy 类型的移动语义
  • 不可变借用与可变借用检查
  • Copy 自动推导(适用于 i32bool&T 以及字段全部可复制的结构体/枚举)

模块与语法

  • mod name; 文件模块声明(基于文件系统的模块解析)
  • pub 可见性控制(函数、结构体、字段)
  • use 路径导入(跨模块引用)
  • 属性 #[...]#![...](可被解析但大部分被忽略)

输出方式

  • println!("{}", expr) —— 目前仅支持单个 {} 占位符,打印一个值
  • exit(code) —— 显式退出程序并返回状态码

测试

运行完整测试套件:

代码语言:javascript
复制
php tests/run.php

测试用例位于 tests/cases/ 目录下,分为 fundamentals/valid/fundamentals/invalid/modules/programs/ 等子目录。 每个 .rs 文件顶部用注释标明预期结果,例如:

代码语言:javascript
复制
// exit: 42
// stdout: hello
// error: Use of moved value

尚未实现的重要功能(大致按影响程度排序)

  1. 复合赋值运算符(+=-=*=/= 等)
  2. 元组及元组解构
  3. Vec<T> 与堆内存分配
  4. 浮点数 f32 / f64
  5. conststatic
  6. ? 运算符(虽然 Result 已支持,但 ? 语法尚未实现)
  7. 闭包作为函数参数(例如 fn apply(f: impl Fn(i32) -> i32)
  8. 无参数闭包(|| expr
  9. 超过单层枚举变体的复杂模式匹配
  10. 更丰富的 println! 格式支持(目前只支持单个 {} + 一个参数)
  11. 生命周期注解(当前借用检查器是简化版,无需显式生命周期)
  12. 更多有符号整数类型(i8i16i64i128

https://github.com/mrconter1/rustc-php

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2026-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 开源技术小栈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 用 PHP 编写的 Rust 编译器
  • 安装
  • 使用方法
    • 小测试
  • 已支持的功能
  • 测试
  • 尚未实现的重要功能(大致按影响程度排序)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档