【问题标题】:Suitability of D for writing a Tracing JIT Compiler?D 是否适合编写跟踪 JIT 编译器?
【发布时间】:2012-07-27 21:08:08
【问题描述】:

我想为我正在设计的编程语言编写一个解释器并跟踪 JIT。我已经有多年的 C++ 编程经验,但我一直想知道更新的替代方案是否会更好。在我的 C++ 时代,我发现最令人沮丧的一件事是不得不使用头文件来处理笨重的一次性编译器模型。问题是并非所有语言都同样适合此目的。对于我的跟踪 JIT,我需要能够将可执行代码写入内存并让解释器调用该代码。我还需要生成的代码才能回调主机函数。

我开始研究 Go,发现该语言有指针但没有指针算术。这立刻让我觉得这是一个大问题。我可能很想编写自己的分配器和垃圾收集器。我需要密切控制我的语言对象在内存中的布局方式,并能够获取特定字段的地址并写入它们。除非有办法解决这个问题,否则 Go 的底层似乎不足以满足我的目的。

D 语言似乎很有前途。它具有指针算法和调用 D 所需的 ABI 的清晰轮廓。我听说过很多关于它的好消息。它还具有垃圾收集功能,非常适合编译器编写,但我仍然有一些我不确定的事情:

  1. D 是否有允许我将内存块标记为可执行的标准库?

  2. 1234563 /li>
  3. 根据您的经验,D 与 C 代码的互操作性如何?加载 C 动态库并调用它们相当容易吗?

最后,还有整个支持方面。对于在这里使用过 D on linux 的人来说,工具链有多好?有什么问题吗?有没有人用 D 写过 JIT 编译器,如果有,体验如何?

【问题讨论】:

  • 您可以使用几乎任何现代语言进行 JIT:Go、D、C#、Haskell、Java、Python、Ruby 等。您可能需要用 C 编写一小段粘合代码,但它是绝对不需要指针算法来编写 JIT。您只需要mprotect/mmap 将区域标记为可执行,并且可以使用任何语言完成。

标签: c++ compiler-construction go d jit


【解决方案1】:
  1. 我相信是这样,如果我没记错的话,请参阅core.memory.GC

  2. 不,不应该。只需拨打 malloc 或任何您需要的电话,并确保 GC 看不到它。

  3. 是的,与 C 代码互操作非常容易。

警告:您可能也不依赖 GC,因为它不是“精确的”(即,如果您不走运,可能而且确实会泄漏内存)。但对于小数据块,通常没问题。

【讨论】:

    【解决方案2】:

    Go 确实允许指针运算,但您必须导入 unsafe 包才能这样做(或使用 C 函数)。指针运算是错误的常见来源,Go 有其他机制,如切片,它提供了安全的方法来执行一些需要在 C 中进行指针运算的相同活动。使用unsafe,您可以将任何指针强制转换为uintptr来回,uintptr 是一个普通的数值类型,可以让你做算术。

    【讨论】:

    • 如何在 Go 中转换一个指向函数的指针?我尝试了(func ()int)(code) 之类的方法,但它说我无法从指向函数的指针强制转换。
    • 您无法获得指向已定义函数的指针,但您可以获得指向具有函数类型的变量的指针。见play.golang.org/p/VfFmRFfmJV(由于不安全的导入,它不会在操场上执行)。
    【解决方案3】:

    我开始研究 Go,发现该语言有指针但没有指针算术。这立即让我觉得这是一个大问题。

    显然,您还没有尝试过这种语言。没有任何“指针算术”,它工作得很好。如果你真的需要改变规则,总是有“不安全”的包可以让你做任何事情。

    我可能很想编写自己的分配器和垃圾收集器。我需要密切控制我的语言对象在内存中的布局方式,并能够获取特定字段的地址并写入它们。

    我自己没有写过分配器或垃圾收集器,但你可以获取结构中字段的地址。所有 Go 数据结构都很简单,易于控制和推理。简介见http://research.swtch.com/godata。大小和对齐保证也是语言http://golang.org/ref/spec#Size_and_alignment_guarantees 的一部分。如果不出意外,您总是可以跳入 C 或 asm。

    恕我直言,您应该尝试执行一些小任务,看看 Go 是否符合您的要求。欢迎随时通过http://groups.google.com/group/golang-nuts提问。

    亚历克斯

    【讨论】:

      【解决方案4】:

      已经有一个 JIT 编译器,非常严肃,用 D 语言完成。我强烈建议您查看 http://lycus.org/,更具体地说是有关 MCI 项目的页面 - http://github.com/lycus/mciMCI documentation 将为您提供更多信息。正如您将看到的,MCI 不仅仅是一个 JIT,它有自己的(比我见过的任何东西都好)IR、优化器、验证器等......

      【讨论】:

      • 也许我看错了地方,但只是看一眼那里的代码似乎根本不是 JIT。 src/mpi/jit 目录是空的,我在其他任何地方都看不到。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 2011-07-01
      • 1970-01-01
      • 2010-10-06
      • 2012-06-05
      • 2020-06-20
      相关资源
      最近更新 更多