📝 编译器设计教程
153篇技术文档📅  最后修改于: 2021-06-28 07:14:58        🧑  作者: Mango
先决条件–编译器设计|代码优化降低频率是环路优化过程中的一种类型,它与机器无关。在降低频率中,对循环内的代码进行了优化,以提高程序的运行时间。频率降低用于减少循环中的代码量。可以在不影响程序语义的情况下将其移动到循环主体之外的语句或表达式,将其移动到循环之外。降低频率也称为代码运动。降低频率的目标:降低频率的目标是:减少表达的评价频率。将循环不变语句带出循环。以下是降低频率的示例:程序1:程式2:...
📅  最后修改于: 2021-06-28 07:15:18        🧑  作者: Mango
静态分配:静态分配是一个过程,用于在编译时分配所有数据对象。仅当编译器在编译时知道数据对象的大小时,才可以进行静态分配。在这种类型的分配中,在任何情况下都无法在运行时形成数据对象。在静态分配中,编译器确定每个数据对象的存储量,并将数据对象的名称绑定到分配的存储。堆栈分配:堆栈分配是使用堆栈来组织存储的过程。堆栈分配中使用的堆栈称为控制堆栈。在这种分配方式中,数据对象的创建是动态执行的。在堆栈分配中...
📅  最后修改于: 2021-06-28 07:15:42        🧑  作者: Mango
加载程序是操作系统的程序,它将可执行文件从磁盘加载到主内存(RAM)中以供执行。它将内存空间分配给主内存中的可执行模块,然后将控制权转移到程序的开始指令。例子:通过xlC编译器进行编译:akash @aix(/ u / akash) #xlC – o ak1.out./ ak1.cpp akash @aix(/ u / akash) #ls – lrt ak1 * -rw – rw – r– 1 ...
📅  最后修改于: 2021-06-28 07:16:01        🧑  作者: Mango
1.本机编译器:本机编译器是为运行该平台的同一平台生成代码的编译器。它将高级语言转换为计算机的母语。例如Turbo C或GCC编译器2.交叉编译器:交叉编译器是一种编译器,可为除运行该编译器的平台以外的平台生成可执行代码。例如,在Linux / x86盒上运行的编译器正在构建将在单独的Arduino / ARM上运行的程序。本机编译器和交叉编译器之间的区别:Native CompilerCross...
📅  最后修改于: 2021-06-28 07:17:06        🧑  作者: Mango
在本文中,我们将学习如何使用SLY(Sly Lex Yacc)和Python创建自己的编程语言。在深入探讨该主题之前,请注意,这不是初学者的教程,您需要对以下先决条件有所了解。先决条件关于编译器设计的粗略知识。对词法分析,解析和其他编译器设计方面的基本了解。了解正则表达式。熟悉Python编程语言。入门为Python安装SLY。 SLY是一个词法分析工具,可以使我们的过程变得更加容易。建立词法分析...
📅  最后修改于: 2021-06-28 07:17:27        🧑  作者: Mango
问题:编写一个Lex程序以计算正数,负数和分数解释 :FLEX(快速词法分析器生成器)是一种工具/计算机程序,用于生成Vern Paxson于1987年左右在C中编写的词法分析器(扫描器或词法分析器)。Lex读取指定词法分析器的输入流,并输出在C语言中实现词法分析器的源代码编程语言。函数yylex()是运行规则部分的主要flex函数。先决条件:Flex(快速词法分析器生成器)例子:执行:输出:...
📅  最后修改于: 2021-06-28 07:18:00        🧑  作者: Mango
汇编程序是一种程序,用于将以低级汇编代码编写的指令转换为可重定位的机器代码,并为加载程序生成信息。它通过评估操作字段中的助记符(符号)来生成指令,并找到符号和字面量的值以生成机器代码。现在,如果汇编程序在一次扫描中完成所有这些工作,则称为单遍汇编程序,否则,如果它在多次扫描中进行,则称为多遍汇编程序。在这里,汇编程序将这些任务分为两步:第1遍:定义符号和字面量,并分别在符号表和字面量表中记住它们。...
📅  最后修改于: 2021-06-28 07:18:30        🧑  作者: Mango
如C标准所定义,for循环语法为:从句法上讲,应该有两个分号,一个是左括号,一个是右括号,并正确拼写“ for”。因此,仅检查for循环的语法,编译器要做的是检查以下条件:仅写“ for”,而不写“ For”,“ FOR”,“ foR”或其任何变体。总计语句由两个分号“;”组成在右括号“)”结束之前。在语句末尾有一个左括号“(”在“ for”关键字之后,以及一个右括号“)”。例子:代码 –输出 :...
📅  最后修改于: 2021-06-28 07:18:52        🧑  作者: Mango
常规语法是描述常规的一种语法语。常规语法是一个数学对象G,它由四个分量G =(N,E,P,S)组成,其中N:非空的非终结符号的有限集合,E:一组有限的终端符号或字母,P:一组语法规则,每个规则都有一种形式A⇢aB⇢A⇢∈,这里∈=空字符串,A,B∈N,a∈∑小号∈N是开始符号。该语法可以有两种形式:右线性正则语法左线性正则语法右线性正则语法在这种类型的规则语法中,右侧的所有非终结点都位于最右边。右...
📅  最后修改于: 2021-06-28 07:19:13        🧑  作者: Mango
先决条件–编译器中的三个地址代码循环优化是中间代码生成之后的阶段。该阶段的主要目的是减少程序中的行数。在任何程序中,大多数时间都花在任何程序上,而实际上是在迭代程序的循环内。如果是递归程序,则将在其中存在一个块,并且大部分时间将出现在该块内部。循环优化–要应用循环优化,我们必须首先检测循环。为了检测循环,我们使用程序流程图(PFG)使用控制流分析(CFA)。要找到程序流程图,我们需要找到基本块基本...
📅  最后修改于: 2021-06-28 07:19:38        🧑  作者: Mango
在执行该程序时,两个实用程序(称为Linker和Loader)扮演着主要角色。1.连结器:链接器是一个特殊程序,它将目标文件(由编译器/汇编器生成)与其他代码段组合在一起,以生成可执行文件所具有的内容。 exe扩展名。在目标文件中,链接器搜索并附加执行文件所需的所有库。它调节每个模块的代码将保存的内存空间。它还合并两个或更多单独的目标程序,并在它们之间建立链接。通常,链接器有两种类型:2.装载机:...
📅  最后修改于: 2021-06-28 07:19:56        🧑  作者: Mango
问题:编写一个Lex程序来检查有效的URL。解释:Lex是一种计算机实用程序,可以生成一些词法分析器。 Lex读取字符流作为指定词法分析器的输入,并提供源代码作为使用C编程语言实现词法分析器的输出。先决条件:Flex(快速词法分析器生成器)例子:执行:输出:...
📅  最后修改于: 2021-06-28 07:20:14        🧑  作者: Mango
有五代编程语言,它们是:第一代语言:这些是机器语言之类的低级语言。第二代语言:这些是内核和硬件驱动器中使用的低级汇编语言。第三代语言:这些是高级语言,例如C,C++, Java,Visual Basic和JavaScript。第四代语言:这些是由类似于人类语言语句的语句组成的语言。这些主要用于数据库编程和脚本编制。这些语言的示例包括Perl, Python,Ruby,SQL,MatLab(Matr...
📅  最后修改于: 2021-06-28 07:20:44        🧑  作者: Mango
解析器生成器是将语法规范作为输入并产生用于识别该语言的过程作为输出的程序。从历史上讲,它们也称为编译器。YACC(还有另一个编译器)是一个LALR(1)(具有1个超前标记的LookAhead,从左到右,最右派生生成器)解析器生成器。 YACC最初是为Lex补充而设计的。输入文件:YACC输入文件分为三个部分。输入文件:定义部分:定义部分包括有关语法定义中使用的标记的信息:Yacc会自动为令牌分配数...
📅  最后修改于: 2021-06-28 07:21:07        🧑  作者: Mango
基本块是一条直线代码序列,除了入口和末尾外,没有分支的入站和出站分支。基本块是一组始终按顺序执行的语句。第一个任务是将一个三地址代码序列划分为多个基本块。从第一个指令开始一个新的基本块,并添加指令,直到遇到跳转或标签。在没有跳转控制的情况下,控制从一个指令连续转移到另一个指令。这个想法在以下算法中得到了标准化:算法:将三地址代码划分为基本块。输入:三个地址指令的序列。流程:确定中间代码中作为领导者...