万字长文详解Go程序是怎样跑起来的CSD

北京的最好皮肤病医院 http://pf.39.net/bdfyy/qsnbdf/150717/4658077.html

作者

qcrao

责编

屠敏

出品

CSDN博客

刚开始写这篇文章的时候,目标非常大,想要探索Go程序的一生:编码、编译、汇编、链接、运行、退出。它的每一步具体如何进行,力图弄清Go程序的这一生。

在这个过程中,我又复习了一遍《程序员的自我修养》。这是一本讲编译、链接的书,非常详细,值得一看!数年前,我第一次看到这本书的书名,就非常喜欢。因为它模仿了周星驰喜剧之王里出现的一本书——《演员的自我修养》。心向往之!

在开始本文之前,先推荐一位头条大佬的博客——《面向信仰编程》,他的Go编译系列文章,非常有深度,直接深入编译器源代码,我是看了很多遍了。博客链接可以从参考资料里获取。

理想很大,实现的难度也是非常大。为了避免砸了“深度解密”这个牌子,这次起了个更温和的名字。

下面是文章的目录:

引入

我们从一个HelloWorld的例子开始:

packagemainimportfmtfuncmain(){fmt.Println(helloworld)}

当我用我那价值元的cherry键盘潇洒地敲完上面的helloworld代码时,保存在硬盘上的hello.go文件就是一个字节序列了,每个字节代表一个字符。

用vim打开hello.go文件,在命令行模式下,输入命令:

:%!xxd

就能在vim里以十六进制查看文件内容:

最左边的一列代表地址值,中间一列代表文本对应的ASCII字符,最右边的列就是我们的代码。再在终端里执行manascii:

和ASCII字符表一对比,就能发现,中间的列和最右边的列是一一对应的。也就是说,刚刚写完的hello.go文件都是由ASCII字符表示的,它被称为文本文件,其他文件被称为二进制文件。

当然,更深入地看,计算机中的所有数据,像磁盘文件、网络中的数据其实都是一串比特位组成,取决于如何看待它。在不同的情景下,一个相同的字节序列可能表示成一个整数、浮点数、字符串或者是机器指令。

而像hello.go这个文件,8个bit,也就是一个字节看成一个单位(假定源程序的字符都是ASCII码),最终解释成人类能读懂的Go源码。

Go程序并不能直接运行,每条Go语句必须转化为一系列的低级机器语言指令,将这些指令打包到一起,并以二进制磁盘文件的形式存储起来,也就是可执行目标文件。

从源文件到可执行目标文件的转化过程:

完成以上各个阶段的就是Go编译系统。你肯定知道大名鼎鼎的GCC(GNUCompileCollection),中文名为GNU编译器套装,它支持像C,C++,Java,Python,Objective-C,Ada,Fortran,Pascal,能够为很多不同的机器生成机器码。

可执行目标文件可以直接在机器上执行。一般而言,先执行一些初始化的工作;找到main函数的入口,执行用户写的代码;执行完成后,main函数退出;再执行一些收尾的工作,整个过程完毕。

在接下来的文章里,我们将探索编译和运行的过程。

编译链接概述

Go源码里的编译器源码位于src/cmd/


转载请注明:http://www.aierlanlan.com/grrz/2325.html

  • 上一篇文章:
  •   
  • 下一篇文章: 没有了