CTS,CLS,CLR的理解
编程时出现的问题,就像裹在真相外面的一层层纸,你要做的就是一层一层剥掉这些纸。
今天在解决一个bug时,一层一层查资料,最后查到了CTS上,虽然大概清楚.net框架的结构,但是对CTS的作用以及为什么叫.net框架是跨语言的不是很了解,于是花了点时间查了点资料,结合所看的资料和自己的思考,有了一下内容。如有不同意见,敬请指正。
一.背景
社会需求的多样性造就了编程语言的多样性。语言多样性使得各语言之间的交互性成了一个很大的问题,这是一种很大的资源浪费(a语言已经实现了的程序,因为不能移植到b语言中,只能用b语言再实现一次)。这也使得实现各语言的统一成了程序员们的一种愿望。但是,事不如人愿,虽然做了很大的努力,但是都没有达到很好的效果。
二.CTS(Common Type System)
我们都知道,著名计算机科学家N.Wirth提出过这样一个公式:算法 + 数据结构 = 程序。这个公式为跨语言的框架提供了灵感:算法属于逻辑,是脱离语言的;那么只要实现了各语言之间数据结构的交互,那么不就是相当于实现了由各语言所编写程序之间的交互了吗!
事实也确实如此,虽然编程语言丰富多彩,但是几乎都有相似的数据结构。而在.net中,数据结构的表现形式也就是CTS。
为了实现各种语言的数据结构之间的可交互性,必须要有中间的数据结构来做中转,也就是说任何以.NET平台作为目标的语言都必须建立它的数据结构与CTS的类型之间的映射。例如:VB.NET中Single类型映射为IL类型就是float32,而C#中float类型也映射为float32,由此就可以建立起VB.NET和C#的类型关系,为互操作打下基础。。实现这种映射有三种方法:
1.改变语言本身以符合CTS的规定。例如Visual Basic 6就为此做了大幅度的扩充与改变,加上继承的特性,这使得新版的Visual Basic .NET 差不多可以算是一个全新的语言了,犹如当年C衍生出C++一样。
2.扩充语言本身以接近CTS的规定,但仍保留不相容于CTS的语法,如此一来,程序中符合CTS规定的以CTS方式编译,不符合CTS规定的则以传统的方式编译成native code。例如C++ with Managed Extension (简称MC++) 就是如此。
3.语言本身尽量维持不变,一切都是通过超强的编译器设计来达成和CTS的相容,Eiffel就是如此的作法。例如,CTS不支援多重继承(multiple inheritance),但是Eiffel支援多重继承,通过Eiffel的编译器可以利用interface以及attribute来达到多重继承。
我们可以把CTS看成是所有.NET语言的superset(union),而符合CTS的各种语言是CTS的subset(intersection)。
三.CLS(Common Language Specification)
虽然各种语言是相似的,但是总还是有区别的。所以为了限制由这些不同引发的交互性问题,使它们遵循相同的规范,.NET定义了CLS。CLS相当于所有支持.NET平台的语言的CTS的最小交集。因为CLS是CTS的一个子集,这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。
四.CLR(Common Language Runtime)
简单地说,CLR是CTS的实现,也就是说,CLR是应用程序的执行引擎和功能齐全的类库,该类库严格按照CTS规范实现。作为程序执行引擎,CLR负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。这里只是很简单的讲了一下CLR,至于想深入了解的朋友可以自己查点资料看看。
参考:
http://www.cnblogs.com/michaelxu/archive/2010/06/02/1750149.html
http://www.haogongju.net/art/478711