Compilation 为什么Go编译版本相对较大?
我最近安装了go,并正在尝试hello world示例Compilation 为什么Go编译版本相对较大?,compilation,go,Compilation,Go,我最近安装了go,并正在尝试hello world示例 package main import "fmt" func main() { fmt.Printf("hello, world\n") } $go构建hello.go 返回大小为1.2Mb的hello二进制文件。这对于一个hello world项目来说是相当大的。为什么文件大,有什么特别的原因吗?是否因为导入了“fmt”?是的,包“fmt”是原因之一。它还反过来导入其他包。但即使不使用“fmt”,整个运行时也会静态链接到Go二进
package main
import "fmt"
func main() {
fmt.Printf("hello, world\n")
}
$go构建hello.go
返回大小为1.2Mb的hello二进制文件。这对于一个hello world项目来说是相当大的。为什么文件大,有什么特别的原因吗?是否因为导入了“fmt”?是的,包“fmt”是原因之一。它还反过来导入其他包。但即使不使用“fmt”,整个运行时也会静态链接到Go二进制文件中。Go的运行时不是一个简单的运行时——它包括调度程序/goroutine vs OS线程管理器、拆分堆栈分配器、垃圾收集器和垃圾收集器友好的内存分配器,也是C线程友好的、信号处理程序和堆栈跟踪生成器,…是的,包“fmt”是原因之一。它还反过来导入其他包。但即使不使用“fmt”,整个运行时也会静态链接到Go二进制文件中。Go的运行时不是一个简单的运行时-它包括一个调度程序/goroutine vs OS线程管理器、拆分堆栈分配器、垃圾收集器和垃圾收集器友好的内存分配器,它也是C线程友好的、信号处理程序和堆栈跟踪生成器,…这是
为什么我的小程序是这么大的二进制文件?
gc工具链(5l、6l和8l)中的链接器进行静态链接。
因此,所有Go二进制文件都包括Go运行时以及
支持动态类型检查所需的运行时类型信息,
反射,甚至恐慌时间堆栈跟踪
一个简单的C“hello,world”程序,使用
Linux上的gcc大约为750KB,包括printf的一个实现。
使用fmt.Printf的等效Go程序大约为1.2MB,但是
包括更强大的运行时支持
这是
为什么我的小程序是这么大的二进制文件?
gc工具链(5l、6l和8l)中的链接器进行静态链接。
因此,所有Go二进制文件都包括Go运行时以及
支持动态类型检查所需的运行时类型信息,
反射,甚至恐慌时间堆栈跟踪
一个简单的C“hello,world”程序,使用
Linux上的gcc大约为750KB,包括printf的一个实现。
使用fmt.Printf的等效Go程序大约为1.2MB,但是
包括更强大的运行时支持
它静态编译所有未压缩的依赖项。想象一下部署的简单性吧!它静态编译所有未压缩的依赖项。想象一下部署的简单性吧!