大家好,今天 给大家带来一篇关于Go编译器的四个阶段的文章,大家可以学习一下,正好为后续一篇文章做一下铺垫。原文见https://golang.org/src/cmd/compile/README
,由于本人翻译水平有限,翻译不当之处烦请指出。
cmd/compile
目录包含构成 Go 编译器的主包。编译器在逻辑上可以分为四个阶段,我们将在包含其代码的包列表中简要描述这四个阶段。
在提到编译器时,有时可能会听到术语front-end|前端
和back-end|后端
。粗略地说,这些转化为我们将在此列出的前两个和后两个阶段。第三个术语,“middle-end|中间端”,通常指的是在第二阶段进行的大部分工作。
请注意 go/*
路径下的包系列,例如 go/parser
和 go/types
,与编译器没有关系。由于编译器最初是用 C编写的,所以开发 go/*
包是为了支持编写使用 Go 代码的工具,比如 gofmt
和 vet
。
需要澄清一下,名称gc
这里代表Go compiler
,与大写的GC
(garbage collection垃圾回收
)没有什么关系。
cmd/compile/internal/syntax
(词法分析器,解析器,语法树)在编译的第一阶段,对每个源文件代码进行标记(词法分析) ,解析(语法分析) ,并构建一个语法树。
每个语法树都精准地展现了源文件相对应的内容,其中的节点对应于源文件的各种元素,如表达式、声明和语句。语法树还包括了用于错误报告和创建调试信息的位置信息。
cmd/compile/internal/gc
(创建编译器 AST
、类型检查、 AST
转换)gc
包包含一个 AST
定义,是用C语言编写的。所有代码都是用它编写的,所以 gc
包必须做的第一件事就是将语法包的语法树转换为编译器的 AST
表示。这个额外的步骤将来可能会被重构。
然后对 AST
进行类型检查。第一步是名称解析和类型推断,确定哪个对象属于哪个标识符,以及每个表达式具有哪个类型。类型检查包括某些额外的检查,例如“声明了且未使用的”的变量检查,以及确定函数是否停止。
某些转换也在 AST
上完成的。有些节点根据类型信息进行了细化,例如将字符串添加从算术加法节点类型中分离出来。其他一些例子包括无效代码删除分析、函数调用内联和逃逸分析。
cmd/compile/internal/gc
(转换为 SSA
)cmd/compile/internal/ssa
(SSA
传递和规则)在这个阶段,AST
被转换为 Static Single Assignment (SSA)
形式,这是一种具有特定属性的较低级的中间表现形式,可以更容易地实现优化并最终从中生成机器代码。
在此转换过程中,将会使用函数的内置函数。这些都是特殊的函数,编译器已经学会了在个别例子的基础上使用经过大量优化的代码来替代它。
在 AST
到 SSA
的转换过程中,某些节点也会被降级为更简单的组件,这样编译器的其余部分就可以使用它们。例如,内置的copy
函数会被内存移动替代,range
循环被重写为 for
循环。由于历史原因,其中一些情况目前是发生在转换为 SSA
之前,但长期计划是将所有这些放到这里处理。
然后,应用一系列与机器无关的通行证和规则。它们不会涉及任何单一的计算机体系结构,因此可以在所有 GOARCH
变体上运行。
这些通用通过的一些例子包括无效代码删除,移除不必要的零值检查,以及移除未使用的分支。通用重写规则主要涉及表达式,例如用常量值替换某些表达式,以及优化乘法和浮点运算。
cmd/compile/internal/ssa
(SSA 降低和特定架构传递)cmd/internal/obj
(机器代码生成)编译器与机器相关的阶段从lower
开始,它将通用的值重写为它们与机器相关的变量。例如,在 amd64
架构上可以使用内存操作数,因此可以组合很多负载存储操作。
请注意,下层的传递运行所有特定机器的重写规则,因此它当前也做了许多优化。
一旦 SSA
被lower
且更特定于目标体系架构,就会运行最终的代码优化传递。这包括另一个无效代码删除/值传递,移动更接近其用途的值,删除永远不会读取的本地变量,以及寄存器分配。
作为这个步骤的一部分,其他重要的工作还包括栈帧布局,该布局为局部变量分配堆栈偏移量,以及指针存活分析,它计算堆栈上哪些指针在每个GC
安全点处于活跃状态。
在 SSA
生成阶段的末尾,Go 函数会被转换为一系列 obj
程序指令。它们被传递给汇编程序(cmd/internal/obj
) ,然后将它们转换为机器代码并写出最终的目标文件。对象文件还将包含反射数据、导出数据和调试信息。
如果你想要更深入了解 SSA 包的工作原理,包括它的传递和规则,请访问cmd/compile/internal/ssa/README.md[1].
[1] cmd/compile/internal/ssa/README.md: https://golang.org/src/cmd/compile/internal/ssa/README.md
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/3w-Pa9m4ws2an5xdJaOwVA
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。