U1编译概述

2023-12-04 10:28
文章标签 编译 概述 u1

本文主要是介绍U1编译概述,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 基本概念
    • 定义
    • 一些概念
  • 编译流程
    • 词法分析
    • 语法分析
    • 语义分析、生成中间代码
      • 中间代码
    • 代码优化
    • 生成目标程序
    • 五个阶段中都需要做的两件事
      • 符号表管理
      • 出错处理
    • 总结
  • 其他概念
    • 多层中间表示和遍(PASS)
    • 三端模式
    • 课程概述

基本概念

定义

用高级语言编制的程序,计算机不能立即执行,必须通过一个“翻译程序”加工,转化为与其等价的机器语言程序,机器才能执行。 这种翻译程序,称之为“编译程序”
eg. *.c经过编译得到*.s(目标程序),最后经过汇编得到*.o,再通过链接器与其他*.o文件结合即可进行运算。

一些概念

  1. 源程序: 用汇编语言或高级语言编写的程序称为源程序。
  2. 目标程序:用目标语言所表示的程序。
  3. 目标语言:可以是介于源语言和机器语言之间的“中间语言”,可以是某种机器的机器语言,也可以是某机器的汇编语言。比如 m i p s , a r m mips,arm mips,arm
  4. 翻译程序:将源程序转换为目标程序的程序称为翻译程序。
    它是指各种语言的翻译器,包括汇编程序和编译程序,是汇编程序、编译程序以及各种变换程序的总称。
    在这里插入图片描述
  5. 汇编程序:若源程序用汇编语言书写,经过翻译程序得到用机器语言表示的程序,这时的翻译程序就称之为汇编程序,这种翻译过程称为“汇编”(Assemble)
  6. 编译程序,若源程序是用高级语言书写,经加工后得到目标程序,这种翻译过程称“编译”
    汇编程序与编译程序都是翻译程序,主要区别是加工对象的不同。由于汇编语言格式简单,常与机器语言之间有一一对应的关系,汇编程序所要做的翻译工作比编译程序简单得多。
    在这里插入图片描述
  7. 解释程序:对源程序进行解释执行的程序。
    在这里插入图片描述

编译流程

在这里插入图片描述

词法分析

分析和识别单词。
源程序是由字符序列构成的,词法分析扫描源程序(字符串),根据语言的词法规则分析并识别单词,并以某种编码形式输出。
单词:是语言的基本语法单位,一般语言有四大类单词
<1>语言定义的关键字或保留字(如BEGIN、END、IF)
<2>标识符
<3>常数
<4>分界符(运算 )

语法分析

根据语法规则(即语言的文法),分析并识别出各种语法成分,如表达式、各种说明、各种语句、 过程、函数等,并进行语法正确性检查。

语义分析、生成中间代码

任务:对识别出的各种语法成分进行语义分析, 并产生相应的中间代码。

中间代码

中间代码:一种介于源语言和目标语言之间的中间语言形式。目的是为了便于做优化处理,且便于编译程序的移植。
中间代码的形式:编译程序设计者可以自己设计,常用的有四元式、三元式、逆波兰表示等

代码优化

目的:为了得到高质量的目标程序。
前面的四元式中第一个四元式是计算常量表达式值,该值在编译时就可以算出并存放在工作单元中,不必生成目标指令来计算

生成目标程序

由中间代码很容易生成目标程序(地址指令序列)。这部分工作与机器关系密切 ,所以要根据机器进行。在做这部分工作时(要注意充分利用累加器),也可以进行优化处理

五个阶段中都需要做的两件事

符号表管理

在整个编译过程中始终都要贯穿着建表(填表)和查表的工作。即要及时地把源程序中的信息和编译过程中所产生的信息登记在表格中,而在随后的编译过程中同时又要不断地查找这些表格中的信息。

出错处理

规模较大的源程序难免有多种错误,编译程序必须要有出错处理的功能。即能诊察出错误,并能报告用户错误的性质和位置,以便用户修改源程序。出错处理能力的大小是衡量编译程序质量好坏的一个重要指标。

总结

在这里插入图片描述

其他概念

多层中间表示和遍(PASS)

遍:对源程序(包括源程序中间形式)从头到尾扫描一次,并做有关的加工处理 ,生成新的源程序中间形式或目标程序,通常称之为一遍。

三端模式

  1. 前端:通常将与源程序有关的编译部分称为前端。
    词法分析、语法分析、语义分析
  2. 中端:生成中间代码部分。中间代码生成、 代码优化
  3. 后端:与目标机有关的部分称为后端。 目标程序生成(与目标机有关的优化)
    在这里插入图片描述
    在这里插入图片描述

课程概述

在这里插入图片描述

这篇关于U1编译概述的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/453121

相关文章

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

Android NDK版本迭代与FFmpeg交叉编译完全指南

《AndroidNDK版本迭代与FFmpeg交叉编译完全指南》在Android开发中,使用NDK进行原生代码开发是一项常见需求,特别是当我们需要集成FFmpeg这样的多媒体处理库时,本文将深入分析A... 目录一、android NDK版本迭代分界线二、FFmpeg交叉编译关键注意事项三、完整编译脚本示例四

Python datetime 模块概述及应用场景

《Pythondatetime模块概述及应用场景》Python的datetime模块是标准库中用于处理日期和时间的核心模块,本文给大家介绍Pythondatetime模块概述及应用场景,感兴趣的朋... 目录一、python datetime 模块概述二、datetime 模块核心类解析三、日期时间格式化与

idea maven编译报错Java heap space的解决方法

《ideamaven编译报错Javaheapspace的解决方法》这篇文章主要为大家详细介绍了ideamaven编译报错Javaheapspace的相关解决方法,文中的示例代码讲解详细,感兴趣的... 目录1.增加 Maven 编译的堆内存2. 增加 IntelliJ IDEA 的堆内存3. 优化 Mave

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

关于最长递增子序列问题概述

《关于最长递增子序列问题概述》本文详细介绍了最长递增子序列问题的定义及两种优化解法:贪心+二分查找和动态规划+状态压缩,贪心+二分查找时间复杂度为O(nlogn),通过维护一个有序的“尾巴”数组来高效... 一、最长递增子序列问题概述1. 问题定义给定一个整数序列,例如 nums = [10, 9, 2

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时