为何计算机人应该懂一点编译知识?

2009年冬,本科计算机《编译原理》课程结业考试结果公布,虽然取得了不错的考试成绩,可是自己除了熟练掌握了那些艰涩难懂的文法分析算法之外,对编译器的工作原理仍然貌似“一无所知”。这让我下定决心在本科毕业设计时,选定了《自定义语言编译器的设计与实现》这个题目,从此与编译领域结下了不解之缘。2012年读研期间,在之前实现的编译器的基础上继而实现了汇编器和静态链接器,并添加了编译优化器。2013年着手启动《自己动手构造编译系统》书稿的撰写,历经两年终于完稿。2016年8月,《自己动手构造编译系统——编译、汇编与链接》一书正式面市,为自己多年投入该方面的精力和心血圆满地划上了句号。

如果不是当初好奇心的驱动,是很难让自己在编译的这条路上坚持这么久的。不过我仍庆幸当初的“一意孤行”,它不仅实现了我构建编译系统的愿望,还让我继而完成了专著帮助到更多的人。更重要的是,实现编译系统的过程对计算机人的专业素养有着巨大的促进作用。从数据结构与算法的增强训练,到大型软件系统的设计与构建;从理解离散数学中代数系统和图论在计算机科学中的作用,到使用数据流和控制流分析进行代码优化;从设计编程语言每一个单词和语法,到使用文法分析算法理解程序的语义;从指令系统和二进制文件结构的研究到编译环境和操作系统运行时环境的深刻理解。可以说,构建编译系统的过程,涉及了计算机科学从原理到实践的方方面面。它带给一个专业学习者的不仅仅是一个软件系统的实现价值,而是系统级的从计算机底层到上层的全局性认识和理解。

编译,即便对于在计算机领域工作多年的人来说,也会觉得枯燥乏味。尤其是在高负荷的业务需求的压力之下,更鲜有人会主动关注它的原理和细节。快餐式的学习确实会在短期内对个人迅速了解未知事物有所帮助,而作为专业人士要保持长期的竞争力,提高专业素养是必不可少而又漫长的过程,了解和学习基础理论并加以实践是一种行之有效的方式。我个人踏入工作岗位这两年多来,一直从事大数据平台构建相关的工作。表面上看来与编译领域关系不大,但是实践中发现,当初在实现编译系统中学习和接触的计算机的原理和知识,曾无数次间接地帮助我更好地完成工作中的任务。无论是学习新的编程语言和工具,还是准确地理解开源系统的原理和使用,亦或是定位各类软件系统的运行时问题,还是开发新型的软件系统或者扩展已有软件系统的新功能,了解和熟悉计算机的工作原理确实给我带来了巨大的帮助。曾经有互联网公司的面试官这样说,公司更看重的是一个人解决问题的能力。说白了,学习新的技术,使用各色各样的软件系统,根本上来说还是为了解决来自于业务或系统的问题,而对计算机更加熟悉的了解,可以帮助我们在解决问题的时候更加游刃有余,胸有成竹。

《自己动手构造编译系统——编译、汇编与链接》一书详细阐述了一门编程语言从无到有的过程,从语言的功能特性设计,到词法、文法、语义分析;从编译器、汇编器的设计实现,到目标文件的链接生成可执行文件;甚至编译优化器的实现、二进制指令、可执行文件格式以及语言运行时和标准库的概念,都在书中做了认真细致地剖析。相信对本书的阅读,将是一次不错的获得知识的体验!

访问图书线上销售链接,请点击:http://item.jd.com/12004876.html

时间: 2024-10-11 11:45:59

为何计算机人应该懂一点编译知识?的相关文章

一点基础知识

1.肉鸡:所谓“肉鸡”是一种很形象的比喻,比喻那些可以随意被我们控制的电脑,对方可以是WINDOWS系统,也可以是UNIX/LINUX系统,可以是普通的个人电脑,也可以是大型的服务器,我们可以象操作自己的电脑那样来操作它们,而不被对方所发觉.2.木马:就是那些表面上伪装成了正常的程序,但是当这些被程序运行时,就会获取系统的整个控制权限.有很多黑客就是热中与使用木马程序来控制别人的电脑,比如灰鸽子,黑洞,PcShare等等.3.网页木马:表面上伪装成普通的网页文件或是将而已的代码直接插入到正常的网

冷静审视人工智能技术的本质 | 一图看懂新一代人工智能知识体系大全

冷静审视人工智能技术的本质 吴妙芸 来源:图灵人工智能(ID:TuringAI01) 人工智能的发展离不开基础支持层和技术层,基础支持层包括大数据.计算力和算法:技术层包括计算机视觉.语音识别和自然语言处理.在过去的2016年人工智能风风火火了一把,到目前为止,还在大力向前发展,研究机构.企业.投资机构和政府都对人工智能投入了很多关注,并陆续出台了一些政策.人工智能的技术本质是什么,本文会详细分析. 总览人工智能技术图谱 基础支撑层的算法创新发生在20世纪80年代末,是大数据和计算力将人工智能推

[转帖]一文读懂分布式架构知识体系(内含超全核心知识大图)

一文读懂分布式架构知识体系(内含超全核心知识大图) https://yq.aliyun.com/articles/721007?spm=a2c4e.11153959.0.0.2f464977X7lSdH 作者 | 晓土  阿里巴巴高级工程师 姊妹篇阅读推荐:<云原生时代,分布式系统设计必备知识图谱(内含22个知识点)> 导读:本文力求从分布式基础理论.架构设计模式.工程应用.部署运维.业界方案这几大方面,介绍基于 MSA(微服务架构)的分布式知识体系大纲,从而对 SOA 到 MSA 进化有着立

人不仅需要勤奋努力 人生还需要一点智慧

人不仅需要勤奋努力 人生还需要一点智慧 人生是需要一点智慧,否则,你很可能就会感到迷茫和纠结的.人生是需要一点智慧的,否则,乐观者在磨难中看到机会,悲观者在机会中看到磨难.相同的视角,不同的角度,便会体会到天壤之别的差异. 我们每个人的心灵都是一扇窗,而心灵之外的所有事物,就构成了生活中花花绿绿.分外妖娆的世界.在这个多姿多彩的世界上,我们经历着人生的无常,多少次我们的心灵在黑暗.抑郁中徘徊,或因为失败而受挫折,或因为烦闷而感失落.多少次我们的灵魂饱经生活的磨难,几欲跌进绝望的深渊.而在生活中我

【转】牛人整理分享的面试知识:操作系统、计算机网络、设计模式、Linux编程,数据结构总结

基础篇:操作系统.计算机网络.设计模式 一:操作系统 1. 进程的有哪几种状态,状态转换图,及导致转换的事件. 2. 进程与线程的区别. 3. 进程通信的几种方式. 4. 线程同步几种方式.(一定要会写生产者.消费者问题,完全消化理解) 5. 线程的实现方式. (也就是用户线程与内核线程的区别) 6. 用户态和核心态的区别. 7. 用户栈和内核栈的区别. 8. 内存池.进程池.线程池.(c++程序员必须掌握) 9. 死锁的概念,导致死锁的原因. 10. 导致死锁的四个必要条件. 11. 处理死锁

【原创】研发应该懂的binlog知识(下)

引言 这篇是<研发应该懂的binlog知识(上)>的下半部分.在本文,我会阐述一下binlog的结构,以及如何使用java来解析binlog. 不过,话说回来,其实严格意义上来说,研发应该还需要懂如何监听binlog的变化.我本来也想写这块的知识,但是后来发现,这块讲起来篇幅过长,需要从mysql的通讯协议开始讲起,实在是不适合放在这篇文章讲,所以改天抽时间再写一篇监听binlog变化的文章. 说到这里,大家可能有一个疑问: 研发为什么要懂得如何解析binlog? 说句实在话,如果在实际项目中

C++ 中有关const引用的一点小知识

在读<C++ Primer>时,发现之前对const的概念不是很清晰,只知道如何去使用,于是翻开const引用部分又阅读了一遍,发现有两点自己要注意的地方 1.const限定的对象不可以初始化非const引用 ex. 1 const int src = 512; 2 const int &ok_dest = src; //ok: 引用和初始化对象都是const 3 int &err_dest = src; //error : 引用为非const 原因很简单, src 是不可以被

开发辅助 | 前端开发工程师必懂的 UI 知识

       移动 UI 设计的世界 ... 1.屏幕尺寸 屏幕大小,指屏幕对角线的长度,而不是屏幕的宽度或高度: 单位为英寸 如 iPhone 7 屏幕尺寸为 4.7 英寸:三星 S6 屏幕尺寸为 5.1 英寸: 2.屏幕像素密度 --- ppi 指每英寸屏幕搜拥有的像素数:由屏幕尺寸和屏幕里所包含的像素数量 计算出来的单位: ppi 指每英寸所拥有的像素数 ,即每英寸像素. 像素密度越高,代表屏幕图像显示越清晰. 同样5英寸的屏幕,像素数多,屏幕像素密度大,屏幕更清晰: 屏幕尺寸 和 像素数

计算机构成简介与Linux基础知识

◆?命令--Linux学习的基础,而基础就是核心.????◆?没有基础就只如空中楼阁,每次处理问题的时候,都需要向外界的力量求教,而缺乏自己解决问题的能力.????◆?学习比较被动,知识的储备速度不能紧跟使用需求.????◆?SO,夯实基础反而成为重中之重.想要万丈高楼平地起,就先打好地基,在人们还看不见的时候,挥洒着汗水:而时间会给你成长的回报! 一.计算机构成与功能简介 ?计算机(computer),也称电脑. 1.五大硬件:????????????●?控制器????????????●?运算