编译程序原理VS解释程序原理

简介: 编译程序原理VS解释程序原理

引言


在备战软考的过程中在复习程序设计语言的时候遇到这么一个考点——解释和编译的原理,并且在做真题的过程中频繁的考查两者的区别,由于复习的不是很到位所以导致丢分,所以小编又重新复习这一块的知识,现在将两者的区别总结出来和大家分享。


一、编译程序原理


首先让大家看一张来自百度百科上面的编译工作阶段的示意图


20151028164938364.jpg


这张图看起来不是很爽因为图比较小并且比较乱,所以我就给大家简化了一下,大致的描述了编译阶段的工作流程,如下图:


20151029201039626.png



1、词法分析


源程序可以简单的被看成一个多行的字符串,词法分析阶段是编译过程中的第一个阶段,这个阶段的任务是对源程序从前到后(从左到右)诸葛字符的扫描,符号是程序设计语言的基本语法单位,如关键字,标识符,常数、运算符等,词法分析过程一句的是语言的词法规则,即描述“单词”结构的规则。


  2、语法分析


语法分析的任务是在词法分析的基础上,根据语言的语法规则将单词符号序列分解成各类语法单位,语法规则就是各类语法单位的构成规则。通过语法分析确定整个输入串是否构成一个语法上正确的程序。词法和语法分析的本质都是对源程序的结构进行分析


  3、语义分析


语义分析阶段分析个语法结构的含义,检查源程序是否包含静态语义错误,并收集类型信息供后面的代码生成阶段使用。只有语法和语意都正确的源程序才能翻译成正确的目标代码。语义分析的一个主要工作是进行类型分析和检查。程序设计语言中的一个数据类型一般包含两个方面的内容:类型的载体极其上的运算。


  4、中间代码生成


中间代码生成阶段的工作室根据语义分析的输出生成中间代码。“中间代码“是一种简单且含义明确的记号系统,可以有若干中形式,他们的共同特征是于具体的机器无关,最常用的一种中间代码是汇编语言指令非常的相似的三地址码。


5、代码优化


由于编译器将源程序翻译成中间代码的工作室机械的,按固定模式进行的,因此生成的中间代码往往在时间上和空间上有较大的浪费,当需要生成高效的目标代码时,必须进行优化。优化过程可以在中间代码生成阶段进行,也可以在目标代码生成阶段。


  6、目标代码生成


目标代码生成是编译器工作的最后一个阶段,这一阶段的任务是把中间代码变换成特定机器上的绝对指令代码,可重定位的指令代码或汇编指令代码,这个阶段的工作与具体的极其密切相关。


二、解释程序原理


解释程序原理是另一种语言处理程序,在词法、语法、语义分析方面与编译程序原理基本相同,但是在运行用户程序时,它直接执行源程序或源程序的中间表示形式。因此,解释程序不产生源程序的目标程序,这是它和编译程序的主要区别。


简单的说解释程序是高级语言翻译程序的一种,它将源语言书写的源程序作为输入,解释一句就提交计算机执行语句,并不形成目标程序。就像外语翻译中的“口译”一样,不产生 全文的翻译文本。


解释程序也可以将源程序翻译成某种中间代码形式,然后对中间代码进行解释来实现用户程序 的运行,这样翻译方式如图所示,通常,在中间代码和高级语言的语句存在一一对应的关系。解释方式B和C的不同之处在于中间代码的级别,在方式C下,解释程序采用的中间代码更接近于机器语言,在这种实现方案中,高级语言和低级中间代码间存在1-n的对应关系,它在词法分析、语法分析、语义分析基础之上,先将源程序翻译成中间代码,再由一个非常简单的解释程序来解释执行这种中间代码,这类系统具有更好的移植性。


解释 VS 编译


两者在在词法、语法、语义分析方面相同,但是解释程序没有目标代码的生成,并且在执行过程中与源代码有非常大的联系,而编译程序的运行时与源程序没有关系。常见考点


  1、两者的区别?


  2、编译过程中那些步骤是必须有的,那些步骤是可以省略的?


  3、有限自动机的出现是用在编译过程的那个阶段?


  4、程序中的某类错误,在编译的那个阶段能检查出来?


  5、。。。。。。。


小结


这两个概念在软考过程中是非常关键的,并且是个易混的知识点,当我们遇到这样的知识点的时候我们就需要好好的总结了,当我们总结过一遍的时候回对这两个知识点非常的熟悉,这样我们就能很轻松的分辨他们,所以说总结是非常关键的!!

目录
相关文章
|
人工智能 机器人 测试技术
使用LM Studio在本地运行LLM完整教程
GPT-4被普遍认为是最好的生成式AI聊天机器人,但开源模型一直在变得越来越好,并且通过微调在某些特定领域是可以超过GPT4的。
6394 1
|
人工智能 安全 数据挖掘
计算机在石油化工领域的应用
计算机在石油化工领域的应用
|
测试技术 数据安全/隐私保护 索引
基于 SpringBoot+Vue+MySql+Java 的大学生体质测试管理系统,附源码(二)
基于 SpringBoot+Vue+MySql+Java 的大学生体质测试管理系统,附源码
|
Unix Shell 数据处理
怎样使用Cython提升Python的性能
**Cython是Python的性能增强工具,用于提升Python代码的速度。它允许声明变量类型并调用C库。安装Cython使用`pip install Cython`。Cython语法接近Python,但通过类型声明优化性能。编译Cython代码需创建setup.py文件,然后运行`python setup.py build_ext --inplace`。通过Cython,可以直接优化Python代码和调用C函数,平衡速度与灵活性。**
400 2
|
存储 缓存 NoSQL
redis缓存优化
采用获取一次缓存,如果为空的情况,获取分布式锁,让一个线程去重建缓存,另外的线程未获取到锁的情况,休眠短时间,然后再自旋获取缓存。
210 0
|
传感器 边缘计算 物联网
基于边缘计算的智能物联网:未来趋势与挑战
感谢您阅读本文!如果您对基于边缘计算的智能物联网、相关技术或未来发展有任何疑问或想法,请在评论区与我交流。让我们一起探索边缘计算如何为智能物联网带来更多的创新和机遇!
989 1
|
开发工具 git 开发者
关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
本文通过具体操作和截图,详细讲解了如何在Git中解决分支冲突问题,包括如何识别冲突、手动解决冲突代码、提交合并后的代码,以及推送到远程分支。
3148 3
关于git 解决分支冲突问题(具体操作,包含截图,教你一步一步解决冲突问题)
|
消息中间件 存储 网络协议
即时通讯需要用到哪些技术手段?
该文探讨了即时通讯技术,涉及网络协议(TCP/IP、UDP、HTTP/HTTPS)在IM中的应用,数据传输与同步(消息队列、长轮询、WebSocket、数据同步)技术,安全性保障(加密、认证授权、防止攻击)措施,以及多媒体处理(音频、视频处理和实时传输)和用户界面交互设计的重要性。文章旨在帮助读者理解并应用相关技术。
1163 1
|
存储 缓存 JSON
详解HTTP四种请求:POST、GET、DELETE、PUT
【4月更文挑战第3天】
70320 5
详解HTTP四种请求:POST、GET、DELETE、PUT
|
SQL Java 数据库连接
JDBC实现java数据库连接(附完整例子+超详细注解)
JDBC实现java数据库连接(附完整例子+超详细注解)
4315 0