go gc gccgo gcc GNU 之间的关系

概念介绍

  • GNU: 包含众多免费开源软件的操作系统
  • gcc (GNU Complier Collection): GNU 编译工具集,支持编译众多的编程语言。经过gcc编译后的代码可以在GNU上执行。
  • go:go 是一门语言,是具有明确标准定义的语言,不是具体的实现,具体的实现由go与gccgo来完成。
  • gc: go compiler go默认的编译器
  • gccgo
    : gcc是一个编译工具集,gccgo是gcc工具集里的一部分,关联go与gcc。能将go编译成可执行文件。

gc 与 gccgo 有什么差别

gc 与gccgo 都是go语言标准规范的不同实现,两者包含不同的侧重点:

  • 处理器:gccgo 具有比 gc更长的发展史,支持更多不同的操作系统,处理器
  • 编译与性能上:
    • gccgo 比gc编译程序更慢;不能保证编译后的代码比gc更佳;
    • 在大部分情况下,基于gcc编译优化,编译的代码性能更高,适合CPU密集型程序
  • gccgo 跟随gcc发布,支持的版本,可能不与当前的go版本相同

开发如何选择gc与gccgo

使用成本上gccgo远比gc更高,基于如下原因:

  • gccgo的发布跟随gcc,更新频率与gc(跟随go版本一起发布)不同步,在语言特性上的支持gc比gccgo强
  • gccgo的环境比gc环境管理成本更高,一些常见的问题:
    • 如gcc系统版本低,gcc需要单独安装(可以通过docker降低成本)
    • gcc安装步骤复杂:https://gcc.gnu.org/install/
    • gccgo 无法使用go toolchain导致,编译环境需要一些特殊操作,比如依赖问题,cgo问题。gc对于特殊操作有更好的支持

总结:除非真要追求高性能,否则不建议去折腾gccgo

如果一定要折腾,建议思路:基于gcc docker 镜像,编写Dockerfile,安装golang,然后使用go build -compiler=gccgo
相关资源:

  • gcc:https://hub.docker.com/_/gcc
  • golang: https://hub.docker.com/_/golang

参考

  • go spec: https://golang.org/ref/spec
  • GNU: https://en.wikipedia.org/wiki/GNU_Compiler_Collection
  • Setting up and using gccgo

你可能感兴趣的:(go gc gccgo gcc GNU 之间的关系)