概念介绍
- 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
。
相关资源: