zoukankan      html  css  js  c++  java
  • .NET中的CTS、CLS、CLR

    一、解释1

    1、CLR(Common Language Runtime) :公共语言运行库

    CLR 是CTS(Common Type System:通用类型系统)的实现,

    即是说:CLR是应用程序的执行引擎和功能齐全的类库,

    该类库严格按照CTS规范实现。作为程序执行引擎,CLR

    负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收

    和安全检查。在CLR监控之下运行的代码成为托管代码(managed code)。

    2、CTS(Common Type System):通用类型系统

    CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型

    的方式来进行类型扩展。任何以.net平台作为目标的语言必须建立它的数据

    类型与CTS的类型间的映射。

    所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供

    了语言之间的继承性。例如:用户能够在VB.NET中派生一个由C#编写的类。

    可以将CTS看成是所有.NET语言的superset(union),而符合CTS的各种

    不同的语言,其实都只是CTS的subset(intersection)。这些语言所写出来的程序,

    如想要有最佳的相容性,以便互相调用(invoke)或继承,这些语言之间就必需取得

    一个共同的subset,有共同遵守的规范,这就是CLS.

    3、CLS(Common Language Specification):通用语言规范。

    很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,

    一些语言支持无符号数据类型,一些语言支持运算符重载。

    用户应认识到这一点,因此.NET通过定义公共语言规范(CLS:Common Language Specification),
    限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须

    支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。

    认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。

    例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言如何支持继承。

    CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。
    例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。
    因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言

    (如VB.NET)设计的.NET组件实现互操作。

    二、解释2

    在学习.NET的过程中,都会不可避免地接触到这三个概念,那么这三个东西是什么以及它们之间的关系是怎样的呢?我们在学习的过程中可能比较过多的会去关注CLR,因为CLR是.NET Framework的核心,但是我要说的是CTS和CLS更为重要,因为他们是CLR的核心。任何编程语言,如果想要在.NET CLR上执行,就必需提供一个编译器,将此语言的程序编译成.NET CLR所认识的metadata以及IL,符合CTS的规定。并非所有的语言都能和C#一样符合CTS的规范,毕竟许多语言出现在先,CTS出现在后,所以有一些旧的语言未能符合CTS的规定。这类的语言在.NET中有下列三种方式来符合CTS规范:

    - 改变语言本身以符合CTS的规定。例如Visual Basic 6就为此做了大幅度的扩充与改变,加上继承的特性,这使得新版的Visual Basic .NET 差不多可以算是一个全新的语言了,犹如当年C衍生出C++一样。

    - 扩充语言本身以接近CTS的规定,但仍保留不相容于CTS的语法,如此一来,程序中符合CTS规定的以CTS方式编译,不符合CTS规定的则以传统的方式编译成native code。例如C++ with Managed Extension (简称MC++) 就是如此。

    - 语言本身尽量维持不变,一切都是通过超强的编译器设计来达成和CTS的相容,Eiffel就是如此的作法。例如,CTS不支援多重继承(multiple inheritance),但是Eiffel支援多重继承,通过Eiffel的编译器可以利用interface以及attribute来达到多重继承(这样的作法相当巧妙,有兴趣的读者不妨去研究一下)。

    好,现在让我们来看一下它们三者的关系。

    1)CTS通用类型系统(Common Type System)

    CTS不但实现了COM的变量兼容类型,而且还定义了通过用户自定义类型的方式来进行类型扩展。任何以.NET平台作为目标的语言必须建立它的数据类型与CTS的类型间的映射。所有.NET语言共享这一类型系统,实现它们之间无缝的互操作。该方案还提供了语言之间的继承性。例如,用户能够在VB.NET中派生一个由C#编写的类。我们可以将CTS 看成是所有.NET 语言的superset (union),而符合CTS 的各种不同的语言,其实都只是CTS 的subset (intersection)。这些语言所写出来的程序,如果想要有最佳的相容性,以便互相调用(invoke) 或继承,这些语言之间就必需取得一个共同的subset,有共同遵守的规范,这就是CLS 。

    2)CLS通用语言规范(Common Language Specification)

    很显然,编程语言的区别不仅仅在于类型。例如,一些语言支持多继承性,一些语言支持无符号数据类型,一些语言支持运算符重载。用户应认识到这一点,因此.NET通过定义公共语言规范(CLS:Common Language Specification),限制了由这些不同引发的互操作性问题。CLS制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。认识到这点很重要,这里讨论的特征问题已不仅仅是语言间的简单语法区别。例如,CLS并不去关心一种语言用什么关键字实现继承,只是关心该语言如何支持继承。CLS是CTS的一个子集。这就意味着一种语言特征可能符合CTS标准,但又超出CLS的范畴。例如:C#支持无符号数字类型,该特征能通过CTS的测试,但CLS却仅仅识别符号数字类型。因此,如果用户在一个组件中使用C#的无符号类型,就可能不能与不使用无符号类型的语言(如VB.NET)设计的.NET组件实现互操作。

    3)CLR公共语言运行库(Common Language Runtime)

    简单地说,CLR是CTS的实现,也就是说,CLR是应用程序的执行引擎和功能齐全的类库,该类库严格按照CTS规范实现。作为程序执行引擎,CLR负责安全地载入和运行用户程序代码,包括对不用对象的垃圾回收和安全检查。在CLR监控之下运行的代码,称为托管代码(managed code)。

    三、解释3

    缩写的全称:    

      CTS是通用类型系统(Common Type System)     

     CLR是公共语言运行时(Common language runtime)     

     CLS是公共语言定义(Common Language Specification)
          所有类型都可以在 CTS中声明。CTS定义了一组语言编译器必须遵循的规则,以定义、引用、使用和存储引用类型和值类型。

    因此,遵循CTS,在不同语言中编写的对象才能彼此交互。但并不是所有的类型都可以用于所有的语言。要建立可以在所有.NET语言中访问的组件,

    就要使用CLS。有了CLS,编译器就可以根据CLS规范检查代码是否有效。
          任何支持.NET的语言都不仅仅局限于CLS定义的公共功能子集。甚至有了.NET,仍可以创建不能在不同语言中使用的组件。

    这就是说,利用.NET支持所有的语言比利用COM简单得多。如果把自己限制在CLS之内,就可以保证组件可以在所有的语言中使用。

    第三方编写的库很可能限制在CLS之内,以确保该库可以在所有的语言中使用。
          .NET Framework是为了支持多种语言而设计的。在设计.NET的阶段中,Microsoft让许多编译器开发商建立它们自己的.NET语言。

    Microsoft自己就发布了VB.NET、Managed C++、C#、J#和JScript.NET。另外,不同开发商开发了40多种语言,

    例如Cobol、Smalltalk、Perl和 Eiffel。每种语言都有其特有的优点和许多不同的功能。这些语言的编译器都进行了扩展,以支持.NET。

    提示:      

    CLS是一种语言必须支持的最小规范要求。如果把公共方法限制为CLS,那么支持.NET的所有语言就都可以使用我们的类!
    在.NET Framework中,几乎所有(但不是所有)的类都是与CLS兼容的。在MSDN文档说明中,不兼容的类和方法都被特别标记为不兼容,

    例如System命名空间中的UInt32结构。UInt32表示32位无符号整数。并不是所有的语言(例如Visual Basic.NET或J#)都支持无符号的数据类型,

    这种数据类型是与CLS不兼容的。

     

           

             

     
  • 相关阅读:
    跳出iframe
    leetcode 225. Implement Stack using Queues
    leetcode 206. Reverse Linked List
    leetcode 205. Isomorphic Strings
    leetcode 203. Remove Linked List Elements
    leetcode 198. House Robber
    leetcode 190. Reverse Bits
    leetcode leetcode 783. Minimum Distance Between BST Nodes
    leetcode 202. Happy Number
    leetcode 389. Find the Difference
  • 原文地址:https://www.cnblogs.com/newcapecjmc/p/7088250.html
Copyright © 2011-2022 走看看