如何学习编者原理

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何学习编者原理相关的知识,希望对你有一定的参考价值。

看了一下现有的答案,分几个部分来回答这个问题.

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

以上是关于如何学习编者原理的主要内容,如果未能解决你的问题,请参考以下文章

Vue.js 模板解析器原理

漫谈如何学习操作系统原理

转载如何自学深度学习技术,大神Yann LeCun亲授建议

深度学习-综述

如何学习编译原理

结束 JavaPython 之战,如何学习所有编程语言?