First-编译原理课程简介
2016-05-27 10:04
288 查看
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弹出栈,计算结果后压入栈,指针指向压入的结果
至此,栈里只剩下一个元素,即是执行结果
其中代码优化(常量折叠优化)
相关文章推荐
- 实现一个简单的计算器
- NOP(N) NOP_##N
- 编译器是如何工作的?(转)
- 写给想学java的朋友!
- 学java的必看!
- java中的加密!
- java中的使用类!
- LEX/FLEX词法分析器
- 如何模仿人的学习模式来教计算机程序解数学题?
- 上下文无关文法1
- 上下文无关文法2
- 编译原理——词法分析器
- 编译原理预习笔记------名词理解
- Simple scanner of c
- 编译原理:短语、直接短语、句柄、素短语
- 编译原理中FIRST集合与FOLLOW集合的算法
- 上下文无关文法解析
- 识别浮点常量问题-编译原理程序实现
- 计算的哲学(philosophy in coding)
- 编译原理 Chapter1 Introduction 第一章 简介