zoukankan      html  css  js  c++  java
  • 如何学习编者原理

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

    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

  • 相关阅读:
    JSDOM优化
    Firebug Console 与命令行全集
    input输入框和 pure框架中的 box-sizing 值问题
    模块化网站注意事项
    COOKIE
    鼠标滚动
    拖拽的基本函数(已有限制范围和修复浏览器默认行为以及磁性吸附、碰撞检测、改变层大小、模拟滚动条)
    app_can 的AJax异步,两个解决方案
    基于jQuery的message插件实现右下角弹出消息框
    C#后台讲字符串转化为计算公式
  • 原文地址:https://www.cnblogs.com/hzp-1/p/6657158.html
Copyright © 2011-2022 走看看