White 简介
White 是一门静态类型原生语言,可以编译可执行文件与共享库。它的源文件使用
.wl 后缀;编译完成后,程序直接在操作系统上运行,中间没有虚拟机或解释器。
编译器 wlc 也使用 White 编写。它负责解析并检查程序,生成 LLVM IR,再调用
Clang 完成优化、机器码生成与链接。发布新编译器时,上一版 wlc 会先编译新版
源码,得到的新编译器随后再编译一次相同源码,完成自举检查。
White 一开始就是一个编译器项目,并不是在另一门语言上套一层新语法。因此,编译器 实现和标准库本身也是语言设计的一部分,而不是放在别处维护的一份参考实现。
设计
White 希望生成行为明确的原生代码,同时不把普通程序写得过于繁琐。编译器会尽量
提前拒绝不安全状态:值必须经过初始化,条件必须是 Bool,可能失败的调用要在
调用处明确写出,不兼容的数值类型也不会被悄悄混在一起计算。
这并不意味着把所有底层细节藏起来。String 的索引以字节为单位,裸指针和 FFI 仍然是不安全边界,由强引用组成的环也无法被 ARC 自动回收。对系统程序有影响的 成本与限制,应当能从源码、类型规则或文档中直接看出来。
Auto 可用于明确要求类型推导,例如 let value: Auto = 5;。声明带有初始化式时
也可以完全省略类型。这两种写法都在编译期确定类型,不会让变量变成动态类型。
class 等托管值使用原子引用计数,struct 则保留确定的值布局。这些内容会在 Language Guide 中逐步说明;编译器究竟接受哪些情况,则以 Language Reference 中的规则为准。
从源码到程序
一次普通编译大致经过下面几步:
.wl 源码
-> 词法与语法分析
-> 名称与类型检查
-> LLVM IR
-> Clang 与平台链接器
-> 可执行文件或共享库
White 前端决定语言规则和输出的 IR,LLVM 与平台工具链负责优化、指令选择、目标文件 和最终链接。这样既不需要重新实现一套成熟的原生后端,也能让编译器保持在适合自举 的规模内。
项目现状
White 已经能够编译自己的编译器与标准库。目前发布包覆盖 Windows、Linux 与 macOS,具体架构列在下载页面。
项目仍处在早期阶段。泛型系统还很有限,ARC 没有弱引用和循环回收,标准库的范围 也无法与成熟语言相比,White 内部 ABI 仍可能随版本变化。目前它适合编译器开发、 语言实验和小型原生工具;依赖稳定 ABI 或成熟生产生态的项目,还应等待后续版本。
接下来读什么
第一次使用 White,可以从 Getting Started 开始安装工具链并编译第一个程序。
Language Guide 介绍日常代码会用到的语言功能,Language Reference 记录精确
语法与语义规则。随工具链发布的包放在 Standard Library,wlc、自举、交叉编译、
wlls 与编辑器支持则放在 Compiler and Tools。
平台覆盖、已知限制与兼容规则统一放在 Project Status。编译器、标准库、测试和 自举设施都可以在源码仓库中找到。