找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

2157

积分

1

好友

295

主题
发表于 昨天 08:06 | 查看: 9| 回复: 0

在上古时代,程序员们直接使用汇编语言进行编程,开发效率低下且过程痛苦。

卡通黑猫抱怨用汇编语言编程

那时,只有少数顶尖的程序员才能运用汇编语言完成复杂的项目。

Unix创始人展示用汇编编写的操作系统

然而,软件产业的繁荣不能仅仅依赖几位天才,它需要成千上万的普通开发者参与其中。IBM公司29岁的约翰·巴科斯决心改变这一现状。

IBM员工向老板提议开发高级编程语言

这个想法催生了Fortran语言。但在当时,人们对编译理论知之甚少,编译器的开发工作异常复杂和艰苦。

团队在艰难道路上探索编译器开发

就在这时,语言学家诺姆·乔姆斯基对自然语言结构的研究,意外地为编译器设计指明了方向。

老人介绍形式语言理论中的各类文法

开发者发现2-型文法对实现编译器的指导价值

经过三年的不懈努力,世界上第一个Fortran编译器终于在1957年诞生。

Fortran编译器诞生,高级语言时代开启

在突破了第一个编译器的技术壁垒后,高级编程语言进入了蓬勃发展的新阶段。

代表COBOL、ALGOL 60、Pascal、Ada的卡通形象

其中,最为知名且影响力最为深远的当属C语言和C++。

C与C++编译器开发者讨论著名的“编译器后门”典故

与此同时,编译器的理论和实践体系也日渐成熟。

《编译原理》作者预感此书将让学生“痛恨”他们

随后,甚至出现了能够自动生成编译器组件的工具,例如Lex和Yacc。Lex能够自动生成词法分析器。

Lex工具演示如何将源代码字符串分割成Token

Yacc则负责生成语法分析器,将Token流构建成抽象语法树(AST)。

Yacc工具演示如何将Token流构建为抽象语法树AST

需要明确的是,Lex和Yacc生成的程序只是编译器前端的一部分。一个典型的编译器结构通常分为三段:前端、优化器和后端。

编译器三段式结构:前端、优化器与后端

对于早期的商业公司而言,开发一款编译器成本高昂,因此很少会投入巨资去同时研发支持多种语言的前端和多种硬件架构的后端。这导致了编译器的封闭性,无法通用和共享。

Turbo C与Microsoft C编译器互不相容

后来,开源的GCC编译器率先打破了这种封闭模式。

GCC采用前后端分离的架构设计

GCC以其开源、跨平台、支持多种前端和后端的特性,迅速成为了Unix和Linux系统下的标准编译器。一个以GCC为核心的编译生态系统逐渐形成。

以GCC城堡为中心的编程语言王国

苹果公司也曾决定采用GCC来编译其自家的Objective-C语言。

苹果公司提议为GCC增加Objective-C前端

然而,Objective-C毕竟是一个相对小众的语言。随着时间推移,苹果公司提出的新特性需求,GCC社区逐渐难以快速响应和满足。

苹果向GCC请求支持新特性遭拒绝

此外,GCC在设计上是一个“单体应用”,其代码库耦合度较高,难以被拆分并嵌入到其他应用程序(如IDE)中使用。

苹果希望模块化调用GCC功能遭拒

就在这个时机,一位关键人物——克里斯·拉特纳登上了舞台。

Chris Lattner向苹果推荐其LLVM编译器

他展示了LLVM编译器的架构,其整体思想与GCC类似,都采用了前后端分离设计。

LLVM编译器架构图,展示前后端通过LLVM IR连接

但LLVM的核心突破在于其彻底的模块化。拉特纳将编译器完全拆分为一个个独立的库,每个模块都可以被单独使用和集成。

Chris Lattner阐述LLVM完全模块化的设计优势

2005年,克里斯·拉特纳加入苹果公司,负责编译器与开发工具。他不负众望,不仅推动了Objective-C的发展,还主导开发了基于LLVM的C语言家族前端——Clang。

最终,苹果公司决定用Clang/LLVM彻底取代GCC。

苹果宣布用Clang/LLVM替换GCC

模块化设计的LLVM吸引了众多新兴编程语言的加入,形成了一个新的生态。

新兴编程语言走向GCC与LLVM两条不同的道路

不仅如此,在当今的许多技术领域,如数据库、大数据和深度学习,都需要用到编译技术,但往往不需要一个完整的独立编译器。LLVM模块化、可嵌入的特性正好能在这些场景中大放异彩。

编译器技术与数据库、大数据、深度学习的循环促进关系

在六十年的发展历程中,编译器技术从最初简单地将高级语言转化为机器码,到专注于后端代码优化,最终迈向了高度模块化的新阶段,LLVM也因此成为了新时代的王者。

后记

试想,如果没有编译原理,人们至今仍需直接使用汇编语言编程,那么世界上的程序员数量将会锐减。编译原理使得高级语言的出现成为可能,间接塑造了如今庞大的开发者群体。

然而,编译原理本身是一门公认难度较高的计算机基础课程。许多学习者觉得其内容过于抽象和枯燥,从而选择了放弃。

这门曾造福无数程序员的基础技术,如今却在一定程度上被开发者们所忽视。诚然,不了解编译器内部原理,对于大多数日常开发工作影响并不大,我们通常只是将编译器作为工具来使用。真正从事编译器底层开发的人也是极少数。

但是,学习编译原理能够极大地加深程序员对编程语言本质和计算机系统运行机制的理解。对于有志于深入技术底层、或参与开源实战项目如语言工具链开发的开发者而言,掌握编译原理知识会带来显著的优势。因此,若学有余力,深入了解这门技术将是极具价值的投资。如果你想更深入地探讨此类话题,欢迎在云栈社区与更多同行交流。




上一篇:企业级单点登录SSO:核心架构、原理与登录流程详解
下一篇:2025前端框架热度榜单发布:Vue跌至第五,新秀Ripple表现亮眼
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-11 14:18 , Processed in 0.293895 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2025 云栈社区.

快速回复 返回顶部 返回列表