编译原理概述

什么是编译程序

编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序。
高级语言程序-翻译->机器语言程序-运行->结果。
其中编译程序又可以分为:
诊断编译程序(Diagnostic Compiler)--专门用于帮助程序员开发和调试,对于目标代码的效率不关注。
优化编译程序(Optimizing Compiler)--侧重于提高目标代码的执行效率,能够生成高效的目标代码。
交叉编译程序(Cross Compiler)--运行编译程序的机器叫做宿主机,运行目标代码的机器我们称为目标机,一般来说宿主机和目标机是同一个机器,如果一个编译程序产生不属于宿主机的目标代码,我们称其为交叉编译程序。
可变目标编译程序(Retargetable Compiler)--不需要重写与机器无关的部分,只要改变与目标机器有关的部分,就能针对不同的平台生成不同的代码。

解释程序(Interpreter)

把源语言写的源程序作为输入,但不产生目标程序,而是边解释边执行源程序。
不同于编译程序,解释程序不会产生完整的目标程序文件。(如python语言)
高级语言程序-解释->结果

编译过程

类比自然语言的翻译:
把英文翻译为中文:
1.识别出句子红的一个个单词。
2.分析句子的语法结构。
3.根据句子的含义进行初步翻译。
4.对译文进行修饰。
5.写出最后的译文。
与编译程序工作的五个阶段对应为:
1.词法分析。
2.语法分析。
3.中间代码产生。
4.优化。
5.目标代母产生。

词法分析

任务:输入源程序,对构成源程序的字符进行扫描和分解,识别出单词符号。
依循的原则:构词规则。
描述工具:有限自动机。

语法分析

任务:在词法分析的基础上,根据语法规则把单词符号串分解成各类语法单位(语法范畴)。
依循的原则:语法规则。
描述工具:上下文无关文法。

中间代码产生

任务:对各类不同的语法单位按语言的语义进行初步翻译。
依循的原则:语义规则
描述工具:属性文法
中间代码:三元式,四元式,树,...

优化

任务:对前阶段产生的中间代码进行加工变换,以期在最后阶段产生更高效的目标代码。
依循的原则:程序的等价变换原则

目标代码产生

任务:把中间代码变换成特定机器上的目标代码
依赖于硬件系统结构和机器指令的含义
目标代码的三种形式:
1.汇编指令代码:需要进行汇编。
2.绝对指令代码:可直接运行。
3.可重定位指令代码:需要链接。

编译程序的结构

编译程序的总框

--源程序--》词法分析器--单词符号--》语法分析器--语法单位--》语义分析与中间代码产生器--中间代码(四元式)--》优化段--中间代码(四元式)--》目标代码生成器--目标代码--》。
另外还有符号表管理,与出错处理模块。

出错处理程序

发现源程序中的错误,把有关错误信息报告给用户,错误分为语法错误与语义错误。

重要概念:遍

所谓“遍”,就是对源程序或源程序的中间表示从头到尾扫描一次。
阶段和遍是不同的概念--一遍可以由若干段组成(词法分析,语法分析、中间代码程序可以合成一遍来处理),一个阶段可以分为若干遍来完成(比如:优化就可能分为好多遍)。

编译程序的前后端

词法分析、语法分析、语义分析和中间代码生成以及优化中与目标机器无关的部分一起称为编译程序的前端。
而优化中与目标机器有关的部分和目标代码生成,一起称为编译程序的后端。
这样分的好处为:程序逻辑结构清晰、优化更充分,有利于移植。

编译程序的生成

以机器语言和汇编语言为工具。

优点:可以针对具体的机器,充分发挥计算机的系统功能;生成的抽象效率高。
缺点:程序难度、难写、易出错、难维护、生产效率低。

使用高级语言书写

优点:程序易读、容易维护、生产效率高。
关于如何利用现有编译器产生自己的编译器

如图:

关于如何移植:

自编译方式

编译程序的自动产生

如LEX:词法分析程序产生器。
YACC:语法分析程序产生器。

高级程序设计语言概述

常用的高级程序设计语言

FORTRAN 数值计算
COBOL 事务处理
PASCAL 结构化程序设计
LISP 函数式程序设计
PROLOG 逻辑程序设计
C 系统程序设计
Smalltalk 面向对象程序设计
Java Internet引用,可移植性
Python 解释型,动态编程
第一位图灵奖获得者Alan J.Perlis曾经说过:如果一个语言不能改变你进行程序设计的思维方法的话,那么你不值得去了解它。

高级程序设计语言的优点

更接近于数学语言和工程语言,更直观、自然和易于理解。
更容易验证其正确性。
编写程序的效率更高。
更容易移植。

程序设计语言的定义

语法

程序本质上是一定字符集上的字符串。
语法:一组规则,用它可以形成和产生一个合式(形式上正确)的程序,分为词法规则和语法规则。

词法规则:单词符号的形成规则

单词符号是语言中具有独立意义的最基本结构
一般包括:常数、标识符、基本字、算符、界符等。

语法规则:语法单位的形成规则

语法单位通常包括:表达式、语句、分程序、过程、函数、程序的等。
描述工具:上下文无关文法。

语义

一组规则,用它可以定义一个程序的意义。
描述方法:
1.自然语言描述:二义性、隐藏错误和不完整性。
2.形式描述:
操作语义。
指称语义。
代数语义。

程序语言的基本功能和层次结构

程序,本质上说是描述一定数据的处理过程。
程序语言的基本功能:描述数据和对数据的运算。
程序的层次结构:
程序--》子程序或分程序、过程、函数--》语句--》表达式--》数据引用、运算符、函数调用。
程序语言成分的逻辑和实现意义
抽象的逻辑的意义:数学意义。
计算机实现的意义:具体实现。
计算思维和数学思维是不同的!。

高级语言的分类

强制性语言/过程式语言
应用式语言
基于规则的语言
面向对象的语言

MOOC 编译原理笔记(一):编译原理概述以及程序设计语言的定义的更多相关文章

  1. 编译原理(一)绪论概念&文法与语言

    绪论概念&文法与语言 以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记. 绪论基本概念 1. 低级语言:字位码.机器语言.汇编语言.与特定的机器有关,功效高,但使用复杂.繁琐.费时 ...

  2. atitit.查看预编译sql问号 本质and原理and查看原生sql语句

    atitit.查看预编译sql问号 本质and原理and查看原生sql语句 1. 预编译原理. 1 2. preparedStatement 有三大优点: 1 3. How to look  gene ...

  3. GCC编译器原理(三)------编译原理三:编译过程---预处理

    Gcc的编译流程分为了四个步骤: 预处理,生成预编译文件(.文件):gcc –E hello.c –o hello.i 编译,生成汇编代码(.s文件):gcc –S hello.i –o hello. ...

  4. C C++ Java C# JS编译、执行过程的原理入门分析

    C.C++是典型的编译型编程语言,编译链接后,点击则可执行. JS,解释型脚本语言,则不需要进行编译,直接解释执行. Java和C#则是所谓的高级语言,编译执行的方式做了很多处理, 尤其是C#,VS编 ...

  5. Python源代码剖析笔记3-Python运行原理初探

    Python源代码剖析笔记3-Python执行原理初探 本文简书地址:http://www.jianshu.com/p/03af86845c95 之前写了几篇源代码剖析笔记,然而慢慢觉得没有从一个宏观 ...

  6. 《深入理解java虚拟机》学习笔记之编译优化技术

    郑重声明:本片博客是学习<深入理解Java虚拟机>一书所记录的笔记,内容基本为书中知识. Java程序员有一个共识,以编译方式执行本地代码比解释方式更快,之所以有这样的共识,除去虚拟机解释 ...

  7. 深入理解 ProtoBuf 原理与工程实践(概述)

    ProtoBuf 作为一种跨平台.语言无关.可扩展的序列化结构数据的方法,已广泛应用于网络数据交换及存储.随着互联网的发展,系统的异构性会愈发突出,跨语言的需求会愈加明显,同时 gRPC 也大有取代R ...

  8. 原创 C++应用程序在Windows下的编译、链接:第一部分 概述

    本文是对C++应用程序在Windows下的编译.链接的深入理解和分析,文章的目录如下: 我们先看第一章概述部分. 1概述 1.1编译工具简介 cl.exe是windows平台下的编译器,link.ex ...

  9. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

随机推荐

  1. flask 简单示例

    flask import flask from flask import jsonify from flask import request # 要获取到请求参数的话,就要导入这个模块 ''' 创建接 ...

  2. 【Java_基础】Java中强制类型转换

    首先,狭义上的强制类型转换指的是引用类型,且是父类向子类转换,这种转换只牵扯到引用名义类型的转换,具体的对象内存没有发生一点变化. 而基本类型的转换与此不同,其数据确实发生了变化.如果是基本类型和其包 ...

  3. 遇到的一个Buffer too small问题

    在ROI中输出图像时遇到 经调试后发现是driver.Create时设置的波段数大于实际写入的波段数导致的 这里xImgIn.m_nBands有204,但实际写入的数据的bands只有3,修改时忘了修 ...

  4. 四步理解GloVe!(附代码实现)

    1. 说说GloVe 正如GloVe论文的标题而言,GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & ...

  5. python笔试题

    冒泡排序的原理:每次对相邻的两个元素进行比较,若前者大于后者,这将两者的位置交换.第一轮就可以将最大的元素置于列表的最后.几轮循环 冒泡排序的前提条件:有序的列表 import unittest# 冒 ...

  6. 20180610模拟赛T1——脱离地牢

    Description 在一个神秘的国度里,年轻的王子Paris与美丽的公主Helen在一起过着幸福的生活.他们都随身带有一块带磁性的阴阳魔法石,身居地狱的魔王Satan早就想着得到这两块石头了,只要 ...

  7. Box HDU - 2475 (Splay 维护森林)

    Box \[ Time Limit: 5000 ms \quad Memory Limit: 32768 kB \] 题意 给出 \(n\) 个箱子的包含关系,每次两种操作. 操作 \(1\):把 \ ...

  8. Vue 实现点击展开收起

    Vue 展开收起功能实现 之前写项目的时候提到了一个需求 展开/收起 所有内容的需求 .因之前一值是重构,自己写功能还是比较少的,于是网上搜了一下,发现很多东西其实是jq的功能 虽然可以拿过来用,但是 ...

  9. 安装hadoop集群-cm 5.14.4

    环境 要求: centos 7 java 1.8 cm 5.14.4 mysql 5.7 4核16G 工具要求: mysql-connector-java-5.1.39.jar 1.绑定 hosts ...

  10. 20189220余超 团队博客——阅读软件app

    项目名称 小说阅读器 项目功能 注册登录 用户信息.用户密码.用户图像修改 书籍分类 书架 书籍搜索(作者名或书籍名) 书籍阅读(仅txt格式,暂不支持PDF等其他格式) 阅读字体.背景颜色.翻页效果 ...