...
Windows和Vista主要是使用C++写的,UNIX是用C写的,部分使用了C++。Vista编写团队拒绝使用C#或.NET写关键服务代码,原因是.NET太慢、太耗资源了,Vista自己使用的运行库仍然是CRT(C/C++运行库),而不是CLR(公共语言运行库,C#的虚拟机)。不能想象用C#或Java写的操作系统会怎样。Vista已经够慢了,如果再用C#写,可能每天要花数个小时开机吧!
再到语言。.NET虚拟机的核心本身就是用C++写的,Java虚拟机的核心虽然没有用C++(部分原因是Java不想因出生而被对手C++嘲笑),但确实是用的C写的。所以,即使C++不是必要的,C总是必要的。而只有C++可以达到近似C的效率。C能做的,C++都可以。相反,C#或Java并非无所不能,他们只不过是将该做的事留给虚拟机做而已。如果没有C/C++,没有了虚拟机,C#和Java什么都不是。在虚拟机的世界,他们只是用来编写各自供开发者的类库罢了。如果C#虚拟机本身也用C#编写,那它必须运行在另一个虚拟机上,这个虚拟机又是用什么编写的呢?
再说编译器。C++编译器可以代码生成为机器码,因而C++编译器可以编译它自己。所有的C++编译器,都是用C++编写的(当然除了史上第一个C++编译器,它是用C写的)。但是C#和Java可以吗?是的,可以,但只可以写前端,不能写后端。因为它们不能生成机器码!传统由编译后端完成的代码生成工作现在由虚拟机完成。这是虚拟机之所以那么慢的部分原因。
Java号称平台无关,C#也号称平台无关,但是他们只能再虚拟机上运行。正如C++之父Bjarne Stroustrup所说“Java不是平台无关,Java是一种平台”。离开Java平台,Java就什么也不能做了。同样的C#也离不开CLR。但是C/C++可以,它们是真正的平台无关。对于一个新的硬件或软件平台,只要用C++自己写的编译器做一次交叉编译生成,就可以在新平台上通行无阻了,以后编译器的不断改进,都在C++自己的能力范围以内。用C#,用Java,如果没有Microsoft和Sun,要你自己写虚拟机时,你不就还是要用C/C++吗?
其实效率不是关键因素,即使C#/Java象C/C++一样快,也不可能取代后者。最根本的原因,C/C++是通用语言,是系统语言。只要掌握一门这样的语言,你和机器的交流就没有问题了,想怎样都成。而C#之流,只是在特定领域其作用的专用语言而已。所以它们不可能取代一门通用语言,层次不同嘛。
当然没有贬低C#和Java的意思,它们在其特定领域还是很有用途的,特别在网络编程领域,已经和C/C++鼎足而立了。但是认清一门语言的优势、劣势及其适用范围,还是很有必要的。C/C++也许在将来会被另一门通用语言所代替,或者让出部分领域的市场,但不同层次上的争斗就不必要了。就象我们也不能指望C/C++能淘汰汇编或机器语言吧。