欢迎回来
登录你的知识库账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属知识库
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

notebasewww.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v0.8.7 · 知识库
笔记
KnowledgeBase
网络无边,知识有迹。
0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →
>
笔记
0
加载中...
工具
0
此页用于记录用户反馈问题后的每一次改进
笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势
// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

编译器与语言设计导论:从基础到实践

2026/7/5技术杂谈

本文系统介绍编译器的工作原理与编程语言设计核心概念,涵盖词法分析、语法分析、语义分析、代码生成等关键环节,并强调理论与实践结合。

编译器是计算机科学中连接人类可读代码与机器可执行指令的桥梁。Douglas Thain 的《Introduction to Compilers and Language Design》是一本面向初学者的开源教材,旨在通过清晰的逻辑和可运行的示例,帮助读者理解编译器如何工作,以及如何设计一门简单的编程语言。

编译器概述

编译器本质上是一个翻译程序,它将高级语言(如C、Java)编写的源代码,转换为低级语言(如汇编或机器码)。整个过程可以分为几个主要阶段:

  1. 词法分析(Lexical Analysis):将源代码字符串分解为有意义的词法单元(Token),如关键字、标识符、运算符、字面量等。例如,int x = 10; 会被分解为 int、x、=、10、; 五个Token。词法分析器通常使用正则表达式和有限自动机实现。

  2. 语法分析(Syntax Analysis):根据语言的语法规则(通常用上下文无关文法描述),将Token序列组织成抽象语法树(AST)。例如,a + b * c 的AST会体现运算符优先级:乘法节点在加法节点之下。常用的算法包括递归下降解析和LALR解析。

  3. 语义分析(Semantic Analysis):检查AST的语义正确性,例如类型检查、变量作用域解析、函数参数匹配等。此阶段会构建符号表,记录每个标识符的类型、作用域等信息。如果代码有类型不匹配或未声明变量,编译器会在此报错。

  4. 中间代码生成(Intermediate Code Generation):将AST转换为与机器无关的中间表示(IR),如三地址码或静态单赋值形式(SSA)。IR便于后续优化,且可以跨平台重用。

  5. 优化(Optimization):对IR进行各种变换以提高效率,例如常量折叠(2 + 3 替换为 5)、死代码删除、循环展开、寄存器分配优化等。优化可以在不同级别进行,从局部优化(基本块内)到全局优化(函数内)再到过程间优化。

  6. 代码生成(Code Generation):将优化后的IR转换为目标机器代码(如x86-64汇编)。这一步涉及指令选择、寄存器分配、指令调度等。最终输出可执行文件或目标文件,由链接器完成最后的地址绑定。

语言设计要素

编译器与语言设计密不可分。设计一门语言时,需要考虑以下核心方面:

  • 语法设计:决定语言的词法和文法规则。例如,C语言用花括号 {} 表示代码块,Python用缩进。语法应当清晰、无歧义,且易于解析。教材中推荐从简单的表达式语言开始,逐步加入变量、函数、控制流等。

  • 类型系统:静态类型(如Java)在编译时检查类型,动态类型(如Python)在运行时检查。类型系统可以防止许多错误,但也增加了复杂度。教材介绍了强类型与弱类型、类型推断、泛型等概念。

  • 作用域与绑定:变量和函数的作用域规则(静态作用域 vs 动态作用域)直接影响程序的语义。静态作用域(词法作用域)是大多数语言的选择,它根据代码结构决定可见性。

  • 控制流:条件语句(if-else)、循环(for、while)、异常处理等。编译器需要将这些高级结构转换为低级跳转指令。

  • 内存管理:栈上分配(局部变量)与堆上分配(动态对象)。有些语言(如C)手动管理内存,有些(如Java、Go)使用垃圾回收。编译器需要生成相应的分配和释放代码。

实践:构建一个微型编译器

教材的核心亮点是指导读者从零构建一个名为 microc 的微型编译器。它面向一门简单的类C语言,支持整数、变量、算术运算、条件分支和循环。实现过程包括:

  1. 词法分析器:用Flex或手写状态机,识别Token如 INT、ID、PLUS、SEMI 等。

  2. 语法分析器:用Bison或递归下降解析,根据文法生成AST。例如,表达式文法:

    expr : term
         | expr '+' term
         | expr '-' term
         ;
    
  3. 语义分析:遍历AST,检查变量是否声明,类型是否匹配(本语言只有int类型,所以简单)。

  4. 代码生成:将AST直接转换为x86-64汇编,输出到文件,再用GCC汇编和链接。例如,a = 5 + 3; 会生成:

    movq $5, %rax
    addq $3, %rax
    movq %rax, a
    

教材还提供了完整的源代码和测试用例,读者可以修改语言特性(如添加浮点或字符串),观察编译器行为的变化。

延伸思考

  • 编译 vs 解释:编译器一次性翻译整个程序,解释器逐行执行。现代语言常混合使用,如Java先编译为字节码,再由JVM解释或JIT编译。

  • 前端 vs 后端:词法、语法、语义分析属于前端(与源语言相关),优化和代码生成属于后端(与目标机器相关)。这种分离使得编译器可以支持多种语言和目标平台。

  • 工具链:除了编译器,还需要预处理器、汇编器、链接器、调试器等。教材简要介绍了这些工具的作用。

  • 自举(Bootstrapping):如何用一门语言编写自己的编译器?这是一个经典问题,通常通过逐步升级解决:先用低级语言写一个简单编译器,再用它编译更复杂的版本。

总结

编译器设计是计算机科学的“圣杯”之一,它融合了形式语言理论、数据结构、算法、操作系统和体系结构的知识。Thain的教材以浅显的方式揭示了这一领域的核心思想,适合对编程语言内部机制感兴趣的读者。通过动手实现一个微型编译器,你将深刻理解代码从文本到机器指令的旅程,并掌握设计新语言的基础能力。

原文链接:https://dthain.github.io/books/compiler/

编写使用方法
Markdown 格式 · Ctrl+Enter 确定
新建笔记
预览
数据表格
点击单元格编辑 · Tab 移动
A1fx
Sheet1
BIH1H2≡🔗</>
隐私提醒

取消
编辑工具
取消