返回介绍

02.2 编译器

发布于 2024-08-14 12:50:32 字数 4724 浏览 0 评论 0 收藏 0

Go 编译器

Go编译器需要在 go tool 的帮助下执行。 go tool 除了生成可执行文件之外还有很多其他功能。

本章节中使用的 unsafe.go 文件不包含任何特殊代码-所提供的命令将适用于每个有效的Go源文件。接下来你将会看到 unsafe.go 的内容。

如果你使用 go tool compile 命令编译 unsafe.go 文件,会得到一个扩展名为.o的目标文件。下面的展示这个命令在macOS操作系统中执行的结果:

> $ go tool compile unsafe.go
> $ ls -l unsafe.o
> -rw-r--r-- 1 mstouk staff 5495 Oct 30 19:51 unsafe.o
> $ file unsafe.o
> unsafe.o: data

目标文件是包含了目标代码的二进制文件,它以可重定位格式的形式展现,很多时候不能被直接执行。可重定位格式的最大好处是在链接阶段它需要尽可能少的内存。

如果执行 go tool compile -pack 命令,将会得到一个压缩文件。

$ go tool compile -pack unsafe.go
$ ls -l unsafe.a
-rw-r--r-- 1 mtsouk staff 5680 Oct 30 19:52 unsafe.a
$ file unsafe.a
unsafe.a: current ar archive

压缩文件也是一个二进制文件,但是它包含了一个或者多个文件,主要的目的是把多个文件组织到单个文件中。Go使用的压缩文件被称为 ar

使用下面的命令可以列出.a压缩文件的内容:

$ ar t unsafe.a
__.PKGDEF
_go_.o

go tool compile 的另一个真正有价值的命令行标志是-race,它允许您检测竞态条件。在第十章中你会学到更多关于竞态条件以及为什么要避免竞态条件的知识点。

本章的最后讨论汇编语言和节点树的时候,你还会学到 一个同样有用的 go tool compile 命令。现在为了撩动你,尝试一下下面的命令吧:

$ go tool compile -S unsafe.go

你可能发现,以上命令的输出会让你难以理解,这正说明了Go可以很好地帮你隐藏不必要的复杂性,除非你要求Go展示出来。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文