计算机程序设计

播音员 - 是...编译器的类型。 转换和广播节目

程序,以及人们从一种语言翻译到另一个需要一个翻译或翻译。

基本概念

该方案是计算语言学表示:ⅰ→第→P(i)中。 解释器是被提供给输入程序P和一些输入x的程序。 它执行为P X:I(P,X)= P(x)的。 那只有一个翻译器能够执行所有可能的方案(可在正式的系统来表示)的事实是非常深刻的,显著发现图灵。

该处理器的机器语言程序的解释。 一般太贵编写高级语言翻译,让他们转化成一种形式,更容易理解。

有些种类的翻译有很奇怪的名字:

  • 汇编翻译汇编语言程序转换成机器语言。
  • 编译器把高层次的语言,以较低的语言。

广播器 - 是一个程序,在一些语言S IN这样的方式,它们都具有相同的语义作为输入数据的程序,并产生T项目:P→X→Q.即,∀x。 P(X)= Q(x)的。

如果广播整个程序分成东西可解释的,它被称为执行,或AOT编译之前汇编。 AOT编译器可以串联使用,其中后者往往是汇编程序,例如:

源代码编译→(译者)→→汇编代码汇编器(编译器)→→CPU机器代码(解释程序)。

如果程序被广播,当由其它先前编译一部分执行操作发生或者动态编译。 JIT编译器记住他们已经这样做不会一次又一次重复的源代码。 他们甚至可以产生基于程序执行环境的行为是自适应的编译和重新编译。

许多语言允许在编译时执行代码,并在运行时编译新的代码。

平移台

广播包括分析和综合的步骤:

源代码分析器→→→概念表示(合成器)→目标代码。

这是由于这些原因:

  • 任何其它方法是不适合的。 词翻译根本不起作用。
  • 良好的工程解决方案:如果你想写进行有针对性的需要只写M + N简单的程序(polukompilyatorov)M和N源语言,而不是M×N个复杂的翻译(笔译总的)。

然而,在实践中的很少足够的表现力和足够强大的概念图,以涵盖所有可能的源语言和目标语言。 虽然有些人能够接近这个。

真正的编译器经过许多阶段。 当创建您自己的编译器不需要重复所有的人都做过创造交涉和发电机的辛勤工作。 您可以在JavaScript或C直接翻译你的语言,并充分利用现有的JavaScript引擎和C编译器来完成剩下的。 您也可以使用现有的中间表示和虚拟机。

记录翻译

广播器 - 是一个程序或硬件,这涉及到三种语言:源,目标和基座。 它们可以被写在一个T形,将以下原始左,右和目标基站。

有三种类型的编译器:

  • 播音员 - 是samokompilyator如果它对应于基本的源语言。
  • 其目标语言编译器是基准,被称为samorezidentnym。
  • 播音员 - 一个交叉编译器,如果他有针对性的和基本的各种语言。

为什么这很重要?

即使你从来没有做一个真正的编译器,其创作的技术,良好的知识,因为用于此目的的概念被广泛使用,例如:

  • 格式文本;
  • 语言查询 到数据库;
  • 先进的计算机体系结构;
  • 广义优化问题;
  • 图形用户界面;
  • 脚本语言;
  • 控制器;
  • 虚拟机;
  • 机器翻译。

此外,如果你想写的预处理器,链接器,加载器,调试器和分析器,你必须经过相同的步骤编写编译器时。

您还可以了解如何编写更好的节目,因为翻译的语言的制作机构更好地理解其复杂性和模糊性。 广播的一般原则的研究也让你成为一名优秀的设计师的语言。 所以它的问题有多陡,如果它不能得到有效执行的语言?

综合技术

编译器技术涵盖了计算机科学的许多不同的领域:

  • 语言的形式理论:语法,语法分析,可计算性;
  • 计算机体系结构:指令集,RISC或CISC,流水线处理核心时钟周期等;
  • 编程语言的概念,例如,进行顺序控制,条件执行迭代,递归功能分解,模块化,同步,元编程,适用范围,恒定亚类型,模板,输出类型,原型,注释,流量,单子,邮箱,继续,通配符,正则表达式,事务存储器,继承,多态性,模式设置,等等等等。;
  • 抽象的语言和虚拟机;
  • 算法和数据结构:正则表达式,解析算法,图形算法, 动态规划,培训;
  • 编程语言:语法,语义(静态和动态),支持范例(结构,面向对象,功能,逻辑,堆栈,平行度,元编程);
  • 创建软件(编译器,通常是庞大而复杂的):本地化,缓存,组件化,API接口,再利用,同步。

编译器设计

一些在现实翻译的发展中遇到的问题:

  • 问题的源语言。 是否容易编译它? 是否有一个预处理器? 如何是哪几类? 是否有一个图书馆吗?
  • 分组编译通行证:单路或多路?
  • 优化的程度所需。 很少或根本没有优化的快速和不洁的广播节目可以是正常的。 过度优化的编译器将放缓,但在运行时更好的代码可能是值得的。
  • 所需要的程度的误差检测。 翻译可以只停留在第一个错误? 当它应该停止? 是否信任该编译器的纠错?
  • 工具的可用性。 如果原来的语言是不是很小,需要扫描仪和发生器分析仪。 还有发电机,代码生成器,但他们不那么常见。
  • 将要生成的目标代码类型。 从纯补充或虚拟机代码来选择。 或只写一个创建流行中间表示如LLVM,RTL,或JVM入口部分。 或使用C或JavaScript源代码原件及翻译。
  • 目标代码的格式。 您可以选择 的汇编语言, 便携式机器代码,机器代码存储图像。
  • 重新定向。 当设定发生器是好有一个共同的入口部。 出于这个原因,最好是有许多地方的输入一台发电机。

编译器架构:组件

这些是产生本地代码(如果输出程序是用C或虚拟机的程序,需要没有那么多级)编译器的主要功能组件:

  • 输入程序(流痕)被送入扫描仪(词法分析器),将其转换成标记的流。
  • 分析器(分析器)构建一个抽象语法树。
  • 语义分析分解的语义信息,并检查是否存在错误的树节点。 其结果是,内置语义图 - 有额外的属性和建立联系的抽象语法树。
  • 中间代码生成器生成一个流图(元组被分成主块)。
  • 机器无关的代码优化器进行程序内基本上剩余本地(基本单元内)和全球(所有块)优化。 减少冗余代码,并简化了计算。 其结果是经修饰的流图。
  • 发电机结合目标代码的基本块为直线传输控制代码,创建一个对象文件汇编虚拟寄存器(可能无效)。
  • 机器相关的优化器,链接器将分配寄存器之间的内存,使规划团队。 它在该组件具有良好的使用流水线的执行汇编语言的转换程序。

此外,使用错误检测分系统管理和符号表。

词法分析(扫描)

扫描器流源字符转换为标记,删除空白,注释和扩大宏流。

扫描仪经常遇到的问题,比如是否要考虑到的情况下,利润率,断线和嵌入的注释。

在扫描过程中可能出现的错误,称为词汇和包括:

  • 这是不是在字母字符;
  • 过量的字或行中的字符数目;
  • 不是一个封闭的标志或一个字符串;
  • 在注释文件的末尾。

解析(解析)

解析器的标记序列转换为抽象语法树。 树中的每个节点被存储为与命名的字段,其中有许多是本身树节点的对象。 在这个阶段,没有循环。 当你创建一个解析器需要注意的语法(LL或LR)的复杂程度,并找出是否有任何规则歧义。 有些语言确实需要语义分析。

在这个阶段中发现的错误称为语法。 例如:

  • K = 5 *(7 - ÿ;
  • J = / 5;
  • 56 = X * 4。

语义分析

语义分析检查的分析树的规则和准部件允许性(允许参考名称为隐式类型转换插入操作,依此类推。D.)为了形成语义图。

显然,这组不同的不同的语言规则受理。 如果您编译Java类语言,编译器可能会发现:

  • 在其范围内的多个变量声明;
  • 一个参考其声明之前的变量;
  • 对未申报的名称引用;
  • 侵犯专利权;
  • 在一个方法调用的参数过多或不足号码;
  • 类型不匹配。

中间代码生成元组产生组成流程图,归纳为基本块。

代码生成产生实机器代码。 在筹备的第一步RISC机器传统的编译器,你创建的虚拟寄存器的无限数量的汇编。 对于CISC机器可能不会发生。

Similar articles

 

 

 

 

Trending Now

 

 

 

 

Newest

Copyright © 2018 zhcn.delachieve.com. Theme powered by WordPress.