========== 指令集和CPU(Instruction set and Central Process Unit) ==========
1. 计算机只认识0和1。0和1的排列组合构成指令。不一样的CPU,会有不一样的指令集架构。指令集架构分为RISC和
CISC架构(RISC,reduced instruction set computer,精简指令集。CISC,complex instruction set computer,复
杂指令集)RISC设计者把主要精力放在那些经常使用的指令上,尽量使它们具有简单高效的特色。对于不常用的功能,常
通过组合指令来完成。CISC指令集的指令系统比较丰富,有专用指令来完成特定的功能。常用的PC是CISC架构,也即X86
。指令架构集是CISC架构。
2. 除了intel/AMD的X86之外,还有很多种CPU。如DEC的Alpha21364、IBM的PowerPC G4、HP的PA-8900,SGI的
R12000A和SUN Microsystem公司的Ultra SPARC。这些CPU多采用RISC架构。
3. 手机之类的掌上只能用品,一般采用ARM技术的处理器,ARM处理器是RISC指令集架构。
4. 除了指令集架构之外,CPU通常架构体系有冯诺依曼体系和哈佛结构。还有其他的机构。还有硬件支持函数式变成的
CPU体系结构和指令集。
5. 龙芯采用什么指令集架构?当然不是X86,人家那个是有专利的。也就是说,龙芯认识的0和1的排列组合是和Intel芯片
认识的排列组合是不一样的。据说龙芯大概是抄MIPS的方案,指令集架构也是RISC的。龙芯上面是不能跑Windows操作
系统的,只能跑Linux和其他开源操作系统。为什么?因为Windows系统源码是不开放的,只有Microsoft公司自己知道,
Microsoft想让Windows操作系统在什么芯片上跑,那种芯片才能跑,而Linux系统的源码是开放的,所以开发龙芯团队可
以把Linux系统移植到自己芯片上去。
========== 计算机怎么认识程序(Why Computer Can Read My Program) ==========
1. 由于计算机只认识0和1,所以要写一个程序让计算机认识的话,只能用二进制代码代码。所以最早的程序员用0和1编程
。这是真的,据说那个时候最常用的编程工具是纸带和打孔机。
2. 用0和1编程实在让人无法忍受,于是汇编语言出现了。汇编语言允许程序员用一个助记符而不是一连串的0和1代表一个
指令。
========== 编译器(Compiler) ==========
1. 汇编语言为什么能用助记符代表一连串0和1?这个是因为有汇编编译器。汇编编译器会将那些助记符转换成对应的0和1
的串。也就是说,你可以用“mov eax,0xa”这样的东西去代替一串形如“0011 0101 0101 1100”这样的东西。
2. 汇编编译器本身也就是一个程序。它只是一个特殊的程序,既然是程序,那么这个程序本身是用什么语言写的呢?答案
是,第一个汇编编译器只能用机器语言写。
3. 当你有了第一个汇编编译器,那么第二个汇编编译器用什么来写呢?这个时候就可以用汇编语言了(因为已经有了第一
个汇编编译器了),你可以选择用汇编语言写,也可以选择用机器语言写。如果用汇编语言写,这是一个无穷的过程,你
可以写第N个汇编编译器。这个无穷的过程叫编译器的自举(bootstrap)。
4. 编译原理方面的书籍,龙书,鲸书,虎书。
========== 移植问题(The Trouble of Transplanting) ==========
1. 如果程序员写了一个在X86指令集架构的CPU上运行的程序,想要放到IBM的PowerPC CPU上运行怎么办?甚至或者想
要放到龙芯上运行怎么办?既然有了不一样的指令集架构和CPU,自然完成同样功能的指令非常可能是完全不一样的(不
一样的CPU有不一样的编程模型和编程范式)
2. 每种CPU都会有使用说明书,不过是非常令人困惑和使用说明书而已。这个使用说明书会提炼常用的指令和接口,以及
寄存器设定给程序员使用。一般把这个说明书的这一部分叫做相应的CPU的编程模型。很显然,不同类型的不一样的CPU
有完全不同的编程模型。Intel的X86芯片的说明书有三卷,其中第三卷是讲CPU的编程模型的。
3. 在只有机器语言和汇编语言的时代,移植等于重写程序。同样的程序,在X86指令集上要这样写,在某些RISC指令集上
要那样写。这意味着程序员为了让同一个程序在不同的CPU上跑就要看不同的令人困惑的CPU使用说明书 。