计算机最早出现的时候,代码是用打孔机打在卡带上,然后塞进特定设备读取执行,后来终于可以键盘输入了,却只能使用直接面向系统的汇编语言,用汇编语言编写简单的数学计算,其实也不难,但如果你要想用汇编语言做一个复杂的系统,想想那酸爽。

所幸编译器出现了,更容易理解和上手的编程语言出现了,程序员这个职位才得以普及,软件行业,乃至互联网行业才得以发展。

编程语言分两种执行方式,一种是编译执行,典型如历史悠久的C语言,一种是解释执行,典型如曾经火爆的PHP。

但可能有的程序员会觉得,我也不会去设计一门新的编程语言,有必要学习编译原理或者解释规则吗?学了有什么用呢?

我先说个故事,几年前,有安全公司发现,有很多常见的苹果 APP 被安装了后门程序,这其中涉及的 APP 有微信,网易音乐,滴滴,12306,同花顺,联通营业厅,中信银行等等等等,覆盖人群过亿。你没听错,是不是觉得不可思议,顶级巨头们研发的 APP 很多被人植入了后门,是不是感觉很震惊,为什么如此多巨头同时中招,而苹果市场也被蒙蔽呢?

因为有人在通过迅雷下发的编译器里做了手脚。我们都知道的,苹果官网对中国网络环境并不友好,很多程序员用迅雷下载编译器,虽然 APP 的源代码都是正常的,但编译器加了尾巴,结果就造成了如此让人难以置信的后果。你现在可以搜索苹果 Xcode 后门事件,依然可以搜到当年事件的回顾。

在编译器里做手脚,几乎所有巨头都中招,而很长时间无人发现。

当然,你说,这跟编译原理有什么关系,咱不是教人学坏啊,但你看精通编译原理的人,能搞出多可怕的事情。如果你想去做防御别人使坏的人,你至少也要懂这些吧。

2002年-2004年,我在绿盟做程序员,跟 TK 教主,袁哥等大牛们做同事,当时才知道,大部分最严重的系统级安全漏洞,基本上都是来源于缓冲区溢出。知道一个顶级的未公开缓冲区溢出漏洞在地下黑市值多少钱么?几百万美金,不开玩笑,而买主用它来搞事产生的效益,或者造成的破坏,可就远不止这个数了。

缓冲区溢出漏洞的机制是什么,其实都在编译原理里面。操作系统是如何对内存和代码进行地址分配和执行的,如果不理解编译原理,你就无法理解,为什么普通程序员看上去逻辑毫无异常的代码,在编译执行的过程中,会存在致命的漏洞。

绿盟当年混出来的安全大牛目前在各大互联网巨头担任要职,光腾讯就有玄武实验室的 TK 教主和湛卢实验室的袁哥两大旗舰型人物。当然安全大牛们也不止绿盟这一支,想去应聘做这些大牛的弟子么?想挑战最前沿的漏洞挖掘技术么?编译原理多半是基本功来着。

除了信息安全领域,编译原理属于基本功之外,在高性能的诉求场合,比如淘宝应对双11的场合,要对系统做极致优化,怎么叫极致优化,你要对程序系统调用的每个逻辑都了如指掌。如果你常去 Qcon 这样的架构师峰会听阿里专家讲如何应对极致并发的场景经验,其实很多优化思路和方案,来源于编译原理的认知。

实际上,编译原理以及代码解释器不是用于炫耀的屠龙技,程序员在工作中经常会碰到需要编译技术的场景,比如:

  • 编写界面模板引擎;

  • 为项目编写各种各样的 DSL;

  • 深度理解甚至开发出 Spring、Hibernate、阿里巴巴 Druid 这样的工具。

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

关于解释器,我多说几句,20年前呼叫中心系统就已经支持智能脚本解析,现在区块链上的智能合约,也是一种脚本解析能力,各种公链推崇的所谓图灵完备的智能合约,说的不就是脚本解析能力的强大么。

掌握了编译和解释器技术,你可以获得什么能力呢?简直太多了:

  • 让你的软件支持公式和脚本,从而具有更强的灵活性;

  • 有能力参与基础软件的研发,因为它们很多都会用到编译技术,比如 Hibernate、Spring、大数据系统等等;

  • 编写特定领域语言,解决领域问题;

  • 写出高效、高质的代码,成为更优秀的开发者;

  • 更好地理解和学习新的语言,降低学习成本,快速跟进技术潮流。

除了实践性强,学习编译技术对于提升程序员的职场竞争力也很重要。

 

比如,你会发现一些大公司招聘程序员时,有难度的面试题都是涉及底层机制的。理解了底层机制,才能更深入的思考问题和解决问题。学习编译原理,能让你从前端的语法、代码优化、与硬件结合等维度,加深对计算机的理解,提升工作中解决疑难杂症的能力。更不用说信息安全领域,不懂编译原理,系统漏洞怎么挖啊。

如今的快餐式学习,虽然会帮助个人在短期内迅速了解一门技术,但程序员想要保持长期的竞争力,学习底层知识并进行实践,提升专业素养必不可少。也许你以后不会成为编译器开发者,但学好编译原理,一定会让你终生受益。

如何深入理解并实践编译原理?

很多同学说,知道编译技术的重要性,也很希望能啃下来,但总是会遇到许多问题:

  • 作为底层技术,编译原理出了名的晦涩难懂,学习完全没有头绪;

  • 网络上的资料过于抽象和理论化,篇幅长,讲解枯燥;

  • 畏难情绪严重,学习编译原理简直成了心魔。

在这里帮大家找到一个非常全面的编译原理知识框架图资料,能帮你更好的理解和实践编译原理,克服畏难情绪,这张图出自极客时间专栏《编译原理之美》,作者是宫文学。

宫文学是谁?

宫文学,北京物演科技 CEO。本科毕业于北京大学,硕士毕业于中科院。是国内最早做 BPM(流程管理平台)和 BI 平台(大数据平台)的创业者之一,2016年入选了厦门市第九批“双百计划”领军型创业人才。好像跟我是同一批。

说个好玩的,我们一起在厦门党校上过培训课,他当时好像就坐在我旁边。因为他一直拿着单反到处拍,印象颇深。扯远了,扯远了。

在编译技术上的实战经验非常丰富,曾经以3个人的团队,用编译技术做了一些硬核的产品原型,然后就跟联想集团签订了战略级合作协议,也做过电子表单和快速开发平台。

?扫描上图,立减¥5优惠口令:666bianyi

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

如何讲解编译原理?

我看了目录和内容,主要是从编译器的前端与后端两个层面来讲解编译原理的核心技术点,会举很多案例来帮你理解抽象的内容,并且教你在工作中真正用到编译技术。

具体分为三个部分:

第一部分:实现一门脚本语言

主要聚焦编译器前端技术,或者说是解释器的技术,通过具体实例讲解词法分析、语法分析、语义分析的原理,实现一门脚本语言,并用工具提升效率。

第二部分:实现一门编译型语言

主要聚焦编译器后端技术,讲解如何生成目标代码和对代码进行优化,并引入 LLVM 工具,最后生成可执行的文件能支持即时编译,并经过了多层优化。

第三部分:面向未来的编程语言

人工智能与编译技术结合是否会出现人工智能编程?这个模块将对编译技术的发展趋势进行分析,帮你更好地把握未来技术发展的脉搏。

学习完课程,你能收获什么?

1.系统掌握编译器核心技术

2.手动实现解释型和编译型2门语言

3.4大案例剖析编译技术的实际应用

4.编译技术的趋势解读

1分钟看看目录,跟市面上复杂的资料不同,内容精简到30多节,但涵盖的重点难点却一点都不少,就是为了能让你更高效、清晰的学懂、落地实践编译原理。

限时订阅福利

1.早鸟优惠¥68,原价¥99。结算时输入优惠口令「666bianyi」再减5元,到手价¥63,仅限前500人。

2.订阅课程后,可获得作者亲自整理的高清版「编译原理核心知识框架图」,获取方式:公众号后台回复「编译」。

?扫描上图,立减¥5优惠口令:666bianyi

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

学好编译原理,不一定非要自己写语言,但却能把很多其他程序员觉得很酷的东西看得透彻一点,不会只看到程序语言的设计表象,这也是十分重要的。

?点击「阅读原文」,一起攻克编译原理。

对程序员而言,有什么终身受用的底层知识?相关推荐

  1. 程序员健康指南 真的很受用

    程序员健康指南 真的很受用 程序员往往被要求不断的提高工作能力,技术水平,却很少被要求有自我管理健康的能力.年轻的时候用健康换钱,上了年纪就不得不用钱来换健康了. 本文从程序员的身体健康到心理健康,提 ...

  2. css点击a标签显示下划线_好程序员HTML5培训教程-html和css基础知识

    好程序员HTML5培训教程-html和css基础知识,Html是超文本标记语言(英语全称:HyperText Markup Language,简称:HTML)是一种用于创建网页的标准标记语言. Css ...

  3. 程序员是否可以作为终身从事的职业,以及程序员该何时考虑转岗

    首先,当前程序员职业确实存在职业生命周期偏短的问题,原因是多方面的,包括工作量大.工作周期长.技术迭代速度快.岗位竞争压力大等因素,但是当前不少技术团队中,也有很多70后.80后的程序员,而且随着人工 ...

  4. 程序员葵花宝典,使你终身受益的箴言

          相信每一个程序员,在刚开始入门的时候都有一个师傅,他可能是你的授课老师,也可能是你所学视频的网课老师,甚至是某本书的作者等等,你通过向他们学习打开了程序世界的大门.       对我自己来 ...

  5. 中年程序员,有哪些关于保护身体健康的知识分享给同行的你?

    归根到底,程序员铁打的办公室久坐人群,一到周末,闷骚的程序员们自然没心思看所谓的技术文,本周末让我发车带大家一起迈向健康生活.. 废话不多说,直接正文先阅读以下图片! 应该没有直接拿手机左右翻的吧.. ...

  6. Web前端程序员该如何准备面试?这些面试知识应该掌握

    面试其实是实力和运气并存的事情,所以一方面我们要做好知识的准备,另一方面也要抓住时机,该出手就出手,那么Web前端程序员该如何准备面试呢?下面和一起来看看吧! 一:Web前端面试什么? 针对Web前端 ...

  7. 程序员杂志为啥没有了_计算机基础知识,程序员必备知识,java必会!新建一个TXT,发生了什么?...

    作者 | ithuangqing 来源 | 编码之外(ID:ithuangqing) 其实我在逐渐使用Windows的过程中发现"记事本"这个工具真的挺好用的!就是它: 平常我喜欢 ...

  8. java 快速从树节点找到数据_14期每日分享Java程序员分享超全哈希相关的知识

    什么是每日分享? 饥人谷每天为大家带来一篇程序员分享!内容都来自于热爱编程.热爱生活的小伙伴们!分享的话题与编程.生活.兴趣.爱好.运动等相关! 想要每天都进步一点点的小伙伴们快点下关注吧! 今天的分 ...

  9. 资深程序员教你,用python入门的知识抓取抖音短视频,太厉害了

    抖音短视频可以说是当下最流行的自媒体平台,而python编程同样也是目前最流行的编程语言. 今天,就让一位大厂的资深程序员,用最简单的方式,使用python抓取抖音短视频. 到时候我会把所有的源代码都 ...

最新文章

  1. mongodb 只查询某个字段
  2. Python:一文让你彻底理解numpy中axis=-1/0/1/2... [实例讲解:np.argmax(axis= -1 0 1 2) np.sum(aixs= -1 0 1 2)]
  3. 用java判定三角形_人教版初中数学八年级上册“角角边”判定三角形全等公开课优质课课件教案视频...
  4. 【STM32H7】第10章 ThreadX GUIX移植到STM32H7(GCC)
  5. python生成首尾相连的字符串
  6. Python获取本机ip地址的两种有效方法
  7. java 判断图片合适,Java 判断图片色彩
  8. 网站镶嵌网站显示代码
  9. 计算机网络实验三——IP网络规划与路由设计
  10. 2020年11月份某kh比赛部分CTF赛题求大佬解题思路
  11. java同名变量在list中添加两次_去除集合中自定义对象的重复值(对象的成员变量值都相同)...
  12. jupyter notebook简明安装、配置、使用教程
  13. 阿里外包java程序员分享,看完你还会去外包吗?
  14. java 生成uuid
  15. 检测下你的显示器是否有问题
  16. Ubuntu Linux 的 十六進位(hex)編輯器
  17. Latex之修改参考文献reference的字体大小
  18. 小米note2开启位置服务器,小米note2如何解锁system系统分区教程_小米note2解系统分区...
  19. 小程序wx.getUserInfo获取不到头像
  20. 北京环球度假区与腾讯互动娱乐达成合作,引入系列腾讯游戏IP

热门文章

  1. K线类型识别—单K线之阴线
  2. Linux常用工具大全
  3. 电商大佬联手ERP厂商的背后故事(上个月就想写,一直没时动笔,终于:)
  4. 机器学习的数学基础1:集合、关系、元组
  5. 【安卓逆向】 浦X银行签名校验,逆向工程师绝不认输
  6. 百草味爆发性增长的秘密:5%靠营销,95%靠产品
  7. docker compose搭建NACOS集群
  8. 《微积分基础》学习(一)
  9. 粪菌移植构建人源化菌群小鼠的分析探讨
  10. 移动Web实训DAY-2