【问题标题】:Implementing a dynamic typed language with LLVM IR [closed]使用 LLVM IR 实现动态类型语言 [关闭]
【发布时间】: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


【解决方案1】:

LLVM IR 与此无关。它已经是一种语言。静态类型的(当然)。它对可以编译的内容没有影响。

有很多方法可以解决这个问题,但归根结底,这与为任何动态类型语言实现 JIT 编译器没有什么不同。

想想你希望它如何工作。它将如何运作。其他动态类型语言如何处理这个问题。

提示:它们都是有类型的,即使它们只有 3 种类型:对象、字符串和数字,如果不是更少的话。他们只是使用某种方式在运行时找出引用的类型。

您是否有一种现有的语言,或者您正在设计它?如果是前者,那就去研究现有的实现/规范,如果是前者——那么你可以做任何你想做的事,那么你就拥有了所有的力量。

【讨论】:

  • 谢谢,我在想一些类似于 ruby​​ 的东西,我想我会研究一下 MacRuby 是如何完成的可能会有所帮助。
  • @FreeTNT 所以你正在创建自己的语言。在这种情况下,您实际上不需要考虑 LLVM(尤其是 IR)。想想它在下面是如何工作的。 LLVM IR 或多或少只是高级汇编。实施细节。您想出了如何在您的语言中实现动态类型。然后你只需通过 LLVM 实现它。或者它可以编译为 C/C++。或者任何东西。这只是一个后端。使用您自己的语言,您可以将 foo + 42 转换为您想要的任何内容。
猜你喜欢
  • 1970-01-01
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-05-22
  • 2012-05-03
  • 1970-01-01
  • 2012-11-05
相关资源
最近更新 更多