编译原理概述

什么是编译程序

编译程序指:把某一种高级语言程序等价地转换成另一张低级语言程序(如汇编语言或机器代码)的程序。
高级语言程序-翻译->机器语言程序-运行->结果。
其中编译程序又可以分为:
诊断编译程序(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. SpringBoot quartz定时器

    <!-- 案例1 --> <!-- 定时器 --> <bean name="CodeTest" class="com.aaa.bbb.con ...

  2. h5表单亲测

    Document 下载进度: 标签. 牛奶 面包 男 女 one two three 按钮 搜索 请输入搜索内容 加密强度 用户名 Email 密码 年龄 身高 生日 这一系列是很酷的一个类型,完全解 ...

  3. Django框架(九)-- 多表操作:一对一、一对多、多对多的增删改,基于对象/双下划线的跨表查询、聚合查询、分组查询、F查询与Q查询

    一.创建多表模型 一对一:OneToOneField 一对多:ForeignKey 多对多:ManyToManyField 创建表时,会自动添加一个nid字段,并且自增,所以id可以不用手动创建 On ...

  4. django迁移脚本

    执行migrate报错的解决办法: 想知道migrate为什么报错,需要先了解migrate到底做了什么事情 migrate做了什么事情? 1.将相关的迁移脚本翻译成sql语句,然后在数据库中执行 2 ...

  5. Linux shell if条件判断1

    shell 逻辑控制语句:            分支判断结构        if        case     循环结构         for         while         unt ...

  6. 性能测试基础---jmeter函数二次开发

    Jmeter函数的二次开发. ·什么时候需要进行jmeter的自定义函数扩展呢? 一般来说,如果我们要对数据进行处理,而jmeter没有提供相应的功能(函数),此时我们可以自己进行自定义函数的扩展. ...

  7. JDK1.8 LocalDate 使用方式;LocalDate 封装Util,LocalDate工具类(三)

    未完待续 ........ 前言: 大企鹅的日常分享,第三步,最近一直在想策略设计模式和工厂模式结合优化ifelse的写法,看了很多资料,终于写出了自己要写的东西,在这段时间里,也有求助小伙伴,但是, ...

  8. linux命令:set 指定行,直接替换并修改文件

    sed 命令: 指定行,从第一行到第一行: 把该行的ssd,换成cd: -i 表示的是替换并直接修改文件: sed  -i  '1,1s/ssd/cd/g' test_file 命令使用: sed - ...

  9. NOIP 2004 联合权值

    洛谷 P1351 联合权值 洛谷传送门 JDOJ 2886: [NOIP2014]联合权值 D1 T2 JDOJ传送门 Description 无向连通图 G有 n个点,n-1条边.点从 1到 n依次 ...

  10. 推荐:Markdown编辑软件 --- 小书匠

    推荐:Markdown编辑软件 --- 小书匠 小书匠 使用手册 Markdown编辑工具推荐小书匠工具,功能丰富,简单使用,可以一步导文件至博客园主页. 概要 小书匠编辑器是一款专为markdown ...