为什么编译原理被称为龙书?(一)

简介: 笔记

碎碎念


为什么这本书叫做 龙书(Dragon book)

10.png

这本书很有意思,它的书名是 《Compilers: Principles, Techniques, and Tools》,也就是编译器的原则、技术和工具。但它却画出了一个恐龙和骑士,恐龙身上写的是 Complexity of Compiler Design,也就是复杂的编译器设计,骑士的盾上写的是 Syntax Directed Granslation,也就是语法翻译。骑士的剑上看的不是很清楚,我猜测应该是优秀的编译器的意思。这是征服复杂性的隐喻。优秀的编译器会直接征服复杂的编译,复杂的编译设计永远无法攻破语法翻译。


什么是编译原理


计算机是只认识二进制的,但是我们平常开发中根本不会使用二进制进行开发,我们使用的都是 Java、C 这类的高级语言,每种语言都会经过一系列的转换才能被计算机识别,那么到底是谁做的这项工作呢?一个被称为 编译器(compiler) 的大佬出场了。


语言处理器


首先考虑一下一个例子,你如何才能和老外对话?你是不是需要学英语?我们有一些同学可能认为英语难学,经常会在英语书上做一些汉语标记方便理解。

11.png

那么,谁做了由英语到方便记忆 的英语之间的转换呢?答案是你的大脑。所以,我们可以归纳一下这个过程。

因为我们懂汉语(自己的一套语法规则),我们把英语(需要学习的语言)转换为我们便于理解的汉语(大脑翻译规则),我们才能学会英语和老外对话(转换为目标语言)。

这里我说一点:昨天晚上外出遛狗有个老黑和中国女生对话,中国女生竟然讲英文??????这可是中国本土好么,为什么外国人来到中国不讲汉语偏要中国人讲英文???你去外国旅游你会讲中文吗???这是一个基本认知问题,别怪我偏执。我认为外国人要来我们国家最基本的一点就是:你要学中文,千万不要抱着英语为上的心态,汉语不输任何语言。

回到正题,我们上面举出的这个学英语的例子,其实就是一个由原程序经过某种机制转换,把它变成目标语言的过程。也就是

12.png

编译器就是一个翻译官的角色,它负责把源程序的语法翻译成目标程序能够理解的语法。

回到计算机中,我们肯定需要目标程序来做一些事情的。

也就是,我们通过某个渠道获得的输入信息,会经过编译器的转换,变为输出信息进行展示。

13.png

除了编译器之外,还有一种称为 解释器(interpreter) 的语言处理器,它不是做翻译工作的,而是把用户提供的输入执行源程序中指定的操作。

14.png

我们熟知的 Java 语言,就结合了编译和解释的过程,我们写的 Java 源文件首先被编译成 字节码(bytecode),字节码是一种中间码,它通常被看成是可执行的二进制文件。然后再由 Java 虚拟机对字节码解释执行。这样,在一台机器上编译的字节码就能够在其他机器上解释执行,这种体现了 Java 语言的平台无关性

15.png

为了提高编译速度,Java 中有一种 just-in-time,JIT 即时编译器会一边编译一边执行。

一个源文件程序可能被划分为多个模块,并存放在多个文件中,还需要把文件链接在一起,所以,除了编译器之外,还需要一种能链接文件的部件参与,预处理器(preprossor) 是做这件事情的。如下图所示

16.png

预处理器经过预处理后会作为输入传递给编译器,编译器对源程序进行编译,编译完成后生成汇编代码,作为汇编器的输入传递给汇编器,汇编器进行汇编处理转换为机器代码,注意这个时候还不是目标代码,还要经过链接器与系统库函数进行链接,最后由加载器把目标代码加载到内存中执行


编译器的结构


我们上面大概了解了一下语言的处理过程,下面我们就来了解一下编译器的内部结构,编译器内部其实具有两种结构:分析(analysis)部分和 整合(synthesis) 部分。

分析过程相当于是把源程序分成多个结构,每个结构都有特定的语法格式进行校验,在经由每个校验后,如果不满足指定的语法格式则进行提醒,使用户进行修改。分析部分还会收集有关源程序的信息,会把收集到的信息存放在一个被称为 符号表(symbol table) 的数据结构中。符号表和中间表示形式一起传给整合部分。

整合过程是根据分析过程传递的信息来构造用户期待的目标程序。分析和整合统称为 前端(front end)后端(back end) ,哈哈哈哈。

这里你需要知道符号表(Symbol Table) 的概念:符号表是编译器使用和维护的数据结构,由标识符和类型组成。符号表的主要作用是帮助编译器快速定位。

相关文章
|
3月前
|
弹性计算 人工智能 Cloud Native
2026年阿里云优惠券全攻略:领取、使用与避坑指南
2026年阿里云推出“AI焕新季”等重磅补贴,涵盖代金券、满减券、折扣券三类,分通用与指定商品两种适用范围。本文系统梳理券种区别、官方领取入口(权益中心/活动页)、高阶用法及避坑要点,助新手、学生、企业高效降本上云。
411 1
|
4月前
|
Linux API 网络安全
零基础落地OpenClaw:阿里云轻量服务器+本地MacOS/Linux/Windows11部署+千问大模型API配置详解
OpenClaw(原Clawdbot)作为2026年主流开源AI自动化执行框架,凭借**本地优先架构**、全渠道通信能力与持久记忆特性,成为个人开发者、内容创作者与中小企业搭建专属AI助理的核心工具。本文聚焦2026年4月最新部署场景,完整覆盖**阿里云轻量服务器云端部署**、**本地MacOS/Linux/Windows11多系统部署**两大路径,同时详细讲解**阿里云千问大模型API**与**市场免费Coding Plan API**的配置方法,针对部署、配置、运行全流程中的常见问题提供解决方案,全程附带可复制代码命令,零基础用户也能快速完成落地。
372 0
|
7月前
|
安全 关系型数据库 MySQL
数据是公司的“命根子”:企业数据防泄露体系的三层设计思路(实战+代码)
数据是公司的“命根子”:企业数据防泄露体系的三层设计思路(实战+代码)
368 7
|
3月前
|
存储 人工智能 安全
静态数据安全治理:存储数据泄露防护系统全解析
企业数据泄露常源于被忽视的静态存储数据。安得卫士SDLP系统以AI智能扫描为核心,实现敏感数据全域发现、自动分类分级、加密隔离、违规处置与全生命周期审计追溯,助力企业摸清数据资产、精准防护、合规达标、溯源取证,筑牢数据安全“最后一道防线”。(239字)
243 4
|
数据采集 机器学习/深度学习 数据可视化
【优秀python web系统毕设】基于python的全国招聘数据分析可视化系统,包括随机森林算法
本文介绍了一个基于Python的全国招聘数据分析可视化系统,该系统利用数据挖掘技术、随机森林算法和数据可视化技术,从招聘网站抓取数据,进行处理、分析和预测,帮助用户洞察招聘市场,为求职者和企业提供决策支持。
1414 3
|
NoSQL JavaScript Java
基于 RuoYi-Vue-Pro 定制了一个后台管理系统 , 开源出来!
从职业生涯伊始,我一直是微服务架构的坚定拥趸,这很大程度上源于长期深耕互联网行业,习惯了高并发、分布式架构下的开发模式。 然而,去年在优化某航空公司核心用户中心系统时,我的技术认知受到了不小的冲击。 因为航空公司用户中心是一个典型的单体应用——尽管业务量不小,但稳定的业务模型和有限的扩展需求,使得单体架构反而比微服务更高效、更经济。
基于 RuoYi-Vue-Pro 定制了一个后台管理系统 , 开源出来!
|
11月前
|
存储 人工智能 Shell
Lua与C语言接口编程实战指南:打造高性能、灵活的程序
本文深入介绍了 Lua 与 C 语言的交互机制,重点分析了 Lua 作为胶水语言在嵌入式系统、游戏开发(如 Skynet、OpenResty)中的应用。内容涵盖 Lua 环境搭建、虚拟栈管理、C 与 Lua 的相互调用、闭包、Userdata 和注册表的使用等核心技术,并结合代码示例讲解了如何在实际项目中实现 Lua 与 C 的高效交互,适合希望掌握 Lua 扩展与嵌入开发的工程师参考学习。
1251 0
|
数据可视化 Java 开发工具
在分支回滚后,如何恢复被回滚的代码?
在分支回滚后,如何恢复被回滚的代码?
2143 8
|
数据安全/隐私保护
5分钟注册一个可用Gemini的谷歌邮箱账号
5分钟注册一个可用Gemini的谷歌邮箱账号
7834 24
5分钟注册一个可用Gemini的谷歌邮箱账号
|
存储 安全 容灾
同步与备份
【7月更文挑战第1天】同步与备份
1813 70