C++ D是否适合编写跟踪JIT编译器?

C++ D是否适合编写跟踪JIT编译器?,c++,compiler-construction,go,d,jit,C++,Compiler Construction,Go,D,Jit,我想为我正在设计的编程语言编写一个解释器和跟踪JIT。我已经有很多年的C++编程经验,但我一直在想,也许新的替代方案可能会更好。在我的C++时代,我发现最令人沮丧的事情之一就是使用头文件来处理笨拙的一次编译模型。问题是,并非所有语言都同样适用于这一目的。对于我的跟踪JIT,我需要能够将可执行代码写入内存,并让解释器调用该代码。我还需要生成的代码,以便能够回调到主机函数中 我开始研究Go,发现该语言有指针,但没有指针算术。这立刻让我觉得是个大问题。我可能很想编写自己的分配器和垃圾收集器。我需要严格

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

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

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

  • D是否有标准的LIB,允许我将内存块标记为可执行文件

  • 如果我用自己的GC分配一大块我想自己管理的内存,并且有一堆指针进入其中,这会给D的垃圾收集器带来问题吗

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

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

  • 我想是的,如果我没记错的话,请参阅
    core.memory.GC

  • 不,不应该。只需调用
    malloc
    或您需要的任何东西,并确保GC没有看到它

  • 是的,与C代码进行互操作非常容易


  • 警告:您可能也不想依赖GC,因为它不是“精确的”(也就是说,如果您运气不好,它会并且确实会泄漏内存)。但是对于小数据块,它通常是好的。

    Go确实允许指针运算,但是必须导入
    不安全的
    包才能这样做(或者使用C函数)。指针算法是常见的错误源,Go还有其他机制,比如Slice,它提供了安全的方法来执行C语言中需要指针算法的一些相同的活动。使用
    unsafe
    可以将任何指针投射到
    uintpttr
    并返回,
    uintpttr
    是一种普通的数字类型,它允许你做算术。

    已经有一个JIT编译器,非常严肃的一个,在D中完成。我强烈建议看一看,更具体地说,关于MCI项目的页面-。我会给你更多的信息。正如您将看到的,MCI不仅仅是一个JIT,它有自己的(比我见过的任何东西都好)IR、优化器、验证器等等

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

    显然,你还没有试过这种语言。它在没有任何“指针算法”的情况下运行得非常好。如果你真的需要改变规则,总有一个“不安全”的包可以让你做任何事情

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

    我自己并没有编写分配器或垃圾收集器,但您可以获取结构字段的地址。所有Go数据结构都很简单,易于控制和推理。请参阅简短的介绍。此外,大小和对齐保证也是语言的一部分。如果没有其他问题,您可以随时跳转到C或asm

    嗯,你应该试着执行一些小任务,看看Go是否符合你的要求。请随时在提出问题


    Alex

    你几乎可以用任何现代语言进行JIT:Go、D、C#、Haskell、Java、Python、Ruby等。你可能需要用C编写少量的粘合代码,但绝对不需要使用指针算法来编写JIT。你只需要
    mprotect
    /
    mmap
    就可以将区域标记为可执行文件,这可以从任何语言完成。也许我找错了地方,但只要看一下代码,就可以发现根本没有JIT。src/mpi/jit目录是空的,我在任何地方都看不到其他内容。如何在Go中转换指向函数的指针?我尝试了类似于
    (func()int)(code)
    的方法,但它说我不能从指向函数的指针强制转换。您不能获取指向已定义函数的指针,但可以获取指向具有函数类型的变量的指针。请参阅(由于不安全的导入,它不会在操场上执行)。