0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

解答编译器是怎样运行的

GReq_mcu168 来源:码农的荒岛求生 作者:码农的荒岛求生 2021-03-09 15:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

对于程序员来说编译器是非常熟悉的,每天都在用,但是当你在点击“Run”这个按钮或者执行编译命令时你知道编译器是怎样工作的吗?

这篇文章就为你解答这个问题。

编译器就是一个普通程序,没什么大不了的

什么是编译器?

编译器是一个将高级语言翻译为低级语言的程序。

首先我们一定要意识到编译器就是一个普通程序,没什么大不了的。

在没有弄明白编译器如何工作之前你可以简单的把编译器当做一个黑盒子,其作用就是输入一个文本文件输出一个二进制文件。

基本上编译器经过了以下几个阶段,等等,这句话教科书上也有,但是我相信很多同学其实并没有真正理解这几个步骤到底在说些什么,为了让你彻底理解这几个步骤,我们用一个简单的例子来讲解。

假定我们有一段程序:

while (y < z) { int x = a + b; y += x;}

那么编译器是怎样把这一段程序人类认识的程序转换为CPU认识的二进制机器指令呢?

提取出每一个单词:词法分析

首先编译器要把源代码中的每个“单词”提取出来,在编译技术中“单词”被称为token。其实不只是每个单词被称为一个token,除去单词之外的比如左括号、右括号、赋值操作符等都被称为token。

从源代码中提取出token的过程就被称为词法分析,Lexical Analysis。

经过一遍词法分析,编译器得到了以下token:

T_While whileT_LeftParen (T_Identifier yT_Less

就这样一个磁盘中保存的字符串源代码文件就转换为了一个个的token。

这些token想表达什么意思:语法分析

有了这些token之后编译器就可以根据语言定义的语法恢复其原本的结构,怎么恢复呢?

原来,编译器在扫描出各个token后根据规则将其用树的形式表示出来,这颗树就被称为语法树。

语法树是不是合理的:语义分析

有了语法树后我们还要检查这棵树是不是合法的,比如我们不能把一个整数和一个字符串相加、比较符左右两边的数据类型要相同,等等。

这一步通过后就证明了程序合法,不会有编译错误。

根据语法树生成中间代码:代码生成

语义分析之后接下来编译器遍历语法树并用另一种形式来表示,用什么来表示呢?那就是中间代码,intermediate representation code,简称IR code

上述语法树可能就会表示为这样的中间代码:

Loop: x = a + b y = x + y _t1 = y < z if _t1 goto Loop

怎么样,这实际上已经比较接近最后的机器指令了。

只不过这还不是最终形态。

中间代码优化

在生成中间代码后要对其进行优化,我们可以看到,实际上可以把x = a + b这行代码放到循环外,因为每次循环都不会改变x的值,因此优化后就是这样了:

x = a + bLoop: y = x + y _t1 = y < z if _t1 goto Loop

中间代码优化后就可以生成机器指令了。

代码生成

将上述优化后的中间代码转换为机器指令:

add $1, $2, $3Loop: add $4, $1, $4 slt $6, $1, $5 beq $6, loop

最终,编译器将程序员认识的代码转换为了CPU认识的机器指令。

总结

注意这篇简短的讲解不希望给大家留下这样的印象,那就是编译器是很简单的,恰恰相反,现代编译器是非常智能并且极其复杂的,绝不是短短一篇文章就能讲清楚的,能实现一个编译器是困难的,实现一个好的编译器更是难上加难。

本文的目的旨在以极简的方式描述编译器的工作原理,这样你就不用把编译器当做一个黑盒了,希望这篇文章能对你有所帮助。
编辑:lyn

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编译器
    +关注

    关注

    1

    文章

    1672

    浏览量

    51903

原文标题:编译器是如何工作的

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    性能突破 | SpacemiT-X60 在 LLVM 编译器上实现 16% 显著提升

    2025年10月,在北美RISC-V峰会上,Igalia编译器工程师Mikhail发表专题演讲《Unlocking15%MorePerformance
    的头像 发表于 11-21 18:04 9104次阅读
    性能突破 | SpacemiT-X60 在 LLVM <b class='flag-5'>编译器</b>上实现 16% 显著提升

    开源鸿蒙技术大会2025丨编译器与编程语言分论坛:语言驱动系统创新,编译赋能生态繁荣

    在万物智联的时代背景下,操作系统底层能力的构建离不开编程语言与编译器的关键支撑。作为开源鸿蒙生态的核心技术,语言设计与编译器、虚拟机实现的进步直接关系到开发效率、运行性能与系统安全。本次分论坛聚焦
    的头像 发表于 11-20 17:24 1146次阅读
    开源鸿蒙技术大会2025丨<b class='flag-5'>编译器</b>与编程语言分论坛:语言驱动系统创新,<b class='flag-5'>编译</b>赋能生态繁荣

    飞凌嵌入式ElfBoard-Vim编辑之GCC编译器的安装

    GCC(GNU Compiler Collection)是由GNU开发的编程语言编译器,最初是作为GNU操作系统的编译器编写的。GCC是一个编译器套件,包含很多软件包,支持多种语言编译
    发表于 10-15 08:44

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译呢?

    GCC编译器,怎么才能实现c文件中未被调用的函数,不会被编译?有什么编译选项可以设置吗? 移植代码,有些函数没被调用的函数想留在代码里,但不想被编译
    发表于 09-28 12:25

    如何在Keil中将NuMicro BSP从Arm编译器5迁移到编译器6?

    在Keil中将NuMicro BSP从Arm编译器5迁移到编译器6!
    发表于 08-20 06:29

    进迭时空同构融合RISC-V AI CPU的Triton算子编译器实践

    Triton是由OpenAI开发的一个开源编程语言和编译器,旨在简化高性能GPU内核的编写。它提供了类似Python的语法,并通过高级抽象降低了GPU编程的复杂性,同时保持了高性能。目前
    的头像 发表于 07-15 09:04 2184次阅读
    进迭时空同构融合RISC-V AI CPU的Triton算子<b class='flag-5'>编译器</b>实践

    边缘设备AI部署:编译器如何实现轻量化与高性能?

    、ASIC等)上高效执行的机器代码。AI编译器在AI模型的部署和优化中扮演着关键角色,能够显著提升模型的运行效率和性能。   AI编译器的主要功能   AI编译器的主要功能包括模型优化
    的头像 发表于 07-06 05:49 6925次阅读

    编译器功能安全验证的关键要素

    在汽车、工业、医疗等安全关键型应用中,确保功能安全合规性需要严格的工具链验证。开发安全关键型软件的企业必须遵守ISO 26262、IEC 61508、ISO 62304等国际标准对编译器工具链进行全面的验证。
    的头像 发表于 07-05 13:37 1691次阅读

    兆松科技发布高性能RISC-V编译器ZCC 4.0.0版本

    近日,兆松科技(武汉)有限公司(以下简称“兆松科技”)宣布正式发布高性能 RISC-V 编译器 ZCC 4.0.0 版本。新版本在性能优化、厂商自定义指令支持和软件库等方面实现全面升级,并同步推出
    的头像 发表于 06-27 14:48 3746次阅读
    兆松科技发布高性能RISC-V<b class='flag-5'>编译器</b>ZCC 4.0.0版本

    stellar studio按照说明文档进行编译器环境配置,为什么会报错?

    已经是按照说明文档进行编译器环境配置,但是还是会报错,问题大概可能是文件系统操作错误,无法访问打开文件,看样子像系统问题,但是其他同学有和我系统版本号一样的也可以编译运行,具体错误点击也无法跳转到错误位置
    发表于 06-12 07:49

    兆松科技ZCC编译器全面支持芯来科技NA系列处理

    近日,兆松科技(武汉)有限公司(以下简称“兆松科技”)宣布正式发布高性能RISC-V编译器ZCC 4.0.0版本。
    的头像 发表于 06-11 09:56 1996次阅读

    RISC-V架构下的编译器自动向量化

    进迭时空专注于研发基于RISC-V的高性能新AICPU,对于充分发挥CPU核的性能而言,编译器是不可或缺的一环,而在AI时代,毫无疑问向量算力将发挥越来越重要的作用。进迭时空非常重视RISC-V
    的头像 发表于 06-06 16:59 1436次阅读
    RISC-V架构下的<b class='flag-5'>编译器</b>自动向量化

    【正点原子RK3506】安装交叉编译器、adb和编译运行SOEM控制EtherCAT IO从站

    】基于Buildroot系统_交叉编译器安装与使用参考手册V1.1》中的说明,安装相应的交叉编译器
    发表于 05-30 14:18

    RVCT编译器是否比GNU的编译器的代码执行速度更快?

    使用FX3S遇到了RVCT编译器的问题。 1、在SDK的release note中有支持RVCT的描述, 但是在EZ USB Suite的设置中没有找到RVCT的选项, 请问支持的具体版本
    发表于 05-08 07:49

    HighTec编译器全面支持芯驰科技车规MCU芯片E3650

    近日,HighTec与芯驰科技共同宣布HighTec编译器套件将全面支持芯驰新一代旗舰智控MCU-E3650芯片。此次合作,进一步丰富了芯驰车芯产品的工具链生态,双方将携手为客户提供高性能、高安全性的解决方案。
    的头像 发表于 04-28 15:20 1971次阅读