.NET 的推出,使得 Windows 下的编程语言发生了重大的变化,在 .NET 之前,各个编程语言都有自已的 Runtime 类库,而在 .NET 之后,各个 .NET 编程语言都引用同一套类库,这就使得微软必须要修改编程语言,否则就不能做到多种编程语言引用同一套类库。为什么不修改编程语言就做不到多种语言引用同一套类库呢? 原因是用这些编程语言编写的代码在编译之后都以机器语言(机器码)的形式存在,而由于机器语言并没有数据类型的概念,更别谈支持面向对象了,所以代码一经编译,数据类型和面向对象等等编程语言的特性就丢失了,所以,像 “VB 编写的类可以在 C# 中继承 ” 这样的特性,显然在旧的机制下是实现不了的。
让我们奇思妙想一下,如果机器语言支持数据类型和面向对象,那一切都不是问题了,所有的编程语言都编译后仍然保留数据类型和面向对象特性,互操作就不成问题了,问题是, CPU 制造商会在 CPU 指令中加入数据类型和面向对象这么复杂的指令吗?
既然机器语言不支持数据类型和面向对象,那我创造一套支持数据类型和面向对象的伪机器语言总可以吧,于是,中间语言的思路就浮出水面了,中间语言这个伪机器语言直接支持数据类型和面向对象特性(当然还不至这些),这样,通过修改编译器,使所有的 .NET 编程语言编译后不是产出机器语言,而是产出伪机器语言,即中间语言。
可是, CPU 并不认识中间语言,所以程序在编译后不能像以前那样直接运行,中间语言要得以执行,还需要经过一层转换(编译),需要先将中间语言转换成机器语言才能执行。
当然,中间语言出言的原因不只是为了解决多语言之间的互操作问题,它还提供了跨平台移植、以及运行时代码安全控制能力等,虽然在移植性方面, .NET 目前主要的平台还是微软的平台。
为什么微软需要创造 C#?
时下最流行的编程语言,当算 Java 、 VB 、 C++ 等,微软肯定要考虑所有这些语言的开发人员,让他们都能开发 .NET 程序,但是微软只拥有 VB ,微软只能把 VB 修改成 .NET 编程语言 VB.NET ,由于微软并不拥有 C++ ,所以微软不能随意修改 C++ ,这样 C++ 不能成为 .NET 编程语言, Java 呢, Sun 更加不愿意让你微软碰一丁半点。
怎么办呢?让 Java 和 C++ 程序员都转去学 VB 吗?呵呵,让这帮酷爱花括号的家伙去学习 VB 实在是比登天还难的事。
因此,为了把 C++ 程序员和 Java 程序员拉入 .NET 阵型,微软决定创造一个新语言 C# , 这个新语言的语法几乎与 C++/Java 一致,同时结合了 C++ 和 Java 的优点,所以无论是 C++ 程序员还是 Java 程序员, C# 都非常亲切。
但也并不是说 C++ 就不能开发 .NET 程序,由于 C++ 在一些性能悠关的场合仍然有着不可替代的地位, 而且很多旧的系统和软件都是用 C++ 编写的,它们仍然工作一段时间,因此微软自然不能放弃 C++ ,为了使 C++ 也能够使用 .NET Framework 的功能,微软为 C++ 提供了一个扩展库,使得 C++ 既可以编写原生的 Windows 程序,也可以编写 .NET 程序,但微软这么做可能只是为了新旧系统交替时的一个过渡方案,所以对于 C++ 程序员来说,在编写新软件时,学习和使用 C# 可能是较好的选择。
再说说 Java, Java 与 .NET 要进行对决这个战线是很明确的,因此,微软并没有给 Java 提供编写 .NET 程序的能力,反之,微软创建了一个另一个新语言 J# 来吸引 Java 程序员。