基于 LLVM 与 rust 实现一门名叫 x 的玩具语言,仅用于学习
fn add(a: num, b: num) -> num {
return a + b; // 返回语句
}
// main 函数,程序的入口
fn main() {
var n: num = 3;
var str = "result: "
var result = add(n, 4.2);
// 调用系统内置的打印方法
print(str, result);
}
更多示例请参考 fixtures
目录里的例子
VSCode 插件:vscode-x-lang
- 下载编译好的二进制文件 (下载链接)
- 执行命令
x-lang example.x
编译并运行 x 语言(目前就实现了通过 JIT 方式运行),example.x
为待编译文件路径。 可以通过x-lang example.x --debug
运行输出编译后端 LLVM-IR 码
提示:MacOS 系统可能会提示 "无法打卡xxx",先鼠标右键打开,弹出提示后选择 "打开",之后就可以正常打开了
- 语句需写在函数体里面,
main
函数是程序的入口函数,程序从这里开始 - x 是一门强类型语言,支持数字(
num
)、字符串(str
)、布尔类型(bool
) - 通过
var
关键字声明变量,变量声明的类型可以省略,系统会自动推断类型。变量必须先定义后使用。 - 通过
fn
关键字声明函数,函数必须在最外层作用域定义,函数的参数类型及返回类型必须明确标识,不可省略(返回void
类型可以省略)。函数会进行预编译,所以函数定义的顺序无关紧要。 - 函数调用时必须与函数定义的参数匹配,否则会调用失败
- 块级作用域隔离
- 代码语句后需以分号结尾,或者通过换行以表明代码语句结束
- 调用系统内置方法
print(a, b, c)
控制台打印信息,支持多个任意类型参数
- LLVM Tutorial
- LLVM Language Reference Manual
- llvm.org
- Getting Started with LLVM Core Libraries(中文版)
- 用 LLVM 开发新语言 (已过时)
- LLVM 中文文档
- LLVM IR入门指南
- rust-cross
- https://crates.io/crates/llvm-sys
- https://crates.io/crates/llvm-ir
- https://github.com/TheDan64/inkwell
- 函数返回类型与定义不匹配时未校验
- 嵌套循环,里面的循环break存在问题,原因是内层的 condition 的变量被重复定义了,导致 break 设置的 condition 的值失效了
- 位运算未实现
- 读取函数返回的字符串类型,有问题
- 完善读取数字 token