1.4.1 IL and Verification IL与验证
IL是一种基于堆栈的语言,这意味着他的所有指令不是将操作推进到一个执行堆栈中,就是从堆栈中弹出结果。因为IL不提供操作寄存器的指令,所以编译器开发人员可以很容易的编写面向CLR的代码。
IL指令是无类型的。例如,IL提供add指令,该指令对推进堆栈中的最后两个操作数做想家操作,没有32位和64位指令的区分。当add指令执行时,它首先判断堆栈上操作数的类型,然后进行适当的操作。
我觉得,IL最大的好处不是对底层CPU的抽象,而是大大提高了应用程序的健壮性(robustness)和安全性(security),当IL代码被编译为本地CPU指令时,CLR将执行一个称作“验证”的过程。验证过程检查高级IL代码,确保它做的每件事情都是“安全”的。例如:不能从未初始化的内存中读取数据每个方法调用都必须传入正确的参数个数,并且每个参数的类型要正确匹配;每个方法的返回值都必须被正确的使用;每个方法都必须有一个返回语句等等。托管模块的元数据中包括了所有验证过程中需要的方法和类型信息。
在windows里,每个进程都有自己的虚拟地址空间。分离地址空间是必须的,因为你不能信任应用程序的代码。一个应用程序完全可能(而且不幸的是,也很常见)读写一个无效的内存地址。将每个windows进程放在独立的地址空间提高应用程序的健壮性,因为这样一个进程就不会干扰另一个进程的运行。
通过验证托管代码,你可以确保他们不会访问它们不应该访问它们不应该访问的内存,一次也就不会干扰另一个应用程序的代码。这意味着我们可以在一个单独的window虚拟地址空间内运行多个托管应用程序。
因为window进程需要很多操作系统资源,所以太多的进程会损伤性能,并限制系统中可用的资源。在一个操作系统进程中运行多个托管应用程序可以减少进程的数量,从而提高系统性能,降低资源需求,而应用程序仍然可以保持良好的健壮性。这是托管代码相较于非托管代码的另一个优点。
实际上,CLR确实提供了在一个单独的操作系统进程中执行多个托管应用程序的能力。在CLR中,一个托管应用程序称作一个应用程序域(AppDomain)。默认情况下,每个托管EXE文件只在它单独的地址空间上运行,这个地址空间上只有一个应用程序域。然而,CLR的宿主进程可以决定在一个操作系统中运行多个应用程序域。我会在第22章"CLR宿主及应用程序域"中做详细讲解
作者:石世特
出处:http://www.cnblogs.com/TivonStone/
希望本文对你有所帮助,想转随便转,心情好的话给我的文章留个链接.o(. .)o