1.如何与计算机进行沟通
就像我们和歪果仁说话一样,和英国人讲英语,和德国人讲德语,和法国人讲法语...
那么和计算机交流我们就需要讲机械语言,
机械语言是什么?
维基百科说:机械语言是用二进制代码表示的计算机能够直接识别和执行的一种机器指令的集合。他是设计者通过计算机硬件结构赋予计算机的操作功能。
我们从中可以get到 1.机械语言是计算机能够直接看懂的
2.机械语言是由二进制代码组成的 比如:01010101
3.他与计算机硬件结构关系密切(意为着不同硬件结构的计算机语言是不一样的 即使他们都使用010101代码来表达意图,就像印度人的摇头是yes,点头是no,而我们却相反)
样子:
指令部分的示例
0000 代表 加载(LOAD)
0001 代表 存储(STORE)
寄存器部分的示例
0000 代表寄存器 A
0001 代表寄存器 B
存储器部分的示例
000000000000 代表地址为 0 的存储器
000000000001 代表地址为 1 的存储器
000000010000 代表地址为 16 的存储器
100000000000 代表地址为 2^11 的存储器
集成示例
0000 , 0000 , 000000010000 代表 LOAD A, 16
加载 寄存器A 16
0000,0001,000000000001 代表 LOAD B, 1
0001,0001,000000010000 代表 STORE B, 16
0001,0001,000000000001 代表 STORE B, 1
确实难以阅读与理解 我们的先辈就是用这些 0101告诉计算机需要干什么.....
补充知识: 000000010000 为什么是16?
二进制转10进制 0 0 0 0 0 0 0 1 0 0 0 0
..... 0*2^5 + 1*2^4 + 0*2^3 + 0*2^2 + 0*2^1 + 0*2^0 = 16
16如何变成10000呢? 不断求余
16/2 = 8.....0 8/2 = 4.....0 4/2 = 2....0 2/2 = 1.....0 1/2=0.....1
从最后一位开始组合 10000 就表示十进制的16
大小 位(bit) 最小的数据存储单位 表示一个 二进制 0 或者 1 占据的空间
字节 (Byte) 1个字节是8位 一般使用字节作为计算算计的通用计算单位
32位cpu 指cup一次可以读入处理 32位的二进制数据
2.机械语言的抽象(按照c的数据结构来 对于一个8位整数来说)
设想如果我们使用 0000,0001,000000000001 一句机械代码看起来也没有那么难,但是如果我们想要用这样的代码写一个简单的1+1
0000 0001
+ 0000 0001
= 0000 0010
什么感觉 这还没有添加前面的 加载命令符 寄存器命令符....
为了简化计算器的程序设计 程序设计者 将最高位的bit 视为正负值标识位
0为整数 1为负数 0000,0001 = 1 1000,0001 = -1(是这样吗?)
因为最上位挪去表示正负号了,所以8位有符号整数的表示范围是“-128~127”,共256个数(因为0只有一个而且算正数,所以负数比正数多一个)
那么 减法这么算对吗 1-1=0
0000,0001
+ 1000,0001
= 1000,0010 = -2 很明显直接相加是不对的
-1到底如何表示 补码的出现
0000,0001 为1 -1是 0000,0001的补码
计算 将 0000,0001 0 1翻转 ---> 1111,1110
在加上1 1111,1110+1 = 1111,1111 这就是-1
0000,0001
+ 1111,1111
= 10000,0000 ---->因为是8位 相加后为9位 最高位将被计算机吞掉 值为
0000 0000
乘除法 具体看下知乎大神的解释 https://www.zhihu.com/question/37319895
其实跑题了
0101直接与计算机打交道没问题 但是很累 代码不易阅读 难以理解...
于是就有人想能不能在把0101的指令进行简化 方便大家使用 于是出现了汇编语言(低级编程语言)
我们可以看到 代码不在是单纯的 0101 而是出现了 人类看的懂的英文...进步啦
但是依然不是那么好理解
于是有人想 能不能把 汇编语言在抽象一点,更加类似人类认知的语言与规范,于是出现了C、C++、C#、pascal、VB、java等高级编程语言
我们来看下 c的编码风格
main(){
int k = 1+11;
printf(“hello world”);
}
和0101 相比 以及和汇编语言相比 什么感觉
我们似乎在用十进制 进行k值的计算 在用我们自己的语言让计算机进行打印
printf 打印 print--->打印 输出 main 主要 1+11 十进制相加 k=12
hello world
没错 也许你从来没学过c 但似乎也能看明白 这些代码 至少1+11 print hello world
打印 hello world 没有任何问题....
这就是进步 高级语言越来越接近人类的自身的语言习惯以及数据的运算方式,提高的代码的可读性与理解性 代码不在那么晦涩
3.编译器(翻译官)
问题来了 我们在代码里面使用 10进制加减乘除 以及人类的语言各种英文 计算机是如何看懂的 前面说过他只认识0101 难道计算机进化啦?
完全没有--->计算机还是只认识0101 但是我们创造了编译器 让他把我们用的高级语言转化为 机械语言 与 计算机进行交互
就像我只会说中文,想要和日本人交流....困难重重 立刻去学习日语 没有个把月是搞不定的,,, 我朋友是个日语学习者 他懂中文又懂日文,我通过朋友和日本人交流,没有任何问题
事情变的极为简单 只要朋友在就好 我只要和朋友交流就好,编译器相当于这样的朋友
维基百科对编译器的解释:编译器是一种计算机程序,它会将用某种编程语言写成的源代码(比如c/c++等),转换成另一种编程语言(目标语言 比如 机械语言)
编译器怎么做到的?
所有的语言都有规范 对于编写程序的语言更是如此,而且很严格,这就意味着编译器制作者可以将高级编程语言 与 机械编程语言对应起来,就像中文的 香蕉-->banana,
编译器就像一个大的翻译器 将c这样的高级语言翻译成 机械语言 现在编译器的基本运行流程
"源代码"-->"预处理器"-->"编译器"-->汇编程序"-->"目标代码"-->链接器”-->"可执行文件" 最后打包好的文件就可以给计算机去判读运行了
有了前人的努力,我们学习与编写程序的成本越来越低了,我们不用在面对0101 或者 汇编语言的晦涩,只需要学习我们感兴趣的高级编程语言,在使用时安装不同语言的编译器即可
4.c语言(高级语言)
c语言在目前名目繁多的编程语言中算的上老爷车,最早是由[丹尼斯·里奇]为了 在PDP-11计算机上运行Unix系统而设计出来的编程语言 属于操作系统语言
1973年 [史蒂芬·强生] 实现了一套 可移植编译器 这套编译器修改起来相对容易,可以再不同的机器上面生成代码,从此c语言就开始被使用在大多数机器上面,得到了快速的发展
那么在这个编程语言满天飞的年代 c语言还有自身的优势吗?当然有 c语言的运行速度极快 因为他更接近机械语言,同时漫长的发展为c语言积累的丰富的类库,后来人使用很方便,至今为止涉及到代码运行速度与安全性时 c语言都是不二选择