看到这本书的英文电子版里密密麻麻的英文字母之后感觉头皮发麻。
还是得硬着头皮看下去,本硕都不是计算机的,coding能力真的需要提升。
为了方便理解整本书,在网上搜了很多前人对如何学习这本书的建议,总的来说有以下几点:
- 初次学习肯定不能整本书从头到尾慢慢看,这是低效的。根据前人经验,本书特色的必读章节是1,2,3,5,7;选读章节是8,9;其他书籍更合适的是:4,6。对于10,11,12,可以先看着。
- 结合书本里带有答案的习题能够更好的理解知识内容。
- 这本书站在了程序员的角度,为初学者提供了丰富的知识,将计算机系统的几个大方向牵线搭桥,旨在让程序员对大多数基本概念有定性理解和实操能力。
- 后边实际工作用到什么知识,需要定点学习,这本书提供的知识还不够。
-----------------------------------------------------------------------
接下来首先结合着中文版梳理一下每章所介绍的知识内容。
第一章:计算机系统漫游。
本章通过研究“hello, world”程序的生命周期,介绍计算机系统的主要概念和主题。
第二章:信息的表示和处理。
本章讲述计算机的算术运算,重点描述了会对程序员有影响的无符号数和数的补码表示的特性。本章考虑数字是如何表示的,以及由此确定对于一个给定的字长,其可能编码值的范围。本章探讨有符号和无符号数子之间类型转换的效果,还阐述算术运算的数学特性。小白经常很惊奇地了解到(用补码表示的)两个正数的和或者积可能为负。另一方面,补码的算术运算满足很多整数运算的代数特性,因此,编译器可以很安全地把一个常量乘法转换为一系列的移位和加法。本章用C语言的位级操作来说明布尔代数的原理和应用。本章从两个方面讲述了IEEE标准的浮点格式:一是如何用它来表示数值,一是浮点运算的数学属性。
对计算机的算术运算有深刻理解是写出可靠程序的关键。比如,程序员和编译器不能用表达式(x-y>0)来代替(x<y),因为前者可能会产生溢出。甚至也不能用表达式(-y<-x)来替代,因为在补码表示中负数和正数的范围是不对等的。算术溢出是造成程序错误和安全漏洞的一个常见根源,然而很少有书从程序员的角度来讲述计算机算数运算的特性。
第三章:程序的机器级表示。
本章将介绍如何阅读由C编译器生成的x86-64机器代码。本章将说明为不同控制结构(例如条件、循环和开关语句)生成的基本指令模式。本章还讲述过程得实现,包括栈分配、寄存器使用惯例和参数传递。本章将讨论不同数据结构(如结构、联合和分组)的分配和访问方式。本章还说明实现整数和浮点数算术运算的指令。本章还以分析程序在机器级的样子作为途径,来理解常见的代码安全漏洞(例如缓冲区溢出),以及理解程序员、编译器和操作系统可以采取的减轻这些威胁的措施。学习本章的概念可以帮助读者提高coding技术,因为你们懂的程序在机器上是如何表示的。另一个好处就在于读者会对指针有非常全面而具体的理解。
作为一个非计算机专业的小白,先把这三章看懂再继续往下推进...