编译原理:引言

版权声明:如果喜欢的话,可以撩我哟,此处没有联系方式,想要就自己找哈。 https://blog.csdn.net/qq_39384184/article/details/84291319

编译器的概述

  • 编译器是一个程序
  • 核心功能是把源代码翻译成目标代码
  • 源代码:
    • C/C++, Java, C#, html, …
  • 目标代码:
    • x86, IA64, ARM, MIPS, …

编译器的结构

编译器具有非常模块化的高层结构,编译器可看成多个阶段构成的“流水线”结构。

在这里插入图片描述

每个阶段将源程序从一种表示转换成另一种表示:

  • 词法分析器:字符流->单词流
  • 语法分析器:单词流->语法树
  • 语义分析器:
    • 收集标识符的属性信息:
      • 类型(Type)
      • 种属(Kind)
      • 存储位置、长度
      • 作用域
      • 参数和返回值信息
    • 语义检查:
      • 变量或过程未经声明就使用
      • 变量或过程名重复声明
      • 运算分量类型不匹配
      • 操作符与操作数之间的类型不匹配
  • 中间代码生成器:抽象语法树->中间表示(与平台无关的抽象程序):
    1. 易于产生
    2. 易于翻译成目标程序
    3. 三地址码:temp1=c*d;temp2=b+temp1;a=temp2
    4. 四元式:(op, arg1, arg2, result);(* , c , d , temp1);(+ , b, temp1 , temp2);(= , temp2 , - , a)
  • 代码优化器:试图改进中间代码,以产生执行速度较快的机器代码:
    • temp1=c*d;temp2=b+temp1;a=temp2
    • change to:temp1=c*d;a=b+temp1
  • 代码生成器:生成可重定位的机器代码或汇编代码:
    • temp1=c*d;a=b+temp1
    • change to:Mov R2,c;Mul R2, d;Mov R1, b;Add R2, R1;Mov a, R2
    • 一个重要任务是为程序中使用的变量合理分配寄存器
  • 符号管理表:
    • 基本功能是记录源程序中使用的标识符,
    • 并收集与每个标识符相关的各种属性信息,
    • 并将它们记载到符号表中。
  • 错误处理器:
    • 处理方式:报告错误,应继续编译
    • 大部分错误在语法分析、语义分析阶段检测出来
    • 词法分析:字符无法构成合法单词
    • 语法分析:单词流违反语法结构规则
    • 语义分析:语法结构正确,但无实际意义

编译技术的应用

  • 高级程序设计语言的实现
  • 针对计算机体系结构的优化(并行性与内存层次结构)
  • 新计算机体系结构的设计(CISC -> RISC)
  • 程序翻译
  • 软件生产率工具(查错)

猜你喜欢

转载自blog.csdn.net/qq_39384184/article/details/84291319