📝 编译器设计教程

153篇技术文档
  加载时间和执行时间地址绑定之间的区别

📅  最后修改于: 2021-06-28 06:56:41        🧑  作者: Mango

先决条件–地址绑定方法地址绑定是程序指令和数据与实际物理内存位置的关联。操作系统中有多种类型的地址绑定。地址绑定有3种类型:编译时地址绑定加载时间地址绑定执行时间地址绑定在这里,我们比较加载时间和执行时间地址绑定,如下所示。加载时间地址绑定:在将程序加载到内存后,将完成这种地址绑定。加载时间地址绑定将通过操作内存管理器来完成。执行时间或动态地址绑定:即使将程序加载到内存中,地址绑定也将被推迟。程序...

  循环优化技术|套装2

📅  最后修改于: 2021-06-28 06:57:04        🧑  作者: Mango

前提条件–循环优化|套装11. Loop Fission:改善参考的位置–在这种情况下,一个循环在相同的索引范围内分为多个循环,但是每个新循环仅包含原始循环主体的特定部分。这可以改善参考的局部性。优化前:优化后:2.循环交换:提高引用的局部性–在这些优化中,将内部循环与外部循环交换。当循环变量索引到数组中时,这种转换可以改善引用的局部性,具体取决于数组的布局。优化前:优化后:3.循环反转–反转将值...

  编译器和汇编器之间的区别

📅  最后修改于: 2021-06-28 06:57:30        🧑  作者: Mango

先决条件–语言处理器:汇编器,编译器和解释器编译器:编译器主要用于将源代码从高级编程语言转换为机器级语言以创建可执行程序的程序。编译器会将整个程序视为一个完整的代码,然后进行翻译。编译器的主要工作是检查各种限制,范围,错误等。在编译器可以成功执行代码之前,必须从源代码中删除错误。编译语言的示例是C,C++, Java,C#等。汇编器:汇编器将汇编代码作为输入,并将其转换为可重定位的机器代码。汇编程...

  Yacc程序,用于计算给定的算术表达式

📅  最后修改于: 2021-06-28 06:57:53        🧑  作者: Mango

先决条件– YACC简介问题:编写一个YACC程序来计算一个给定的算术表达式,该表达式由“ +”,“-”,“ *”,“ /”(包括方括号)组成。例子:词法分析器源代码:CC解析器源代码:C输出:笔记:通常将Yacc程序编写在2个文件中,一个用于扩展名为.l的lex(用于令牌化,并将令牌发送到yacc),另一个用于扩展名为.y的yacc(用于语法评估和结果评估)。执行Yacc程序的步骤:...

  自上而下的解析器的工作

📅  最后修改于: 2021-06-28 06:58:14        🧑  作者: Mango

在本文中,我们将介绍自上而下的解析器的工作,并了解如何获取输入并对其进行解析,以及自上而下的一些基础知识。前提条件–解析自上而下的解析器:在自上而下的技术中,从顶部解析树结构,并且输入将从左至右读取。在自上而下,自上而下的解析器中,它将从符号开始到字符串。遵循最左边的推导。在自上而下的解析器中,自上而下的解析器的困难在于,如果变量包含多个可能性,则选择1很难。自上而下的解析器的工作:让我们考虑一个...

  Lex程序对小于10且大于5的单词进行计数

📅  最后修改于: 2021-06-28 06:58:33        🧑  作者: Mango

问题:编写一个Lex程序以计算小于10且大于5的单词。解释:Lex是一个生成词法分析器的计算机程序。 Lex读取指定词法分析器的输入流,并输出以C编程语言实现词法分析器的源代码。用于执行lex程序的命令为:让我们看一下Lex程序对小于10且大于5的单词进行计数。例子:下面是实现:输出:...

  目标代码在编译器设计中的介绍

📅  最后修改于: 2021-06-28 06:59:01        🧑  作者: Mango

假设您有一个ac程序,然后将C程序交给编译器,编译器将以汇编代码生成输出。现在,该汇编语言代码将提供给汇编器,而汇编器将为您生成一些代码。这就是所谓的目标代码。但是,当您编译程序时,您将不会同时使用编译器和汇编器,只需将程序提交给编译器,编译器就会为您提供直接可执行的代码。编译器实际上是与装载器和链接器一起组合在汇编器中的,因此所有模块都保存在编译器软件本身中。因此,当您调用gcc时,实际上并不仅...

  需要中间代码和代码优化

📅  最后修改于: 2021-06-28 06:59:24        🧑  作者: Mango

中级代码:中间代码是与机器无关的代码,但它们与机器指令很接近。语法树,后缀表示法,3地址代码,DAG可用作中间语言。需要中间代码:假设我们有x个源语言和y个目标语言:如果没有ICG,我们必须将每种源语言直接更改为目标语言,因此,对于每个源-目标对,我们将需要一个编译器。因此,我们需要(x * y)个编译器,这可能是一个非常大的数目,而且从字面上看不可能的。使用ICG –我们只需要x个编译器就可以将...

  自底向上或Shift减少解析器|套装2

📅  最后修改于: 2021-06-28 06:59:56        🧑  作者: Mango

在本文中,我们将讨论自下而上的解析器。自下而上的解析器/ Shift减少解析器从叶子到根构建解析树。自下而上的解析可以定义为通过反向搜索w的最右派生来将输入字符串w简化为语法的开始符号的尝试。例如。自底向上解析器的分类一般的移位减少解析是LR解析。 L代表从左到右扫描输入,R代表反向构造最右边的导数。LR解析的好处:许多编程语言使用LR解析器的某些变体。应该注意的是,C++和Perl是它的例外。L...

  语法定向翻译中的S –属性和L –属性SDT

📅  最后修改于: 2021-06-28 07:00:17        🧑  作者: Mango

在介绍S属性和L属性SDT之前,这里是Synthesized或Inherited属性的简要介绍。属性类型–属性可能有两种类型-合成的或继承的。综合属性–合成属性是产品左侧非终端的属性。合成的属性表示在解析树上传递的信息。该属性只能从其子级获得价值(产品RHS中的变量)。例如。假设A-> BC是语法的产物,并且A的属性取决于B的属性或C的属性,那么它将被合成。继承的属性–生产右侧的非终结符的属性称为...

  GCC和G ++之间的区别

📅  最后修改于: 2021-06-28 07:00:36        🧑  作者: Mango

GCC代表GNU编译器集合,主要用于编译C和C++语言。它也可以用来编译Objective C和Objective C++。编译源代码文件时,最重要的选项是源程序的名称,其余每个参数都是可选的,例如警告,调试,链接库,目标文件等。GCC命令的不同选项允许用户停止编译过程处于不同阶段。g ++命令是GNU C++编译器调用命令,用于对源代码进行预处理,编译,汇编和链接以生成可执行文件。 g ++命令...

  编译器简介

📅  最后修改于: 2021-06-28 07:00:56        🧑  作者: Mango

编译器是一种通常采用高级语言(如C++和Java)代码作为输入并将输入立即转换为低级语言的软件。如果输入代码不遵循其语言规则,它将列出所有错误。这个过程比解释器快得多,但是很难在程序中一起调试所有错误。编译器是将高级语言的指令翻译成机器语言的翻译程序。输入到编译器的程序称为源程序。现在,该程序已通过编译器转换为机器级语言,称为目标代码。有不同的编译器:交叉编译器–编译后的程序可以在CPU或操作系统...

  编译器设计中的BNF表示法

📅  最后修改于: 2021-06-28 07:01:20        🧑  作者: Mango

BNF代表Backus Naur Form表示法。这是一种描述程序设计语言语法的正式方法,John Bakus和Peter Naur于1960年提出了Backus Naur Formas,即Backus NaurFormas。BNF和CFG(上下文无关语法)几乎相同。 BNF可能是主要语言的元语言(一种无法描述另一种语言的语言)。对于人类食用,一种用于编码语法的适当符号是预期的,称为Backus ...

  Lex代码以计算令牌总数

📅  最后修改于: 2021-06-28 07:01:38        🧑  作者: Mango

Lex是一个生成词法分析器的计算机程序,由Mike Lesk和Eric Schmidt编写。 Lex读取指定词法分析器的输入流,并输出以C编程语言实现lex的源代码。令牌:令牌是一组构成基本原子语法的字符组,即令牌是与模式匹配的一类词素。例如–关键字,标识符,运算符,分隔符。例子:下面是上述说明的实现:输出:...

  构造DFA的程序,以检查给定的整数是否为无符号

📅  最后修改于: 2021-06-28 07:02:46        🧑  作者: Mango

给定一个表示整数的字符串S,任务是通过构造DFA来检查给定的字符串S是否表示一个无符号整数。如果给定的字符串表示无符号整数,则打印“ Unsigned integer”。否则,打印“不是无符号整数”。例子:Input:S = “+4554”Output:Not an unsigned integerInput:S = “1729”Output:unsigned integer为什么编程需要懂一点英...