First-编译原理课程简介

来源:互联网 发布:淘宝买家地域分布图 编辑:程序博客网 时间:2024/06/05 17:40

First-课程简介

什么是编译器

  • 是一个软件程序
  • 核心功能:源代码(C/C++/Objcet-C/JAVA) -> 目标代码(x86/IA64/ARM/MIPS)
  • 运用流程:源代码 -> 编译器 -> 目标代码 -> 计算机 -> 计算结果

编译器带来的好处及其影响

  • 好处:减少程序员工作的代码量
  • 编译器对计算机科学的发展的影响:
    • 理论上:算法、数据结构、形式语言与自动机等
    • 实践上:软件工程、体系结构等
    • 编译器架构

为什么学习编译原理及如何学好

  • 为何学:
    • 编译原理包含计算机科学的很多核心思想,如算法、数据结构、软件工程等。
    • 编译器是其他研究的重要基础
    • 可以设计出优秀的新语言
    • 大型软件的构造及维护的需要
  • 如何学:
    • 注重解决实际问题
    • 巩固理论知识:数据结构、算法等核心思想

编译器结构

  • 模块化结构,各模块有各模块的功能
    • 前端:负责与源代码交互
    • 后端:负责与目标代码交互
  • 分阶段“流水线结构”:不同阶段处理不同的问题,如何合理规划组织各个阶段是编译器设计中非常重要的问题,关乎编译器的实现及维护的难易
    • 源代码 -> 前端 -> 中间表示 -> 后端 -> 目标代码

编译器例子

  • 源语言:加法表达式语言Sum
    • 整型数字:n
    • 加法:e1+e2
  • 目标机器:栈式计算机Stack
    • 一个操作数栈
    • 两条指令
    • 压栈指令:push n
    • 加法指令:add
  • 把编译程序1+2+3到栈式计算机的步骤:
  • 词法语法分析
    • 读入1,符合第一条规则
    • 读入+,符合第二条规则
    • 读入2,符合第一条规则
    • 读入+,符合第二条规则
    • 读入3,符合第一条规则
  • 语法树构建:某种数据结构

  • 后序遍历,代码生成:
    • push 1;
    • push 2;
    • add;
    • push 3;
    • add;
  • 栈式计算机动态执行得到结果
    • 头指针指向栈底
    • 读入一条指令push 1,把1压进栈底,指针指向1
    • 读入一条指令push 2,把2压进栈底,指针指向2
    • 读入一条指令add,把1、2弹出栈,计算结果压入栈,指针指向压入的结果
    • 读入一条指令push 3,把3压进栈底,指针指向3
    • 读入一条指令add,把结果、3弹出栈,计算结果后压入栈,指针指向压入的结果
    • 至此,栈里只剩下一个元素,即是执行结果
  • 其中代码优化(常量折叠优化)
0 0
原创粉丝点击