readme.md 2.4 KB

抽象语法树编译到 llvm

上一节: 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, 以及与已有的易语言生态相容.

AST 导出

函数实现

在虚拟机中, 我自己写的代码可以随意操作逻辑, 但是到 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 的效果很好, 接下来就可以着手

  1. 使用 Antla 的易语言解析器
  2. 使用易语言编写的易语言语法扩展工具
  3. 使用扩展后的易语言书写语法扩展工具
  4. 交替使用流程1/2得到的新易语言, 这里称之为 nelang
  5. 使用 nelang, 书写生成 nelang 在 llvm IR 的工具
  6. 使用以 llvm 编译后的静态文件将 nelang AST 生成 llvm IR
  7. 使用 nelang 补全 nelang 的标准库
  8. 至此 nelang 可以脱离原版易语言, 实现自举, 得益于 llvm, 现在 nelang 可以运行在三大系统, 多种架构了.

这个科学计算器语言就告一段落了, 到现在我还没有给它起一个名字(

可以从本节到达的其他方向

读过这四篇之后, 你应该可以很简单地把易语言子集静态编译出去了, 如果你感兴趣的话, 不如来试试?