代码之家  ›  专栏  ›  技术社区  ›  Jack

哪个是好的简单的中间代码?

  •  3
  • Jack  · 技术社区  · 15 年前

    假设赋值的目的是编写一个在C语言子集上工作的编译器(您可以假定任何语言的子集,只支持基本的脚本表达,而不将复杂的东西作为对象)。

    什么类型的中间代码可以用来验证编译器的正确性?我正在和一位教授谈话,他谈到了这样一个事实,即他不知道作为虚拟机,他不知道给他的学生提供什么东西来用于“编译代码”,所以我想知道哪种方法可以是一个好的解决方案。

    Subset of C -> Compiler -> Code? -> VM
    

    其中代码可以是二进制格式,也可以是更好的ASCII格式(类似于伪ASM)。

    我在寻找一些已经制作的东西,而不是如何构造这个中间代码和虚拟机,只是一个简单易用的工具,可以用来测试一些编译的程序。

    5 回复  |  直到 15 年前
        1
  •  2
  •   Cheery    15 年前

    您可以描述一些抽象的机器设计,然后以列表格式提供一个指令集。我的小lisp解析器在解析器中是个贵族。

    (label add-two)
    (init-stack-frame 2)
    (load r1 0)
    (load r2 1)
    (add val r1 r2)
    (goto cont)
    

    另外,写一个Lisp翻译来读这个是一个贵族。

    load_labels (index, expr, env)
        if expr.first == 'label'
            env.set(expr.second, index)
    
    interpret (machine, expr, env)
        return env.lookup(expr.first).eval(machine, expr.tail)
    
        2
  •  1
  •   Corbin March    15 年前

    您可以找到许多中间代码的例子/ bytecode 在现有的虚拟机中。根据你的定义,它们可能简单,也可能不简单。实例:

        3
  •  0
  •   Amnon    15 年前

    编译成脚本语言(例如javascript)怎么样?它是人类可读的,而且已经制成。

        4
  •  0
  •   JeSuisse    15 年前

    如何瞄准Java虚拟机?不知道它有多简单,但是它有很好的文档记录,所以如果学生好奇的话,他们可以去amazon.com上买本关于中间代码实际上意味着什么以及虚拟机如何工作的书。

    您还可以创建真正的80x86或68000程序集,使用汇编程序获取机器代码,然后使用模拟器运行它。如果你已经完成了编写编译器的工作,而且它已经有大量的调试程序和其他实用程序可用,那么真正的硬件对我来说并没有某些组成的虚拟机复杂。

    但我确实喜欢Lisp的建议——)

        5
  •  0
  •   swegi    15 年前

    怎么样 llvm ?