zoukankan      html  css  js  c++  java
  • 编译原理概述

    着手看编译原理 2019/1/9


    概述

    • 编译程序、解释程序与翻译程序

    • 编译程序的工作阶段

    • 编译程序结构

    • 编译程序的生成


    编译程序

    把某一种高级语言程序等价地转换为一种低级语言程序(如汇编语言或机器语言)的程序,称为编译程序

    运行编译程序的机器称为宿主机,运行编译后的程序的机器称为目标机,经常目标机就是宿主机

    • 诊断编译程序(Diagnostic Compiler)帮助开发和调试,发现程序中的错误
    • 优化编译程序(Optimizing Compiler)专注于优化
    • 交叉编译程序(Cross Compiler)宿主机不作为目标机
    • 可变目标编译程序(Retargetable Compiler)目标机可变的编译程序

    解释程序

    把源语言编写的源程序作为输入,但不产生目标程序,而是边解释边执行,即每次运行都需要解释,这种程序称为解释程序

    编译程序和解释程序统称为翻译程序


    编译程序工作的五个阶段

    • 词法分析
    • 语法分析
    • 中间代码产生
    • 优化
    • 目标代码产生

    词法分析

    • 目标:将源程序字符串扫描分解,识别出单词、符号等
    • 规则:PL的构词规则(什么样的字符做关键字,什么样的字符可以做变量名)
    • 描述工具:有限自动机
      (分割字符串,为分割出的单词或符号定性)
      示意如下图

    在这里插入图片描述


    语法分析

    • 目标:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位语法范畴
    • 规则:PL的语法规则
    • 描述工具:上下文无关文法
      (将分割的单词、字符组织成有效形式)

    示意如下图
    语法分析树
    在这里插入图片描述


    中间代码产生

    • 目标:进行静态语义检查,对各类语法单位按语言的语义进行初步翻译,将源程序代码翻译为中间代码
    • 规则:语义规则(语义,语句的功能)
    • 描述工具:属性文法
    • 中间代码:三元式、四元式、树…

    示意如下图

    Z := X + 0.618 * Y
    

    翻译为四元式
    在这里插入图片描述


    优化

    • 目标:对前阶段产生的中间代码进行加工变换,以期产生更高效的目标代码
    • 规则:程序的等价变换原则

    目标代码产生

    • 目标:把中间代码变换成特定机器上的目标代码(依赖于硬件系统结构和机器指令的含义)
    • 目标代码的三种形式
      (1)汇编指令代码:需要进行汇编(汇编器)方可运行
      (2)绝对指令代码:可直接运行(机器语言)指令地址是绝对地址,变量存储单元地址已经定好,可在内存中直接运行
      (3)可重新定位指令代码:需要链接(链接器)链接为可执行程序,指令中地址是相对地址,给定起始地址可以运行。
      可重新定位指令代码很好支持模块化软件开发,可独立编写编译各模块,最后链接为可执行程序

    编译程序的结构

    • 编译程序总框

    • 遍的概念

    • 编译前端后端

    编译程序总框

    在这里插入图片描述

    出错处理

    在这里插入图片描述


    遍:对源程序或源程序的中间表示从头到尾扫描(分析、处理)一次

    • 若干个阶段可以一遍完成
        比如说词法分析,语法分析,中间代码生成,词法分析出来一个单词/符号可以交给语法分析,判断是否组成同一语法单位。完成一个语法单位的分析后即生成中间代码。这样动态地一遍就完成三个阶段的工作
    • 一个阶段可以由若干遍完成
        比如优化阶段,可以多遍进行多种优化,也可以多遍进行针对性的优化
    编译前端与后端

    可以进行区分的原因:大致以中间代码为界,词法分析、语法分析、语义分析(中间代码生成)甚至一部分的优化与目标机是无关的,仅与源语言有关,有较为明显区别与界限

    • 与目标机无关的词法分析、语法分析、语义分析(中间代码生成)甚至一部分优化称为编译前端
    • 与目标机有关的优化、中间代码生成、目标代码的产生称为编译后端
      在这里插入图片描述
      意义:
    • 程序逻辑更加清晰
    • 优化分为机器无关的优化和机器相关的优化,优化更加充分
    • 方便复用、移植

    编译程序的生成

    编译程序的开发方法
    (1)以机器语言和汇编语言为工具

    • 能针对具体机器,充分发挥计算机的系统功能,生成高效率的程序
    • 程序编写、维护难度大

    (2)高级语言开发

    • 程序编写、维护难度小

    在拥有L1语言的编译器的情况下,使用L1语言编写L2语言的编译器,编译该L1程序得到可运行的L2语言编译器
    在这里插入图片描述

    推广
    编译程序的移植
    在有A机器代码构成的L语言到A代码的编译器P1的情况下,用L语言编写编译L语言到B机器代码的编译器P2,用P1编译P2得到A机器代码版本的L语言到B机器代码的交叉编译程序,再用此程序编译P2得到B机器代码版本的编译器P3,P3作为B机器上L语言的编译器
    在这里插入图片描述

    (3)自编译方式生成编译程序
    用汇编语言或者机器语言实现一个L语言的子集L1,用L1实现一个更大的子集L2,用L2……用Ln实现L
    (4)编译程序的自动产生
    编译程序的自动产生工具称为 编译程序-编译程序,编译程序产生器,编译程序书写系统
    如LEX:词法分析程序产生器
    YACC:语法分析程序产生器

  • 相关阅读:
    IE9不能在线打开InfoPath表单的解决办法
    在Word中使用Quick Parts功能
    .NET WinForm程序在Windows7下实现玻璃效果和任务栏进度条效果
    如何对已经发布过的InfoPath模板进行修改
    .NET WinForm中给DataGridView自定义ToolTip并设置ToolTip的样式
    有关SharePoint Client Object应用的笔记
    解决VS 2010中编译程序时弹出"Type universe cannot resolve assembly"的错误
    SharePoint客户端对象模型"(400) Bad Request"错误
    C# Method Attribute and Reflection
    .NET WinForm下一个支持更新ProgressBar进度的DataGridView导出数据到Excel的类
  • 原文地址:https://www.cnblogs.com/kafm/p/12721833.html
Copyright © 2011-2022 走看看