前面大概说过bison与yacc的语法,那么其实go也是用bison来实现的,下面来说说怎么阅读go语言源代码。要看代码首先得找到代码的入口,怎么找呢?你可能首先想到grep main是的,一般来说这是一个没有争议的办法,但是对于go语言来说,这个办法对,也不对。怎么说呢?我们用gdb来进行debug就会看到所有的go语言程序的入口居然都在src/lib9/main.c里的main函数。
从go/include/libc.h中里我们可以看到这么一句
也就是说,在go语言源代码里main函数都重命名了,所有的函数入口都变成了src/lib9/mina.c,也实际的入口各自的代码里,因此说入口是各自的main这句话,对也不对。
那么先大概说一下go语言的代码结构
我们先来看一个go语言的hello world文件hello.go
那么这个文件要被编译链接成一个可执行文件,那么要执行如下命令:
很显然最关键的就是6g和6l两个程序,那么我们就从6g开始
首先gdb -tui打开tui界面的gdb程序
然后输入file 6g载入6g程序,就可以看到
/home/hoping/go/src/lib9/main.c,然后输入start后,step进入了/home/hoping/go/src/cmd/gc/lex.c的main函数
因此我们只需要看这个文件就大概可以看到程序的执行流程了。接下来暂时不需要gdb了,我们换vi和ctags。
在go目录执行ctags -R *来生成tag,然后用vi打开lex.c进入main函数,其实即使你看了这个函数也不会有太多收获。
正如我们前面说过的那样,6g是用bison的,那么显然我们需要找到bison文件和yylex函数即可。既然入口在gc文件夹,那么猜想y文件也在gc文件夹,于是进入ls *.y之后可以看到go.y。而go.y的输入全是由yylex函数来提供的。所以首先我们来看看yylex函数,在go文件夹下执行vim -t yylex,然后选择gc文件夹那个。