【龙书】编译原理(第二版)学习与理解:

1.也许我们这辈子都不会去实现一个编译器,但是我们至少要知道编译器是什么?为什么会需要编译器?

①编译器首先也是一种电脑程序。它会将用某种编程语言写成的源代码(原始语言),转换成另一种编程语言(目标语言)。

②高级计算机语言便于人编写,阅读,维护。低阶机器语言是计算机能直接解读、运行的。编译器主要的目的是将便于人编写,阅读,维护的高级计算机语言所写作的源代码,翻译为计算机能解读、运行的低阶机器语言的程序。编译器将原始程序(Source program)作为输入,翻译产生使用目标语言(Target language)的等价程序。源代码一般为高阶语言 (High-level language), 如 Pascal、C、C++、C# 、Java 等,而目标语言则是汇编语言或目标机器的目标代码(Object code),有时也称作机器代码(Machine code)。

2.编译器的各步骤

一开始看比较容易被各种词法,语法等弄得头大。其实计算机的所谓语法,类比一下自然语言,无非也一样是语言的结构方式。包括词的构成和变化﹐词组和句子的组织。无外乎主谓宾这样的一些规则或者结构来表达一个意思。为了后续学习的顺利性,这里有必要先把各种术语搞清楚。

1.词法分析

编译器的第一个步骤称为词法分析或扫描。词法分析器读入组成源程序的字符流,并将其组成有意义的词素的序列。形如<token-name, attribute-value>这样的词法单元。(token-name是由语法分析使用的抽象符号,attribute-value是指向符号表中关于这个词法单元的条目,符号表条目的信息会被语义分析和代码生成步骤使用)

例如源程序包含如下赋值语句:position = initial + rate * 60

对其进行词法分析:

抽象符号

词素

标识符 id position
赋值运算符 = =
标识符 id initial
加法运算符 + +
标识符 id rate
乘法运算符 * *
整数 60 60
空格(分析器直接忽略)

经过词法分析之后,赋值语句的词法单元序列:<id, 1>  < = > <id, 2> < + > <id, 3> < * > <60>

图1-1 一个赋值语句的翻译

①.语法是语言学的一个分支,研究按确定用法来运用的词类、词的屈折变化或表示相互关系的其他手段以及词在句中的功能和关系。包含词的构词、构形的规则和组词成句的规则。

举个例子:我是人;他学习汉语;你爬山...........这样的句子有千千万万。那么人们会总结出来:主语+谓语+宾语 这样的语法规则来。

由于计算机的特殊性,因此计算机的语法逻辑性更强,更注重算术和表达式等。所以就没有那么简单的“主谓宾”,我们看的更多的可能类似 x = y + 1,等;

②.文法:自然语言汉语中的意思1.法制;法规。 2.文章的作法。 3.语法。语言的结构方式。包括词的构成和变化﹐词组和句子的组织。文法即文章的书写法规,一般用来指以文字、词语、短句、句子的编排而组成的完整语句和文章的合理性组织。

文法即语言中的每个句子可以用严格定义的规则来构造.

2.语法分析

编译的第2个步骤称为语法分析或解析。语法分析器使用由词法分析器生成的各词法单元的第一个分量来创建树形的中间表示。该中间表示给出了词法分析产生的词法单元的语法结构。常用的表示方法是语法树,树中每个内部节点表示一个运算,而该节点的子节点表示运算的分量。

以上赋值语句表示成语法树:

3.语义分析

(数据的含义就是语义。简单的说,数据就是符号。数据本身没有任何意义,只有被赋予含义的数据才能够被使用,这时候数据就转化为了信息,而数据的含义就是语义)

语义分析器使用语法树和符号表中的信息来检查源程序是否和语言定义的语义一致 。它同时收集类型信息,并存放在语法树或符号表中,以便在中间代码生成过程使用。

语义分析的一个重要部分就是类型检查。比如很多语言要求数组下标必须为整数,如果使用浮点数作为下标,编译器就必须报错。再比如,很多语言允许某些类型转换,称为自动类型转换。

图1-1中显示了一个这样的自动类型转换,假设position,initial和rate已经被声明为浮点型,而词素60是一个整数。语义分析器输出中有一个inttofloat的额外节点,明确的把60转换为一个浮点数。

4.中间代码生成

          在源程序翻译成目标代码的过程中,一个编译器可能构造出一个或多个中间表示。这些中间表示可以有多种形式。语法树是一种中间表示形式,它们通常在语法分析和语义分析中使用。

在源程序的语法分析和语义分析完成之后(也会生成中间表示,区别语法树),很多编译器生成一个明确的低级的或类机器语言的中间表示。该中间表示有两个重要的性质:1.易于生成;2.能够轻松地翻译为目标机器上的语言。

5.代码优化

          代码优化试图改进中间代码,以便生成更好的目标代码。即更快(省时),更短(省空间)或能耗更低。

6.代码生成

           代码生成以中间表示形式作为输入,并把它映射为目标语言。如果目标语言是机器代码,则必须为每个变量选择寄存器或内存位置,中间指令则被翻译为能够完成相同任务的机器指令序列。

代码生成的一个至关重要的方面是合理分配寄存器以存放变量的值。

编译原理学习(一)--编译以及编译过程相关推荐

  1. [编译原理学习笔记2-2] 程序语言的语法描述

    [编译原理学习笔记2-2] 程序语言的语法描述 文章目录 [编译原理学习笔记2-2] 程序语言的语法描述 [2.3.1] 上下文无关文法 [2.3.2] 语法分析树与二义性 [2.3.3] 形式语言鸟 ...

  2. 编译原理学习笔记20——符号表

    编译原理学习笔记20--符号表 20.1 符号表的组织与操作 20.2 符号表的内容 20.3 利用符号表分析名字的作用域 20.1 符号表的组织与操作 符号表 符号表的作用与组织 符号表的整理和查找 ...

  3. 计算机编译原理有必要学吗,计算机程序编译原理学习心得

    计算机程序编译原理学习心得 <编译原理>是计算机专业的一门重要课程,正如教材:第一章的引论所述,"编译程序是现代计算机系统的基本组成部分之一"."一个编译程序 ...

  4. 编译原理学习笔记2——高级程序设计语言概述

    编译原理学习笔记2--高级程序设计语言概述 2.1常用的高级程序设计语言 2.2程序设计语言的定义 2.2.1语法 2.2.1语法 2.2.3程序语言的基本功能和层次机构 2.2.4程序语言成分的逻辑 ...

  5. 编译原理-学习指导与典型题解析

    <编译原理-学习指导与典型题解析>这本书的pdf版本 是刘春林版本,应该是和陈火旺的是配套的,出版社一样 点击下载

  6. 编译原理拉链回填技术c语言,编译原理笔记1:概述编译相关的基本知识

    本系列为个人编译原理学习笔记,谬误之处恳请高人指点,感激不尽! 内容整理自西安电子科技大学 王小兵.张南.鱼滨老师的编译原理课程. 编译器的工作步骤 在开始说任何东西之前,我们先来大致看一下编译器是怎 ...

  7. 编译原理学习笔记一(待续)

    这几天忙着学英语,同时在学习编译原理,对这门课很感兴趣,已经制作了词法分析器,同时还在补充这个分析器的功能,也准备着手开始写语法分析器,看到最后能不能连在一起,我想如果能够将整套编译器的流程跑下来真的 ...

  8. [编译原理学习]词法分析

    此前一直没能系统完整地学过编译原理,只有很粗浅的理解,虽然其实对工作里的任务也没啥影响,但总觉得缺了一大块知识,加上对所谓程序员三大浪漫(编译器,操作系统,图形学)的向往,所以最近跟着网易云课堂推出的 ...

  9. HTML4基本编译原理,Stanford公开课《编译原理》学习笔记(1~4课)

    课程里涉及到的内容讲的还是很清楚的,但个别地方有点脱节,任何看不懂卡住的地方,请自行查阅经典著作<Compilers--priciples, Techniques and Tools>(也 ...

最新文章

  1. Ext.js Tree
  2. go 类型 value 不支持索引_10分钟掌握PostgreSQL 5种索引的应用场景
  3. 6.1 C/S 架构介绍
  4. Qt CheckBox的使用
  5. 机器学习中导数最优化方法(基础篇)
  6. 内网linux服务器安装运行环境,linux下如何在内网中安装docker_网站服务器运行维护...
  7. STL 之find,find_if,find_end,find_first_of
  8. 2_4 FacadeMode.cpp 外观模式
  9. cassandra_Spring Boot Cassandra的第一步
  10. 【Python包】安装teradatasql提示找不到pycryptodome模块错误(pycrypto,pycryptodome和crypto加密库)...
  11. python 测试用例管理 生成_python自动生成接口测试用例
  12. C#中全角转半角以及半角转全角
  13. 一个有很多QT免费应用例程的网站
  14. Task08 word2vec;词嵌入进阶;文本分类 学习笔记
  15. 简述sizeof和strlen的区别
  16. Redis Zset的实现为什么用跳表,而不用平衡树?
  17. CANOpen中SDO和PDO的COB-ID理解
  18. 关于数据治理的读书笔记 - 企业数据治理的“道、法、术、器”
  19. 【学习笔记】stm32+ESP8266+阿里云+云智能APP
  20. java保存cookie在本地_Java保存Cookie

热门文章

  1. softmax单元_三分钟带你对 Softmax 划重点
  2. 【MATLAB教程案例96】基于GA优化的WSN最大覆盖率和最少节点部署数量matlab仿真
  3. gitbook book.json 定制功能
  4. 【温故而知新-Javascript】理解 DOM
  5. 减法运算电路(含同反相比例运算结论以及叠加定理等预备知识)
  6. hadoop集群启动与关闭需要输入密码
  7. excel文档关闭时不小心点了不保存???老铁别扎心以下方法可以恢复!!!
  8. 网民告腾讯公司 索赔4万Q币和445个5位QQ号
  9. 苹果商业广告--倡导绿色环保
  10. 数学 | 好用的网站