为什么从一开始就没有“管理”代码?

时间:2009-04-28 09:08:09

标签: history managed-code

请注意,这不是微软为了传播托管代码概念而进入大气层的.NET CLR。大多数人都知道托管代码已存在很长时间,与火箭科学无关。

我想知道的是为什么计算机发展过程中运行时安全的概念来得太晚

我知道这就像问“为什么第一辆T型福特不带安全气囊和安全带?”。尽管如此,这个问题的相关性仍然存在,因为保护已知的危险在人性中是很好的。例如。第一辆T-Ford没有足够快地推动安全气囊研究。它的速度不够快,人们常常做出致命的判断错误,以至于它会激励安全带成为许多国家的法律和标准。

在计算机进化中,它几乎是另一种方式。我们开始使用汇编程序,相当于以200英里每小时的速度驾驶T-Ford。我有幸与这个时代的几个老卡车司机交谈,听到这些关于手工组装汇编代码,人工调试器,格栅代码等的故事。如果我们在C中犯了一个非常讨厌的错误,我们可能会结束蓝屏。几十年前,你最终可能会损坏硬件而上帝知道什么。但这对我来说是一个谜 - 几十年来,我们所做的一切都是为了让崩溃更轻松的是蓝屏(抱歉使用MS作为任何东西的原型)。

防止已知危险不仅在人性中,在任何程序员的本性中也可以自动化和系统化常见设施,如错误检查,内存诊断,日志框架,备份维护等。

为什么程序员/人类没有开始自动完成确保他们提供给系统的代码不会损害系统的任务?是的,当然,表现。但是,嘿,这是在任何严重渗透的硬件标准之前。为什么主板没有设计总线架构和额外的处理器来促进“托管代码”?

是否有任何比喻模型T福特不够快,我错过了?

15 个答案:

答案 0 :(得分:18)

安全等内置的托管代码已存在很长时间了。

原始PC平台上没有空间,以后再也没有添加它。

自70年代以来,古老的IBM大型机已经保护了寻址,不可触及的内核库,基于角色的安全性等。此外,所有Assembler代码都由一个复杂的(当时的)变更管理系统管理。 (Univac,Burroughs等有类似的东西。)

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

所以我认为这是一个很大的windows / web空间问题。

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

内部IBM邮件系统确实托管了第一个'木马'!

答案 1 :(得分:11)

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

  • LISP
  • Smalltalk中
  • BASIC(原味)

所有提供的类似操作系统的环境保护内存和其他资源控制问题的使用。所有这些都是相对的失败(BASIC只有在PEEK和POKE之类的功能允许你搞乱基础系统时才真正成功)。

答案 2 :(得分:10)

计算机功能不够强大,使它们足够强大太贵了。当您只有有限的资源可供使用时,每个字节和CPU周期都会计算在内。

我在1982年使用的第一台计算机是Sinclair ZX Spectrum。它的RAM(16K)比当前单个Windows'字体文件的大小少。这是最近,在家庭计算机时代。在20世纪70年代中期之前,在家中安装电脑的想法是不可想象的。

答案 3 :(得分:7)

仅仅为了记录,我们从未手工编译过汇编。我们手工组装汇编语言代码。现在那很清楚......

你的比喻使问题蒙上阴影,因为在这种意义上,汽车的速度与计算机的速度并不相似:汽车的速度越来越快,汽车安全性的变化就越大,但并不是计算机速度的提高这促使人们需要改变计算机安全性,这就是连接性的增加。从略微不同的角度来看:对于汽车来说,提高速度是驾驶技术,以提高安全性。对于计算机而言,提高速度是启用技术以提高安全性。

所以,第一辆车在事故中是安全的,因为它们很慢。第一台计算机是安全的,因为它们没有联网。

现在,通过安全带,安全气囊,ABS,防撞装置等使汽车更加安全。通过其他技术使计算机变得安全,尽管您仍然无法拔掉网络电缆。

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

答案 4 :(得分:6)

让我们从第一原则开始思考。

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

现在考虑一个本机应用程序 - 操作系统提供了一个相对沙箱区域(一个进程)来运行从高级语言创建的程序代码到更适合由平台执行的形式(x86操作码)。还有一些实用功能,如虚拟内存管理和模块加载。

没有太大的区别,我认为我们首先管理平台的原因仅仅是因为它使编码平台变得更容易。它应该使代码在操作系统之间可移植,但MS并不关心它。安全性是托管平台的一部分,但应该是操作系统的一部分 - 例如。您的托管应用程序可以像正常流程一样编写文件和类似文件。限制这是一个安全功能,它不是托管平台的一个方面,在本机上不存在。

最终,他们可以将所有这些托管功能放入一组本机dll并废弃中间字节码的想法,JIT编译为本机代码。像GC这样的“托管”功能在原生堆上很容易实现 - 请参阅Boehm C ++示例。

我认为MS之所以这样做,部分是因为它使编译器更容易编写,部分原因是因为Java就是这样制作的(而且.NET是Java的后代,如果只是在精神上),尽管Java就这样做了为了使跨平台编码成为可能,MS并不关心。

那么,为什么我们从一开始就没有得到托管代码 - 因为你提到的所有东西都是“托管”代码的一部分,都是本机代码。我们今天拥有的托管平台只是在已经抽象的平台之上的额外抽象。高级语言已经添加了更多功能来保护您自己,缓冲区溢出已经成为过去,但是当C最初发明时,它们没有理由不能在C中实现。只是他们不是。也许事后看来似乎缺少这些功能,但我相信在10年的时间里,我们会问“为什么没有C#实现像我们今天这样明显有用的功能XYZ”

答案 5 :(得分:4)

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

技术随着时间的推移而发展,它被称为进化。

当时计算机功能不够强大。在后台运行垃圾收集器会破坏应用程序性能。

答案 6 :(得分:3)

谈谈为什么计算机在托管代码级别上没有保护机制的问题,而不是为什么虚拟机无法在慢速硬件上运行(已经在其他帖子中解释过)。简短的回答是,它是。 CPU被设计为在发生错误代码时抛出异常,这样就不会损坏系统。 Windows处理这个问题非常糟糕,但还有其他操作系统。 Unix将其作为信号传递,以便程序在不关闭系统的情况下终止。实际上,无论您是否正在运行托管代码,空指针异常将以相同的方式产生 - 在程序终止时。虚拟内存确保程序不会与其他代码混淆,因此他们所能做的只是伤害自己。

这让我想到了第二点。如果你知道自己在做什么,这一切都是不必要的。如果我想保持家具清洁,我根本就不要把食物放在上面。我不需要用塑料盖房子,我只需要小心。如果你是一个草率的编码器,世界上最好的VM不会拯救你,它只会让你运行你的草率代码没有任何噪音。此外,如果使用适当的封装,移植代码也很容易。如果您是一名优秀的程序员,托管代码并没有广泛的帮助。这就是为什么不是每个人都在使用它。这只是一个偏好问题,而不是更好/更糟。

就运行时安全性而言,没有任何P代码编译器可以预测机器代码不能,并且托管代码解释器无法处理操作系统不能(或不能)处理的任何内容。带有额外总线,CPU和指令集的主板需要花费更多的钱 - IT就是成本/性能比。

答案 7 :(得分:2)

1970年,记忆成本为around $1/bit(没有通货膨胀)。你不能承担这样的费用来购买奢侈垃圾。

答案 8 :(得分:1)

我认为像大多数问题一样,“为什么我们在Y年前没有编程X”答案是速度/资源分配。资源有限,需要尽可能有效地进行管理。与托管代码相关联的通用管理类型过于消耗资源而无法在当时的性能关键应用程序中获益。这也是为什么今天的性能关键代码仍然用C,Fortran或汇编语言编写的部分原因。

答案 9 :(得分:1)

为什么我们不是立刻建造飞机和宇宙飞船,而不是用马车和所有繁琐的东西捣乱?

答案 10 :(得分:1)

使用中间语言需要以下两种方法之一:

  1. 运行时解释,会有很大的性能损失(变化很大 - 偶尔会有2倍或更少,但有时会达到100倍或更多)
  2. 即时编译器,它需要额外的RAM,并且会增加大致与程序大小成比例的延迟,而不是执行的语句数量

多年来发生的一件事是,许多程序运行模式中使用频率最高的部分比以前多了很多倍。假设第一次执行任何特定语句将导致罚款的次数是后续执行的1,000倍。在每个语句平均运行100次的程序中,该惩罚会产生什么影响?对每个声明平均运行1,000,000次的计划会产生什么影响呢?

即时编译已经有可能很长一段时间了,但在1980年代或1990年代,性能成本是不可接受的。随着技术的变化,JIT编译的实际成本已降到可以完全实用的程度。

答案 11 :(得分:0)

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

答案 12 :(得分:0)

为了它的价值,我读了几篇关于我的计算机语言课程的论文(一篇由Car Hoare和另一篇由Nicholas Wirth撰写)在60年代和70年代之间提倡这一论文。

我无法确切地说出为什么这些事情没有发生,但我的猜测是,这只是事后看来显而易见的事情之一,当时并不明显。并不是早期的编译器不关心安全性。他们对如何做到这一点有不同的想法。

Hoare提到了“结账编译器”的想法。据我所知,这本质上是一个进行静态分析的编译器。对他而言,这是一种失败的流行技术(或者至少没有像解决的那样解决许多问题)。他的解决方案是通过创建托管代码使编程语言更加安全(或者至少就是他如何用现代术语来表达它)。

我想,一旦C(及后来的C ++)流行起来,托管代码的想法基本上已经死了。并不是说C语言是一种糟糕的语言,只是因为它是一种汇编语言而不是应用程序编程语言。

如果有机会,可以阅读Hints on programming-language design。如果你对这类事情感兴趣,这是一个很好的阅读。

答案 13 :(得分:0)

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

答案 14 :(得分:-1)

我认为这主要是变化阻力加上对垃圾收集效率低下的错误认知,这推迟了GC和相关技术的采用。当然,英特尔8086上的脑死分段内存模型并没有完全有助于促进PC上的理智内存管理。