计算机执行的是二进制的机器语言,所以最初的程序代码,都是些二进制数字,为解决编程的低效,产生了汇编语言和更高级的语言。汇编语言需要程序员写出,按照计算机执行顺序的每一条指令,这就要求程序员像计算机一样思考。这也是为什么汇编语言和某些高级语言会被称为“面向过程”编程语言的原因。这相当低效。
通常高级语言通过编译程序编译成汇编语言,然后汇编语言在编译成二进制的可执行文件;当然很多编译器可以直接生成二进制文件,这样就省掉了生成汇编语言这一步。最终,计算机就可以读取这些二进制文件,并最终执行。这里需要注意的是,不同处理器的机器二进制机器语言是不同的,比如分别采用CISC指令集和RISC指令集的两台机器,它们的二进制执行程序的二进制码就是不同的。操作系统(OS)会封装I/O操作,内存分配和其它低级的系统功能,从而使应用程序无需在这些细节上分心。架构(architecure)会为应用程序和操作系统的基本指令集(二进制),提供面对硬件的接口,称为二进制接口(ABI application binary interface)。整个计算机体系,从硬件到软件,都是通过这样不断为上层提供接口,并对下层实现抽象封装来实现。
某个程序执行需要的时钟周期数可以这样计算:总CPU时钟周期数=程序的指令数 X 每条指令的平均时钟周期数。CPI(clock cycles per instrution)表示在使用相同指令集时,执行每条指令所需的时钟周期数的平均值。程序的CPU时间=指令数 X CPI X时钟周期时间,以此来考察程序的性能高低,要注意的是,执行指令数最少的程序其执行速度未必最快,因为可能它的CPI也更高
计算机硬件不管有多少,最终是要实现如下功能:输入数据、存储数据、处理数据、输出数据。组成计算机的五个典型部件是:输入/输出(I/O)、存储器(内、外存)、运算器和控制器(CPU)。一个典型的计算机处理流程:处理器从存储器(内存)中得到指令和数据,通过控制器向运算器、存储器、输入和输出部件发出命令,输入部件将数据写入存储器,输出部件则从内存中读出数据。
主存储器(main memory)主要指内存DRAM,属于易失性存储器,相对的,非易失性存储器有两种:次存储器(secondary memory)主要指硬盘等;闪存(flash memory)的读写速度比内存低,但比磁盘快许多;闪存唯一的缺点是写寿命太短,只能写几百万次就报废了。内存(memory)属于DRAM,动态随机访问存储器,其内容不能长期保存,需要不断加电,以维持其保存的内容,所以每次关机后,内存中的内容就丢失了;处理器内部的高速缓存(cache memory)属于SRAM,静态随机访问存储器,其内容可以长期保存。
一个数的补码被定义为该数的反码+1。为什么正数的补码=它的负数;而负数的补码=它的绝对值呢?因为X+反X==111111111(假设x为一个字节);而11111111在有符号数中=-1,这样X+反X+1==0,所以反X+1=-X。因为补码被定义为反X+1结论就是:正数的补码=它的负数;而负数的补码=它的绝对值
既然存在嵌套调用,那么不存在对其它过程调用的过程就被称为叶子过程(leaf procedure),这大概是引用了树的概念