【问题标题】:C++ compilers and back/front endsC++ 编译器和后端/前端
【发布时间】:2011-02-06 18:58:47
【问题描述】:

对于我自己的教育,我很好奇编译器使用哪个 C++ 前端和后端。 您能告诉我以下技术在哪里使用以及它们有哪些标志/优势(如果有的话)?

  • Open64 - 它是后端、前端还是两者兼而有之?哪些编译器使用它?我在CUDA编译器中遇到过。

  • EDG - 据我所知,这是英特尔编译器和 Comeau 的前端使用。其他编译器使用它吗?我在 boost 源代码中发现了很多对它的引用。

  • ANTLR - 这是通用解析器。有没有常见的编译器使用它?

关于编译器:

  • gcc 编译器套件使用前端/后端吗?它与任何其他编译器有共同的传统吗?

  • 前端/后端 PGI 和 PathScale 编译器使用什么?

  • 前端/后端 XL 编译器使用什么(IBM 产品)。

Internet 上的深度链接或您的个人专业知识会很棒。 我做了一些谷歌搜索,但我一般遇到的信息都比较肤浅。

谢谢。

【问题讨论】:

    标签: c++ compiler-construction frontend backend


    【解决方案1】:

    EDG 是英特尔和 Comeau 使用的前端。其他用户请参阅 EDG 的customers 列表。

    ANTLR 是一个解析器生成器。我不知道任何围绕使用 ANTLR 构建的解析器构建的 C++ 编译器(但这并不意味着它不存在)。

    GCC 是一套编译器,前端支持 C、C++、Fortran、Ada、Java 等,后端支持的处理器数量超出我的想象。

    Open64 也是一套编译器,包括几个前端(用于 C、C++、Fortran 以及我目前不记得的其他)和后端(针对 X64、Itanium、ARM 等) ,可能是我不记得和/或不知道的其他人)。我相信它的起源(双关语不是故意的)是 SGI 的编译器。我似乎记得读过一些暗示 Open64 源自某些版本的 GCC 前端的东西,但是我不知道 1)它在内部与 GCC 有多么相似,或者 2)它的 GCC 版本派生的——但它已经存在了足够长的时间,我猜它最近是 GCC 3.x,很可能是 GCC 2.x。

    我相信 PathScale 已经创建了至少一个从 Open64 派生的编译器,但他们可能也有其他的。

    据我所知,IBM 的编译器完全是他们自己创造的。我IBM(现已停产)VisualAge for C++ 与 XL C++ 共享了一些遗产/开发/代码,但不确定,也不能甚至开始猜测它的程度,即使假设它是真的。

    【讨论】:

    • 谢谢。使用 nvcc(open 64)时,我在尝试使用 boost 类型特征(或任何包含它的东西)时遇到了重大问题。希望我在寻找编译器解决方法时会有一些参考
    • C++ 不是 LALR,所以这就是为什么(命名你最喜欢的解析器生成器)不用于前端。 ANTLR 基于 LL(*) 而不是 LALR 工作,但我觉得这对于某些 C++ 更棘手的语法来说还不够。 C++ 语法不是上下文无关的,这是大多数通用解析器生成器的要求。
    • @Ben: 是也不是——C++ 具有上下文相关的语义(例如臭名昭​​著的“最令人头疼的解析”),但解析器并不需要处理那——它只需要接受格式良好的代码并拒绝格式错误的代码。从这个角度来看,C++ 是(或可以被视为)上下文无关的——尽管如果你这样做,你必须稍后在编译器中“整理”更多。
    • @Ben:不是真的——确定意义是语义分析的领域。是的,我们通常更喜欢解析器使语义分析变得容易,但解析器不需要具备解析器的资格。
    • @Jerry:总的来说,该页面充满了 FUD。但它确实有几个上下文相关解析的好例子。他完全正确,抽象语法树在这些情况下是完全不同的。真的,我认为我们在这个问题上是一致的:解析器生成器在处理 C++ 时非常有帮助,但语法的上下文部分必须由后面的步骤更充分地处理。
    【解决方案2】:

    Visual Studio uses EDG 的智能感知引擎。

    【讨论】:

      【解决方案3】:

      Clang 项目在 LLVM 后端之上为 C/C++/Objective C 提供了新的前端。 LLVM 项目还提供了一个 LLVM-gcc,使用 GCC 前端和 LLVM 后端。 DragonEgg 项目试图用 LLVM 替换 GCC 后端。

      Codeplay VectorC、Sieve 和 Offload 编译器使用自定义前端和后端

      【讨论】:

        【解决方案4】:

        gcc 编译器套件使用前端/后端吗?它与任何其他编译器有共同的传统吗?

        首字母缩略词“GCC”代表“GNU 编译器集合”(最初是“GNU C 编译器”),这已经给出了一个提示:GNU 编译器是编译器的集合,尤其是 C 和C++ 也适用于 Fortran、Objective-C 等。它们共享专门为 GCC 开发的通用后端和中间表示。

        前端都是为 GCC 定制的。有些是由第三方贡献的,最著名的是由 Apple 贡献的 Objective-C 前端。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2010-12-22
          • 1970-01-01
          • 2017-02-06
          • 1970-01-01
          • 2011-05-02
          • 2016-09-10
          • 2013-08-04
          相关资源
          最近更新 更多