我正在设计一种高级的、面向对象的、垃圾收集的编程语言,但我在如何制作模板方面遇到了问题。我计划创建一个类似于 .NET 或 JVM 的 VM 类型系统(但它会在底层使用 LLVM)。问题是我想拥有强大的、类似 C++ 的模板,但具有动态链接(因此我可以替换模板库而无需重新编译使用它的所有内容)。我希望能够在没有模板定义的情况下编译源文件。应尽量减少 JIT 时的代码生成。
以下是我正在考虑的选项:
- 具有静态链接到每个编译单元的模板库的概念。模板库本质上就像一个 AST,在模板实例化时需要填充空白。这样做的问题是,如果使用不同版本的模板库编译两个文件,它们可能不兼容,或者如果模板库有错误,则所有内容都必须重新编译。这就是 C++ 的做法。
- 具有在 JIT 时间链接的模板库。这解决了大部分问题,但要求 IR 本质上是 AST。我希望 IR 的水平要低得多。这需要更多的 JIT 工作。
- 拥有类似 C# 的懦弱泛型,只有类型作为参数。这是相当有限的,但允许简单的代码生成和动态链接。
还有其他我没有想到的好方法吗?我倾向于第一个选项,但我真的不喜欢任何选项。你认为最好的选择是什么?