请注意,这与Microsoft正在向大气中推进大气的.NET CLR无关,以宣扬托管代码的概念。你们中的大多数人都知道,托管代码已经存在了很长时间,并且与火箭科学没有密切相关。

我想知道的是 为什么计算机演变中运行时安全性的概念太晚了.

我知道这就像问“为什么第一个型号T福特不带安全气囊和安全带?”。尽管如此,这个问题的相关性仍然存在,因为保护再次已知危险在人性之内。例如,第一支T型福德的速度不够快,无法激励安全气囊研究。人们犯有致命的判断错误的速度不够快,以至于在许多国家 /地区都会激发安全带作为法律和标准。

在计算机进化中,几乎是相反的。我们从汇编器开始,相当于以200mph的速度驾驶带有眼球的T型福音。我很高兴与这个时代的一些老卡车司机交谈,听到这些有关手工组装的组装代码,人类调试者,格拉数代码等的故事。如果我们在C中犯了一个非常讨厌的错误,我们可能最终会出现带有蓝屏。几十年前,您可能会遇到损坏的硬件,而上帝知道什么。但这对我来说是一个谜 - 这么数十年,我们所做的一切使崩溃的痛苦减轻了(对不起,对使用MS作为原型的所有内容)。

防御已知危险,不仅在人性之内, 在任何程序员的本性中也可以自动化和系统化共同的设施, ,例如检查错误检查,内存诊断,记录框架,备份维护等。

为什么程序员/人类没有开始自动化确保其为系统提供的代码不会损害系统的任务?是的当然, 表现. 。但是,嘿,这是在任何认真穿透的硬件标准之前。为什么不使用公交架构和额外处理器设计主板来促进“托管代码”?

是否有任何隐喻来模型fords的速度不够快,以至于我缺少了我的缺失?

有帮助吗?

解决方案

让我们从第一原则中考虑一下。

一个托管平台提供了一个相对沙盒的区域来运行从高级语言到更适合由平台执行的形式(IL BYTECODES)创建的程序代码。在其中还有实用功能,例如垃圾收集和模块加载。

现在考虑一下本机应用程序 - OS提供了一个相对较高的面积区域(一个过程)来运行从高级语言到更适合由平台执行的形式创建的程序代码(X86 opcodes)。在其中还有实用功能,例如虚拟内存管理和模块加载。

没有太大的区别,我认为首先管理平台的原因仅仅是因为它使编码更容易。它应该使OS之间的代码便携式在OSS之间,但MS并不关心。安全是托管平台的一部分,但应成为OS -EG的一部分。您的托管应用程序可以像普通过程一样编写文件和类似内容。限制这是一项安全功能,它不是本机上不存在的托管平台的一个方面。

最终,他们可以将所有这些托管功能放入一组本机DLL中,并取消了中介字节码的想法,而JIT则将其编译到本机代码。在本机堆上很容易实现诸如GC之类的“托管”功能 - 示例请参见BOEHM C ++。

我认为MS之所以这样做,是因为它使编译器更容易编写,部分是因为这是Java的制作方式(并且.NET是Java的后代,即使只是精神上),尽管Java这样做了 - 可以进行平台编码,MS不在乎。

因此,为什么我们从一开始就没有获得托管代码 - 因为您提到的所有内容是“托管”代码的一部分,都是本机代码。我们今天拥有的托管平台只是在已经抽象的平台之上的另一个抽象。高级语言已经添加了更多功能来保护您免受自己的侵害,缓冲区溢出已成为过去,但是当C首次发明C时,C在C中无法实现它们。只是他们不是。也许事后看来,这些功能似乎缺少了,但是我敢肯定,我们会问:“为什么C#不像今天那样实现明显有用的功能xyz”

其他提示

内置安全性的管理代码已经存在了很长时间。

在原始的PC平台中只是没有空间,因此以后再也没有添加。

自70年代以来,古老的IBM大型机已经保护了解决,不可触摸的内核库,基于角色的安全性等。再加上所有的汇编代码由复杂的(时间)更改管理系统管理。 (Univac,Burroughs等有类似的东西。)

Unix从一开始就具有相当不错的安全性(多年来它并没有发生太大变化)。

因此,我认为这是一个Windows/Web空间问题。

从来没有大型机病毒!世界上的大多数金融交易在某个时候都通过这些系统,因此并不是它们不是一个有吸引力的目标。

内部IBM邮件系统确实托管了第一个“特洛伊木马”!

实际上,托管代码已经存在很长时间了。考虑:

  • Lisp
  • 短暂聊天
  • 基本(原始风味)

所有提供了类似操作系统的环境,这些环境可以保护使用免于内存和其他资源控制问题。所有这些都是相对失败的(仅当引入诸如Peek&Poke之类的功能时,才真正成功,才能引入基础系统)。

计算机还不够强大,使它们的功能足够昂贵。当您只能获得有限的资源时,每个字节和CPU周期都会计算。

我使用的第一台计算机是 Sinclair ZX频谱 1982年。它的RAM(16K)少于今天的单个字体文件的大小。那是在家用计算机时代相对较新的。在1970年代中期之前,在家中拥有计算机的想法是不可想象的。

只是为了记录,我们从不手工编译组装。我们手工组装汇编语言代码。现在这很明显...

您的类比蒙上了一个问题,因为从这种意义上讲,汽车的速度与计算机的速度不类似:汽车的提高需要自动安全性的变化,但并不是计算机的速度提高,使需要更改计算机安全性,这是连接性的提高。从略有不同的角度:对于汽车,提高速度是 驾驶 提高安全性的技术。对于计算机,提高速度是 启用 提高安全性的技术。

因此,第一批汽车在事故中是安全的,因为它们很慢。第一台计算机是安全的,因为它们没有网络。

现在,通过安全带,安全气囊,ABS,防撞设备等使汽车更安全。通过其他技术,尽管您仍然无法击败网络电缆,但通过其他技术可以安全。

这是一个简化,但我认为它是它的核心。那时我们不需要这些东西,因为计算机没有连接到网络。

300年前没有火车的原因相同。 30年前没有手机没有手机的原因。我们仍然没有传送机的原因。

技术随着时间的流逝而发展,称为进化。

当时,计算机还不够强大。在后台运行垃圾收集器会杀死您的应用程序性能。

谈到您的问题,为什么计算机没有在托管代码级别上具有保护机制,而不是为什么VM无法在慢速硬件上运行(在其他帖子中已经解释)。简短的答案是。 CPU被设计为当发生不良代码时会引发例外,以免损坏系统。 Windows臭名昭著地处理了这一问题,但是还有其他OSS。 Unix将其作为信号传递,以便在不降低系统的情况下终止程序。实际上,无论您是否正在运行托管代码,在程序终止中,零指针异常都会以相同的方式产生。虚拟内存可确保程序不会与其他代码混乱,因此他们所能做的就是伤害自己。

这把我带到了第二点。如果您知道自己在做什么,那么所有这些都是不必要的。如果我想保持家具清洁,我根本不放在上面。我不需要用塑料遮盖我的房子,我只需要小心。如果您是草率的编码器,那么世界上最好的VM就不会拯救您,它只会允许您在没有任何噪音的情况下运行草率的代码。另外,如果您使用适当的封装,则容易移植代码。当您是一个好的编码器时,托管代码无济于事。这就是为什么每个人都不使用它的原因。这只是一个偏爱问题,而不是更好 /更糟。

就运行时的安全性而言,P代码编译器无法预测机器代码不能,而托管代码解释器可以处理OS无法(或不可)。带有额外公共汽车,CPU和指示套件的主板花费更多的钱 - 这一切都与成本/绩效比率有关。

1970年,记忆的成本是 大约$ 1/位 (没有通货膨胀)。您负担不起豪华垃圾收集的费用。

我认为像大多数问题一样,“为什么几年前我们没有X在编程中没有X”,答案是速度/资源分配。有限的资源需要尽可能有效地管理。与托管代码相关的管理的通用类型将太过资源消耗,无法在当时的绩效关键应用中受益。这也是为什么今天的fortran或汇编程序编写的今天的性能关键代码的一部分。

为什么我们不只是立即建造飞机和飞船,而不是用马和婚姻和所有乏味的东西闲逛?

使用中间语言需要两件事之一:

  1. 运行时解释将有很大的性能惩罚(可变变化 - 骨质2倍或更少,但有时100倍或更多)
  2. 一个即时的编译器,将需要额外的RAM,并且将添加与程序大小大致成比例的延迟,而不是执行的语句数量

多年来发生了变化的一件事是,许多程序的运行是其模式中最严重的部分,比以往更多的次。假设第一次执行任何特定语句将与后续执行一样长1,000倍。在每个语句平均运行100次的计划中,该罚款会产生什么影响?该罚款对每个声明平均运行1,000,000次运行的计划有什么影响?

很长一段时间以来,就可以使用即时编译,但是在1980年代或1990年代,性能成本是不可接受的。随着技术的变化,JIT汇编的实际成本已经归结为它们完全实用。

答案变得更加清晰 - 人类不是为编写程序而建立的。机器应该这样做,让我们通过玩Pacman放松。

就其价值而言,我阅读了几篇有关我的计算语言课程的论文(一个是Car Hoare,另一个由Nicholas Wirth撰写的),在60年代和70年代中倡导这一点。

我无法确切地谈论为什么这些事情没有发生,但是我猜想这只是事后看来显而易见的事情之一,当时并不明显。并不是较早的编译器不关心安全性。这是他们对如何执行此操作有不同的想法。

Hoare提到了“结帐编译器”的想法。据我所知,这本质上是进行静态分析的编译器。对他来说,这是一种流行的技术,失败了(或者至少没有解决要解决的问题)。对他的解决方案是通过创建托管代码来使编程语言更加安全(或者至少这就是他将其以现代方式提出的方式)。

我想,一旦C(和后来的C ++)抓住了,托管代码的想法本质上就已经死了。并不是说C是一种不好的语言,只是打算是一种汇编语言而不是应用程序编程语言。

如果有机会,您可能会读 关于编程语言设计的提示. 。如果您对这种事情感兴趣,这是一个很好的阅读。

对这个问题的最佳答案是,恕我直言,当时没有人知道托管代码的想法。知识实际上会随着时间的流逝而发展。与建筑或农业等领域相比,计算机科学是一个非常年轻的领域。因此,关于该领域的集体知识也很年轻,并且会随着时间的流逝而发展。也许在几年后,我们遇到了一些新现象,有人会问同样的问题:“为什么有人不考虑XYZ Beofore?”。

我想说这在很大程度上是变化的抵抗力,加上对垃圾收集效率低下的虚假看法,这延迟了GC和相关技术的采用。当然,Intel 8086上的大脑死亡分段内存模型并不能完全有助于促进PC上的理智记忆管理。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top