Go的编译执行流程主要包括编译和执行两个阶段。
-
编译阶段:╰(艹皿艹 )
前端编译:这个阶段的主要任务是将Go源代码转换成抽象语法树(AST, Abstract syntax tree)。首先,词法分析器将源代码转换成token序列,即将代码按关键字、标识符、运算符等分割成单个单元。然后,语法分析器将这些token序列转换成AST,即将代码按照语法规则进行解析,构建出语法树。在构建AST的过程中,还会进行语义分析,检查语法是否合法,例如变量是否被定义等。 后端编译:这个阶段的主要任务是将AST转换成机器码。编译器会将AST转换成中间代码,然后优化这些中间代码,最后生成目标机器能够运行的二进制机器码。
-
执行阶段:o( ̄┰ ̄*)ゞ
执行阶段则直接运行编译阶段生成的机器码。当程序被加载到内存中并执行时,CPU会按照机器码中的指令执行相应的操作,从而完成程序的功能。
总的来说,Go的编译执行流程是一个典型的编译型语言的流程,先通过编译器将源代码转换成机器码,然后再由执行器执行这些机器码。在这个过程中,编译器会进行一系列的优化操作,以提高程序的运行效率。
go build之后发生了甚么事?😁
- 创建临时目录,mkdir -p $WORK/b001/
- 查找依赖信息,cat >$WORK/b001/importcfg « …
- 执行源代码编译,/usr/local/go/pkg/tool/darwin_amd64/compile …
- 收集链接库文件,cat >$WORK/b001/importcfg.link « …
- 生成可执行文件,/usr/local/go/pkg/tool/darwin_amd64/link -o …
- 移动可执行文件,mv $WORK/b001/exe/a.out hello
go run后又发生了甚么事?😀
与build不同的是,在link生成hello文件后,并没有把它移动到当前目录,而是通过$WORK/b001/exe/hello执行了程序。
...