写点什么

为什么你要学习编译原理?

  • 2019-08-15
  • 本文字数:2598 字

    阅读完需:约 9 分钟

为什么你要学习编译原理?

你好,我是宫文学,一名技术创业者。我曾经参与过几个公司的创业过程,在开源技术社区也做过一些工作,现在是北京物演科技 CEO。最近我在极客时间开设了一门课程《编译原理之美》


我喜欢做平台性的软件,而编译技术就是产品取得优势的关键。我是国内最早一拨做 BPM 的,也就是流程管理平台,也是最早一拨做 BI 平台的,现在流行叫大数据。当时我们只有 3 个人,用编译技术做了一些硬核的产品原型,跟联想集团签订了战略级合作协议。之后我又做过电子表单和快速开发平台,而它们的核心就是编译技术。


我参与的第一个公司卖给了上市公司,第二个在新三板上市,这些成果在一定程度上受益于编译技术。而我呢,对编译技术一直很重视,也一直保持着兴趣。所以很高兴能在“极客时间”上分享与编译技术有关的原理和经验,希望我的分享能帮助你在编译技术这个领域获得实实在在的进步。


众所周知,编译技术是计算机科学皇冠上的明珠之一。历史上各门计算机语言的发明人,总是被当作英雄膜拜。比尔·盖茨早期最主要的成就,就是写了一个 Basic 的解释器。当年 Brendan Eich 设计的 JavaScript,虽然语言略微有点儿糙,但却顽强地生存到了现在。


很多国外厂商的软件,普遍都具备二次编程能力,比如 Office、CAD、GIS、Mathematica 等等。德国 SAP 公司的企业应用软件也是用自己的业务级语言编写的。目前来看,谷歌也好,苹果也好,微软也好,这些技术巨头们的核心能力,都是拥有自己的语言和生态。可见编译技术有多么重要!

编译技术,与你的工作息息相关

但也有一些程序员认为:“我不可能自己去写一门新的语言,还有必要学习编译原理吗?”


这种想法是把编译原理的用途简单化了。编译原理不是只能用于炫耀的屠龙技。 别的不说,作为程序员,在实际工作中你经常会碰到需要编译技术的场景。


Java 程序员想必很熟悉 Hibernate 和 Spring,前者用到了编译技术做 HQL 的解析,后者对注解的支持和字节码动态生成也属于编译技术。所以,如果你要深入理解和用好这类工具,甚至想写这种类型的工具,会需要编译技术。


而 PHP 程序员在写程序的时候,一般会用到模板引擎实现界面设计与代码的分离。模板引擎对模板进行编译,形成可执行的 PHP 代码。模板引擎可以很强大,支持条件分支、循环等语法。如果你了解编译技术,会更容易掌握这些模板引擎,甚至写出更符合领域需求的模板引擎。


我们 2001 年开发了一款工作流软件,里面有依据自定义公式判断流转方向的功能。像这类需要用户自定义功能的软件,比如报表软件、工资管理软件等,都需要编译技术。


如果你要参与编写一个基础设施类的软件,比如数据库软件、ETL 软件、大数据平台等,很多需要采用编译技术提供软件自带的语言功能,比如 SQL。这种功能无法由外部通用语言实现。


除此之外,解析用户输入,防止代码注入,为前端工程师提供像 React 那样的 DSL,像 TypeScript 那样把一门语言翻译成另一门语言,像 CMake 和 Maven 那样通过配置文件来灵活工作,以及运维工程师分析日志文件等等高级别的需求,都要用到编译技术。


除了丰富的应用场景,学习编译技术对于提升程序员的竞争力也很重要。现在一些大公司在招聘程序员时,有难度的面试题都是涉及底层机制的。因为理解了底层机制,才能有更深入思考问题,以及深层次解决问题的能力,而不是只能盲目地搜索答案,从表面解决问题。而学习编译原理能让你从前端的语法维度、代码优化的维度、与硬件结合的维度几个方面,加深对计算机技术的理解,提升自己的竞争力。


所以,无论你是前端工程师、后端工程师,还是运维工程师,不论你是初级工程师还是职场老手,编译技术都能给你帮助,甚至让你提升一个级别。

编译技术并不难学

但问题来了,你可能会说:“我知道编译技术很重要,我也很想把它啃下,可是我每次鼓起勇气拿起《编译原理》,啃不了多少页就放下了。编译原理已经成了我的心魔……”


在我看来,你之所以遇到困难,很大一个原因在于市面上讲述编译原理的内容往往过于抽象和理论化。学习,说到底是一个学和练,以及学以致用的过程。所以在和朋友们沟通了解之后,我想用下面的思路组织课程内容,帮你克服畏难情绪,更好地理解和学习编译原理。


我会通过具体的案例带你理解抽象的原理。比如语义分析阶段有个 I 属性和 S 属性,传统课本里只专注 I 属性和 S 属性的特点和计算过程,很抽象。那么我会分析常用语言做语义分析时,哪些属性是 I 属性,哪些是 S 属性,以及如何进一步运用这些属性,来让你更直观地了解它们。


我也会重视过程,带你一步步趟过雷区。我写了示例程序,带你逐渐迭代出一门脚本语言和一门编译型语言。当然了,我们会遇到一些挑战和问题,而在解决问题的过程中,你会切切实实体会到某个技术在哪个环节会发挥什么作用。最重要的是,你会因此逐渐战胜畏难情绪,不再担心看不懂、学不会。


我还会让你在工作中真正运用到编译技术。课程里的代码,可以给你的工作提供参考。我介绍的 Antlr 和 LLVM 工具,前者能帮你做编译器前端的工作,后者能帮你完成编译器后端的工作。在课程中,你能真正运用编译技术解决报表设计等实际问题。


为了帮你迅速了解课程的知识结构体系,我画了一张思维导图。课程从三方面展开,包括实现一门脚本语言、实现一门编译型语言和面向未来的编程语言。



  • 课程的第一部分主要聚焦编译器前端技术,也就是通常说的词法分析、语法分析和语义分析。我会带你了解它们的原理,实现一门脚本语言。我也会教你用工具提升编译工作的效率,还会在几个应用场景中检验我们的学习成果。

  • 第二部分主要聚焦编译器后端技术,也就是如何生成目标代码和对代码进行优化的过程。我会带你纯手工生成汇编代码,然后引入中间代码和后端工具 LLVM,最后生成可执行的文件能支持即时编译,并经过了多层优化。

  • 第三部分是对编译技术发展趋势的一些分析。这些分析会帮助你更好地把握未来技术发展的脉搏。比如人工智能与编译技术结合是否会出现人工智能编程?云计算与编译技术结合是否会催生云编程的新模式?等等。

写在后面

课程虽然只有 30 多节,但每节课绝对是干货满满。我希望这个课程能让所有有志于提升自己技术的工程师,顺利攻下编译技术这重要的一关,能够在工作中应用它见到实效,并且对编程理解更上一层。


最后,我希望你在留言区立下 Flag,写下自己的计划,在“极客时间”与志同道合的朋友互相监督,一起学习,一起进步!


《编译原理之美》限时订阅福利


戳我订阅,输入优惠口令: bianyi666


到手价 ¥63,仅前 500 人有效


2019-08-15 12:182792

评论

发布
暂无评论
发现更多内容

“程”风破浪的开发者|Web3.0去中心化预言机网络技术剖析

小明Java问道之路

架构 预言机 Web3.0 10月月更 “程”风破浪的开发者

速度快、时延低、更安全,华为云CDN助力企业创新发展!

路过的憨憨

华为

node版本管理器:nvm 和 n区别

乌龟哥哥

10月月更

外包学生管理系统架构设计

Jack

架构实战训练营9期

架构实战训练营模块 3 作业

atcgnu

OverOps在根本原因分析中重要性

阿泽🧸

10月月更 OverOps

Impala基本架构

穿过生命散发芬芳

impala 10月月更

华为云CDN为什么能够打通数据传输阻碍?

路过的憨憨

华为

上网冲浪总是慢?试试华为云CDN,高效加速真体验!

路过的憨憨

Laravel-EloquentORM高级部分解析

乌龟哥哥

10月月更

华为云 CDN 是如何修炼 “ 内功 ” 的?

IT科技苏辞

TOGAF企业架构框架-1概览

Marvin Ma

架构 企业架构 TOGAF

服务巡检

芯动大师

Python 10月月更 服务巡检

jsp 十个常用标记回顾

你笑一下嘛!

前端 jsp 10月月更

高效IO之零拷贝技术

乌龟哥哥

10月月更

技术同学如何面对裁员浪潮?

老张

职场发展 求职面试

2022-10-26:以下go语言代码输出什么?A:1 3 2;B:1 2 3;C:3 1 2;D:3 2 1。 package main import “fmt“ type temp struc

福大大架构师每日一题

golang 福大大 选择题

千锋HTML5大前端全网首发Web3.0面授课程,助力个人入局热门赛道!

千锋IT教育

揭开epoll面纱:Nginx,Redis等都在用的多路复用,到底是什么?

董哥的黑板报

源码 高并发 多路复用 C语言 网络

网络畅通的“无名英雄”:华为云CDN,让数据传输又快又稳

路过的憨憨

华为

“程”风破浪的开发者|OpenHarmony 开发环境搭建

鸿蒙之旅

OpenHarmony 10月月更 “程”风破浪的开发者

架构实战营 - 学生管理系统架构设计

π

#架构实战营

模块三作业-外包学生管理系统架构设计

Diana S

架构训练营

安全、快速、稳定,华为云CDN赋能中小企业数字化发展

IT科技苏辞

智慧城市、数字政府、城市大脑、一网统管之间有什么关系

雨果

智慧城市 城市大脑 数字政府 一网统管

【web 开发基础】PHP 的流程控制之嵌套(巢状)条件分支结构 -PHP 快速入门 (15)

迷彩

嵌套条件表达式 10月月更 web开发基础 PHP基础

IoT设备与手机App之间如何实现实时消息通信——业务场景最佳实践

阿里云AIoT

物联网 IoT 传感器 智能硬件

“程”风破浪的开发者|研究生学习路程回顾

Studying_swz

学习方法 “程”风破浪的开发者

【web 开发基础】PHP 的流程控制之多向条件分支结构 -PHP 快速入门 (14)

迷彩

10月月更 PHP基础 if条件分支 多条件分支

3分钟快速了解什么是千兆以太网?

wljslmz

网络技术 以太网 10月月更 千兆以太网

TOGAF企业架构框架-2常见术语

Marvin Ma

架构 企业架构 TOGAF TOGAF术语

为什么你要学习编译原理?_语言 & 开发_宫文学_InfoQ精选文章