2012年7月11日 Go生态洞察:Gccgo在GCC 4.7.1中的集成 摘要 搜索:Gccgo, GCC, Go语言编译器, Go性能优化 猫头虎博主来报道! 今天我们探讨的是Gccgo在GCC 4.7.1版本中的集成。Go语言一直以来都是由规范定义,而不是实现。Go团队编写了两个不同的编译器来实现这一规范:gc和gccgo。 让我们更仔细地看看gccgo,它是如何作为GCC的一部分发挥作用的。 正文 gccgo与GCC的结合 gccgo作为GNU编译器集合GCC的一部分进行分发。 gccgo与gc的比较 与gc相比,gccgo编译代码较慢,但支持更强大的优化功能,因此由gccgo构建的CPU密集型程序通常运行更快。 gccgo还在gc编译器不支持的操作系统上进行了测试,尤其是Solaris。 标准库和运行时特性 gccgo提供了完整的标准Go库。
GOPATH="/go" GORACE="" GOROOT="/usr/local/go" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO ="gccgo" CC="gcc" CXX="g++" CGO_ENABLED="1" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" go/1.12.4/libexec" GOTMPDIR="" GOTOOLDIR="/usr/local/Cellar/go/1.12.4/libexec/pkg/tool/darwin_amd64" GCCGO ="gccgo" CC="clang" CXX="clang++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS
目前有两种编译器,其中"Gccgo"采用GCC作为编译后端。另外还有 根据处理器架构命名的编译器:针对64位x86结构为"6g",针对32位x86结构的为"8g"等等。 这些go专用的编译器编译很快,但是产生的目标代码效率比gccgo稍差一点。目前(2009年底), go专用的编译器的运行时系统比"gccgo"要相对健壮一点。 下面看看如何编译并运行程序。 $ 6l helloworld.6 # 链接; 输出 6.out $ 6.out Hello, world; or Καλημέρα κόσμε; or こんにちは 世界 $ 如果是用gccgo 编译,方法和传统的gcc编译方法类似: $ gccgo helloworld.go $ a.out Hello, world; or Καλημέρα κόσμε; or こんにちは 世界
home/lbb/go/go_study" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO ="gccgo" CC="gcc" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build946063677
GOROOT=D:\BaiduNetdiskDownload\go set GOTOOLDIR=D:\BaiduNetdiskDownload\go\pkg\tool\windows_amd64 set GCCGO =gccgo set CC=gcc set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 set CXX=g++ set CGO_ENABLED=1 set GOPATH="/root/gocode" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO ="gccgo" CC="gcc" GOGCCFLAGS="-fPIC -m64 -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build057487015
"
GOROOT="/usr/local/go"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64"
GCCGO ="gccgo"
CC="gcc"
CXX="g++"
CGO_ENABLED="1"
GOMOD=""
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS
GOTOOLDIR=D:\software\go1.17.6\go1.17.6\pkg\tool\windows_amd64 set GOVCS= set GOVERSION=go1.17.6 set GCCGO =gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=D:\software\goworkspace\go-fly-pro
摘要 引子:gdb、go execution tracer、GODEBUG、gctrace、schedtrace 一、gccgo Function Counting 二、Go gc Function Counting } 一、gccgo Function Counting 我开始会使用 gccgo 编译,然后使用 Go gc 编译器 。(区别:gccgo 可以生成优化后的二进制文件,但是基于老版本的 Go。) ## 编译 $ gccgo -o hello hello.go $ ./hello Hello, BPF! 现在我将使用 bcc 工具的 funccount 来动态跟踪和计数所有以 “fmt.” 在这种情况下,我利用 libgo 当测量工具(假定“lib”在“go:”之前),作为 gccgo 发出的一个二进制动态链接库(libgo 包含 fmt 包)。 我将回到 gccgo,使用一个非常简单的示例程序( from the go tour ),functions.go: package main import "fmt" func add(x int
GOPATH=D:\Go\Development\ set GORACE= set GOROOT=C:\Go set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64 set GCCGO =gccgo set CC=gcc set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0 set CXX=g++ set CGO_ENABLED=1 set
GOTMPDIR= set GOTOOLDIR=D:\apptools\go\pkg\tool\windows_amd64 set GOVCS= set GOVERSION=go1.17.2 set GCCGO =gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=NUL set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS GOTMPDIR= set GOTOOLDIR=D:\apptools\go\pkg\tool\windows_amd64 set GOVCS= set GOVERSION=go1.17.2 set GCCGO =gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=NUL set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS
gopath"GOPROXY=""GORACE=""GOROOT="/usr/local/go"GOTMPDIR=""GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"GCCGO ="gccgo"CC="clang"CXX="clang++"CGO_ENABLED="1"GOMOD=""CGO_CFLAGS="-g -O2"CGO_CPPFLAGS=""CGO_CXXFLAGS=
GOROOT=c:\go set GOSUMDB=sum.golang.org set GOTMPDIR= set GOTOOLDIR=c:\go\pkg\tool\windows_amd64 set GCCGO =gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD= set CGO_CFLAGS=-g -O2 set CGO_CPPFLAGS
若在你的操作系统和架构上没有可用的二进制发行版,请尝试 从源码安装Go 或 安装gccgo来代替gc。 系统需求 gc 编译器支持以下操作系统及架构。在开始前,请确保你的系统满足这些需求。 若你的OS及架构不在此列表中,那么 gccgo 可能支持你的设置, 详情请访问设置并使用gccgo。
编译器编辑 当前有两个Go编译器分支,分别为官方编译器gc和gccgo。官方编译器在初期使用C写成,后用Go重写从而实现自举。Gccgo是一个使用标准GCC作为后端的Go编译器。
local/Cellar/go/1.9.2/libexec" GOTOOLDIR="/usr/local/Cellar/go/1.9.2/libexec/pkg/tool/darwin_amd64" GCCGO ="gccgo" CC="clang" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length
"/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO ="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS
Users/MelissaShu/go" GORACE="" GOROOT="/usr/local/go" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GCCGO ="gccgo" CC="clang" GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length
"/usr/local/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/linux_amd64" GCCGO ="gccgo" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS
set GOSUMDB=sum.golang.org set GOTMPDIR= set GOTOOLDIR=C:\Program Files\Go\pkg\tool\windows_amd64 set GCCGO =gccgo set AR=ar set CC=gcc set CXX=g++ set CGO_ENABLED=1 set GOMOD=D:\code\kknock\KnockKnock\application
GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64" GCCGO="gccgo" AR