首页 > 代码库 > 如何学习编者原理
如何学习编者原理
看了一下现有的答案,分几个部分来回答这个问题.
1. 知乎上对于新手推荐的(高票)答案通常都存在很大问题。倒不是说推荐的东西不够经典,而是推荐的东西确实很好,走的路太弯太崎岖,不太适合新手。像类似于『看龙书』、随手扔一本纯英文的书、没有公式也能讲清楚、『动手开始写』这类答案看似逼格很高,分分钟体现答题人的情怀,其实对新手毫无帮助,因为对于一个『不知道从何下手』的人来说,无论是理论经典还是直接实战,都是不切实际的(居然还让我直接读英文?这得多少功底才能从读下去到读懂了?都说了『不知道从何下手』了)。且不去揣测这些推荐的真正目的是什么,但有理由怀疑这些推荐其实希望新手把自己以前踩过的坑再踩一遍,或者压根就不希望让新手入门,甚至单纯处于一个目的: **。
2. 在回答『如何学习编译原理』问题之前。编译原理并非随随便便就能入门的,一定要正视这个问题。编译原理的学习和实践通常基于对计算机编译过程、计算机基本工作原理、甚至一定的数学知识有一定积累,这些知识分别分布并应用在了编译原理的不同阶段。没有这些基本知识的积累,很快就会在某个阶段由于功底不够而无法再继续后面的学习。适合(完整, 前后端)学习编译原理的必要不充分条件是能够回答下面的所有问题,这些问题实在是太过于简单,如果这都答不上来真的别学了,好好补补基础:
a. 编译型语言和解释型语言的区别是什么?
b. 编译经历了哪几个基本过程? 每个过程主要干了什么事情?
c. 详细描述一下你最熟悉的语言中,赋值号的左边可以由哪些部分组成? 右边可以由哪些部分组成?
d. 什么是递归? 如何终止一个递归行为?
e. 什么是贪心过程?
f. 听说过 KMP 吗? 介绍一下它的基本思想.
g. 生成树是什么?
h. 你觉得编程语言和自然语言最重要的区别有哪些?
i. 什么是有限状态自动机? 你知道几种不同的自动机类型? 它们之间的区别和联系?
j. 内存被人为的划分成了哪几种不同的类型, 它们之间的区别和联系?
k. 什么是中断? CPU 在响应中断时会做什么事情?
l. 你最熟悉的语言有垃圾回收机制吗?
若有描述它进行垃圾回收的原理, 若没有则描述你在编写程序时是如何管理内存的?
3. 回答『如何学习编译原理』。
a. 学习 C 语言, 不要求熟悉, 但至少要弄明白指针的思想.
b. 学习数据结构, 尤其是对字符串/树/图的相关基本处理手段要非常熟悉.
c. 学习离散数学, 对树和图的相关理论要比较心中有数
d. 学习汇编语言, 不要求熟悉这门语言, 但至少要弄明白汇编指令、数据在CPU和存储器之间的交互机制.
e. 着手学习编译原理, 推荐先找一本国内高校普遍使用的教材(比如我本科学校用的是胡元义的一本编译原理教程, 很一般, 但很适合先入门), 入门后(搞明白编译原理到底是要干嘛, 解决什么样的需求)马上扔掉转龙书, 此法最佳.
f. 这里讨论的"学习"包含了编译器前后端.
最后提示:不要忽视理论的重要性, 因为编译原理本身就是很理论的;边学边做。
转自:https://www.zhihu.com/question/21515496
如何学习编者原理