笔记 | 编译原理L1

重点关注过程式程序设计语言编译程序的构造原理和技术

1 程序设计语言

1.1 依据不同范型

过程式(Procedural programming languages–imperative)函数式(Functional programming languages–declarative)逻辑式(Logical programming languages–declarative)对象式(Object-oriented programming languages)
程序中指明如何完成一个计算任务程序中指明要进行哪些计算事实+推理规则支持面向对象编程
FORTRAN, PASCAL, CLISP, HASKELL, ML, OCAML, SCALA…PROLOGSmalltalk, Java, C++, Eiffel, Ruby
说明式语言(Declarative programming): 与上述命令式(Imperative language) 不同,没有控制结构,甚至没有赋值,仅有问题说明,或者 说纯数学定义

1.2 依据不同转化方式

编译型语言解释型语言混合型语言
需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言。一般需经过编译(compile)、链接(linker)这两个步骤。编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件。不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。比如C#,C#在编译的时候不是直接编译成机器码而是中间码,.NET平台提供了中间语言运行库运行中间码,中间语言运行库类似于Java虚拟机。.net在编译成IL代码后,保存在dll中,首次运行时由JIT在编译成机器码缓存在内存中,下次直接执行(博友回复指出)。
优点:编译器一般会有预编译的过程对代码进行优化。因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高。可以脱离语言环境独立运行。优点:有良好的平台兼容性,在任何环境中都可以运行,前提是安装了解释器(虚拟机)。灵活,修改代码的时候直接修改就可以,可以快速部署,不用停机维护。
缺点:编译之后如果需要修改就需要整个模块重新编译。编译的时候根据对应的运行环境生成机器码,不同的操作系统之间移植就会有问题,需要根据运行的操作系统环境编译不同的可执行文件。缺点:每次运行的时候都要解释一遍,性能上不如编译型语言。
代表语言:C、C++、Pascal、swift代表语言:JavaScript、Python、Erlang、PHP、Perl、RubyJava先生成字节码再在Java虚拟机中解释执行。

不同的程序设计语言机制(函数式、过程式、逻辑式、对象式),需要采用不同的技术编写编译程序,过程式语言的编译是对象式语言编译的基础

1.3 另一种角度

动态类型语言(Dynamically Typed Language)静态类型语言(Statically Typed)强类型定义语言(Explicit type)弱类型定义语言(Implicit type)
编译时不知道变量类型,运行时才决定,类型错误属于运行错误,运行时报错编译时候决定变量,类型错误属于语法错误,编译器报错偏向于不容忍隐式类型转换偏向于容忍隐式类型转换

image.png

2 编译器概述

编译器(Compiler) 将某种语言(源语言)编写的程序翻译成语义等价的另一种语言(目标语言)编写的程序

image.png|700

依据目标程序的类型:

目标程序若是可执行的机器语言程序目标程序若是汇编语言的程序
可以被用户调用,处理输入并产生输出。image.png
则须经汇编器汇编后方可执行

编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

2.1 编译器的翻译包括哪些步骤

  1. 阅读并理解程序
  2. 准确地确定需要采取什么行动
  3. 弄清楚如何忠实地执行这些行动
  4. 指示计算机执行这些步骤

[[编译器概述.excalidraw|示例图]]
image.png

2.2 编译程序的伙伴程序

编辑器 (editor)预处理器(preprocessor)汇编程序(assembler)连接程序(linker)装入程序(loader)
除一般的文本编辑功能外,还可以对正在编辑的文本进行分析、提示、自动提供关键字匹配等功能;删除源程序中的注释、执行宏替换以及包含文件的嵌入等将编译程序生成的汇编代码汇编成机器代码将不同的目标文件连接到一个可执行的文件中将程序加载到内存中以便执行
image.png

3 编译器的组成

3.1 自然语言翻译过程总结

掌握源语言和目标语言:词法、语法和语义, 翻译过程包括:

分析源句子是否正确将句子翻译成目标语言
拼写,包括识别单词及其属性,依据源语言的语法建立语法结构,检查句子是否有意义翻译每个语法部分,将其组合成有意义的目标语言句子

3.2 编译器组成模块

image.png

[!Note]- 分析部分

  1. 源程序 - 语法结构 - 中间表示
  2. 搜集源程序中的相关信息,放入符号表
  3. 分析、定位程序中可能存在的错误信息(语法、语义错误)
  4. 又称编译器的前端(front end),是于机器无关的部分
符号表管理词法分析/扫描(lexical analysis, scanning)语法分析语义分析
记录源程序中使用的变量的名字,收集各种属性(名字的存储分配,类型,作用域,过程名字的参数数量、参数类型等等)1.读入源程序的字符流,输出有意义的词素(lexeme)。基于词素,产生词法单元token: <token-name, attribute-value>
2.关于token:程序语言处理的最小单位,token-name由语法分析步骤使用,attribute-value指向相应的符号表条目,由语义分析/代码生成步骤使用
1.词法分析后,需要得到词素序列的语法结构
2.语法分析/解析(syntax analysis/parsing):sentence是对单词的再次重组,程序设计语言规定了词法单元、语句的重组规则 — >语句的类别.
使用语法树和符号表中的信息,检查源程序是否满足语言定义的语义约束。同时收集类型信息,用于代码生成。类型检查,类型转换。
符号表可由编译器的各个步骤使用程序语言规定了单词构成的规则和单词类别image.png
根据各个词法单元的第一个分量来创建树形中间表示形式。通常是语法树(syntax tree/parse tree),指出了词法单元流的语法结构image.png


[!Note]- 合成部分

  1. 根据符号表和中间表示构造目标程序
  2. 又称编译器的后端(back end),是于机器相关的部分
中间代码生成代码优化目标代码生成
根据语义分析的输出,生成类机器语言的中间表示通过对中间代码的分析,改进中间代码,得到更好的目标代码(快、短、能耗低把中间表示形式映射到目标语言:(寄存器的分配,指令选择,内存分配)
三地址代码:每个指令最多包含三个运算分量image.png
优化有具体的设计目标image.png
image.png

3.3 编译器的趟(Pass)

趟(Pass):以文件为输入输出单位的编译过程的个数,每趟可由一个或若干个步骤构成。就是对源程序或源程序的中间表示形式从头到尾扫描一次,并作加工处理,生成新的中间结果或目标程序。

  • 可以词法分析、语法分析、语义分析等阶段各作为单独一趟
  • 也可以词法分析作为语法分析的子程序
  • 还可以整个编译程序一遍扫描完成

与编译器组成模块的关系:前者作为“步骤”是逻辑组织方式,“趟”和具体的实现相关

4 解释器

  1. 定义:解释器(Interpreter):解释器直接利用用户提供的输入执行源程序中指定的操作。
  2. 解释过程中若发现错误,则返回修改源程序,修改后重新解释执行。
  3. 解释器与编译器的区别理解:解释器可以直接输出结果,而编译器最终的输出是一个目标程序,是把一种程序设计语言翻译成另外一种语言,编译器的重要任务之一是报告它在翻译过程中发现的源程序中的错误。

4.1 解释器与编译器的比较

image.png

二者比较:

相同点区别
使用相同的实现技术实现机制: 翻译 (程序 to 程序)vs. 解释(指令 to 指令序列)

二者特点:

解释器编译器
可移植性好,支持交互式程序设计,边解释,边执行,错误诊断效果好效率高,一次编译,多次运行,存储代价小,目标程序的执行速度比解释器快很多

二者结合的一种应用:Java

  1. javac 前端编译器:先编译成字节码(bytecode, .class文件)
  2. 由JVM解释执行,可移植性好
  3. JIT即时编译器(just-in-time compiling)
  4. image.png
  5. 为了提高热点代码的执行效率,在运行时虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各层次的优化(判断热点代码的方法:基于采样的热点探测;基于计数器的热点探测)

5 构建(Build),构建工具(Make)与编译的关系

  • 代码变成可执行文件,叫做编译(compile)
  • 安排编译的顺序,叫做构建(build)
  • Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目,实际上任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建,构建规则都写在Makefile, “make [选项][参数]”

6 编译器的实现

编译器的开发代价是非常昂贵的,在可能的情况下,可以将一种语言的程序转换成另一种语言的程序,利用另一种语言的编译器进行编译。

前提条件:两种语言在语法和语义上很近似,或者一种语言是另一种语言的扩展;实例:C++ —> C

image.png

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

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

相关文章

C语言——顺序表

文章目录 一、线性表二、顺序表顺序表和数组的区别顺序表的分类1.静态顺序表2.动态顺序表 三、动态顺序表的实现1.动态顺序表头文件2.动态顺序表源文件3.测试源文件 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种…

在Excel中把打印内容打印在一页上的5种方法,总有一种适合你

序言 如果你经常通过在Microsoft Excel中打印不必要的单元格区域而用完打印机纸张,那么可以按照本Excel教程中提到的经过尝试和测试的方法,学习如何在一页上打印Excel工作表。 由于Excel工作表不像Microsoft Word那样显示单页布局,因此在打印这些电子表格时,你经常会感到…

HBuilder开发者必备!Windows上传IPA文件的软件分享

摘要&#xff1a;HBuilder是目前市场上最受欢迎的移动应用开发框架&#xff0c;但是我们很多人在使用的时候&#xff0c;由于没有mac电脑&#xff0c;无法使用xcode或者application loader上传ipa文件到App Store。本篇博客介绍了一种通过网页平台上传ipa文件的方法&#xff0c…

蓝桥杯 经验技巧篇

1. 注意事项 &#x1f468;‍&#x1f3eb; 官方通知 &#x1f468;‍&#x1f3eb; 资料文档 时间&#xff1a;4月13日 9:00~13:00 &#xff08;时长 4小时&#xff09;物品 准考证&#xff08;赛前一周开放下载&#xff0c;自行打印&#xff09;学生证身份证笔、水、外套&a…

Java学习之原子性操作(Atomic)

CAS&#xff08;compare and swap&#xff09;&#xff1a; public static void main(String[] args) throws InterruptedException {// AtomicInteger是一个提供原子操作的Integer类&#xff0c;通过CAS思想实现AtomicInteger a new AtomicInteger(0);System.out.println(a.…

KnowLog:基于知识增强的日志预训练语言模型|顶会ICSE 2024论文

徐波 东华大学副教授 东华大学计算机学院信息技术系副系主任&#xff0c;复旦大学知识工场实验室副主任&#xff0c;智能运维方向负责人。入选“上海市青年科技英才扬帆计划”。研究成果发表在IJCAI、ICDE、ICSE、ISSRE、ICWS、CIKM、COLING等国际会议上&#xff0c;曾获中国数…

MySQL的基本查询

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;MySQL &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 本博客主要内容介绍了mysql的基本查询部分的知识&#xff0c;包括Crea…

记录一次官网访问很慢的情况

客户查看云监控,带宽未超限,客户取的是1分钟的原生值,也就是1分钟也是个平均值。 但是客户的原始值&#xff0c;其实就是1分钟内的平均值。所以客户的瞬时超限&#xff0c;其实是看不出来的。但是后端同事从实时监控里面可以看到超限的情况。 客户升带宽后&#xff0c; 发现还…

【InternLM 实战营第二期笔记】使用茴香豆搭建你的RAG智能助理

RAG RAG是什么 RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;通过检索与用户输入相关的信息片段&#xff0c;并结合外部知识库来生成更准确、更丰富的回答。解决 LLMs 在处理知识密集型任务时可能遇到的挑战, 如幻觉、知识过时和缺乏透明、可追…

全面的Docker快速入门教程(详细)

前言&#xff1a; 都2024年了&#xff0c;你还在为了安装一个开发或者部署环境、软件而花费半天的时间吗&#xff1f;你还在解决开发环境能够正常访问&#xff0c;而发布测试环境无法正常访问的问题吗&#xff1f;你还在为持续集成和持续交付&#xff08;CI / CD&#xff09;工…

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/inception-v1

1.8.3 卷积神经网络近年来在结构设计上的主要发展和变迁——GoogleNet/ inception-v1 前情回顾&#xff1a; 1.8.1 卷积神经网络近年来在结构设计上的主要发展和变迁——AlexNet 1.8.2 卷积神经网络近年来在结构设计上的主要发展和变迁——VGGNet GoogleNet问题 在VGGNet简单堆…

【超简单】基于PaddleSpeech搭建个人语音听写服务

一、【超简单】之基于PaddleSpeech搭建个人语音听写服务 1.需求分析 亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?亲们,你们要写会议纪要嘛?当您面对成吨的会议录音,着急写会议纪要而不得不愚公移山、人海战术?听的头晕眼花,听的漏洞百出,听的怀疑人生,那么你…

软件测试_黑盒测试_等价类划分法

黑盒测试 等价类划分法 等价类划分法 一个程序可以有多个输入&#xff0c;等价类划分就是将这些输入数据按照输入需求进行分类&#xff0c;将它们划分为若干个子集&#xff0c;这些子集即为等价类&#xff0c;在每个等价类中选择有代表性的数据设计测试用例。 有效等价类&a…

安全威胁情报的漏洞挖掘

前段时间edu上出现了两个网安总队收取安全情报&#xff0c;不收漏洞&#xff0c;下面简单分析一下如何挖掘安全情报。 在发现在edu中新增了两个网安总队收安全情报等漏洞&#xff0c;那威胁情报又会包含哪些内容呢&#xff1f;以前或许会看到各种ss网站、bc网站、yx网站满天飞&…

网络原理(6)——IP协议

目录 一、网段划分 现在的网络划分&#xff1a; 1、一般情况下的家庭网络环境 2、IP地址 3、子网掩码 4、网关 以前的网络划分&#xff1a; 二、特殊IP 1、环回 IP 2、主机号为全 0 的IP 3、广播地址IP 三、路由选择&#xff08;路线规划&#xff09; 一、网段划分…

JavaScript(二)-Web APIS

文章目录 Web API 基本认知作用和分类什么是DOMDOM树DOM对象获取DOM对象操作元素内容操作元素属性操作元素常用属性操作元素样式属性自定义属性 定时器-间歇函数定时器函数的理解定时器函数使用间歇函数 事件监听与绑定事件监听事件监听版本事件类型事件对象什么是事件对象获取…

国债逆回购如何收费,现在最低的佣金可以做到多少?

国债逆回购是投资者在持有国债的情况下将其出售给金融机构&#xff0c;同时与该机构约定在未来的一定期限内回购国债。对于投资者来说&#xff0c;国债逆回购是一种获取流动资金的方式&#xff0c;同时也可以获得一定的收益。然而&#xff0c;国债逆回购费用对于投资者而言可能…

《Market Insight:中国流程挖掘市场发展洞察(2023)》报告将于4月11日发布

流程挖掘市场虽然项目数量有所增加&#xff0c;但目前的中国市场依旧处于早期阶段。而伴随着生成式AI技术的发展&#xff0c;流程挖掘市场又将迎来的新的变革和机遇&#xff0c;RPA中国在调研中发现&#xff0c;诸多技术供应商在努力地拥抱生成式AI&#xff0c;以便于提升自身产…

微信开发工具——进行网页授权

微信开发工具——进行网页授权 微信公众平台设置 1.在首页创建好自己的订阅号 网站&#xff1a;https://mp.weixin.qq.com/ 点击立即注册,在选择订阅号&#xff08;个人创建使用&#xff09; 之后按流程填写后&#xff0c;点击设置与开发-------->基本配置&#xff0c;这…

基于DCT和扩频的音频水印嵌入提取算法matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ......................................................................... N 10; %嵌入一…