程序解释与编译

▶1.程序的解释执行方式

程序语言强写的计策机指令序列称为“源程序”,计算机并不能直接执行用高级语言编写的源程序,源程序必须通过“翻译程序”翻译成机器指令的形式,计算机才能项别和执行。源程序的翻译有两种方式:解释执行和编译执行。不同的程序语言,有不同的翻译程序,这些翻译程序称为程序解释器(也称为虚拟机)或程序编译器(简称为编译器)。

1)程序的解释执行过程

解释程序的工作过程如下:首先,由语言解释器(如Python)进行初始化准备工作。然后语言解释器从源程序中读取一个语句(指令),并对指令进行语法检查,如果程序语法有错,则输出错误信息;否则,将源程序语句翻译成机器执行指令,并执行相应的机器操作。返回后检查解释工作是否完成,如果未完成,语言解释器继续解释下一语句,直至整个程序执行完成。否则,进行必要的善后处理工作。

语言解释器一般包含在开发软件或操作系统内,如IE浏览器带有.Net脚本语言解释功能;也有些语言解释器是独立的,如Python解释器就包含在Python软件包中。

2)解释程序的特点

解释程序的优点是实现简单,交互性较好。动态程序语言(如Python、PHP、JavaScript、R、MATLIB等)一般采用解释执行方式。
解释程序有以下缺点:一是程序运行效率低,如源程序中出现循环语句时,解释程序也要重复地解释并执行这一组语句;二是程序的独立性不强,不能在操作系统下直接运行,因为操作系统不一定提供这个语言的解释器;三是程序代码保密性不强,例如,要发布Python开发项目,实际上就是发布Python源代码。

▶2.程序的编译执行方式

程序员编写好源程序后,由编译器将源程序翻译成计算机可执行的机器代码。程序编译完成后就不再需要再次编译了,生成的机器代码可以反复执行。

源程序编译是一个复杂的过程,这一过程分为以下步骤:源程序→预处理→词法分析→语法分析→语义分析→生成中间代码→代码优化→生成目标程序→程序连接→生成可执行程序。事实上,某些步骤可能组合在一起进行。

在编译过程中,源程序的各种信息被保存在不同表格里,编译工作的各个阶段都涉及构造、查找或更新有关表格。如果编译过程中发现源程序有错误,编译器会报告错误的性质和发生错误的代码行,这些工作称为出错处理。

1)预处理

一个源程序有时可能分成几个模块存放在不同的文件里,预处理的工作之一是将这些源程序汇集到一起;其次,为了加快编译速度,编译器往往需要提前对一些头文件及程序代码进行预处理,以便在源程序正式编译时节省系统资源开销。例如,C语言的预处理包括文件合并、宏定义展开、文件包含、条件编译等内容。

2)词法分析

编译器的功能是解释程序文本的语义,不幸的是计算机很难理解文本,文本文件对计算机来说就是字节序列,为了理解文本的含义,就需要借助词法分析程序。词法分析是将源程序的字符序列转换为标记(Token)序列的过程。词法分析的过程是编译器一个字符一个字符地读取源程序,然后对源程序字符流进行扫描和分解,从而识别出一个个独立的单词或符号(分词)。在词法分析过程中,编译器还会对标记进行分类。
单词是程序语言的基本语法单位,一般有四类单词:一是语言定义的关键字或保留字(如if、for等);二是标识符(如x、i、list等);三是常量(如0、3.14159等);四是运算符和分界符(如十、一、*、/、=、;等)。如何进行“分词”是词法分析的重要工作。

3)语法分析

语法分析过程是把词法分析产生的单词,根据程序语言的语法规则,生成抽象语法树(AST),语法树是程序语句的树形结构表示,编译器将利用语法树进行语法规则分析。语法树的每一个节点都代表着程序代码中的一个语法结构,例如包、类型、标识符、表达式、运算符、返回值等。后续的工作是对抽象语法树进行分析。

符号表是由一组符号地址和符号信息构成的表格。符号表中登记的信息在编译的不同阶段都要用到。在语法分析中,符号表登记的内容将用于语法分析检查;在语义分析中,符号表所登记的内容将用于语义检查和产生中间代码;在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。

4)语义分析

语义分析是对源程序的上下文进行检查,审查有无语义错误。语义分析主要任务有静态语义审查、上下文相关性审查、类型匹配审查、数据类型转换、表达式常量折叠等。
源程序中有些语句按照语法规则判断是正确的,但是它不符合语义规则。例如,使用了没有声明的变量;或者对一个过程名赋值;或者调用函数时参数类型不合适;或者参加运算的两个变量类型不匹配等。当源程序不符合语言规范时,编译器会报告出错信息。
表达式常量折叠就是对常量表达式计算求值,并用求得的值来替换表达式,放入常量表。例如,s=1+2折叠之后为常量3,这也是一种编译优化。

5)生成中间代码

语义分析正确后,编译器会生成相应的中间代码。中间代码是一种介于源程序和目标代码之间的中间语言形式,它的目的是:便于后面做优化处理,便于程序的移植。中间代码常见形式有四元式、三元式、逆波兰表达式等。由中间代码很容易生成目标代码。

6)代码优化

代码优化的目的是为了得到高质量的目标程序。

7)生成目标程序

生成目标程序不仅与编译技术有关,而且与机器硬件结构关系密切。例如,充分利用机器的硬件资源,减少对内存的访问次数;根据机器硬件特点(如多核CPU)调整目标代码,提高执行效率。生成目标程序的过程实际上是把中间代码翻译成汇编指令的过程。

8)链接程序

目标程序还不能直接执行,因为程序中可能还有许多没有解决的问题。例如,源程序可能调用了某个库函数等。链接程序的主要工作就是将目标文件和函数库彼此连接,生成一个能够让操作系统执行的机器代码文件(软件)。

9)生成可执行程序(机器代码)

机器代码生成是编译过程的最后阶段。机器代码生成不仅仅需要将前面各个步骤所生成的信息(语法树、符号表、目标程序等)转化成机器代码写入到磁盘中,编译器还会进行少量的代码添加和转换工作。经过上述过程后,源程序最终转换成可执行文件了。

▶3.程序编译失败的主要原因

完美的程序不会一次就写成功,都需要经过反复修改、调试和编译。Google和香港科技大学的研究人员分析了Google工程师的2600万次编译,分析了编译失败的常见原因:一是编译失败率与编译次数、开发者经验无关;二是大约65%的Java编译错误与依赖有关,如编译器无法找到一个符号(占编译错误的43%),或者是包文件不存在;在C++编译中,53%的编译错误是使用了未声明的标识符和不存在的类变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/207379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网络编程基础api

1. IP 协议 1.1 IP 分片 (1)IP 分片和重组主要依靠 IP 头部三个字段:数据报标识、标志和片偏移 以太网帧的 MTU 是 1500 字节; 一个每个分片都有自己的 IP 头部,它们都具有相同的标识值,有不同的片偏移…

css 十字分割线(含四等分布局)

核心技术 伪类选择器含义li:nth-child(2)第2个 lili:nth-child(n)所有的lili:nth-child(2n)所有的第偶数个 lili:nth-child(2n1)所有的第奇数个 lili:nth-child(-n5)前5个 lili:nth-last-child(-n5)最后5个 lili:nth-child(7n)选中7的倍数 border-right: 3px solid white;borde…

EasyExcel-最简单的读写excel工具类

前言&#xff1a; easyExcel 的官网文档给的示例非常全&#xff0c;可以参考https://easyexcel.opensource.alibaba.com/docs/current/quickstart/read 在此我贴出自己的工具类&#xff0c;可以直接用 导包 <dependency><groupId>com.alibaba</groupId><…

机器学习第15天:GBDT模型

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 GBDT模型介绍 Boosting 残差 GBDT的缺点 python代码实现 代码 模型参数解释 结语 GBDT模型介绍 GBDT&#xff08;Gradient Boos…

vivado $clog2函数

对于.v文件在vivado中是不支持&#xff0c;但是可以修改为.sv或更改文件属性使用sytemverilog来支持。 /*** Math function: $clog2 as specified in Verilog-2005** clog2 0 for value 0* ceil(log2(value)) for value > 1** This implementatio…

php+mysql期末作业小项目

目录 1、登录界面 2、注册界面 3、主界面 4、学生表界面 5 、查询学生界面​编辑 6、修改学生信息界面​编辑 7、删除学生信息界面 8、添加学生信息界面 9、后台数据库​编辑 一个简单的php➕mysql项目学生信息管理系统&#xff0c;用于广大学子完成期末作业的参考&…

测试架构工程师需要具备哪些能力 ?

前言 相比于我们常见的研发架构师&#xff0c;测试架构师是近几年才出现的一个岗位&#xff0c;当然岗位title其实没有特殊的含义&#xff0c;在我看来测试架构师其实更像对某一类人的抽象称呼和对其复合能力的期待及认可。 在聊这篇文章的主题之前&#xff0c;先来看这样一个…

算法训练营Day4(链表)

语言 采用的Java语言&#xff0c;一些分析也是用于Java&#xff0c;请注意。 24. 两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 解题 这道题就是考验链表的基础操作&#xff0c;但是有个语言方面的知识需要去掌握&#xff0c;就是|…

TCP通信

第二十一章 网络通信 本章节主要讲解的是TCP和UDP两种通信方式它们都有着自己的优点和缺点 这两种通讯方式不通的地方就是TCP是一对一通信 UDP是一对多的通信方式 接下来会一一讲解 TCP通信 TCP通信方式呢 主要的通讯方式是一对一的通讯方式&#xff0c;也有着优点和缺点…

如何在Android平板上远程连接Ubuntu服务器使用code-server代码开发

目录 1.ubuntu本地安装code-server 2. 安装cpolar内网穿透 3. 创建隧道映射本地端口 4. 安卓平板测试访问 5.固定域名公网地址 6.结语 1.ubuntu本地安装code-server 准备一台虚拟机,Ubuntu或者centos都可以&#xff0c;这里以VMwhere ubuntu系统为例 下载code server服务…

el-table 表格多选(后端接口搜索分页)实现已选中的记忆功能。实现表格数据和已选数据(前端分页)动态同步更新。

实现效果&#xff1a;&#xff08;可拉代码下来看&#xff1a;vue-demo: vueDemo&#xff09; 左侧表格为点击查询调用接口查询出来的数据&#xff0c;右侧表格为左侧表格所有选择的数据&#xff0c;由前端实现分页。 两个el-table勾选数据联动更新 实现逻辑&#xff1a; el-…

低代码开发到底是补品还是垃圾食品?

2023&#xff0c;低代码彻底火了&#xff0c;甚至火到没有点相关经验&#xff0c;都不好意思出去面试的程度。 从业者对低代码的发展充满了想象&#xff0c;都认为未来低代码的商业价值不可估量。 据Gartner的最新报告显示&#xff0c;2023年全球低代码开发技术市场规模预计将…

内部文件上传以及渲染-接口API

文件上传 地址http://172.16.0.118:8090/api/pm/base/affix/upload请求类型POSTContent-Type:text/plain;charsetutf-8参数 prjData {"prjId":"", "jobId":"3031b2c8-c809-4110-8e88-22c80a9c1ec0721aca89-96a1-4346-9b6e-022331d221d1Nec…

【EMNLP 2023】面向Stable Diffusion的自动Prompt工程算法BeautifulPrompt

近日&#xff0c;阿里云人工智能平台PAI与华南理工大学朱金辉教授团队合作在自然语言处理顶级会议EMNLP2023上发表了BeautifulPrompt的深度生成模型&#xff0c;可以从简单的图片描述中生成高质量的提示词&#xff0c;从而使文生图模型能够生成更美观的图像。BeautifulPrompt通…

【MATLAB】MODWT分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 MODWT分解FFTHHT组合算法是一种综合性的信号处理方法&#xff0c;它结合了经验小波变换&#xff08;Empirical Wavelet Transform&#xff0c;EWT&#xff09;、快速傅里叶变换&#xff…

25.Oracle的回收站

oracle基础系统学习目录 01.CentOS7静默安装oracle11g 02.Oracle的启动过程 03.从简单的sql开始 04.Oracle的体系架构 05.Oracle数据库对象 06.Oracle数据备份与恢复 07.用户和权限管理 08.Oracle的表 09.Oracle表的分区 10.Oracle的同义词与序列 11.Oracle的视图 12.Oracle的…

爱智EdgerOS之深入解析如何应用爱智的视频流模块完成拉流

一、ONVIF 规范和常见视频流传输协议 ① ONVIF 规范 随着视频监控产业链的成熟&#xff0c;市面上陆陆续续出现了各式各样的网络摄像设备&#xff0c;这些设备都需要通讯协议才能进行数据传输。早期厂商都采用私有协议&#xff0c;但是现在厂商分工明确&#xff0c;有的负责生…

程序员的技术成长攻略

推荐语&#xff1a;偶尔在公众号看到的一篇文章&#xff0c;写的非常好&#xff0c;在此分享给各位程序员兄弟&#xff0c;不光是对技术成长有帮助&#xff0c;其他领域也是同样适用的&#xff01;建议反复阅读&#xff0c;形成一套自己的技术成长策略。 原文地址&#xff1a;…

数据结构与算法:python栈和队列的用法

python的栈和队列其实都算作一个数组&#xff0c;栈从最后一个元素开始推出&#xff0c;队列从第一个元素开始推出 # pop(0)删除时间复杂度O(n) s [] #栈 q [] #队列 s.append(1)#1入栈 q.append(1)#1入队 s.pop()#出栈 q.pop(0)#出队由于从第一个元素删除需要挪动数组&…

【EI会议征稿】2024年粤港澳大湾区数字经济与人工智能国际学术会议(DEAI2024)

2024年粤港澳大湾区数字经济与人工智能国际学术会议(DEAI2024) 2024 Guangdong-Hong Kong-Macao Greater Bay Area International Conference on Digital Economy and Artificial Intelligence(DEAI2024) 2024年粤港澳大湾区数字经济与人工智能国际学术会议(DEAI2024)由广东科…