【发布时间】:2012-08-28 06:42:44
【问题描述】:
我一直在研究 Golang,发现它有一个编译器。 但它是将 Go 编译成汇编级代码还是只是将其转换为 BYTECODES 然后调用该编译?我的意思是,即使在 PHP 中,我们也能够将其转换为 BYTECODES 并具有更快的性能。 Golang 是系统级编程和编译的替代品吗?
【问题讨论】:
我一直在研究 Golang,发现它有一个编译器。 但它是将 Go 编译成汇编级代码还是只是将其转换为 BYTECODES 然后调用该编译?我的意思是,即使在 PHP 中,我们也能够将其转换为 BYTECODES 并具有更快的性能。 Golang 是系统级编程和编译的替代品吗?
【问题讨论】:
这确实是一个编译器(实际上它嵌入了 2 个编译器),它可以生成完全自给自足的可执行文件。您不需要任何补充库或任何类型的运行时来在您的服务器上执行它。您只需为您的目标计算机架构编译它。
有两个官方的 Go 编译器工具链。本文件重点 在 gc Go 编译器和工具(6g、8g 等)上。有关如何 在 gccgo 上工作,这是一个使用 GCC 后端的更传统的编译器, 请参阅设置和使用 gccgo。
Go 编译器支持三种指令集。有重要的 不同的编译器的质量差异 架构。
amd64(又名 x86-64); 6g,6l,6c,6a 成熟的实现。这 编译器有一个有效的优化器(注册器)并生成良好的 代码(虽然 gccgo 有时可以做得更好)。
386(又名 x86 或 x86-32); 8g,8l,8c,8a 堪比amd64端口。
arm(又名 ARM); 5g,5l,5c,5a 仅支持 Linux 二进制文件。使用范围不如 其他端口,因此没有经过彻底测试。
除了 诸如低级操作系统接口代码、运行时之类的东西 所有端口的支持都是相同的,并且包括标记和清除垃圾 收集器,高效的数组和字符串切片,并支持 高效的 goroutine,例如按需增长和收缩的堆栈。
编译器可以针对 FreeBSD、Linux、NetBSD、OpenBSD、OS X (达尔文)和 Windows 操作系统。全套支持 组合在环境变量的讨论中列出 下面。
在服务器上,您通常会以amd64 平台为目标。
请注意,Go 以编译速度着称。在部署我的服务器程序时,我不会在开发计算机上为不同的平台构建:我部署源代码并直接在生产服务器上编译。自 Go1 以来,我从来没有在一个平台上编译过代码,而在其他平台上也没有编译过。
在 Windows 上,我可以毫无问题地在我的开发计算机上创建 exe,然后简单地将 exe 发送给从未安装过任何与 Go 相关的任何东西的人。
【讨论】:
go build -gcflags -S 将运行编译器,将 -S 传递给输出程序集。您也可以直接调用编译器,例如go tool 8g -S <source.go>
Go 可以快速编译为机器码,同时具有垃圾收集的便利性和运行时反射的强大功能。它是一种快速、静态类型的编译语言,感觉就像是一种动态类型的解释语言。
来源 - golang.org
【讨论】: