.Net技术的起源可以说是一个最基本的观点,代码复用。
以前的复用方式就是类库,使用一个好的类库是非常令人舒心的事情,但现实往往令人沮丧,因为类库都是与语言绑定的,每种语言有自己的类库,比如js想使用stl的unordered_map,或者其他的c++库,需要实现与c++之间的相互调用。
怎么样才能使js方便的调用c++的类库呢?微软给了两个答案COM和.NET。
COM这里就不讨论了,其实现原理是基于物理层面的,太复杂,尽管有MFC,ATL,依然非常复杂。
那么.NET呢,很简单,做个编译器,把js代码编译为c++代码呗!
是啊,把js代码编译为c++代码需要解决一些问题:
首先就是变量的类型,大家的类型系统都不一样怎么办呢?
其次是语言本身,解释性语言搞成了编译性语言,难道每次写js代码都要编译两次吗?
微软也给出了相应的解决方案:
类型系统不一致,那就统一呗,既然我们希望支持各种语言,那就叫通用类型系统(CTS)吧。
语言问题怎么办呢,大家都认为自己喜欢的语言是最好的,为了讨论什么语言更好大家往往会讨论到脸红脖子粗。那就给种全新的语言吧,也不用引起IT界的又一次大讨论,既然我们希望支持各种语言,那就叫通用中间语言(CIL)吧。
噢,对了,还要给各个编译器作者规定一下把代码编译为CIL的规范吧?既然我们可以支持各种语言,那就叫公共语言定义(CLS)吧。
我们的出发点就是为了解决复用问题,好了现在大家都会被编译为CIL,我们只需要为CIL写一个基础库就可以了,既然我们可以支持各种语言,那就叫公共语言运行库(CLR)吧。剩下的事情就是各个编译器作者的事情了,javascript.net,VB.net。。。
.Net起源的故事我们就讲完了,毕竟这是一个全新的系统,以前的语言写法或者实现上可能会有些出入(至少让人别扭),所以微软发布了C#。