原文链接 - http://msdn.microsoft.com/msdnmag/issues/06/06/EndBracket/
当发明C和C++语言时,计算机速度相当慢,存储器容量有限且昂贵,编译器也很简易。所以那时一门实际应用的语言只能是对汇编语言的修饰而已。然而,随着时代变更,这却限制了现代软件发展。今天,程序性能已经很少受限于原生处理器的速度。相反,延迟内存,磁盘,网络,数据库等经常对性能有着绝对性作用。此外,软件的可信任性(即软件可靠性,实用性,安全性的综合)已经成为软件开发的主要挑战。
通过预防(或者至少是检测)多数通用编程错误,安全的编程语言可以增加软件的可信任性。安全性包括两部分:类型和存储。类型安全是说程序不应当把类型A的对象视为无关类型来对待(C/C++语言提供了这个“特性”)。存储安全指的是程序不应当通过对象边界或构造对象指针来引用。比如,把某个随机整数转换成指针。
不必怀疑你所认为的:“嗯...,你那种调调我以前就听过了,但是安全的语言对我的应用程序来说太慢了,很吃内存的”。事实上,或许你更应该关注所使用的编程语言或操作系统的实现,而不是语言安全性。
为了探究这些问题,微软研究院的队伍已经构建了一个新的系统来研究权衡取舍在安全语言中广泛使用的用法,以及证明它们并不会导致大的性能下降。
Singularity是一个新操作系统。它几乎完全用C#写成,只运行可验证的安全程序。Singularity的内核和运行时库只是系统的一部分。此外,还包含不安全代码。大部分代码都是用安全的C#写成的。
Singularity通过重新改造代码执行环境达到了良好的性能。在现存的系统中,安全代码相对于那些生活在系统上流社会的服务来说,它是个奇怪的外来客。与此相反,Singularity架构了一个与现存系统性能相媲美的,每个人都安全的单一世界。
很关键的一个起始点就是Singularity的进程。它一开始是空的,然后按需增加特性。现代语言运行时往往伴随着巨大的库和富于表现的动态语言特性,比如反射。这就是丰富的代价。像代码访问安全或反射等特性会导致高开销,即使从来都不使用。
Singularity应用程序详细说明了它需要哪个库,而且Bartok编译器会与代码结合,通过调用进程“tree shaking”(该进程删除了未使用的类,方法,甚至字段)消除了不必要的功能。结果,在Singularity中一个简单的C#“Hello world”进程占用的内存,比起与之相当的运行在大多数Unix或Windows系统上的C/C++程序还要小。此外,Bartok编译器还把微软中间语言(MSIL)转换成高度优化过的x86代码。它还通过中间过程优化来消除多余的运行时安全测试,减少语言安全性的消耗。
极其有效的中间过程优化是非常有可能的,因为Singularity进程是封闭的。系统不允许在进程开始运行之后继续加载代码。这是个引人注目的变化,因为动态代码加载是个非常流行,但又有问题的插件机制。允许插件程序访问程序内部导致了很严重的安全性和可靠性问题(你可知道大约85%的Windows蓝屏是由第三方插件和设备驱动引起的)。动态加载会破坏在编译器或缺陷检测工具中的程序分析工作,因为或许会看不到所有的代码运行。为了保证安全,必须保守分析,预先排除许多优化,削减缺陷检测精度。
在Singularity中的插件程序运行在它们自己的进程空间中,并且用仔细验证过的通信管道来通信。这种架构是可行的,因为创建Singularity进程和进程间通信并不昂贵。这是缘于Singularity进程依赖于语言安全性,而不是虚拟内存硬件来强制隔离。
重新思考程序运行环境会极大减少现代安全编程语言所带来的负作用。Singularity是个重新设计的系统,这样程序员便不再为了速度而牺牲安全性。
关于Singularity的其他文章链接:
Singularity项目概览 - 1.介绍
Singularity项目概览 - 2.Singularity