Introduction
-
编译器是软件,将源程序编译成目标程序,学习编译原理有助于理解程序内部如何执行,设计出更高效的程序,同时也有助于调试代码,分析错误原因。
-
源代码经过词义分析,语法分析生成语法树,再经过翻译生成中间代码,编译器会优化,然后再生成目标代码。这一步工作就是编译。
-
Compiler vs Interpreter
Compiler 将源程序转为目标程序,并输出错误调试信息,转换过程是对所有的代码进行转换并做优化。编译执行的代码更快。
Interpreter也是将源程序转为目标程序,但不同的是,转换过程是一句一句的转换并且没有做优化。动态执行易于调试,可移植性好。
-
Phases of Compiler
主要分为两个阶段,分别是分析阶段和代码生成阶段。
分析阶段:Source program \(\rightarrow\) Lexical analyzer \(\rightarrow\) Syntax analyzer \(\rightarrow\) Semantic analyzer \(\rightarrow\)
代码生成阶段: Intermediate code generator \(\rightarrow\) Code optimizer \(\rightarrow\) Code generator \(\rightarrow\) Target program
-
编译过程小例子:position := initial + rate * 60;
-
Lexical analysis (词义分析
- keywords:关键词
- Identifier: position, initial, rate(标识符)
- operator::=, +, *
- Constant: 60
- Separators:空格符,tab键,换行符
- Delimiters:(),:;=>;>>
-
Syntax analysis (语法分析
生成语法树,个人感觉有点像中缀表达式对应的树
-
Semantic analysis (语义分析
分析检查程序中的每个操作是否实际可执行,比如运算符的两个操作数的类型是否一致(可做类型转换),if是否有else与其匹配(报错误信息,调试信息)etc...
-
Intermediate code generator
生成三地址码(最多三个地址),可以看出和机器指令很接近。
-
大致过程如下:
-
-
Compiler-Construction Tools:
-
Scanner generator: Lex(生成词法分析器的工具,输入是描述词法分析器的文件,输出经过编译生成词法分析器)
-
Parser generator: Yacc(生成语法分析器的工具,同上)
-
Syntax-directed translation engines
-
Automatic code generators
-
Data-flow engines
-
原文地址:https://www.cnblogs.com/Ivessas/p/15102765.html
- SVG - 创建SVG图片
- 移动端框架 滚动类 iScroll5
- GoogLeNet的心路历程(二)
- iScroll5 表单元素无法失焦 解决方法
- ResNet原理及其在TF-Slim中的实现
- 了解你服务器的心情——top命令详解
- HTML5视音频代码实例 & WEBM格式转换器
- 解析Tensorflow官方PTB模型的demo
- MyBatis源码解析(一)——MyBatis初始化过程解析
- MyBatis源码解析(二)——动态代理实现函数调用
- Git命令速记
- linux设备驱动第三篇:如何写一个简单的字符设备驱动
- Tensorflow高级API的进阶--利用tf.contrib.learn建立输入函数
- Spring速查手册(三)——Spring+JDBC
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Django Admin后台添加数据库视图过程解析
- Python 线性回归分析以及评价指标详解
- Python实现从N个数中找到最大的K个数
- .NET开源工具类库-Masuit.Tools
- 如何伪装本地IP
- shell脚本执行错误 $‘r‘:command not found
- CentOS7下安装和配置yarn
- android采用FFmpeg实现音视频合成与分离
- 如何在Node.js和Express中上传文件
- Android底部导航栏的动态替换方案
- Android自定义View实现饼状图带动画效果
- Android音视频之视频采集(系统API预览)
- 在Node.js中使用Multer进行文件上传
- Android实现自动填充短信验证码功能
- django项目中新增app的2种实现方法