高等数学
对于大学的科班学生,这部分同学以后也许会去做算法(CV、NLP之类)、游戏引擎、信息安全编码等,这些方向对数学要求就会偏高,在计算机领域,线代、概率论、统计学这些数学分支相对比较重要,计算机本质上还是离散的。比如在机器学习或数据挖掘中常常用线性代数来降低数据维度,很多问题最终都能化为求解线性方程组。所以为了避免以后想走这些方向却被数学卡住,在大一、大二上数学课的时候就好好的学一下。书到用时方恨少,不要现在以为没用处就不好好学,等你需要的时候,就知道后悔了。
C语言
其他的东西都没有比 C 语言更适合用来理解计算机系统了。我们后面将会提到的操作系统、体系结构 这些东西非常适合用 C 语言去理解或者去实践。并且 C 语言本身的语言特性非常少,但是想学好又是不容易,很多人都觉得 C 语言难,难在哪里呢?简陋的标准库,几乎没有可用的数据结构和算法,指针很难理解和使用,需要了解汇编、链接、装载、内存等才能把 C 语言用好。不巧的是,这些东西正是计算机系统知识的一部分,所以用 C 语言作为学习计算机系统知识是最有效率的方式。任何比C语言更低级的语言,都不足以完整地抽象一个计算机系统;任何比C高级的语言,都可以用C来实现。这真是极高而中肯的评价!所以对于计算机科班来说,不管你是做前端还是后端,算法还是开发,C 语言都建议你好好学习。这是无关方向的一门语言,就是基础。
编译原理
学好编译原理有啥用?你会站在更高的角度去审视这些编程语言,看到的不再是表面的语法,更会想到语法背后的实现。继续往下学你会了解到抽象语法树 AST 如何生成、如何转化为中间代码、如何对中间代码优化、最终又是怎么生成机器指令的。你会看到贪心算法在寄存器分配中的应用,也会看到图论中的可达性分析又是如何实现死代码消除。你写的英文字母又是如何变成一个个二进制指令的?学完编译原理,这些通通不是问题,当然完成一个像 GCC、Clang 这样的编译器难度太高太高,我们学习编译原理的目的也不是去造这样的轮子,而是为了更好的理解和运用编程语言。