5

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

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

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

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

  2. 如果我分配了一大块我想自己管理的内存,用我自己的 GC,并且有一堆指针进入那里,这会对 D 的垃圾收集器造成问题吗?

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

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

4

4 回答 4

5
  1. 我相信是这样,看看core.memory.GC我是否记错了。

  2. 不,不应该。只需调用malloc或任何您需要的,并确保 GC 看不到它。

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

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

于 2012-07-27T21:16:59.933 回答
4

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

于 2012-07-27T21:50:02.957 回答
2

我开始研究 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提问。

亚历克斯

于 2012-07-28T12:37:03.277 回答
2

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

于 2012-07-28T00:12:55.113 回答