📝 compiler

64篇技术文档
  范围信息

📅  最后修改于: 2020-12-06 07:36:47        🧑  作者: Mango

表示范围信息在源程序中,每个名称都具有一个有效区域,称为该名称的范围。块结构语言中的规则如下:如果在块B中声明了名称,则该名称仅在B中有效。如果B1块嵌套在B2内,则对块B2有效的名称对B1也有效,除非在B1中重新声明了名称的标识符。与名称和属性之间的关联列表相比,这些作用域规则需要更复杂的符号表组织。表被组织成堆栈,每个表都包含名称及其相关属性的列表。每当输入新块时,就会将新表输入到堆栈中。新表...

  存储组织

📅  最后修改于: 2020-12-06 07:56:34        🧑  作者: Mango

仓储组织当目标程序执行时,它将在其自己的逻辑地址空间中运行,每个程序的值在该逻辑地址空间中都有一个位置。逻辑地址空间在编译器,操作系统和目标机之间共享,以进行管理和组织。操作系统用于将逻辑地址映射到通常在整个内存中分布的物理地址。运行时内存细分:运行时存储分为多个块,其中一个字节用于显示可寻址内存的最小单位。使用这四个字节可以形成一个机器字。多字节对象存储在连续的字节中,并给出第一个字节的地址。运...

  激活记录

📅  最后修改于: 2020-12-06 07:57:27        🧑  作者: Mango

激活记录控制堆栈是一个运行时堆栈,用于跟踪实时过程的激活,即用于查找尚未完成执行的过程。当它被调用(激活开始)时,过程名称将被压入堆栈,而当它返回(激活结束)时,它将弹出。激活记录用于管理过程的一次执行所需的信息。调用过程时,激活记录被推入堆栈,当控件返回到调用者函数时,弹出记录被弹出。下图显示了激活记录的内容:返回值:调用过程使用它来将值返回给调用过程。实际参数:调用过程使用它为被调用过程提供参...

  存储分配

📅  最后修改于: 2020-12-06 07:58:22        🧑  作者: Mango

存储分配分配内存的不同方法是:静态存储分配堆栈存储分配堆存储分配静态存储分配在静态分配中,名称绑定到存储位置。如果在编译时创建了内存,则该内存将在静态区域创建,并且只会创建一次。静态分配支持动态数据结构,这意味着内存仅在编译时创建,并在程序完成后释放。静态存储分配的缺点在于,应在编译时知道数据对象的大小和位置。另一个缺点是递归过程的限制。堆栈存储分配在静态存储分配中,存储组织为堆栈。激活记录在激活...

  词汇错误

📅  最后修改于: 2020-12-06 07:59:15        🧑  作者: Mango

词汇错误在词法分析阶段,可以检测到这种类型的错误。词法错误是与任何标记的模式都不匹配的字符序列。在执行程序期间发现词法阶段错误。词法相位误差可以是:拼写错误。标识符或数字常量的长度超出限制。出现非法字符。删除应该出现的字符。要使用不正确的字符替换的字符。两个字符的换位。例:在此代码中,1xab既不是数字也不是标识符。因此,此代码将显示词法错误。...

  语法错误

📅  最后修改于: 2020-12-06 08:00:09        🧑  作者: Mango

语法错误在语法分析阶段,将出现此类错误。在执行程序期间发现语法错误。一些语法错误可能是:结构错误缺少运算符括号不平衡当无效的计算输入计算器时,也会发生语法错误。这可能是由于在一个数字中输入了几个小数点,或者在不关闭括号的情况下打开了括号。例如1:当需要“ ==”时使用“ =”。许多编译器将显示以下警告消息:语法警告:赋值运算符在程序firstprog.cpp的if表达式行16中使用在此代码中,如果...

  语义错误

📅  最后修改于: 2020-12-06 08:01:03        🧑  作者: Mango

语义错误在语义分析阶段,将出现此类错误。这些类型的错误是在编译时检测到的。大多数编译时错误是范围和声明错误。例如:未声明的标识符或多个声明的标识符。类型不匹配是另一个编译时错误。使用错误的变量或使用错误的运算符或以错误的顺序执行操作可能会引起语义错误。一些语义错误可能是:不兼容的操作数类型未声明的变量实际论证与形式论证不匹配示例1:使用未初始化的变量:在此代码中,未声明t,这就是为什么它显示语义错...

  代码生成

📅  最后修改于: 2020-12-06 08:01:59        🧑  作者: Mango

代码生成器代码生成器用于生成三地址语句的目标代码。它使用寄存器存储三个地址语句的操作数。例:考虑三个地址语句x:= y + z。它可以具有以下代码序列:注册和地址描述符:寄存器描述符包含每个寄存器中当前内容的跟踪。寄存器描述符显示所有寄存器最初都是空的。地址描述符用于存储在运行时可以找到名称的当前值的位置。代码生成算法:该算法将一个三地址语句序列作为输入。对于形式为a:= b op c的每三个地址...

  设计问题

📅  最后修改于: 2020-12-06 08:02:56        🧑  作者: Mango

设计问题在代码生成阶段,可能会出现各种问题:输入到代码生成器目标程序内存管理指令选择寄存器分配评估顺序1.输入到代码生成器代码生成器的输入包含源程序的中间表示和符号表的信息。源程序由前端生成。中间表示有几种选择:a)后缀表示法b)语法树c)三个地址代码我们假定前端产生底层的中间表示,即其中的名称值可以由机器指令直接操纵。代码生成阶段需要输入完整的无错误中间代码。2.目标程序:目标程序是代码生成器的...

  目标机器

📅  最后修改于: 2020-12-06 08:03:52        🧑  作者: Mango

目标机目标计算机是一种可字节寻址的计算机。一个字有4个字节。目标机器具有n个通用寄存器R0,R1,…,Rn-1。它还具有以下形式的两个地址的指令:其中,op用作操作码,源和目标用作数据字段。它具有以下操作码:ADD(将源添加到目标)SUB(从目标中减去源)MOV(将源移动到目标)指令的源和目标可以通过寄存器和地址位置与存储器位置的组合来指定。MODEFORMADDRESSEXAMPLEADDED ...

  运行时存储

📅  最后修改于: 2020-12-06 08:04:47        🧑  作者: Mango

运行时存储管理在执行过程中所需的信息保存在称为激活记录的存储块中。激活记录包括存储过程本地名称的信息。我们可以使用以下方式在目标代码中描述地址:静态分配堆栈分配在静态分配中,激活记录的位置在编译时固定在内存中。在堆栈分配中,对于过程的每次执行,都会将新的激活记录推入堆栈。激活结束后,将弹出记录。对于激活记录的运行时分配和取消分配,关联了以下三个地址的语句:呼叫返回停止动作,其他语句的占位符我们假设...

  基本块

📅  最后修改于: 2020-12-06 08:05:43        🧑  作者: Mango

基本块基本块包含一个语句序列。控制流从语句的开始进入,而在结束时离开而没有任何停止(可能是该块的最后一条指令除外)。以下三个地址语句序列构成一个基本块:基本块构造:算法:划分为基本块输入:它包含三个地址语句的序列输出:它包含一个基本块列表,每个三个地址语句恰好在一个块中方法:首先确定代码中的领导者。寻找领导者的规则如下:第一个陈述是领导者。如果有条件或无条件的goto语句,例如:if …. got...

  流程图

📅  最后修改于: 2020-12-06 08:06:35        🧑  作者: Mango

流程图流程图是有向图。它包含基本块集的控制信息流。控制流程图用于描述如何在块之间解析程序控件。在循环优化中很有用。矢量点积的流程图如下:块B1是初始节点。块B2紧随B1之后,因此从B2到B1有一条边。从B1的最后一条语句跳转的目标是第一个语句B2,因此从B1到B2有一条边。B2是B1的后继者,而B1是B2的前身。...

  块优化

📅  最后修改于: 2020-12-06 08:07:34        🧑  作者: Mango

基本块的优化:优化过程可以应用于基本块。在优化时,我们不需要更改由块计算的表达式集。基本块优化有两种类型。这些如下:保留结构的转换代数变换1.保留结构的转换:基本块上的主要保留结构转换如下:常见子表达式消除消除死代码重命名临时变量两个独立的相邻语句的互换(a)共同的副表达消除:在公共子表达式中,无需一遍又一遍地对其进行计算。取而代之的是,您可以一次计算它,并在再次遇到它时将其保存在引用的位置。在上...

  代码生成器

📅  最后修改于: 2020-12-06 08:08:32        🧑  作者: Mango

代码生成器代码生成器用于生成三地址语句的目标代码。它使用寄存器存储三个地址语句的操作数。例:考虑三个地址语句x:= y + z。它可以具有以下代码序列:注册和地址描述符:寄存器描述符包含每个寄存器中当前内容的跟踪。寄存器描述符显示所有寄存器最初都是空的。地址描述符用于存储在运行时可以找到名称的当前值的位置。代码生成算法:该算法将一个三地址语句序列作为输入。对于形式为a:= b op c的每三个地址...