深入理解计算机系统
1.概述
1.1信息就是位+上下文
计算机是由二进制表示+输入输出+控制器+运算器+存储器
ASCII中为8为,256种组合,完全可以表示26个字母。
hello.c在系统中的信息(磁盘文件、内存中数据、程序、网上上传的数据等)就是一串比特序列(编码),区分这些数据的不同对象的唯一方式就是我们读到的数据对象的上下文。(编码)
起源:
打孔机(010101)–>汇编代码(英文+助记符)->C语言(老美的英文编译)
1969年ANSI定义了:ANSI C标准
C语言开发了unix内核(最初是为了做汇编器的),后面发现可以写很多的其他程序(C语言需要汇编器,写这个汇编器的是机器码(大佬写的))
C语言和c++是Java的底层,Java里面tomcat、spring等都封装好了,没有底层c、c++很难。
1.2程序被其他程序翻译成不同的格式
C语言中的hello程序运行:
一串0101---->另外一串010101
原因:起始0101源代码的上下文是.c的文件,最后的上下文是.exe的执行文件(Linux中式.elf/.out的格式)。
Linux–>gcc -0 hello hello.c预处理阶段:
hello.c生成了hello.i文件
把#include<stdio.h>读取头文件里面的内容,直接粘到源文件中,hello.c生成了hello.i文件。
编译阶段(ccl编译器):
hello.i—>hello.s(汇编语言)
ccl编译器,把人识别的代码编译成人类识别的低级代码,再通过汇编器生成计算机执行的0101代码,hello.i—>hello.s(汇编语言)(计算机还不认识)+链接–>hello.o(机器码)(可执行的代码)
汇编语言出现是为了代替机器语言对人类的不友好。
汇编阶段:
hello.s(汇编语言)(计算机还不认识)–>hello.o(机器码)
汇编器as将hello.s翻译成机器指令,并打包成可重定位的目标程序(relocatable)。
重定位(文件偏移):文件的运行需要依赖其他文件,但是不知道其他文件的位置,为了解析到它需要位置偏移(修改其位置)。
链接阶段:
hello.s(汇编语言)(计算机还不认识)+链接–>hello.o(机器码)(可执行的代码)
1.3GUN项目
GUN用来写操作系统的,UNIX所有东西当时全部闭源,linus就用GUN(有编译器+汇编器)写出来了Linux。没有编译器和汇编器也写不出来Linux。