Go的编译和运行
Go的编译
Go
语言是一门需要编译才能运行的编程语言,也就说代码在运行之前需要通过编译器生成二进制机器码,随后二进制文件才能在目标机器上运行,如果我们想要了解Go语言的实现原理,理解它的编译过程就是一个没有办法绕过的事情。
Go
语言编译器的源代码在 src/cmd/compile
目录中,目录下的文件共同构成了Go
语言的编译器,学过编译原理的人可能听说过编译器的前端和后端,编译器的前端一般承担着词法分析、语法分析、类型检查和中间代码生成几部分工作,而编译器后端主要负责目标代码的生成和优化,也就是将中间代码翻译成目标机器能够运行的机器码。
Go
的编译器在逻辑上可以被分成四个阶段:词法与语法分析
、类型检查和 AST 转换
、通用 SSA 生成
和最后的机器代码生成
。
Go的运行
Go build
go build
命令用来启动编译,可以将go
编写的程序与相关以来编译成一个可执行文件。
#[name]参数可传入多个
go build [name]
-
当
[name]
为空时:如果当前目录存在main包,则会生成一个与当前目录名相同的可执行文件,在不同的操作系统中,生成的文件不同。 -
当
[name]
不为空时:- 如果
[name]
为非main
包下的源文件名,编译器将只对该包进行语法检测,不生成可执行文件。 - 如果
[name]
为main
包下的源文件名(可能有多个),编译器将生成一个与第一个[name]
同名的可执行文件,在不同的操作系统中,生成的文件不同。
- 如果
在上一章中,我们创建了第一个Go
的程序,我们可以对第一个项目进行build
。
#进入项目目录
cd myfirstproject
#进行编译生成 可以不填写参数
go build [main.go]
#当前目录下会产生一个可执行文件
#如果带参数,将会生成名叫main的可执行文件
main
#如果不带参数,将会生成与当前目录名相同的可执行文件
myfirsproject
#运行可执行文件
./main #./myfristproject
打印出Hello World!
。
Go run
go run
命令是将go build
命令和执行生成的可执行文件二合一的命令,该命令不会生成可执行文件,但是可以运行。但在go run
命令中,参数是不可以省略的,并且参数必须时同一main
包下的所有源文件名。
go run main.go
这将会直接打印出Hello World!
,并且不产生可执行文件。
Go install
go install
命令会把项目进行编译并安装,go install
命令将会把可执行文件放入你的工作空间($GOPATH
)下的bin
目录中,将库文件放入工作空间($GOPATH
)下的pkg
目录中。如果你配置了环境变量的情况下($GOPATH/bin
),那么你就可以不在可执行文件的目录下运行可执行文件。
Go get
go get
命令可以用于拉取远程项目,该命令需要git
,所以在使用该命令前,需要先安装git
。当你用go get
从远程分支中拉取项目时,该项目会被编译安装,可在工作空间目录下的bin
目录中找到可执行文件。如果当前项目已从远程拉下来,使用go get -u
还可以更新该项目。
其他命令
如果你还对其他命令感兴趣,可以使用go help
命令查看所有命令的解释。如果你想了解一个命令,你还可以使用go help <topic>
查看更多信息,例如:go help build
。