csapp和计算机组成原理区别,csapp包括哪些内容

http://www.itjxue.com  2023-01-17 22:59  来源:未知  点击次数: 

读《编码:隐匿在计算机软硬件背后的语言》

第一次听说这本书,是在今年过年的时候,在 bang 的博客上看到他对这本书的评价非常高,他甚至感叹到,如果学校里能像这本书中讲述方式一样去教学生,那么也就不会有那么多学生是去学习的兴趣了。

后来在金旭亮老师介绍如何自学计算机课程时,他也推荐了这本书,可以作为学习计算机组成原理的入门读物。

因为我是非科班出身,最近开始补计算机课程,这本书便成为了我的第二本教材。

与作为教材的《计算机科学概论》相比,这本书更像是科普读物,以讲故事的形式,深入浅出地讲解了一台计算机是怎么制造出来的以及计算机科学的发展史,是一本绝佳的入门读物,但是如果要更系统、更全面和深入地学习计算机科学,还是需要再看一看专业教材,比如大名鼎鼎的 CSAPP。

一句话概括,这本书值得每个程序员读一读。

编码是一种用来传递信息的方式,我们使用不同的编码来为我们的交流服务。比如,盲文就是一种编码、电报报文也是一种编码。我们甚至可以说,我们每天说话交流的每一个词汇也是编码,聋哑人用的手语也是一种编码。

在计算机和电子设备中存储和传递文字、音频、图片、视频时,也使用了编码,因为计算机不能像人一样能够用直接通过眼睛、耳朵、嘴巴等方式来接收信息,计算机只认识 0 和 1。不同类型的信息使用了不同的编码。

莫尔斯码也被称作二进制码,因为这种编码的组成元素只有两个——“点”和“划”。

也就是说莫尔斯码的每一位只有两种表示,这一点跟二进制数很相似。所以一个莫尔斯码所能表示的数目大小可以用下面的公式表示:

有一种比莫尔斯码更早的编码方式,叫做布莱叶盲文,是法国的一个盲人布莱叶发明的。

换挡码和逃逸码

手电筒有一个开关,开关控制电路的中电流是否接通。开关只能是闭合状态或者断开状态。电流只能是有或者无。灯泡也只能是发光或不发光。跟莫尔斯和布莱叶发明的编码中每一位的值一样,只有两种状态。

二进制码和电气电路之间有一定的联系。

搭建一个简单的电报系统:通过电线将通讯两方连接起来,接收方有一个灯泡,发送方通过控制灯泡的开关,然后就可以发送摩尔斯编码了。

计算机系统正是基于这个装置构建出来的。

莫尔斯发明的电报机:发报时通过控制按压电键的时间长短来表示“点”和“划”,收报时通过听声音的长短来区分“点”和“划”。

但是一开始,电报机的有效距离不能太长,于是后来出现了继电器,这个继电器可以将接收到的信息转发出去。

继电器的本质是一个开关,但是这个开关的闭合和断开并不是由人来操纵的,而是由电流控制的。

延伸阅读:

大多数文明都建立在以 10 为基数的数字系统上,因为人们用自己的手指来计数。

早期的数字系统只有罗马数字和阿拉伯数字沿用到了今天,而且今天使用最广泛的就是阿拉伯数字。

阿拉伯数字相比其他计数系统的几个特点:

而位置计数法不仅仅适用于十进制,还适用于其他计数系统,比如八进制、二进制。

十进制中,我们用 0~9 这十个符号来表示所有的数字。“十”没有特定的符号,我们用 10 表示“十”。

同样,在八进制中也没有专门表示“八”的符号,我们也是用 10 来表示“八”。

四进制和二进制也是同样的表示方式。

二进制数字系统是最简单的数字系统,它的加法表和乘法表是最简单的。

二进制数字系统在算术和电子技术之间架起了一座桥梁,开关是否打开、电线中是否有电流通过、灯泡是否点亮、电报继电器是否闭合都可以用二进制数 0 和 1 来表示。

大约在 1947 年,美国数学家 John Wilder Turkey 首次用 bit 来表示二进制位 binary digit,一直沿用至今。

延伸阅读:

二进制的特殊性:它是最简单的数字系统。

在计算机时代,比特被看做是组成信息块的基本单位。

二进制并不是传达信息的唯一方法,但是比特所传递的“信息量”极小,1 比特是可能存在的最小信息量。

复杂一些的信息可以用多位二进制数来表达。

信息本质上是指多个可能性中的一种,而比特本质上就是数字。所以,我们可以说,所有可以被转换成两种或者多种可能性的选择的信息,都可以用比特来表示。比如文字、图片、声音、视频、条形码、评分等等。

用比特表示其他信息的时候,我们所要做的就是计算有多少种可能性,每种可能性对应一个编码。

我们通常所讨论的二进制数,都是指有一定位数的二进制数,比特位越多,所表示的可能性越多。

跟十进制类似,在二进制中,一个二进制数可以表示的编码数目等于 2 的整数次幂,其幂指数就是比特位的位数。

在日常生活中,我们一般是看不到比特的,因为它们深藏于 CD、计算机等电子产品中的编码,但在某些场合还是可以看得到的,比如商品包装上的条形码(UPC)。

在逻辑学中也可以找到比特的影子,逻辑学是哲学和数学的结合,其主要目的就是确定某个陈述是真还是假,而真和假同样可以用 1 和 0 来表示。

延伸阅读

Claude Elwood Shannon 首次提出了:电子工程师可以运用布尔代数去设计开关电路。

从这里开始,继电器将会极少地出现了,以后的电路会由缓冲器、反向器、四种基本逻辑电路和其他由逻辑门组成的复杂电路组成。当然,所有这些器件也是由继电器构成的。

摩根定律是简化布尔表达式的一种重要手段,可以用来简化电路:

二进制加法跟十进制相似,也是各位数字相加的组合。

二进制加法的加法表比十进制更简单。

一对二进制数字相加的结果中有两个数位,其中一个叫做加法位,另一位叫做进位位。所以二进制加法表可以表示成下面这样:

使用逻辑门制作一个半加器和一个全加器。

减法和加法的本质区别是,加法中有进位,而减法中没有进位只有借位,也就是说,减法运算中在计算低位时可能需要向更高一位借位,这样就会导致一位运算变成多位运算了。

举个例子,下面这个加法计算

可以拆成两步:

而下面的减法运算

就变成这样了:

减法表达式:

避免借位的关键是保证被减数每一位都比减数中相同位置的数要大,所以我们这里需要用到 对 9 求补数 的概念。

以 253 - 176 为例,为了在计算时不涉及到借位,我们可以将其转成 (999 - 176) + 253 + 1 - 1000 ,就可以得到最终结果了。

步骤:

以 176 - 253 为例,为了在计算时不涉及到借位,我们可以先通过计算 999 - ((999 - 253) + 176 得到最终结果的绝对值,然后再取相反数,。

步骤:

以 253 - 176 (也就是 1111 1101 - 1011 0000 )为例,为了在计算时不涉及到借位,我们可以将其转成 (1111 1111 - 1011 0000) + 1111 1101 + 1 - 1 0000 0000 ,就可以得到最终结果了。

步骤:

以 176 - 253 (也就是 1011 0000 - 1111 1101 )为例,为了在计算时不涉及到借位,我们可以先通过计算 1111 1111 - ((1111 1111 - 1111 1101) + 1011 0000) 得到结果的绝对值,然后再取相反数,就可以得到最终结果了。

步骤:

振荡器:可以在不需要人为干涉的情况下,完全自发地改变状态。振荡器是用来产生重复电子讯号(通常是正弦波或方波)的电子元件。其构成的电路叫振荡电路。能将直流电转换为具有一定频率交流电信号输出的电子电路或装置。

当采用 0 和 1 的交替序列来表示振荡器的输出时,我们可以用下面的图来描述输出。

反馈就是将电子系统中输出回路的输出量(输出电压或输出电流)的一部分或全部,通过一定的电路(反馈网络)反向送回到输入端或输入回路,进而对输入量产生影响的连接形式(过程)。

触发器(Flip Flop)是一种可以存储电路状态的电子元件。最简单的是由两个或非门,两个输入端和两个输出端组成的RS触发器。

触发器的电路图由逻辑门组合而成,其结构均由R-S锁存器派生而来(广义的触发器包括锁存器)。触发器可以处理输入、输出信号和时钟频率之间的相互影响。

这一章主要是通过观察微处理器和外部设备的交互过程,来认识其内部的结构和工作原理。这里作者将微处理器看做一个黑盒,主要的研究方法是通过观测芯片的输入、输出信号。特别是芯片的指令集来理解微处理器的工作原理。

读完c primer plus后有必要再看c与指针吗

当然没有必要啦!

无聊可以看看a book on c加强语法学习.

编程珠玑可以试读, 不过我更建议看看weiss的DSAAC

c缺陷和陷阱

c语言解惑

c语言专家编程

想深入理解c细节看看汇编语言是有必要的

看看计算机组成原理了解下硬件, 推荐看计算机组成原理与软硬件接口

离散数学, 线性代数看看会有意想不到的收获

我们的操作都在操作系统层之上, 所以了解下操作系统是有必要的, 推荐看csapp入门级.

对算法情有独钟可以考虑看看clrs, 如果自信满满可以挑战taocp毕竟近乎所以算法都选自此书, 并且作者特意写了本具体数学也是非常值得一看的

业余时间看看代码大全也是不错的选择

如果对代码自身, 以及文本的分析有兴趣建议看看编译原理, 推荐看完整版龙书. 当然如果你真准备和龙决斗, 那么带上盾牌和宝剑是必要的, 盾牌是否坚固来至你对数据结构的掌握程度, 宝剑是否锋利受你对语言的掌握程度的影响, 杀龙赚的经验是让人欣喜的, 受伤也是正常的.

评《Code》-- 赞誉太过的一本科普著作

《Code: The Hidden Language of Computer Hardware and Software》 在豆瓣与亚马逊上的评分与赞誉都极高。封面上赫然表明:永不褪色的计算机科学经典著作。

为了让赞誉与批评取得平衡,读后想表达的观点如下:

《Code》是一本解释计算机工作原理的通俗读物,非教材,非科技专著,是科普著作。因为是科普,以前不曾是、以后也不会是“大学计算机组成原理的替代品”,更不要拿它来与 CSAPP 并列对比。因为它是科普,所以,用它来佐证“大学的教材思路全错”是不正确的判断,即使大学的教材思路确实全部都是错的。

《Code》讲解了若干计算机入门理论,这些理论内容并不充分,远不足以包含计算机专业大一新生的《计算机科学导论》课的知识点。换句话说,即使你把《Code》读懂读透,《计算机科学导论》考试还是不及格,就更别提《数字逻辑电路》或者《计算机组成原理》了。作者为了保持该书的通俗性、可读性,在若干知识点上做了许多无效的努力,包括:第19章微处理器,第22章操作系统,第24章程序设计语言,第25章图形。对于这些重要的知识点,该书的讲述既不充分也不清晰。

《Code》同时也花了大量的篇幅讲解了许多非计算机理论知识,包括:摩斯码、盲文、手电筒的结构、电流电压安培瓦特......当然,还有算盘。这些内容以大概率不会出现在大学课堂。值得注意的是,这些内容在《Code》这本书占据了大量篇幅(第1章到第9章),也是作者的通俗表达可以高度发挥作用的章节。因为要保持通俗性、可读性,该书到第9章才讲到二进制。之前讲了什么?第1章讲两个小朋友希望开展“夜谈会”的故事、第2章讲摩斯码、第3章讲盲文、第4章讲手电筒(电池电线电流)、第5章灯泡加电线、第6章讲电报、第7章讲十进制......用全书1/5的篇幅讲解这些内容,确实很通俗,以下这幅图(第10章第一页)多少可以说明其通俗的程度:

可惜的是,我看不出这种通俗能对专业学生有任何的裨益,更纳闷的是,这样的书要怎么样才能如某些读者声称的那样“读出高潮”?这两句非常不客观,读者可以忽略。

最后,也许还可以苛责《Code》有一个重大的缺陷:没有任何一本参考文献。也就是说,这是一本自包含的书,而且从这本书出发,你的求知欲没办法延伸开来。你看了这书,依然不知道计算机组成原理、操作系统、程序设计应该怎么学,应该看什么书,这些知识点的重点难点是什么......当然,这与其定位有关,它是一本科普书,非专业书。

我给计算机专业读者的建议是,任何时候都不要阅读这本书。要入门,随便找一本教材,比如: CSI ,或者 CSO 。要找乐子,可以看其他科普,不就此献丑,摆手!

--

20180502晨,阴有雨

学计算机呀?

学计算机很好啊!如果是博士毕业的话,年薪有些甚至得到几百万,最差的职业学校毕业的,工作也非常好找。

(责任编辑:IT教学网)

更多

推荐网络工程师文章