如何驱动更智能的计算
最终降级完成的 SSA 此时的代码已经降级的与最终的汇编代码比较接近,但还没经过正式的转换。 汇编 完成程序编译后,第三步将是 ”汇编“,汇编器会将汇编代码转变成机器可执行的指令,每一个汇编语句几乎都对应着一条机器指令。基本逻辑就是根据汇编指令和机器指令的对照表一一翻译。 在 Go 语言中,genssa 所生成的目标代码已经完成了优化降级,接下来会调用 src/cmd/internal/obj 包中的汇编器将 SSA 中间代码生成为机器码。
我们可通过 go tool compile -S 的方式进行查看: SSA 从左往右依次为:Sources(源代码)、AST(抽象语法树),其次最右边第一栏起就是第一轮中间语言(代码),后面还有十几轮。 目标代码生成与优化 在中间语言生成完毕后,还不能直接使用。因为机器真正能执行的是机器码。这时候就到了编译器后端的工作了。 从阶段上来讲,在源代码级优化器产生中间代码时,则标志着接下来的过程都属于编译器后端。 编译器后端主要包括如下两类,作用如下::
在 Go 语言中,以上行为包含在前面所提到的十几轮 SSA 优化降级中,有兴趣可自行研究 SSA,最后在 genssa 中可看见最终的中间代码: 视化后的语法树 在上文中,主要涉及语法分析和语义分析部分,其归属于编译器前端,最终结果是得到了语法树,也就是常说是抽象语法树(AST)。 有兴趣可以亲自试试 yuroyoro/goast-viewer,会对语法树的理解更加的清晰。 中间语言生成 现代的编译器有这多个层次的优化,通常源代码级别会有一个优化过程。例如单纯的 1+2 的表达式就可以被优化。
而在 Go 语言中,中间语言则会涉及静态单赋值(Static Single Assignment,SSA)的特性。例如有一个很简单的 SayHelloWorld 方法,如下: (编辑:淮安站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |