sha*_*kin 8 history managed-code
请注意,这不是微软为了传播托管代码的概念而进入大气层的.NET CLR.大多数人都知道托管代码已存在很长时间,并且与火箭科学无关.
我想知道的是为什么计算机发展中运行时安全的概念来得太晚了.
我知道这就像问"为什么第一辆T型福特不带安全气囊和安全带?".尽管如此,这个问题的相关性仍然存在,因为保护已知的危险在人性中是很好的.例如,第一辆T-Ford的速度不够快,无法激发安全气囊的研究.它的速度不够快,人们常常做出致命的判断错误,以至于它会激励安全带成为许多国家的法律和标准.
在计算机进化中,它几乎是另一种方式.我们开始使用汇编程序,相当于以200英里每小时的速度驾驶T-Ford.我有幸与这个时代的几个老卡车司机交谈,听到这些关于手工组装汇编代码,人工调试器,格栅代码等的故事.如果我们在C中犯了一个非常讨厌的错误,我们可能会结束蓝屏.几十年前,你最终可能会损坏硬件而上帝知道什么.但这对我来说是一个谜 - 几十年来,我们所做的一切都是为了减少痛苦,因为蓝屏(很抱歉使用MS作为任何东西的原型).
保护免受已知危险的不仅仅是在人性中,在任何程序员的本性中,自动化和系统化常见设施也是如此,例如错误检查,内存诊断,日志框架,备份维护等.
为什么程序员/人类没有开始自动完成确保他们提供给系统的代码不会损害系统的任务?是的,当然,表现.但是,嘿,这是在任何严重渗透的硬件标准之前.为什么主板没有设计总线架构和额外的处理器来促进"托管代码"?
模特T福特是否有任何比喻不足以让我失踪?
Jam*_*son 18
在安全性等方面构建的托管代码已存在很长时间了.
在最初的PC平台上没有它的空间,它从未在以后添加过.
自70年代以来,古老的IBM大型机已经保护了寻址,不可触及的内核库,基于角色的安全性等.此外,所有Assembler代码都由一个复杂的(当时的)变更管理系统管理.(Univac,Burroughs等有类似的东西.)
Unix从一开始就内置了相当不错的安全性(多年来它并没有太大变化).
所以我认为这是一个很大的windows/web空间问题.
从未有过大型机病毒!世界上大多数金融交易在某些时候通过这些系统,因此它们并不像是一个有吸引力的目标.
虽然内部IBM邮件系统确实托管了第一个"木马"!
小智 11
实际上,托管代码已存在很长时间了.考虑:
所有提供的类似操作系统的环境都保护了内存和其他资源控制问题的使用.所有这些都是相对的失败(BASIC只有在PEEK和POKE这样的功能允许你搞乱底层系统时才真正成功).
Joh*_*ley 10
计算机不够强大,使它们足够强大太昂贵了.当您只拥有有限的资源时,每个字节和CPU周期都会计算在内.
我使用的第一台计算机是1982 年的Sinclair ZX Spectrum.它的RAM(16K)比现在单个Windows'字体文件的大小少.这是最近,在家庭计算机时代.在20世纪70年代中期之前,在家中安装电脑的想法是不可思议的.
仅仅为了记录,我们从来没有手工编译组装.我们手工组装汇编语言代码.现在那很清楚......
你的比喻使问题蒙上阴影,因为在这种意义上,汽车的速度与计算机的速度并不相似:汽车速度的提高需要改变汽车的安全性,但并不是计算机驱动速度的提高.需要改变计算机安全性,这是连接性的增加.从略微不同的角度来看:对于汽车而言,提高速度是提高安全性的驱动技术.对于计算机而言,提高速度是提高安全性的有利技术.
因此,第一辆车在事故中是安全的,因为它们很慢.第一台计算机是安全的,因为它们没有联网.
现在,通过安全带,安全气囊,ABS,防撞装置等使汽车更加安全.通过其他技术使计算机变得安全,尽管您仍然无法拔掉网络电缆.
这是一种简化,但我认为它是它的核心.那时我们不需要那些东西,因为计算机没有连接到网络.
让我们从第一原则开始思考.
托管平台提供相对沙箱区域以运行从高级语言创建的程序代码到更适合由平台执行的形式(IL字节码).还有垃圾收集和模块加载等实用功能.
现在考虑本机应用程序 - 操作系统提供了一个相对沙箱区域(一个进程)来运行程序代码,该程序代码从高级语言创建到更适合由平台执行的形式(x86操作码).还有一些实用功能,如虚拟内存管理和模块加载.
没有太大的区别,我认为我们首先管理平台的原因仅仅是因为它使编码平台变得更容易.它应该使代码在操作系统之间可移植,但MS并不关心它.安全性是托管平台的一部分,但应该是操作系统的一部分 - 例如.您的托管应用程序可以像正常流程一样编写文件和类似文件.限制这是一个安全功能,它不是本机上不存在的托管平台的一个方面.
最终,他们可以将所有这些托管功能放入一组本机dll并废弃中间字节码的想法,JIT编译为本机代码.像GC这样的"托管"功能在原生堆上很容易实现 - 请参阅Boehm C++示例.
我认为MS之所以这样做,部分是因为它使编译器更容易编写,部分原因是因为Java就是这样编写的(而且.NET是Java的后代,如果只是在精神上),尽管Java这样做是为了交叉-platform编码可能,MS不关心.
那么,为什么我们从一开始就没有得到托管代码 - 因为你提到的所有东西都是"托管"代码的一部分,都是本机代码.我们今天拥有的托管平台只是在已经抽象的平台之上的额外抽象.高级语言已经添加了更多功能来保护您自己,缓冲区溢出已经成为过去,但是当C最初发明时,它们没有理由不能在C中实现.只是他们不是.也许事后看来,似乎缺少这些功能,但我相信在10年的时间里,我们会问"为什么没有C#实现像我们今天这样明显有用的功能XYZ"
| 归档时间: |
|
| 查看次数: |
1069 次 |
| 最近记录: |