昨天在学校的帖子看到一个大一的同学,说他学了 Python,虽然还有很多不懂的地方,但是享受写出正确结果的过程,所以想转专业到计算机,不知道自己适不适合。
闲着没事就写了一些我学校 cs 涉及的课程,都是我自己粗浅的理解,在细节也有不那么精准的地方,只是大概。贴在这里,希望能给有类似困惑的佬友提供一点帮助。 没找到合适的标签了。
以下是原回复内容:
计算机除了你提到的 Python 这种比较上层的内容,更多课程会涉及到系统软件的原理、底层硬件的组成和原理。
随心所欲地讲一些吧,“计算机” 这三个字就是你能看到的,你手里用的那个就是计算机,而这个专业最传统的课程并不是教你用计算机开发什么软件,当然多少也会有。
最传统的计算机课程,更多是涉及原理。
硬件层面(计算机组成原理课程 或者计算机体系结构等课程):计算机是由哪些部分组成的,通电之后各部分是怎么运行起来的,流程是怎么样子的;关注的是内部的骨架、结构和运作方式。举几个例子,比如数在计算机里是怎么表示的,这个很关键啊,我们生活中的这些信息,怎么就能在计算机里显示,底层原理是怎么样的呢,说白了就是一堆 0 和 1 啊,更底层一些就是高电平和低电平。
光是数的表示就涉及到很多内容,原码补码反码,二进制十进制十六进制,整数怎么表示,浮点数怎么表示,不同的编码,还会稍微牵扯到不同的校验码。然后就是运算,数在计算机里怎么计算呢,加法怎么算,减法怎么算,乘法除法呢?你手算当然是你学过的,在计算机里用一堆 0 和 1 表示的数要怎么办呢?这些都是 “原理的内容”。
学了这些 “基础知识”,你终于可以了解计算机是怎么组成的了(毕竟是计算机组成原理嘛),像是什么运算器 控制器 指令存储器 数据存储器,输入输出设备,每个部分都可以是一个大章节,又都可以继续向外延申,比如昂:让计算机运行得有指令吧,指令需要存起来让控制器去获取吧,那就放到指令存储器里的,这里就可以向外延申到不同的指令系统,或者说 “指令集架构”,不同的厂商有自己的指令集,比如 Intel 的 x86 指令集,arm 的指令集架构,还有很多开源的指令集,risc-v 等等。
这里会学习各种指令的格式,作用,执行流程。 如果有进阶实验的话会涉及到让你自己设计指令集。 指令集可以当作硬件和软件的接口,大概就是表示 CPU 能够做什么,能做一个加法,那就是 add 指令,能做乘法,那就是 multiply 指令。假设你可以自己定义一条指令,比如打对象一巴掌(举个栗子而已),名字就叫 hit,你要来设计这条指令怎么运行,在每个环节怎么做,它需要什么数据吗,产生了什么结果吗,结果要保存在哪里吗。
其实计算机组成原理基本上就是围绕指令运行展开的,指令的全部执行流程,以及在这个流程中涉及到的每个部分的原理。(指令的获取,指令的译码,指令的执行,内存的访问,写回),关于内存,也是非常优雅、内容密度非常非常丰厚的一章哈哈哈哈,真的要在一章学会这么多大佬的智慧也太难了吧。
上面的课程只是硬件运行的原理!是运行,是已经有了机器了,你来学习。
更底层一些,可以让你学习怎么设计这个机器,说直白一点,就是怎么设计芯片!这个会学到数字逻辑课程,不过我们学校讲得不深(学的时候没用心学,但是我至今都认为这是最有用的一门课,虽然实际没怎么用到过 hhh,这才是计算机啊,去设计一个计算机,而不是组装一台计算机),有其他专业是更关注芯片设计的:微电子科学与工程或者集成电路工程
这门课按照我的理解是在做什么呢:用代码去描述硬件,把电路讲出来。
这里放一段我在大三写的日记,里面有不准确的地方哈,:
==================================
计算机专业的人通过数字逻辑的知识,在 EDA 软件上设计电路,或者说是使用 verilog 语言,来描述电路,即说明哪根线应该连接在哪里,是通过编程语言描述出来的。这个阶段结束后会得到板图,然后电路设计人员就把这个板图交给下一个人员,他来根据板图绘制电路图,这里就要考虑线的粗细,长短,间距了。
我自己的理解就是,电路设计人员需要根据计算机的知识,来决定哪个信号传给哪个部位,就是怎么方便,怎么能使指令更快、更高效地执行,就怎么设计,这个设计不需要考虑线的长短粗细等问题,这些问题是后面电子专业的人考虑的,电子专业的人要确定多粗的线能把信号传过去,然后绘制成电路图,再交给制造厂,照着图生产芯片。
其实挺有意思的,我们设计电路,但是是为了让计算机更高效地执行,因为我们懂指令集,知道微体系结构等等,所以我们可以设计。
==================================
当然除了设计芯片,也可以设计简单的功能,比如计算机组成原理里有加法器,那么你用人类的逻辑会计算,请你现在用数字的逻辑来计算(即为数字逻辑课程),具体什么意思呢,给你一堆 0 和 1,你把求和的结果给我输出出来,你要用到什么器件呢?
实话实说,这门课教的比较浅,对于绝大多数人来说都用不上。
继续,在硬件之上,是系统软件层面:操作系统,这也其实也算软件,但它是系统层面的软件,不是你写的简单的 python 软件。依旧是讲原理。
怎么描述呢,可以理解成一个把手吧,你不能和机器去交流,你告诉机器帮我打开明日方舟,它不懂。你要通过操作系统提供的可视化界面(苹果,windows,安卓这些都可以是操作系统,以及 linux),用鼠标去点明日方舟,操作系统把你执行的这些动作,翻译一下,翻译成机器能懂的一堆 0 和 1 组成的指令。所以操作系统可以说是硬件运转的灵魂?或许可以这么说吧。 它是来负责帮你管理机器管理硬件的。比如你打开多个软件,手机上有时候只能打开几个,电脑上或许可以开很多,手机也是有操作系统的,你只能开几个软件就是手机的操作系统检测的资源不够了,只能先关闭一些了。
这也是很硬核的一门课,凭印象描述吧,OS(operating system 就是操作系统,计算机组成原理可以缩写 co 或者 cod,computer organization and design,芯片设计或者集成电路设计可以叫 ic 设计,integrated circuit,计算机专业可以简称 cs 畜生(不是),computer science,计算机科学,科学!竟然是一门科学哎,有意思)
Os 比较重要的部分是内核,就是来管理各种资源的,比如刚才说的手机资源不足了。包括 CPU 时间、内存空间、硬盘存储等等。
在这基础上就会依次地学习进程管理,内存管理,文件系统等等。
这课其实我也没太学明白,糊里糊涂的。
再向上一层,编译原理,非常非常非常硬核的课,感觉集结了非常多大佬的智慧哈哈哈,也是非常非常非常抽象的一门课。
先讲一下它是干嘛的吧,简单说就是翻译的,把人类能看懂的编程语言翻译成机器能看懂的 0 和 1,或者说汇编语言,或者说机器能执行的目标代码(仅供参考哈,大方向是这样的)。当然 python 比较特殊,它用的不是编译器,而是解释器哈哈哈哈。
你想想很神奇吧,你写了一堆 print,又是什么加减法计算,又是输入又是输出的,然后编译器就把这些单词都都进来,然后输出一堆 0 和 1,然后这堆 0 和 1 机器就能看懂了,就能执行了(执行过程就是 cod 课程学的,编译原理 Compiler Principle,一般没见过缩写叫 CP 的,不过问题也不大,直接叫 compiler 会比较多)
Cp 这门课就是在学原理,什么原理?编译器是怎么把这些高级语言翻译成低级语言的,分为多个步骤,像什么词法分析,语法分析,语义分析,代码生成,代码优化等等,真的特别特别特别特别特别特别特别抽象!
你能感受到大佬们的智慧真的是难以企及。
不多说了,继续再向上一层。
算法与数据结构,这个可以说是大多数 cs 人比较喜欢看的,因为面试笔试确实是一定会涉及的,而且做一道题目会比较轻松,或者说正反馈比较及时吧,不像上面提到的那些,你来设计一个 os?你来自己写一个 compiler?你在 fpga 上跑一个 cpu 出来?跑吧写吧,一跑一个不吱声。
数据结构是什么意思呢,就是让数据变得有组织,比如哦,形成一棵树的样子,上面尖,下面宽。像什么数组,链表,栈,队列,树,图……
算法是什么意思呢,可以理解成解决一个问题的方法吧。比如你用的地图软件,怎么给你规划路径的。其实算法也是很难的一部分,能把算法研究明白也可以说明 cs 水平非常非常牛了。
像排序算法就有很多种,冒泡,快排等等;查找算法,二分,哈希;图和树上的算法,动态规划之类的。
再向上一层,是编程语言,像你用的 python,评论里的 c,c++,还有 java,还有好多编程语言。
这是干嘛的呢,是为了更好地和机器交流哇。你总不能写一堆 0 和 1 来操控计算机吧。虽然计算机刚出来的时候确实是这么干的哈哈哈。太艰辛了。
这年头你讲一句话,ai 也能看懂,所以我郑重建议把人类语言也定义为编程语言的一种(不是)
那在编程语言这个层面,就要去学习这门语言的规则,其实和学外语是类似的,语法规则,语义,等等。外语有很多种,编程语言也有很多种,各有特点。
还有一门课,计算机网络,CN,computer network
这课有涉及到底层的内容,也有中间和上层的内容,也讲述了大量的原理,大概就是 0 和 1 怎么在网络中传输的吧。
再向上,软件层面,有数据库,人工智能等等。
当然以上是最最经典的计算机的课,还有很多其他领域的课,像图形学,高性能计算等等,嵌入式也没提到。还有什么区块链,云计算,移动应用开发,游戏开发,以及和其他学科的交叉。
总体来说计算机涉及到的面非常广泛,我认为最本质的内容就是 0 和 1 的流动。
用 AI 总结了一下,计算机在各个层面的本质:
总结
1. 物理/硬件层面:
- 本质:驭电成算。 (用对电的驾驭,来实现计算)
2. 数据表示层面:
- 本质:化繁为简。 (将复杂信息简化为 0 和 1 的组合)
3. 计算层面:
- 本质:逻以成序。 (用逻辑运算构建秩序,形成程序)
4. 程序/软件层面:
- 本质:人为机动。 (人的意图通过机器自动执行)
5. 系统层面:
- 本质:群力协奏。 (各种资源协同工作,像交响乐一样和谐)
6. 应用层面:
- 本质:算无遗策。 (运用计算,周密筹划,解决问题)
所以,如果你对运行的原理感兴趣,愿意研究这些精妙的部件,渴望探索人类(最)伟大的智慧结晶,或许可以考虑转。
不过哈,这些其实都不是问题,本专业的人大多数也是学得糊里糊涂的,这种问题还是看个人,你的学习能力,意愿,方法都是很关键的,也包括资源,还有你对自己的期待值,毕竟想毕业总是容易的。
另外就是这年头 ai 这么聪明,这些人类已有的知识,有不懂的我感觉问 ai 都能学得很明白。
闲来无事写了这么多字,给有想法的师弟师妹们一些参考哈哈哈。
祝学业顺利!