【发布时间】:2019-02-07 16:40:23
【问题描述】:
我正在尝试使用 LLVM C API 为动态语言构建 JIT 编译器,但我一直坚持实现动态类型,例如在函数定义中,LLVM 需要每个参数的类型,但类型在基于运行时之前是未知的关于用户传递的内容,我在谷歌上搜索了一段时间,但在任何地方都没有任何好的资源,我还尝试查看 Julia 的源代码,看看他们是如何做到的,不幸的是代码又大又复杂,我不得不到处跳要找到这么一个小细节,从我目前看到的情况来看,它们将它们的类型表示为一个空的 LLVM 结构指针和一个包含一些额外数据的 func sig 类型,但我非常不确定它是如何工作的,或者即使我解释得对,任何资源都会有所帮助,示例代码非常感谢,示例不必在 C API 中,C++ 也可以,我将自己转换为一种或另一种方式。
提前致谢。
【问题讨论】:
-
您有什么具体问题吗?询问示例或任何场外资源是题外话
-
您可能希望将语言的值实现为某个标记联合(或某个指针),并且您的 LLVM IR 将返回该类型。
-
那是 1 个长句,看不到任何问题!
-
问题是“如何”做到这一点。
-
动态类型是你传递的值的一个属性。然而,该值本身具有静态类型。例如,您可以传递
std::variant:它是静态类型的动态类型值。它的动态类型就像一种颜色:仅仅因为汽车有多种颜色(动态方面),它们仍然是汽车。仅仅因为值有许多动态类型,它们仍然是值:这暗示您需要一个具体的Value类型来表示动态类型的值。如果你让具体类型适合void*,那么你将传递一个适当大小的整数。
标签: c++ c compiler-construction llvm language-design