以下内容是阅读《黑客与画家》时,摘录的关于计算机的一些基础知识。
低级语言
什么叫机器语言
计算机和其他机器一样,也有一张操作命令清单。比如,可以命令计算机把两个数相加。这种操作命令的总和就是计算机的机器语言(machine language)。
什么叫汇编语言
命令清单还是一样,只是将语言换成更人性化的表达,如计算机中的加,用机器语言表达就是11001101,汇编中就是add
。
机器语言和汇编语言的共同问题就是,只能让大多数计算机做一些很简单的事情。
为什么使用低级语言
当考虑效率问题时。
如果你非常关注运行速度,那么最好使用接近机器的语言。
比如说,C 语言就是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言。大多数操作系统都是用C语言写的。
那么问题来了,硬件速度越来越快了,底层次语言的作用越来越小,为什么不抛弃C语言呢?
原因:人们可能想保留缓存区溢出攻击,使得程序员保持警惕!
缓存区溢出攻击
当你在C语言中为输入的内容分配出一片内存(缓存
)时,它会被分配在当前运行代码的返回地址
旁边。
返回地址
:指的是一块特定内存,当前代码运行完毕以后,就要运行这块内存中包含的代码。缓冲区(buffer)
: 一个内存区域,用来保存程序需要的输入数据,或者将程序的输出数据累积起来,到一定数量后再输出。
假定有人打算入侵你的计算机,他们猜出你会为某种输入分配256字节的缓存
,于是他们就提交多于256字节的内容,目的是覆盖旁边的返回地址
。那么,当前代码运行完毕之后,程序的控制权就交给了他们指定的内存地址。这个地址通常是缓存的首地址,当中放的是入侵者事前编好的机器码。于是,入侵者的程序就运行在你的计算机上了。
在C语言中,一旦接受用户输入的时候没有检查输入长度,就创造出了一个安全漏洞。利用这种漏洞的攻击行为就被称为缓存区溢出攻击
。
如果使用更抽象的高级语言,上面的事情是不可能发生的。
高级语言,与低级语言的关系
简便方式书写程序所用的语言就是高级语言,其优点是使得程序更具有可移植性,而不同计算机的机器语言是不一样的。
高级语言(简便方式书写的程序,就像一行if
语句)可以通过编译器转变为低级语言(硬件可以理解的语言)。
编译器与解释器区别
编译器
不是低级语言唯一的实现方法,另一种方法是使用解释器
。
- 解释器: 实时地将代码解释为相应的机器语言,然后一行行运行。
- 编译器: 先将整个程序全部翻译成机器语言,然后再运行。
当编程语言变得很抽象时,就可完全脱离硬件,但是问题是太抽象的话,能解决的问题太少。