重新学.Net[五]——CLR的多语言支持

简介:
众所周知,CLR支持多种语言,包括C#,VB.Net等等二十多种(其实说确切一点,应该是各种语言都可以提供编译器,从而运行在CLR上)。为了支持多种语言,CLR必须建立一种模式,使得各种语言都能很容易的运行在其上。而如今各种面向对象的语言,虽然在语法上各有不同,但其核心语义都是类似的。因此CLR利用了这一点,它的所有内容都是围绕着类型展开的。CLR的通用类型系统CTS,就是用来描述类型定义和行为的。
 简单的说,首先CTS定义了一些类型,分成值类型和引用类型两种。值类型包括int32,Boolean,Structure等等,运行时在运行栈上分配。引用类型包括Class,Interface,Array等等,在托管堆中分配(相信学过OO的人对这都不会很陌生)。每种类型可能会有一些成员(0到N个),包括字段,方法,属性和事件。同时每种类型都用一些访问控制权限,比如Public,Private,等等。此外,CTS中还规定了一些规则,比如:所有类型必须继承自Object,支持单继承等等。所有的这些类型设定和规则构成了CTS,一门语言编译过来,只要满足CTS要求,CLR都可以运行。因此一门语言要想运行在CLR之上,就必须服从CTS的规定和限制(比如C++需要编译运行在CLR上,就需要改变其多继承的方式)。
同时,CTS是如此的庞大,目前还没有语言可以支持它的所有特点(包括C#和VB),并且CLR也没有这个要求。这样就会带来一个问题。一种语言编写的库,如何能被其他语言调用?假设一门语言支持UInt64,用它实现了一个库,有一个方法为public int64 getInt()。这时候另外一门语言在程序设计中想调用这个库的这个方法,但是它不支持UInt64,使其根本无法使用这个库。这与CLR的多语言支持理念显然不符。
所以为了实现多语言的互通,还需要一个通用语言规范CLS,它是CTS的一个子集。所有运行在CLR上的语言,必须完全支持CLS。比如CLS中有Int16,但没有要求UInt64(CTS中都有支持),一门语言想运行在CLR之上,它必须支持Int16,但不必须支持UInt64。这也告诉我们,如果你想让你的设计的类库,框架等被所有支持CLR的语言调用,必须只能以CLS的规范公开接口,当然在内部你可以使用所有CTS支持的类型进行编程。
说直白一些,CTS是天,它包容一切,CLS是地,必须站立在它上面。大部分语言都是在两者之间(是CLS的超集,是CTS的子集),可以说是顶天立地了(不好意思,比喻有点烂,胃部不适者请自备垃圾袋^_^)。
每每考虑这个问题的时候我都会有一个疑惑。就是C#和VB.Net一定要搞得很双胞胎一样吗(两者语法习惯虽不同,但支持的特征和特点简直像到了死)?当然,微软有它的商业考虑,但我还是很怀念那个简单的VB时代,总觉得VB.Net语法就应该简单一些,好入门一些,开发效率更高一些。据说VB.Net和C#的特征集在以后要开始有所分离了,恩,希望这是真的。









本文转自 duguguiyu 51CTO博客,原文链接:http://blog.51cto.com/duguguiyu/361637,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
数据采集 自然语言处理 监控
基于.Net开发的、支持多平台、多语言餐厅点餐系统
基于.Net开发的、支持多平台、多语言餐厅点餐系统
76 0
|
11月前
|
开发框架 .NET Java
【深入理解CLR 一】Net体系结构及CLR在何处
【深入理解CLR 一】Net体系结构及CLR在何处
78 0
|
开发框架 自然语言处理 前端开发
一个基于.NetCore开发、模块化、跨平台、多语言商城系统
一个基于.Net Core MVC开发的、简单、模块化、跨平台、多语言的电子商务系统。项目采用模块化架构,代码清晰,便于扩展;功能完善、集成了外贸常见的支付方式;支持多个主题切换;所采用的技术栈都是最新的。
315 0
一个基于.NetCore开发、模块化、跨平台、多语言商城系统
|
存储 开发框架 Java
【CLR C#】浅谈.Net的GC(垃圾回收)机制及其整体流程
在.NET程序开发中,为了将开发人员从繁琐的内存管理中解脱出来,将更多的精力花费在业务逻辑上,CLR提供了自动执行垃圾回收的机制来进行内存管理,开发人员甚至感觉不到这一过程的存在。.NET程序可以找出某个时间点上哪些已分配的内存空间没有被程序使用,并自动释放它们。自动找出并释放不再使用的内存空间机制,就称为垃圾回收机制。本文主要介绍.Net中的GC(垃圾回收)机制及其整体流程。
【CLR C#】浅谈.Net的GC(垃圾回收)机制及其整体流程
|
自然语言处理
.Net MVC5(.Net Framework 4.0+)多语言解决方案
最近项目需要做多语言,原先是2种语言(中文/英文),现在又要加一种语言,成了3种。那么原来的方式肯定不适用了,只能升级解决方案。
.Net MVC5(.Net Framework 4.0+)多语言解决方案