上一节: https://bbs.125.la/thread-14706398-1-1.html 源代码 git: http://gogs.mkyr.fun:99/myuan/elang
本节的目标是把上一节的「语言」编译到 llvm, 不过要想简单快捷地生成 llvm IR, 官方的方案是 C++, 也有一些其他语言的绑定, 比如 Python/Julia, 总而言之, 这一节把 AST 用易语言输出出去后, 就不得不远离易语言了.
另外还有一个选项是 binaryen, 如果是 binaryen IR 的话, 倒还可以用易语言手写生成, 但是 binaryen 最终是运行在 wasm 上的, 不直接原生运行的话, 就代表着无法简单使用操作系统 API, 以及与已有的易语言生态相容.
在虚拟机中, 我自己写的代码可以随意操作逻辑, 但是到 llvm 层面, 就得自己新加逻辑来控制常量匹配了. 以如下代码举例:
f(0) = 1
f(x) = x * f(x - 1)
f(x, y) = f(x) + f(y)
应当编译成四个函数, 一个总入口, 三个子函数
// f(0)
inline double f1() {
return 1
}
// f(x)
inline double f2(double x) {
return x * f(x - 1)
}
// f(x, y)
inline double f3(double x, double y) {
return f(x) + f(y)
}
double f(double args[], int args_count) {
switch (args_count) {
case 1:
if (x == 0)
return f1()
else
return f2(x)
case 2:
return f3(args[0], args[1])
}
}
然后这门语言除了函数就没东西了, 就这样
与其他方案对比后, 如果 llvm 的效果很好, 接下来就可以着手
这个科学计算器语言就告一段落了, 到现在我还没有给它起一个名字(
读过这四篇之后, 你应该可以很简单地把易语言子集静态编译出去了, 如果你感兴趣的话, 不如来试试?