结束语 | 实战是唯一标准!
该思维导图由 AI 生成,仅供参考
- 深入了解
- 翻译
- 解释
- 总结
编译原理实战课程的结束语强调了实战是检验编译原理掌握程度的唯一标准,也是学习编译原理的真正目标。作者认为,工程性很强的计算机领域决定了学习编译原理不仅仅是掌握理论,而是要将其付诸实践。在实践中,学习者会遇到许多疑惑,如词法分析和语法分析工具的选择、后端的实现方式等,这些问题在教科书中难以找到答案,因此实战成为决策的标准。文章还探讨了理论与实践的重要性,以及对所使用语言的编译器进行深入研究的必要性。作者鼓励学习者抛弃传统学习编译原理的困扰,多看实际的编译器,多自己动手实践,从而具备更好的技术方案鉴别力。总的来说,本文强调了实战在学习编译原理中的重要性,以及对所使用语言的编译器进行深入研究的必要性。 从程序运行机制的角度,去理解编译技术 学习编译原理的一个挑战,就在于你必须真正理解程序是如何运行的,以及程序都可以有哪几种运行方式。这样,你才能理解如何生成服务于这种运行机制的目标代码。 最最基础的,你需要了解像C语言这样的编译成机器码直接运行的语言,它的运行机制是怎样的。代码放在哪里,又是如何一步步被执行的。在执行过程中,栈是怎么变化的。函数调用的过程中,都发生了些什么事情。什么数据是放在栈里的,什么数据是放在堆里的,等等。 在此基础上,如果从C语言换成C++呢?C++多了个对象机制,那对象在内存里是一个什么结构?多重继承的时候是一个什么结构?在存在多态的时候,如何实现方法的正确绑定?这些C++比C语言多出来的语义,你也要能够在运行时机制中把它弄清楚。 再进一步,到了Go语言,仍然是编译成机器码运行的,但跟C和C++又有本质区别。因为Go语言的运行时里包含了垃圾收集机制和并发调度机制,这两个机制要跟你的程序编译成的代码互相配合,所以编译器生成的目标代码里要体现内存管理和并发这两大机制。像Go语言这种特殊的运行机制,还导致了跨语言调用的难度。用Go语言调用C语言的库,要有一定的转换和开销。 然后呢,语言运行时的抽象度进一步增加。到了Java语言,就用到一个虚拟机。字节码也正式登台亮相。你需要知道栈机和寄存器机这两种不同的运行字节码的解释器,也要知道它们对应的字节码的差别。而为了提升运行速度,JIT、分层编译和逆优化机制又登场,栈上替换(OSR)技术也产生。这个时候,你需要理解解释执行和运行JIT生成的本地代码,是如何无缝衔接的。这个时候的栈桢,又有何不同。 然后是JavaScript的运行时机制,就更加复杂了。V8不仅
《编译原理实战课》,新⼈⾸单¥59
全部留言(8)
- 最新
- 精选
- whoami感受到老师的雄心,看得我嘴唇发干,眼神坚定。坚持学习能够做到,但我有一个坏习惯——贪多,这一块儿不会,学,那一块儿不知道,学,以至于感觉自己处于“学而不思则罔”的状态。焦虑、迷茫、不甘心,老师,你能给我一些建议吗?
作者回复: 世界是在矛盾中前行的,人是在矛盾中成长的。 有贪心是好事。否则,连学习动力都没有呢,岂不是更糟糕。 你遇到的困惑应该不是特例,每个有志青年都多多少少遇到过。 但是,还是会给你一些具体的建议: 1.计算机领域的知识确实是很多的,多到一个人一辈子都学不完。你看,前端技术和后端技术;前端分n个平台,m个技术栈;后端也有x种语言,y种架构...。每种学精都要花费大量精力。所以确实要有所取舍。 2.每个领域的知识都是一个倒金字塔的形状。上层的应用性的技术很多,但底层的基础原理其实并不多。所以,掌握大部分的底层原理反倒是有可能的。 3.但我们要把底层原理和上层应用性的技术关联起来学习,这样效果会比较好。也就是从上面向下打一个通道。对于你所使用的应用性的技术,你知道从上到下每一层是怎么实现的。 举个例子,现在很多人都用MySQL数据库。那么从上到下有下面的一些知识要去搞清楚: (1)掌握SQL,以及背后的数学基础:关系代数。知道从比较高的抽象度上,其实就是那么几个基本的运算。 (2)往下一层,了解数据库服务器的架构,知道服务器是如何响应客户端请求的,如何保证事务机制的,在这个过程中是怎么使用日志和锁的。 (3)再往下一层,探究一下MySQL是如何解析SQL的,如何把SQL分解为第一层中的那些基本运算的。以及它是如何处理并发的,如何处理客户端连接的(比如,如果客户端断连了,服务器的那些运算如何及时停下来),如何生成最佳的SQL执行计划的,等等。这一层次的内容,我在《编译原理实战课》中有所涉猎。 (4)继续往下,数据是怎样保存在磁盘上的,如何划分磁盘空间的;索引是如何建立和维护的;查找一套数据,都有哪几种方法,代价分别有多高… 你会发现,如果把MySQL搞清楚,你会涉及到各种基础原理:并发、数据结构(比如索引的结构)、算法(比如最佳执行计划算法)、计算机组成(磁盘IO等)、网络(客户端和服务器的通讯协议)等等各种基础原理。而如果一个同学把这些问题都能搞明白,那么他会成为一个很高级的数据库专家,甚至可以自己动手该数据库中的一些部件,比如实现高效的异地灾备等。 把自己经常使用的高级语言,从顶到底搞清楚,也会达到同样的效果。我在《编译原理实战课》中也解析了n门语言的实现机制,希望能起到对知识的穿针引线和启发思维的作用。 4.心态上的调整:要有玩的心态。不要把学习当成任务,不要搞得太功利,要搞得有趣、好玩。我见过很多大牛(包括某些大厂的技术奠基性的人物),都是先玩,搞一些自己喜欢的东东,比如当年某人做了个能在家里默默下载东西的小硬件,还能远程控制,这在当年网速很低的时代很有用,但要做这个小硬件,就需要洞悉网络的基础原理,还要能搞Linux,还要会搞一个小板子。你把这么多知识都能串起来,去搞定某些大型的云计算的场景也是没有问题的(事实也是如此)。 好了,就说这么多,希望对你和其他同学有所启发!
2020-11-1536 - VVK感谢老师的分享,也期待老师对Rust编译器的加餐。
作者回复: 好!又一个对Rust语言感兴趣的同学!
2020-10-046 - 漏网之渔期待老师对Rust编译器的加餐!
作者回复: Rust正在准备中。前几天先把C++的写了一篇。
2020-10-293 - 无形加油!一起为中国的软件崛起而奋斗!
作者回复: 点赞! 我们可以多做点底层技术了,以前这都是别人说了算。
2021-01-11 - 风感谢老师的分享
作者回复: 感谢你一直的跟进:-)
2020-11-12 - andre宫老师,您有没有编译技术的交流群(微信\qq或者电报都可以),最近在做动态语言的JIT,经常遇到问题苦于无人可以交流,有种闭门造车的感觉。2022-06-14
- ifelse学到很多2022-02-01
- fy老师,我买的那些课程,还是你这门课程过瘾,编译原理之美也买了,看到了编译器的后端技术,这课程太硬核了,其它课程相比这门课程觉得是小儿科。只有坚持最后,并反复看,才能搞懂。深知你们这一代程序员的功底太扎实了。2021-03-07