2016.10.26 - 11.01
《程序是怎样跑起来的》7-12章
- 矢泽久雄 / 著
- 李俊峰 / 译
个人学习笔记。
虽然计算机领域新技术在不断涌现,但计算机能处理的事情始终是对输入的数据进行运算,并把结果输出,这一点是不会发生任何变化的。
10.28
1. 应用的运行环境,指的是什么?
操作系统和其操作的硬件。[更统筹的说法是操作系统和硬件(计算机主机)两项]
2. Macintosh用的操作系统(MacOS),在AT兼容机上能运行吗?
不能。
3. Windows上的应用,在MacOS上能运行?
不能。
4. FreeBSD提供的Ports,指的是什么?
[2] 通过使用源代码来提供应用,并根据运行环境进行整个编译,从而得以在该环境下运行的机制。[FreeBSD是一种Unix操作系统]
5. 在Macintosh上可以利用的Windows环境模拟器称为什么?
[2] Virtual PC for Mac。
6. Java虚拟机的功能是什么?
[2] 运行Java应用的字节代码。[只要为分别为各个环境安装专用的Java虚拟机,同样的字节代码就能在各种环境下运行了。Java编译器输出的是字节代码]
重点。程序的运行环境指的是什么,为什么运行环境不同,应用就无法应用?
机器语言的程序称为本地代码。
对一个应用程序,由编译器编译而来的可执行程序包含本地代码和编译信息。对于同一种计算机硬件上不同的操作系统来说,本地代码几乎相同(系统调用等可能不同),但编译信息不同,其被加载、运行的方式也就不同了。所以,即使在同一种计算机上,在一个操作系统上得到的可执行文件不能再另外一个操作系统上执行。
FreeBSD是1993年加州大学伯克利分校的Computer Systems Research Group在4.4BSD-Lite的基础上开发的Unix系列操作系统。
Ports表示移植(porting)的意思。根据不同的运行环境来重新调整程序,一般也称为移植。
Unix系统操作系统FreeBSD中的Ports机制能够结合当前运行的硬件环境来编译应用的源代码,进而得到可以运行的本地代码系统。如果目标应用代码没有再硬件上的话,Ports就会自动使用FTP连接到相关站点来下载代码。FreeBSD等Unix系列操作系统中,都带有标准的C编译器。C编译器可以结合FreeBSD的运行环境生成合适的本地代码。
Java有两个层面的意思。一个是作为编程语言的Java,另一个是作为程序运行环境的Java。同其他编程语言相同,Java也是将Java语法记述的源代码编译后运行。不过,编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序。字节代码的运行环境称为Java虚拟机(JavaVM,Java Virtual Machine)。Java虚拟机是一边把Java字节代码逐一转换成本地代码一边运行的。如果能够结合各种类型的操作系统和硬件作成Java虚拟机,那么,同样字节代码的应用就可以在任何环境下运行了。
Java虚拟机也有缺点:[1] 想让所有字节代码任意虚拟机上都能运行是比较困难的。而且,当使用只适用某些特定硬件的功能时,就会会出现在其他Java虚拟机上无法运行,或者功能使用受限等。[2] Java虚拟机每次运行时都要把字节代码变化成本地代码,这将造成运行速度变慢。
1. CPU可以解析和运行的程序形式称为什么代码?
本地代码。(机器代码)
2. 将多个目标文件结合生成EXE文件的工具称为什么?
链接器。
3. 扩展名为.obj的目标文件的内容,是源代码还是本地代码?
本地代码。
4. 把多个目标文件收录在一起的文件称为什么?
库。
5. 仅包含Windows的DLL文件中存储的函数信息的文件称为什么?
[2] 导入库。
6. 在程序运行时,用来动态申请分配的数据和对象的内存区域形式称为什么?
[2] 堆。
重点。源文件是如何通过编译转换成可执行文件的。可执行文件被加载到内存后的运行机制。
能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器。
交叉编译器生成的是和运行环境中的CPU不同的CPU所使用的本地代码。
把多个目标文件结合,生成1个EXE文件的处理就是链接。[即使程序不调用其他目标文件的函数,也必须要进行链接,链接调用main函数的目标文件(启动文件)]
库文件指的是把多个目标文件集成保存到一个文件中的形式。连接器指定库文件后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件。库文件是和编译器一起被提供的,它们由编译器厂商提供。
windows中,API的目标文件,并不是存储在通常的库文件中,而是存储在名为DLL(Dynamic Link Library)文件的特殊库文件中。用来存储API函数在哪一个DLL文件中且DLL文件文件夹信息的库文件称为导入库。[导入库用于编译阶段]
叠加链接。将不会同时执行的函数,交替加载到同一个地址中运行,通过使用“叠加链接器”这一特殊的链接器即可实现。在计算机中配置内存容量不多的MS-DOS时代,经常使用叠加链接。
10.29
1. 监控程序的主要功能是什么?
加载和运行程序。
2. 在操作系统上运行的程序称为什么?
应用程序。
3. 调用操作系统功能称为什么?
系统调用。
4. Windows Vista是多少位的操作系统?
我管理多少位。我怎么知道是多少位。
5. GUI是什么的缩写?
Graphical User Interface。
6. WYSIWYG是什么的缩写?
[2] What You See Is What Your Get。
重点。程序员是通过利用操作系统提供的功能来编写应用程序的。
在计算机中尚不存在操作系统的年代,完全没有任何程序,因此程序员就需要编写出处理相关的所有程序。用机器语言编写程序,然后再使用开关将程序输入,这一过程非常麻烦。于是,有人开发出了仅具有加载和运行功能的监控程序,这就是操作系统的原形。通过先启动监控程序,程序员就可以根据需要将各种程序加载到内存中运行。
随着时代的发展,人们在利用监控程序编写程序的过程中,发现很多程序都有共通的部分。例如,通过键盘输入文字数据、往显示器输出文字数据等。这些处理,在任何程序下都是一样的。而如果每编写一个新的程序都要记述相同的处理的话,那真的是太浪费实践了。因此,基本的输入输出部分的程序就被追加到了监控程序中。初期的操作系统就这样诞生了。
之后,随着时代的进一步发展,开始有更多的功能被追加到监控程序中,比如,为了方便程序员的硬件控制程序、编程语言处理器(汇编、编译、解析)以及各种实用程序等,结果就形成了和现在相差不大的操作系统。因此,操作系统本身并不是单独的程序,而是多个程序的集合体。
制作应用的程序员应意识一点,那就是程序员操作的不是硬件,而是利用操作系统功能的应用。[虽然对程序员来说,掌握硬件的基础知识是必需的,不过,在操作系统诞生以后,就没有必要再编写直接控制硬件的程序了。不过,要成为一个全面的程序员,有一点需要清楚的是,掌握基本的硬件知识,并借助操作系统进行抽象化,可以大大提高编程效率]
进入标准库中的函数可移植。直接调用的系统调用若在其它的操作系统不存在的话就不可移植。
[1] 能处理数据的最大位数;
[2] API;
[3] GUI;
[4] WYSIWYG(显示器上显示的内容可以直接通过打印机打印输出);
[5] 多任务(时钟分割);
[6] 网络和数据库[系统软件:操作系统和中间件(介于应用于操作系统之间的程序)];
[7] 通过即插即用实现设备驱动的自动设定[即插即用:新的设备连接后立刻就可以使用的机制;新的设备连接到计算机后,系统就会自动安装和设定用来控制该设备的设备驱动程序。设备驱动是操作系统的一部分,提供了同硬件进行基本的输入输出的功能。键盘、鼠标、显示器、磁盘装置等,这些计算机中必备的硬件设备驱动,一般都是会随操作系统一起安装的。如果增加操作系统没有相应驱动程序的设备,那么就必须追加相应的设备驱动程序,这样设备才能和计算机(操作系统)相连]。
1. 本地代码的指令中,表示其功能的英语缩写称为什么?
助记符。
2. 汇编语言的源代码转换成本地代码的方式称为什么?
编译。
3. 本地代码转换成汇编语言的源代码的方式称为什么?
反汇编。
4. 汇编语言的源文件的扩展名,通常是什么格式?
.asm。
5. 汇编语言程序中的段定义指的是什么?
[1] 一个程序段。
[2] 构成程序的命令和数据的集合组。
6. 汇编语言的跳转指令,是在何种情况下使用的?
[2] 将程序流程跳转到非下一条指令地址的其他地址时需要用到该指令
重点。程序的运行机制。
10.30
使用助记符的编程语言称为汇编语言。这样,通过查看汇编语言的编写的源代码,就可以了解程序的本质了。因为这和查看本地代码的源代码,是同一级别的。
大部分C语言编译器,都可以把利用C语言编写的源代码转换成汇编语言的源代码,而不是本地代码。利用该功能,就可以对C语言的源代码和汇编语言的源代码进行比较研究。由于本地代码和汇编指令一一对应,通过反汇编可以通过本地代码得到汇编代码,但是要想根据本地代码或汇编代码获得C语言语句就不那么容易了,因为C语言跟汇编代码并无诸如一一对应这样的关系。 [通过调查本地代码的内容,可以了解程序最终是以何种形式来运行的]
介绍几个伪指令。
由伪指令segment和ends围起来的部分,是给构成程序的命令和数据的集合体加上一个名字而得到的,称为段定义。group这个伪指令表示把多个定义的段汇总为一个新名的段。伪指令proc和endp围起来的部分,表示的是过程的范围。 [汇编中的过程相当于C语言中的函数]
对于有操作数的汇编指令,保持此点意识:“操作码 + 操作数”在一块内存中,操作数在另外一块内存中。
最优化功能是编译器在本地代码上费尽功夫实现的,其目的的是让编译后的程序运行速度更快、更小。
函数的参数是通过栈传递的,函数的返回值是通过寄存器来返回的。 [其中机制还需具体实验]
通过对C语言源代码和汇编语言源代码进行比较,会对“程序是怎样跑起来的”有更深的理解。 [而且,从汇编语言源代码中获得的知识,在某些情况下对查找bug的原因也是有帮助的]
1. 在汇编语言中,是用什么指令来同外围设备进行输入输出操作的?
IO/OUT。
2. I/O是什么的缩写?
Input/Output。
3. 用来识别外围设备的编号称为什么?
[1] 端口。
[2] I/O地址或I/O端口号。
4. IRQ是什么的缩写?
[2] Interrupt Request。
5. DMA是什么的缩写?
Direct Memory Access。
6. 用来识别具有DMA功能的外围设备的编号称为什么?
[2] DMA通道。
重点。控制CPU,只需把编译器或汇编器生成的本地代码加载到主内存并运行即可。如何用程序来控制CPU和内存以外的硬件。
在计算机主机中,附带了用来连接显示器及键盘等外围设备的连接器。各连接器的内部,都有用来交换计算机主机同外围设备之间电流特性、以及用于临时保存输入输出数据的内存[端口]的IC。这些IC,统称为I/O控制器。
在实现I/O控制器功能的IC中,会有多个端口。由于计算机连接着很多外围设备,所以就会有多个I/O控制器,当然也会有多个端口。一个I/O控制器既可以控制一个外围设备,也可以控制多个外围设备。各端口之间通过端口号进行区分。端口号也称为I/O地址。IN指令和OUT指令在端口号指定的端口和CPU之间进行数据的输入输出。
CPU通过IN/OUT可以直接读写端口号。 [通过指定端口号,并利用IN/OUT指令,就可以直接控制软驱这个硬件设备,实现输入输出处理了]
实施中断请求的是连接外围设备的I/O控制器,负责实施中断处理程序的是CPU。为了进行区分,外围设备的中断请求会使用不同于I/O的其他编号,该编号称为中断编号。
假如同时有多个外围设备进行中断请求的话,CPU也会为难。为此,我们可以在I/O控制器和CPU中间加入名为中断控制器的IC来进行缓冲。
由于外围设备有很多个,因此就有必要按照顺序来调查。按照顺序调查多个外围设备的状态称为查询。对几乎不产生中断的系统来说,轮询是比较合适的处理。不过,对计算机来说就不合适了。举例来说,假如主程序正在调查鼠标是否有输入,这时如果发生了键盘输入的话,该如何处理呢?结果势必会导致键盘输入的文字无法实时地显示在显示器上。而通过使用中断,就可以实现实时显示了。
打印机等输出用的外围设备中,外围设备接收数据的状态,有时是需要用中断来通知的。由于外围设备的处理速度比计算机主机的处理速度要慢很多,因此,这种情况下就不需要对打印机的状态进行多次调查,只需在终端请求发生时输出数据即可,这样一来,其他时间CPU就可以集中处理别的程序了。
I/O端口号、IRQ、DMA通道可以说是识别外围设备的3点组合。不过,IRQ和DMA通道并不是所有外围设备都必须具备的。计算机主机通过软件控制硬件时所需要的信息的最低限,是外围设备的I/O端口号。IRQ只对需要终端处理的外围设备来说是必需的。 [在Windows的资源中可以查看设备的端口号、IRQ、DMA号]
显示器中显示的信息一直存储在某内存中。该内存称为VRAM(Video RAM)。 [内存VRAM中存储的数据就是显示器上显示的信息]
在现在的计算机中,显卡等专用硬件中一般都配置有与主内存相独立的VRAM和GPU(Graphics Processing Unit,图形处理器)。
11.01
1. 用计算机进行模拟的实验称为什么?
[2] 计算机模拟。
2. 伪随机数指的是什么?
[2] 用公式产生的随机数。
3. 随机数的种子指的是什么?
[2] 产生伪随机数的公式的参数。
4. 计算机有思考功能吗?
无。
5. 计算机有记忆功能吗?
[2] 有。
6. AI是什么的缩写?
[2] Artificial Intelligence(人工智能)
重点。用程序实现思考步骤,让计算机执行。
如用一段随机数来表示概率,概率可从一定程度上代替人类的习惯。
由于借助公式产生的随机数具有一定的规律性,因此并不是真正的随机数,通常称为伪随机数。
产生随机数的公式中的各个参数就是随机数的种子。如果能让这些参数也随机出现,那么伪随机数就更加接近真正的随机数了。
用内存记忆输入,以该输入来作判断。
前提是对人类思考方式有所了解,如人类有直觉、想法、习惯、经验以及作者所提到的按照节奏短语式的思考。
[2016.11.01 - 10:23]