【问题标题】:Why does Go use its own Code generator? [closed]为什么 Go 使用自己的代码生成器? [关闭]
【发布时间】:2011-07-01 04:21:54
【问题描述】:

当前的官方 Go 编译器 (http://code.google.com/p/go/) 目前使用手工制作的、可以说是晦涩难懂的代码生成器,其中包括将自定义部分注入 ELF 二进制文件。

这种方法产生了很多与直接读取和/或写入 ELF 信息的实用程序相关的错误,例如 lddobjdumpstrip

我相信这可以通过使用经过良好测试的跨平台代码生成器(例如 LLVM)来避免,然后只需使用操作系统附带的链接工具,例如 Unix/Linux 上的 ld(或 Windows 上的 ld.exe w/ MinGW),或 link.exe 在 Windows 上使用 Visual Studio。

那么,为什么 Go 使用自己的代码生成器呢?真的只是重新发明轮子吗?还是背后有更重要的原因?

【问题讨论】:

  • 你必须问那个项目的人他们为什么做出这个选择。
  • 完全控制他们的工作。
  • @dmckee:或者你可以阅读他们对这个问题的回答。
  • 编译速度是主要设计点之一。所以他们不能依赖庞大且非常慢的 LLVM 或 GCC 后端。但后来他们制作了使用它们的 GO 编译器版本。

标签: code-generation go elf


【解决方案1】:

有关如何使用 gccgo(一种使用 GCC 后端的更传统的编译器)的信息,请参阅Setting up and using gccgo

Go Language Specification 与编译器无关。您可以从可用的编译器中进行选择,自己编写一个,或者为LLVM Go frontend 项目做出贡献。

有关 Go 编译器技术的历史观点,请阅读此问题的答案:What compiler technology is used to build the compilers?

【讨论】:

    【解决方案2】:

    参考编译器(5g、6g 和 8g,统称为 gc)由 Ken Thompson 基于他为 Plan 9 操作系统编写的 C 编译器编写。他这样做有几个原因:

    • 他已经熟悉 C 编译器的工作原理,因此他更容易适应现有工作,而不是学习一个全新的框架。
    • Go 的目标之一是快速编译。 gc 编译器可能比基于 LLVM 的编译器更快,因为它没有做太多工作。再说一次,它也没有优化。

    正如 Peter 提到的,还有 gccgo,它使用 gcc 作为后端。我怀疑 Go 编译器最终会有其他选择,特别是考虑到 Go 库包含完整的 Go 解析器和(部分完整的)类型检查器。

    【讨论】:

      猜你喜欢
      • 2015-06-03
      • 1970-01-01
      • 2012-06-24
      • 2011-01-30
      • 2010-09-22
      • 2011-08-04
      • 1970-01-01
      • 2011-12-07
      • 2011-07-26
      相关资源
      最近更新 更多