UtopiaXC Blog - 读书笔记
type: channel
link: https://blog.utopiaxc.com/tag/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/
items: 编译原理（龙书）阅读笔记1：绪论上

编译原理（龙书）阅读笔记1：绪论上
type: item
date: 2022-05-20T00:35:00+08:00
description: 引前段时间买了三本书，本篇的主角编译原理也就是龙书、信息论基础和编码这三本。正好最近毕设做的差不多了，论文定稿也完成了，接下来准备慢慢读一读这三本书。不过有一说一，这种东西的难度对我来说还是略微高了一点，所以准备开一个系列来简单记录一下我的读书笔记，这个系列更新会非常非常缓慢。今天简单看了一下龙书的第一章引论的前几节，因此本篇笔记主要记录引论中的内容。在开始之间，这里援引书中原话，“研究编译器的编写将涉及程序设计语言、计算机结构体系、形式语言理论、算法和软件工程”。所以希望我已经做好了心理准备。语言与语言处理器继电器与数字电路我们都知道，香农发表的有史以来最为重要的硕士论文《继电器与开关电路的符号分析》中，为我们阐释了如何通过布尔代数描绘开关继电器状态，论证了数字计算机及数字线路逻辑设计的可能性，为后世利用电位状态设计的二进制计算机打下了基础。学过数字逻辑电路设计的我们都知道，无论是用于计算的以加法器为核心的ALU单元，还是以触发器为核心设计的寄存器，他们都是由最基本的逻辑门构成，而逻辑门正是开关继电器的组和。因此，我们的数据无论是保存还是计算均是由电位状态所表示，而为了人类进行理解，则赋予其1与0的表征。一种全加器的设计指令与语言因此，我们必须要理解，程序设计中我们所写的代码计算机并没有办法直接进行运行，需要通过编译器来将我们的代码编译成为计算机可以理解的语言计算机才能正确地执行，这里计算机能够理解的语言并不是我们前文提到的0与1，而是指令。CPU指令分为两种，一是机器指令，二是汇编指令。机器指令是CPU能够直接识别的唯一的“语言”，它是在CPU设计中就规定好的一套指令方案。而将大量的指令总结起来，所形成的就是我们所谓的指令集，我们常说的包括x86在内的CISC复杂指令集与包括ARM在内的RISC精简指令集都属于这一范畴。然而，由于机器指令是由二进制编码的形式构成，并不利于人类理解与开发，因此诞生了汇编指令。汇编指令以指令助记符的形式使用，例如ADD加法指令。汇编指令与机器指令一一对应，是一般开发者所能接触并使用的最底层的语言。然而，哪怕是汇编语言，学习成本与使用难度依旧十分巨大，在这样的因素影响下，更高级的语言应运而生，如C语言，Java语言甚至更高级的Python语言等。这些高级语言计算机并不能直接理解，因此需要一些手段辅助我们将这些语言转换为计算机可以理解的语言，这就是语言处理器的作用。语言处理器常见的语言处理器分为两种，一种是编译器，另一种是解释器。编译器的本质是一个程序，他的作用就是将一种语言所编写的代码翻译成另一种语言，比如汇编，代码届的DeepL了属于是。当然，它也具有在翻译过程中找到源代码错误的功能。而另一种语言处理器则是解释器，像我们常用的Python就是典型的解释型语言，它不需要预先将源代码进行编译形成汇编，他的编译是实时的，将源代码放入解释器，解释器逐行对源码进行翻译并运行。一般来说，编译器编译出的程序运行速度更快，因为编译后的程序一般是CPU可以直接理解的，而解释器运行的时候需要先翻译，在运行，因此就会略慢。不过，解释器执行的过程中更直观，对开发者更为友好，就需要我们做出相应的取舍了。除此之外，我们也会将两者结合起来，比如Java语言。我们首先使用javac编译器将Java源代码翻译成相对容易理解的字节码语言，在运行的时候通过JVM虚拟机这一解释器对字节码进行翻译运行，这样效率会比单独的解释器更高，同时也相对容易理解。一个语言处理系统编译器结构我们理解的编译器究竟是什么，现在，我们要对一个编译器进行拆解，了解一下编译器在运行的过程中到底进行了什么样的工作。其实，整个翻译的流程分为两个大步，分别是分析和综合。分析就是将源程序分解成各个小的组成元素，并在元素之间构建语法结构，同时要按照一定规则对语法结构进行检查，是否是符合语言规定，如果不符，则要抛出相关错误供开发者对源程序进行修改。此外，分析还要将源程序信息存储在符号表中。综合则是利用分析构成的中间结构与符号表构造源代码对应的翻译后的程序。一般，在编译器设计中，分析流程被称为编译器的前端，而综合被称为后端。而对其进行展开，整个编译流程则包含词法分析，语法分析，语义分析，中间代码生成，和最终代码生成这几大阶段。一个编译器的流程词法分析词法分析是编译器执行的第一步，又被称作扫描，它将源代码作为字符流读入，形成词素序列，并将词素通过词法分析器产生语法单元，其结构为<token,value>。其中，token是后续语法分析中所使用的抽象符号（可以理解为一个由词法分析器生成的ID），value为词法单元条目数，可以理解为符号表中的映射关系。我在以前讲C语言的时候就提到过，无论是符号，变量名，保留字，其在编译是都叫做词素。比如以下C代码，a=10+b;利用词法单元进…