2016.06.30 - 07.12
《计算机是怎样跑起来的》1-3 章。
- 矢泽久雄 / 著
- 胡屹 / 译
个人学习笔记。
05.30
兴趣。不了解计算机成为计算机专家的年轻工程师觉得计算机没啥意思的原因。
学问的学习方法(参考)。
[1] 划出一个“知识范围”,精通一门学问所必知必会的知识都在这个范围内。
[2] 掌握该范围内每个知识点中“基础中的基础知识”。
[3] 能独当一面的“目标” —— 掌握了这些知识可以做什么。
本书目的。让诸位了解有关计算机技术的知识范围,掌握其基础中的基础知识,设定目标;同时又想让那些打算用计算机做点什么,却又因难以下手而犹豫不决的人,以及虽然就职于计算机行业,却又因追赶不上最新技术而苦恼的人,能够了解计算机的本质。
[基础中的基础知识(开端)]
07.04
初级问题。硬件和软件的区别是什么?
[1] 硬件的结构固定,用来存储/传输/执行软件(对应的电信号/指令);软件是存储在内存硬件中的信号序列。[读前]
[2] 硬件是看得见摸得着的设备,比如计算机主机、显示器、键盘等。而软件是计算机所执行的程序,即指令和数据。软件本身是看不见的。[读后]
[感觉没我回答得好,虽然我回答得也不好]
中级问题。存储字符串“中国”需要几个字节?
[1] 如果存储一个汉字需要4字节,那么“中国”需要9字节(字符串结束标志’\0’需要1字节)。[读前]
[2] 在GBK字符编码下,存储“中国”需要4个字节。[读后]
(UTF-8字符编码下,一个汉字占用3个字节)
[虽然比我的准确,但感觉没我回答得好(我以C角度)]
高级问题。什么是编码(Code)?
[1] 编码是给一个集合中的每一个元素给予一个(在计算机中的)唯一的编号。[读前]
[2] 通常为了便于计算机处理而经过数字化处理的信息称作编码。[读后]
(计算机内部会把所有的信息当成数字来处理,尽管有些信息本来不是数字。用于表示字符的数字是“字符编码”,用于表示颜色的数字是“颜色编码”)
[回答比我专业,更正我的片面认识]
重点。认识计算机,需要把握的最基础的要点只有三个 —— “计算机的三大原则”。无论多么高深、多么难懂的最新技术,都可以对照着这三大原则来解释。本书以本章介绍的计算机的三大原则为基础,内容延伸至硬件和软件、编程、数据库、网络以及计算机系统。
计算机三大原则
[1] 计算机是执行输入、运算、输出的机器
[2] 程序是指令和数据的集合
[3] 计算机的处理方式有时与人们的思维习惯不同
[这三点都知道,只是没那个把握力将其归纳为计算机的三大原则,并以这三点延伸计算机的其它方面 —— 原来是从事计算机行业20余年的笔者的深切领悟,厉害。]
计算机输入、运算、输出的精彩论证段落
输入、运算、输出三者必须成套出现,缺一不可。这样说的原因有三。首先,现在的计算机还没有发展到能通过自发的思考创造出信息的地步。因此不输入信息,计算机就不能工作。所以,输入是必不可少的。其次,计算机不可能不执行任何运算。如果只是使输入的信息绕过运算环节直接输出,那么这就是电线而不是计算机了。可以说不进行运算,计算机也就没有什么存在的意义。最后,输入的信息如果经过了运算,那么运算结果就必然要输出。如果不输出结果,那么这也不是计算机而只是堆积信息的垃圾箱了。因此,输出也必不可少。
指令。控制计算机进行输入、运算、输出的命令。向计算机发出的指令与计算机硬件上的行为一一对应。[这指令解释得新颖儿]
程序。把向计算机发出的指令一条条列出来就得到了程序[**数据呢 ——程序是指令和数据的结合]。
程序中的数据。程序中的数据分两类,一类是作为指令执行对象的输入数据,一类是从指令的执行结果得到的输出数据。[程序中的数据段是属于前者?这有严格区分么?该怎么区分? —— 二者在程序中都应属于数据段的内容]
07.05
在用计算机替代手工作业的过程中,要想顺应计算机的处理方法,有时就要违背人们的思维习惯。[用数字表示所有信息 —— 颜色编码;字符编码(如“蓝色”:“0, 0, 255”)]
要想达到这一点,窃以为
[1] 深刻理解三大原则
[2] 在本域见多识广、经验丰富
计算机进化的目的只有一个 —— 与人类更加接近。[提供给人使用/计算机表现的角度]
编程方法的进化。编程方法进化的成果诞生了两种编程方法:面向组件编程(Component Based Programming)和面向对象编程(Object Oriented Programming)。这两种的进化目标一致,都是使程序员可以在编程中继续沿用人类创造事物时的方法。面向组件编程的方法是通过将组件(程序的零件)组装到一起完成程序;面向对象编程的方法是先如实的对现实世界的业务建模,之后再把模型搬到程序中。
但是,偏偏有这类程序员,他们对面向组件编程敬而远之,明明有各种各样现成的组件可供使用,却什么功能都要自己亲手做,仿佛不这样编程就不舒心。还有的程序员误认为面向对象编程难以理解。像这样的程序员人数还不少,特别是在昔日的计算机发烧友当中。总之就是因为它们太习惯于配合计算机的处理方式了,反倒认为计算机贴近人类这一发展趋势是在添乱。[作者对编程方法的看法]
[硬件和软件]
07.06
初级问题。CPU是什么的缩写?
[1] Center Processor Unit。[读前]
[2] Central Processing Unit。[读后]
[为什么CPU不是Central Processor Unit的缩写]
中级问题。Hz是表示什么的单位?
频率。
高级问题。Z80 CPU是多少比特的CPU?
[1] 没听过Z80 CPU。[读前]
[2] Z80 CPU是8比特的CPU。[读后]
CPU上数据总线的条数,或者CPU内部参与运算的寄存器的容量,可以作为衡量CPU性能的比特数。
重点。纸上(原理图)谈微型计算机的制作过程。
制作微型计算机所需的基础元件:CPU、内存、I/O以及辅助元件(时钟发生器,输入程序装置 —— 指拨开关,输出程序执行结果的装置,其它细碎元件)。[组装层面/组成原理]
时钟发生器。时钟发生器中带有晶振,根据其自身的频率产生时钟信号。
07.07
[NULL]
微型计算机所使用的IC属于数字IC。在数字IC中,每个引脚上的电压要么是0V,要么是5V,通过这两个电压与其他的IC进行电信号的收发。用于给IC供电的Vcc引脚和GND引脚上的电压是恒定不变的5V和0V,但是其他引脚上的电压,会随着计算机的操作在5V和0V之间不断地变化。[即,若5V对应二进制数1,0V对应二进制数0,其他引脚上的电压为5V或0V]
07.08
端口。端口是I/O与外部设备之间输入输出数据的场所。
总线。总线是连接到CPU中数据引脚、地址引脚、控制引脚上的电路的统称。
DMA。不经过CPU而直接从外部设备读写内存的行为叫作DMA(Direct Memory Access,直接存储器访问)。硬盘等设备要读写内存时使用的就是DMA。
[如果将开关直接连接到TC5517的各个引脚上,在程序执行时,开关的状态就会对电路产生影响]
在单片机广泛应用的几天,CPU、I/O、内存都被集成到了一块IC上。[纸上画画,没有用电路软件绘图,故而不能输入程序仿真(也略)]
07.11
初级问题。什么是机器语言?
[1] 能直接驱动(输入给)CPU工作的高低电平序列集。[读前]
[2] 由二进制数字构成的程序,CPU可以直接对其解释、执行。[读后]
中级问题。通常把标识内存或I/O中存储单元的数字称作什么?
[1] 端口。[读前]
[2] 标识内存或I/O中存储单元的数字叫作“地址”。[读后]
高级问题。CPU中的标志寄存器(Flags Register)有什么作用?
[1] 配置;记录某些结果。[读前]
[2] 用于在运算指令执行后,存储运算结果的某些状态。[读后]
[一旦执行了算术运算、逻辑运算、比较运算等指令后,标志寄存器并不会存放运算结果的值,而是会把运算后的某些状态存储起来,例如运算结果是否为0、是否产生了负数、是否有移除等。没提供直接修改标志寄存器的指令?记不清了]
重点。通过编写程序亲身体验计算机的运行机制。为达到这个目的,就需要使用一种叫作“汇编语言”的编程语言来编写程序,然后再把编好的程序通过手工作业转换成CPU可以直接执行的机器语言。这样的转换工作叫 “手工汇编”。
编程时必须要先了解微型计算机的硬件信息(真正需要了解的硬件信息只有7种):
【CPU信息】
[1] CPU的种类(不同CPU对应不同的机器语言 —— 原生代码)
[2] 时钟信号的频率
【内存信息】
[3] 地址空间
[4] 每个地址中可以存储多少比特的信息
【I/O信息】
[5] I/O的种类
[6] 地址空间
[7] 连接着何种周边设备
时钟信号。时钟信号是在0和1两个数(电平)之间反复变换的电信号。(指令执行时所需的时钟周期数取决于指令的类型)
内存的地址空间。每个地址都标示一个内存中的数据存储单元,而这些地址所构成的范围就是内存的地址空间。[《CSAPP》《程序员的自我修养》《Linux C编程一站式学习》中可能也有关于内存地址空间的解释]
I/O地址空间。指用于指定I/O寄存器(端口)的地址范围。[在内存中,每个地址的功能都一样(不具OS),既可以用于存储指令又可以用于存储数据。而I/O不同,地址编号不同即寄存器的类型不同,功能也就不同]
CPU控制I/O。CPU控制I/O设备是通过端口来实现的(《汇编语言》),只要CPU控制I/O的寄存器,就可以设定I/O的功能,与周边设备进行数据的输入输出。
机器语言。机器是语言是(能够直接驱动)CPU或CPU能够直接解释、执行的高低电平(二进制)序列。
汇编语言。汇编语言是机器语言的“助记符”(便于人的记忆、编程、理解)。汇编语言由(CPU执行的)汇编指令(和编译器处理的伪指令)组成。汇编指令由“操作码”和“操作数”组成,操作码就是“做什么”的指令,操作数就是指令执行的对象(CPU的寄存器、内存地址、I/O地址或者直接给出的数字都可以作为操作数)。[《汇编语言》对汇编语言有解释]
计算机的三要素。CPU、内存和I/O。CPU负责解释、执行程序,从内存或I/O输入数据,在内部进行运算,再把运算结果输出到内存或I/O。内存中存放着程序,程序是指令和数据的集合。I/O中临时存放着用于与周边设备进行输入输出的数据。
寄存器。CPU中存储数据的地方,且CPU中的寄存器还具备对数据进行运算的能力(移位寄存器等,见《自己动手设计制作CPU与单片机》中各种寄存器的设计)。[cache可存储指令和数据]
[汇编指令(的含义)可以作为理解计算机工作的原理,还可以更小的执行单位(如微操作)来理解计算机的工作原理(见《自己动手设计制作CPU与单片机》或《计算机组成原理》)]
07.12
[NULL]
这一节其实是(从组成原理层面)在描述CPU从内存取指并执行指令得到结果的原理(《汇编语言》《计算机组成原理》等书也有涉及;透入到芯片、内存内描述取指、解释、执行指令过程的在《自己动手设计制作CPU和单片机》一书中有描述)。
汇编语言和机器语言对照资料所在。在CPU的资料中,明确写有所有可以使用的助记符,以及助记符转换成机器语言后的数值。只要查看这些资料,就可以把汇编语言编写的程序手工转换成机器语言的程序(编译器也要查看这些资料),这样的工作称为手工汇编。[在《自己动手设计制作CPU和单片机》一书中也有涉及手工汇编 —— 汇编语言和机器语言对照表]
通过时钟周期估算程序的执行时间。将所有指令的时钟周期累积起来,再根据晶振的频率计算出每个时钟周期所对应的时间,再用这个时间乘以累积的时钟周期数就差不多得到程序的执行时间(以及某一段程序执行的时间)。
[1] 作者从事计算机行业20余年的深切领悟,晚生不能与之共鸣很正常。可将类似的领悟当成目标。
[2] 要是根据第二章介绍,收集元件(繁琐)来焊一块单片机(先画PCB)会加深对组装计算机的理解。
[3] 书中所介绍的内容基本都知道,但作者所作的像计算机三要素、从程序员角度看硬件的7个信息、学问学习方法等是新手有用的参考。
[2016.07.01 - 0:08]