返回介绍

抽象性

发布于 2023-05-23 15:33:22 字数 1091 浏览 0 评论 0 收藏 0

高级语言比汇编语言更接近人类语言,而某些高级语言又比其他语言更进一步。举例来说,C语言是一种低层次语言,很接近硬件,几乎堪称可移植的汇编语言,而Lisp语言的层次则是相当高。

如果高层级语言比汇编语言更有利于编程,你也许会认为语言的层次越高越好。一般情况下确实如此,但不是绝对的。编程语言可以变得很抽象,完全脱离硬件,但也有可能走错了方向。比如,我觉得Prolog语言就有这个问题。它的抽象能力强得不可思议,但是只能用来解决2%的问题,其余时间你苦思冥想、运用这些抽象能力写出来的程序实际上就是Pascal语言的程序。

另一个你会用到低层次语言的原因就是效率问题。如果你非常关注运行速度,那么最好使用接近机器的语言。大多数操作系统都是用C语言写的,这并非偶然。不过,硬件的运行速度越来越快了,所以使用C这样的低层次语言开发应用程序的必要性正在不断减少,但是大家似乎还是要求操作系统越快越好。(另一种可能是,人们还是希望“缓存区溢出攻击”继续存在下去,以便让大家时时保持警惕)^。

^「最常见的几种入侵计算机的手法都是利用了C语言的某些特点。当你在C语言中为输入的内容分配出一片内存(也叫“缓存”)时,它会被分配在当前运行代码的返回地址旁边。所谓“返回地址”指的是一块特定内存,当前代码运行完毕以后,就要运行这块内存中包含的代码。也就是说,它实标上是计算机下一步要做的事情。

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

如果使用更抽象的高级语言,上面的事情是不可能发生的。伹是,在C语言中,一旦接受用户输入的时候你没有检奔输入长度,就创造出了一个安全漏洞。利用这种漏洞的攻击行为就被称为“缓冲区溢出攻击”。在这种攻击中,还有其他方法可以控制计算机,但是覆盖返回地址是最经典的一种。

有意思的是,劫持飞机与“缓冲区溢出攻击”有类似之处。在一般飞机上,乘客区与驾驶舱是相通的,就好像C语言中数据区与代码区是相邻的一样。劫机者一且进入驾驶舱,实际上就相当于把自己从数据提升为代码。」

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文