本文简单的探讨一下.net代码是如何被运行的,以及一些有关。net类型安全的个人见解,并不保证这里所说的符合事实,实际上,很可能有许多都是错漏的,如果您有不同或更好的看法,请一定要告诉我,我将不胜感激 :)
1 源代码
几乎所有的编程语言的生命周期,其初始都是一个包含许多特定符号的文本文件,这些文本以人类可读的形式记录下了一些操作的逻辑,当然,不同的编程语言其可读性有很大差别
在目前,那些可读的文本文件一定会被转换成一个机器可读并且可以执行的二进制的文件(编译),也就是我们所说的程序,当然。转换的方式可能并不是直接的
有些语言强制要求将文本文件编译成二进制的程序,例如C,C++
另一些则不这么做,他们直接读入文本,然后执行它,例如 javascript
在此有必要解释一下,在目前的技术条件下,机器只能够读懂二进制的文件,它并不能够读懂文本文件,也不知道该怎么按照文本文件描述的那样去执行,那么类似javascript的语言是如何被执行的呢?很简单,有一个二进制的程序(由C/C++或者其他什么语言编译而成的)来解释它,用二进制的程序,读入文本文件,然后产生相应的动作,这样是可行的,就像下面的代码展示的一样
static int main(string[] args) { if(args[0] == "关机") { //执行关机的代码 } } |
现在情况有些变化 .net 讲上述讲述的过程加了一步,这里以C#为例
c#源文件(文本字符串,人类可读的,机器不可执行) -> IL程序集(二进制文件,人类不可读,目前机器不可执行) -> 本机代码(二进制,人类不可读,机器可执行)。
为什么要加上一个产生IL程序集的过程? 原因有很多,其中的一个是可以使得.net平台提供跨语言特性,因为.net平台能够理解,并支持的只有IL程序集,只要编程语言能够讲自己编译成IL程序集,它就能够被.net平台理解并运行
能够编译成IL程序集的语言有很多,C#,VB.NET,Ruby,等等... ..