黑客与画家

以下内容是阅读《黑客与画家》时,摘录的关于计算机的一些基础知识。


低级语言

什么叫机器语言

计算机和其他机器一样,也有一张操作命令清单。比如,可以命令计算机把两个数相加。这种操作命令的总和就是计算机的机器语言(machine language)。

什么叫汇编语言

命令清单还是一样,只是将语言换成更人性化的表达,如计算机中的加,用机器语言表达就是11001101,汇编中就是add

机器语言和汇编语言的共同问题就是,只能让大多数计算机做一些很简单的事情。

为什么使用低级语言

当考虑效率问题时。

如果你非常关注运行速度,那么最好使用接近机器的语言。

比如说,C 语言就是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言。大多数操作系统都是用C语言写的。

那么问题来了,硬件速度越来越快了,底层次语言的作用越来越小,为什么不抛弃C语言呢?

原因:人们可能想保留缓存区溢出攻击,使得程序员保持警惕!

缓存区溢出攻击

当你在C语言中为输入的内容分配出一片内存(缓存)时,它会被分配在当前运行代码的返回地址旁边。

  • 返回地址:指的是一块特定内存,当前代码运行完毕以后,就要运行这块内存中包含的代码。
  • 缓冲区(buffer): 一个内存区域,用来保存程序需要的输入数据,或者将程序的输出数据累积起来,到一定数量后再输出。

假定有人打算入侵你的计算机,他们猜出你会为某种输入分配256字节的缓存,于是他们就提交多于256字节的内容,目的是覆盖旁边的返回地址。那么,当前代码运行完毕之后,程序的控制权就交给了他们指定的内存地址。这个地址通常是缓存的首地址,当中放的是入侵者事前编好的机器码。于是,入侵者的程序就运行在你的计算机上了。

在C语言中,一旦接受用户输入的时候没有检查输入长度,就创造出了一个安全漏洞。利用这种漏洞的攻击行为就被称为缓存区溢出攻击

如果使用更抽象的高级语言,上面的事情是不可能发生的。

高级语言,与低级语言的关系

简便方式书写程序所用的语言就是高级语言,其优点是使得程序更具有可移植性,而不同计算机的机器语言是不一样的。

高级语言(简便方式书写的程序,就像一行if 语句)可以通过编译器转变为低级语言(硬件可以理解的语言)。

编译器与解释器区别

编译器 不是低级语言唯一的实现方法,另一种方法是使用解释器

  • 解释器: 实时地将代码解释为相应的机器语言,然后一行行运行。
  • 编译器: 先将整个程序全部翻译成机器语言,然后再运行。

当编程语言变得很抽象时,就可完全脱离硬件,但是问题是太抽象的话,能解决的问题太少。

-------------完-------------