计算机组成原理是研究计算机硬件系统结构、功能等方面的学科。数据结构是研究非数值计算的程序设计问题中计算机数据的组织、存储、管理以及相关算法的学科。编译原理是研究关于编译器设计和优化的计算机科学学科。
一、计算机组成原理
1、简介
《计算机组成原理》是计算机系统方面重要的基础课程。随着计算架构和计算资源不断多样化,软件与硬件协同设计的深度和广度不断扩展,系统方面的教学对于计算机专业的教学显得越来越重要。良好的上层算法和程序设计必须依赖对底层硬件系统的深入了解,甚至必须和系统进行紧密的结合。本教材的编写特点是综合考虑了现有教材的一些问题,考虑到计算机技术发展快的特点,根据学生学习一些基本概念的难点,从以下几个方面加强了对教材内容的修改:
- 增加趣味性:在介绍基本概念和原理的同时,增加计算机的文化知识介绍,包括一些历史人物和历史事件的介绍;
- 加强内容的及时性:教材增加了计算机发展的一些新技术,如多核、闪存、移动平台、传感技术等内容;
- 强调实验的重要性:重要的基本概念和原理通过相关的实验加强理解,培养学生对实验的动手能力。
2、主要内容
计算机组成原理主要有四大块内容:
- 名列前茅块:计算机的基本组成,主要包含:硬件设备组成:CPU、主板、内存、硬盘、显示器等;冯诺依曼体系结构:运算器、控制器、存储器、输入设备、输出设备;计算机性能:CPU 主频、响应时间、吞吐率。
- 第二块:计算机的指令和运算,主要包含:计算机指令:机器码(编译 -> 汇编 -> 机器码、指令格式和跳转、函数调用和程序栈)、程序的编译、链接、装载和执行;计算机运算:二进制编码(整数、反码、补码、浮点数、定点数)、数字电路(门电路、加法器、乘法器)。
- 第三块:处理器设计,主要包含:CPU:建立数据通路、面向流水线和设计、控制冒险和数据冒险、分支预测、异常和中断、并行计算。
- 第四块:存储器和 I/O 系统,主要包含:存储器的层次结构:SRAM 存储技术、寄存器、CPU 高速缓存、内存、固态硬盘、机械硬盘;存储器和 I/O 系统:虚拟内存、CPU和内存的通信、DMA技术、访问输入输出设备;CPU 高速缓存:局部性原理、缓存一致性协议、伪共享问题、write through 和 write back;虚拟存储:缺页异常、TLB 加速地址转化、MMU 虚拟地址和物理地址转换。
其中名列前茅、第二、第四是对开发者而言是比较重要的内容,而第三部分处理器的设计如果没时间可以先不用去了解。
3、学习方法
理解问题,拆解任务
在开始各种计算机的概念之前,如冯诺依曼所说,先要明确这个计算机时解决什么问题的?帮助打工人们收发邮件做PPT的,让宅男看片打游戏的,或是码农们实现具体功能的。而不同于台式机或者笔记本电脑,智能汽车要解决的问题要复杂的多,纯电新能源汽车的电池管理需要电控ECU(Electronical Control Unit)、播放影音视频各种娱乐需要用户体验ECU、网络互通需要智能网联ECU、集成雷达/摄像头/Lidar实现智能驾驶辅助各种功能需要ASDM域控制器……没有任何一家公司能够独立完成所有的功能,更多的是彼此的协作关系,更不用提在各人研究的时候需要找到选择聚焦的点,来进行学习和理解。以辅助驾驶ADAS为例,SAE将自动驾驶分为五级,每个级别都有各自的功能(例如下图所列的AEB),为了解决”实现辅助驾驶的”问题,就需要对功能进行进行拆解具体。
各个击破,简化操作
计算机产品功能层面的拆解完了,那么如何实现呢,内在的逻辑何在?比起一蹴而就的4级5级自动驾驶来说,从最简单的1级开始可能是更加务实的方法。从系统架构上看,云服务器、功能特性、服务集成、计算域控制器、感应与感知等相关的软硬件集成在一起,分层形成解决方案。
形成组合,解决问题
大学学习的时候,对于计算机有个全局观,例如对五大部件——存储器、运算器、控制器、输入设备、输出设备的理解是理所当然,而在工作时,软件工程师会说那是系统工程师要考虑的事、系统工程师又说该是硬件工程师的活、硬件工程师在发生问题的时候会说是软件工程师在软硬件接口的设计上出了问题。由于分工的细化,各个部门可能只专注各自的领域,而只有形成组合彼此协作,才有可能生产出高质量的产品——比如实现L4 / L5的安全自动驾驶汽车。
二、数据结构
1、简介
数据结构是一种具有一定逻辑关系,在计算机中应用某种存储结构,并且封装了相应操作的数据元素集合。它包含三方面的内容,逻辑关系、存储关系及操作。不同种类的数据结构适合于不同种类的应用,而部分甚至专门用于特定的作业任务。例如,计算机网络依赖于路由表运作,B 树高度适用于数据库的封装。随着应用程序变得越来越复杂和数据越来越丰富,几百万、几十亿甚至几百亿的数据就会出现,而对这么大对数据进行搜索、插入或者排序等的操作就越来越慢,数据结构就是用来解决这些问题的。
2、数据结构的内容
3、常见的数据结构
- 栈(Stack):栈是一种特殊的线性表,它只能在一个表的一个固定端进行数据结点的插入和删除操作。
- 队列(Queue):队列和栈类似,也是一种特殊的线性表。和栈不同的是,队列只允许在表的一端进行插入操作,而在另一端进行删除操作。
- 数组(Array):数组是一种聚合数据类型,它是将具有相同类型的若干变量有序地组织在一起的集合。
- 链表(Linked List):链表是一种数据元素按照链式存储结构进行存储的数据结构,这种存储结构具有在物理上存在非连续的特点。
- 树(Tree):树是典型的非线性结构,它是包括,2 个结点的有穷集合 K。
- 图(Graph):图是另一种非线性数据结构。在图结构中,数据结点一般称为顶点,而边是顶点的有序偶对。
- 堆(Heap):堆是一种特殊的树形数据结构,一般讨论的堆都是二叉堆。
- 散列表(Hash table):散列表源自于散列函数(Hash function),其思想是如果在结构中存在关键字和T相等的记录,那么必定在F(T)的存储位置可以找到该记录,这样就可以不用进行比较操作而直接取得所查记录。
4、学习技巧
边学边练,适度刷题
“边学边练”这一招非常有用。建议你每周花1~2个小时的时间,记住,时间要控制好,建议你每周花1~2个小时的时间,时间差别不要太偏离我的建议,学会管理时间的同时注重效率!集中把这周的三节内容涉及的数据结构和算法,全都自己写出来,用代码实现一遍。这样一定会比单纯地看或者听的效果要好很多。但一定不要浪费太多时间在刷题上。我们学习的目的还是掌握,然后应用。
多问、多思考、多互动
学习较好的方法是,找到几个人一起学习,一块儿讨论切磋,有问题及时寻求老师答疑。 但是,离开大学之后,既没有同学也没有老师,这个条件就比较难具备了。不过可以通过网站上的专栏学习,专栏里有很多跟你一样的学习者。你可以多在留言区写下自己的疑问、思考和总结,也可以经常看看别人的留言,和他们进行互动。
打怪升级学习法
学习的过程中,我们碰到最大的问题就是,坚持不下来。 是的,很多基础课程学起来都非常枯燥。为此,我自己总结了一套“打怪升级学习法”。游戏你肯定玩过吧?为什么很多看起来非常简单又没有乐趣的游戏,你会玩得不亦乐乎呢?这是因为,当你努力打到一定级别之后,每天看着自己的经验值、战斗力在慢慢提高,那种每天都在一点一点成长的成就感就不由自主地产生了。所以,我们在枯燥的学习过程中,也可以给自己设立一个切实可行的目标,就像打怪升级一样。
知识需要沉淀
在学习的过程中,一定会碰到“拦路虎”。如果哪个知识点没有怎么学懂,不要着急,这是正常的。因为,想听一遍、看一遍就把所有知识掌握,这肯定是不可能的。永远记住学习知识的过程是反复迭代、不断沉淀的过程。
三、编译原理
1、简介
编译原理是计算机专业的一门重要专业课,旨在介绍编译程序构造的一般原理和基本方法。内容包括语言和文法、词法分析、语法分析、语法制导翻译、中间代码生成、存储管理、代码优化和目标代码生成。 编译原理是计算机专业设置的一门重要的专业课程。编译原理课程是计算机相关专业学生的必修课程和高等学校培养计算机专业人才的基础及核心课程,同时也是计算机专业课程中最难及最挑战学习能力的课程之一。编译原理课程内容主要是原理性质,高度抽象。
2、为什么要学习编译原理
作为程序员,不管是前端开发工程师还是后端开发工程师,编译技术都与我们的工作息息相关。在实际工作中也经常会碰到需要编译技术的场景。比如,前端开发工程师想要了解TypeScript是如何把一门语言翻译成另一门语言的,以及babel是如何编译JavaScript的等等。学习编译技术有助于提升我们的职场竞争力,更有助于程序员在技术的道路上走的更远。
3、编译的步骤
编译可以分为六个基本步骤:
- 词法分析 :词法分析器是通过词法分析程序对构成源程序的字符串从左到右的扫描,逐个字符地读,识别出每个单词符号,识别出的符号一般以二元式形式输出,即包含符号种类的编码和该符号的值。词法分析器一般以函数的形式存在,供语法分析器调用。当然也可以一个独立的词法分析器程序存在,完成词法分析任务的程序称为词法分析程序或词法分析器或扫描器。
- 语法分析:语法分析是编译过程的第二个阶段。这阶段的任务是在词法分析的基础上将识别出的单词符号序列组合成各类语法短语, 如“语句”, “表达式”等。语法分析程序的主要步骤是判断源程序语句是否符合定义的语法规则,在语法结构上是否正确。而一个语法规则又称为文法,乔姆斯基将文法根据施加不同的限制分为0型、1型、2型、3型文法,0型文法又称短语文法,1型称为上下文有关文法,2型称为上下文无关文法,3型文法称为正规文法,限制条件依次递增。
- 语义分析:词法分析注重的是每个单词是否合法,以及这个单词属于语言中的哪些部分。语法分析的上下文无关文法注重的是输入语句是否可以依据文法匹配产生式。那么,语义分析就是要了解各个语法单位之间的关系是否合法。实际应用中就是对结构上正确的源程序进行上下文有关性质的审查,进行类型审查等。
- 中间代码生成与优化:在进行了语法分析和语义分析阶段的工作之后,有的编译程序将源程序变成一种内部表示形式,这种内部表示形式叫做中间语言或中间表示或中间代码。所谓“中间代码”是一种结构简单、含义明确的记号系统,这种记号系统复杂性介于源程序语言和机器语言之间,容易将它翻译成目标代码。另外,还可以在中间代码一级进行与机器无关的优化。
- 目标代码的生成:根据优化后的中间代码,可生成有效的目标代码。而通常编译器将其翻译为汇编代码,此时还需要将汇编代码经汇编器汇编为目标机器的机器语言。
- 出错处理:编译的各个阶段都有可能发现源码中的错误,尤其是语法分析阶段可能会发现大量的错误,因此编译器需要做出错处理,报告错误类型及错误位置等信息。
4、学习方法
《编译原理》作为计算机专业的一门重要专业课程,是日后深入研究专业领域知识的基础。这门课作为计算机科学与技术的专业课,融合了离散数学、数据结构、操作系统、计算机组成原理等多个学科的知识,属于综合性与理论性较强的一门课,该课程的学习方法是:
- 首先了解为什么要学习编译原理,以及编译原理和我们日常开发中使用的开发语言的关系。
- 掌握一门适合写编译器的编程语言,如ML(OCaml, ReScript, F#)等。选择一种自己熟悉的编程语言也可以。然后耐心地学习编译原理相关的书籍、课程或教材,如龙书、虎书等。
- 多手抄代码、多看工业级别的编译器实现、多尝试编写简单的编译器、多做练习题,以提高自己的编译器设计和实现能力。
- 采用高效学习的方法,如费曼学习法,通过讲给别人听将所学的知识巩固和加深理解。同时集中注意力,阅读和听课是手段,记忆是根本,笔记是辅助。
延伸阅读1:传统编译原理课程教学中存在的问题
从普通高等院校的编译原理教学实际出发,其课程覆盖范围一般仅限于编译器的前端,即词法分析、语法分析和语法制导翻译等内容。这其中包括大量抽象且逻辑复杂的理论知识点,如形式语言理论、正规式、有限自动机、上下文无关文法、属性文法和语法制导翻译等。传统的教学方式强调知识点的灌输,让学生解决孤立的单一问题,缺乏各知识点之间的关联。这种“只见树木, 不见森林”的教学方式会极大地削弱学生的学习积极性,导致整体效果不佳。