• 如何学习编者原理


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

    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

  • 相关阅读:
    AFHTTPRequestOperationManager网络请求的时候添加一个菊花,requestmapping
    媒体层图形技术之Core Animation 学习笔记
    PHP自动判断字符集并转码
    用PHP实现游戏中的一些常见功能
    从几个简单的程序看PHP的垃圾回收机制
    递归遍历PHP多维数组
    CodeIgniter的缓存机制与使用方法
    PHP的内存泄露问题与垃圾回收
    记录一下PHP数组数据分页的方法
    PHP正则表达式移除超链接文本
  • 原文地址:https://www.cnblogs.com/hzp-1/p/6657158.html
Copyright © 2020-2023  润新知