我想为我正在设计的编程语言编写一个解释器并跟踪JIT。我已经有很多年用C ++编程的经验,但我一直想知道是否有更新的替代方案可能更好。在我的C ++时代,我发现最令人沮丧的事情之一就是不得不使用头文件来处理笨重的单通道编译器模型。问题是并非所有语言都适用于此目的。对于我的跟踪JIT,我需要能够将可执行代码写入内存并让解释器调用该代码。我还需要生成的代码才能回调主机函数。
我开始看Go,看到该语言有指针,但没有指针算术。这立刻让我感到震惊。我可能想编写自己的分配器和垃圾收集器。我需要严密控制我的语言对象在内存中的布局方式,并能够获取特定字段的地址并写入它们。除非有办法解决这个问题,否则Go似乎无法达到我的目的。
D语似乎很有希望。它有指针算法和进出D调用所需的ABI的清晰轮廓。我听到很多关于它的好东西。它还有垃圾收集,这对编译器编写很有帮助,但我仍然有一些我不确定的事情:
D是否有标准的库可以让我将内存块标记为可执行文件?
如果我分配了一大块内存,我想用自己的GC管理自己,并且有一堆指针进入那里,这会给D的垃圾收集器带来问题吗?
< / LI>根据您的经验,D与C代码的互操作程度如何?加载C动态库并调用它们相当容易吗?
最后,还有整个支持方面。对于那些在Linux上使用过D的人来说,工具链有多好?有什么问题?有没有人在D中编写JIT编译器,如果有,那么体验如何?
答案 0 :(得分:5)
我相信,如果我没记错的话,请参阅core.memory.GC
。
不,不应该。只需拨打malloc
或您需要的任何内容,并确保GC看不到它。
是的,与C代码互操作非常容易。
警告:你可能不希望想要依赖GC,因为它不是'精确'(即如果你不幸的话可以并且确实会泄漏内存)。但对于小块数据,它通常很好。
答案 1 :(得分:4)
Go允许指针算术,但您必须导入unsafe
包才能这样做(或使用C函数)。指针算法是bug的常见来源,Go还有其他机制,比如切片,它提供了安全的方法来执行一些需要在C中进行指针运算的相同活动。使用unsafe
,您可以将任何指针强制转换为{ {1}}和后面,uintptr
是一个普通的数字类型,它允许你做算术。
答案 2 :(得分:2)
在D中已经有了一个非常严肃的JIT编译器。我强烈建议您查看http://lycus.org/,更具体地说是关于MCI项目的页面 - http://github.com/lycus/mci。 MCI documentation会为您提供更多信息。正如您将看到的,MCI不仅仅是一个JIT,它有自己的(比我见过的任何其他东西更好)IR,优化器,验证器等......
答案 3 :(得分:2)
显然,你没有尝试过这种语言。没有任何&#34;指针算法&#34;它工作得很好。如果你真的需要弯曲规则,总会有'不安全的&#34;允许你做任何事情的包。我开始看Go,看到该语言有指针,但没有指针算术。这立即让我感到非常困难。
我可能想编写自己的分配器和垃圾收集器。我需要密切控制我的语言对象在内存中的布局方式,并能够获取特定字段的地址并写入它们。
我自己没有写过allocatior或垃圾收集器,但是你可以获取一个结构字段的地址。所有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提问。亚历