compiler-construction - 一通和多通编译器之间的区别?

标签 compiler-construction

我看过很多关于 的帖子一通多通编译器,但我似乎不明白这一点。

  • 什么是一通编译器?
  • 什么是多通编译器?
  • 它们之间的主要区别是什么?
  • 谁能用一种非常简单的语言提供它们之间的区别?
  • 最佳答案

    多 channel 一词的起源来自计算机内存少得多的时代。编译器需要大量内存,而在内存小的机器中,这很难管理。

    所以最初的想法是编译器在多次传递中运行。第一遍读取源代码,并完成语法检查等基本任务,可能构建符号表,然后将其结果写入磁盘文件以进行第二遍。每个连续的 N 轮将读取前一轮的结果,并更改程序表示以使其越来越接近机器代码,并写出其结果以供 N+1 轮读取。重复这个过程,直到最后一遍产生最终代码。许多编译器可以通过几次(“多”)通过;有著名的编译器在非常旧的机器上构建了几十个 channel 。

    (同样的概念适用于所谓的“两遍汇编器”:第一遍读取汇编器源代码,语法检查,找出应该为标签符号使用的位置值;第二遍使用分配的符号位置的知识生成目标代码在第一遍)。

    内存现在变大了,将每个非常大的程序的源代码读入内存,让编译器在单个进程的内存中完成所有工作,并编写目标代码,这非常实用。您仍然可以在链接器的概念中看到一些类似的残余;他们将多个对象模块(“第一遍”)粘合到一个二进制文件中。

    如果您在内部查看编译器,它们会分阶段运行。典型的阶段可能是:

    *  Parse and syntax check
    *  Build symbol tables
    *  Perform semantic sanity check
    *  Determine control flow
    *  Determine data flow
    *  Generate some "intermediate" language (representing abstract instructions)
    *  Optimize the intermediate language
    *  Generate machine code from the optimized language
    

    特定编译器对阶段所做的工作因编译器而异。这些步骤中的每一个都使程序表示更接近最终的机器代码。 N 遍编译器会将这些步骤中的一个或多个捆绑到一个遍中。

    回到现在,我们有很多内存;不需要现代编译器将中间结果写入磁盘文件,因此所有这些阶段都发生在单个进程的内存中。您,编译器用户,看不到它们。因此,您可以将现代编译器称为“一次性”一词的原始含义。由于现在没有人关心,这个短语已经被废弃了。

    无论如何,编译器内部通常仍然是多阶段的。 (有些编译器在一个阶段完成所有这些步骤;通常,他们不能做很多优化)。

    关于compiler-construction - 一通和多通编译器之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35673818/

    相关文章:

    flash - 慢闪cs5编译

    c - C语言的Syntax是完全由CFGs定义的吗?

    c++ - 如何使用 Qt 设计 IDE?

    c - GCC 和 Clang 优化选项之间的区别

    c - 如何在 LLVM 中获取函数指针

    compiler-construction - LLVM IR 嵌套 phi 指令

    compiler-construction - 在词法分析器中定义 <LINE-START> 和 <LINE-END>

    c - 如何通过 LLVM C 绑定(bind)发出调试信息?

    c++ - 什么是更有效的堆栈内存或堆?

    c++ - 为什么函数中本地定义的结构需要赋值运算符和复制构造函数