对于什么是C++/CLI,我们首先能够简单的将其名字划分为两部分来理解,第一,C++,我们熟悉的眼下被广泛使用的面向对象的ISO国际标准的高级语言,也称为ISOC++,我们这里以后均称其为ISOC++;第二,CLI,我们能够觉得是对ISOC++在CLI上扩展。CLI是通用语言框架的缩写,微软的.NET就是架构在CLI其上,尽管CLI如今也是ISO标准,可是C++/CLI并非ISOC++委员会对其进行的扩展,所以C++/CLI并非新版的ISOC++标准,它仅仅是微软针他的CLI实现.NET的扩展。尽管C++/CLI眼下并非ISO标准,可是C++/CLI结合了ISOC++和.NET具有超强的能力,这也就注定了它不可能被我们忽视。



事实上C++/CLI除了包括ISOC++和CLI扩展,还有它之所以强大的更重要的原因就是它实现了ISOC++和.NET的无缝连接。以下就具体看这三方面:



1)ISOC++语言

我们知道C++是一门ISO的面向对象的语言,对于这门语言我们也从下面三个方面来看,也正是这三个主要方面决定了他被广泛的使用。第一,C++是一个功能强大的语言。比方C++语言本身提供的基于C语言的内嵌类型,数组,结构体和指针等,C++比C新增加的面向对象的Class,继承,多态和模板等,还有C++标准模板库(STL)提供的实际开发其中经常使用的数据结构和算法的实现;第二,大量的开源和第三方库,假设在windows上使用C++开发,首先我们能够借助microsoft对C++提供的强有力的支持,比方说VS编译器,还有UI库MFC,还有ATL等;除此之外我们还能够看到其它的很多非microsoft的开源的和第三方的支持,比方说Boost非常大程度的扩充了STL,提供了很多其它更高级的功能,还有Loki把C++与设计模式结合起来,还有非常多的第三方的UI库,比方QT,WxWindows,WTL,GTK等,第三方的网络通信库,比方ACE,StreamModule等,第三方的XML库,比方Xerces,CMarkup,tinyxml等,第三方的科学计算库,比方Blitz++,MTL等,第三方的游戏开发库,比方OGRE,KlayGE等,第三方的线程库,比方C++
Threads,ZThreads等,还有其它的非常多;第三,C++的高性能。C++的这一特性也是毋庸质疑的,我们知道的大部分的操作系统,嵌入式开发,游戏,图像软件离不开C++,这都是跟C++的高性能有非常大的关系,单从这一点来看,这就是非常多现代的其它的高级语言所欠缺的,也正是这点注定了C++以后仍然有非常长的路要走。



2)CLI



CLI(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所执行须要的虚拟执行环境的规范。更通俗的我们能够说它是一个虚拟平台,是操作系统和应用程序间的一层抽象。微软的.NET的基础CLR(Common Language Runtime,通用语言执行时)就是CLI的一个实例。CLI基本的组成部分有:CTS,Metadata,CLS和VES。



CTS(Common Type System,通用类型系统)是CLI的基础,它是一个类型规范,定义了全部CLI平台上能够定义的类型的集合,全部基于CLI的语言类型都是CTS的一个子集,眼下C++/CLI是对CTS描写叙述支持最好的高级语言。



Metadata(元数据):用来描写叙述和引用CTS定义的类型,元数据以一种独立于不论什么语言的形式存储,正是元数据赋予了组建自描写叙述的能力。

CLS(Common Language Specification,通用语言规范),是用以确保全部CLI语言可以互操作的一组规则,它定义了全部CLI语言都必须支持的一个最小功能集(一个CTS的子集)。各CLI语言可以选择自己对CTS的一部分的映射,可是为了确保不同语言的交互,至少应该支持CLS所定义的最小功能集。

VES(Virtual Execution System,虚拟运行系统),为CLI程序提供了一个在各种可能的平台上载入和运行托管代码的虚拟机环境,仅仅是一个规范,比方微软和momo就各有自己的实现。.NET的CLR的JIT和GC应该属于此范围。

.NET Framework是微软对CLI的一个实现,当然也是眼下最好的实现,.NET Framework主要包括CLR和BCL,CLR是核心也即CLI的实现,BCL是一套通用的代码库,能够被全部的.NET语言(C#, VB.NET, C++/CLI)程序所使用。

3)ISOC++和CLI的无缝连接



C++/CLI支持对本地ISOC++编程和.NET托管编程的无缝集成,不是简单的混合,不仅可以像.NET调用windows APIs一样通过P/Invoke来实现函数互调,并且可以实现类型class级和ISOC++和.NET类库的相互使用,更强的是可以实现类型的混合。为了实现无缝连接,绝大多数的曾经的ISO C++代码编译后将得到托管代码,部分不能编译为托管IL的採用P/Invoke调用实现。代码托管,可是数据并不托管,原来ISOC++中本地堆内的数据仍位于本地堆中。



综上,我们能够总结C++/CLI是ISOC++在.NET的扩展,是ISOC++和.NET的无缝结合。



作者:iTech

出处:http://itech.cnblogs.com/ 

欢迎转载,欢迎增加qq交流群172758282来讨论build_release/Linux/Perl/Python/Jenkins!

[C++/CLI编程宝典][2]什么是C++/CLI语言的更多相关文章

  1. GUI编程与CLI编程

    作为一名多年的iOS开发人员,多次触发我思酌“GUI编程与CLI编程”各自的优劣,尤其是在当我为界面交互花费大占比时间时,时常怀疑自己的工作性质,我终究还是为互联网工作的码农,而不是让互联网为我所用的 ...

  2. 《Go并发编程实战》读书笔记-初识Go语言

    <Go并发编程实战>读书笔记-初识Go语言 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在讲解怎样用Go语言之前,我们先介绍Go语言的特性,基础概念和标准命令. 一. ...

  3. 网络编程—【自己动手】用C语言写一个基于服务器和客户端(TCP)!

    如果想要自己写一个服务器和客户端,我们需要掌握一定的网络编程技术,个人认为,网络编程中最关键的就是这个东西--socket(套接字). socket(套接字):简单来讲,socket就是用于描述IP地 ...

  4. PHP CLI编程基础知识积累(进程、子进程、线程)

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  5. 《C#编程宝典:十年典藏版》阅读笔记(1)

    1.运行时错误,使用Checked块语句进行异常检查与抛出异常. 2.值类型使用线程堆栈保存数据,数据大小大概为1M左右,引用类型使用托管堆保存数据,可以无限分配空间,因为有一个GC垃圾回收机制存在, ...

  6. codeblocks 配置 opengl 编程宝典 的 gltools 环境

    懒得多说,亲测,这个问题,csdn 和 cnblog 上的博客真的没有一个能解决的. 这个帖子2L的答案则完美解决了问题,虽然步骤有些繁琐,过程还是英文,但考虑到了可能出现的各种问题,跟着走一遍就完美 ...

  7. WPF编程宝典(Pro wpf in c# 2012)(文摘)

    第一部分 基础知识 第1章 WPF概述 第2章 XAML 第3章 布局 第4章 依赖项属性 第5章 路由事件 第二部分 进一步研究WPF 第6章 控件 第7章 Application类 第8章 元素绑 ...

  8. 如何成为游戏的生产者——第二章:如何开始你的编程(开发环境的搭建、C++语言适应)

    如何成为游戏的生产者--文章二章:怎样開始你的编程 小故事:上节说到我六年级打开了那本C语言的书,然后其实我还是没看懂.好像看懂了一些printf语句.之后遇到了史无前例的困难--怎么让代码执行起来. ...

  9. 全网最详细的hive-site.xml配置文件里添加<name>hive.cli.print.header</name>和<name>hive.cli.print.current.db</name>前后的变化(图文详解)

    不多说,直接上干货! 比如,你是从hive-default.xml.template,复制一份,改名为hive-site.xml 一般是 <configuration> <prope ...

随机推荐

  1. HDU 3480 DP+斜率优化

    题意:给你n个数字,然后叫你从这些数字中选出m堆,使得每一堆的总和最小,一堆的总和就是这一堆中最大值减去最小值的平方,最后要使得所有堆加起来的总和最小. 思路:对这些数字排序之后,很容易想到DP解法, ...

  2. fzu 1911 C. Construct a Matrix

    C. Construct a Matrix Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 32768KB Special Judge ...

  3. kernel hexdump分析

    驱动调试中,很多时候是二进制的,这个时候hexdump就是个非常有用的工具了. 不要再自己去实现类似的功能,kernel代码里面就有: 参考: kernel/lib/hexdump.c // 0Xxx ...

  4. python 在 eclipse 上的编码配置问题

    Eclipse的设置 window->preferences->general->editors->text editors->spelling->encoding ...

  5. delphi指针简单入门

    delphi指针简单入门:         看一个指针用法的例子:     1         var     2             X,   Y:   Integer;       //   ...

  6. Oracle死锁、数据库链接问题

    --查询数据库锁表的信息 select do.object_name,t2.username,t2.sid,t2.serial#,t2.logon_time,t2.MACHINE,t2.state,t ...

  7. ubuntu14操作系统chrome标签和书签乱码解决

    ubuntu操作系统更新后.发现chrome标签和书签中文都无法显示. 解决的方法: 打开配置文件 sudo vim /etc/fonts/conf.d/49-sansserif.conf <! ...

  8. 基于Predictive Parsing的ABNF语法分析器(十)——AbnfParser文法解析器之数值类型(num-val)

    ANBF语法中的数值类型有3种:二进制.十进制和十六进制,可以是一个以点号分隔的数列,也可以是一个数值的范围.例如,%d11.22.33.44.55表示五个有次序的十进制数字“11.22.33.44. ...

  9. (萌O(∩_∩)O)哈希知识点小结

    噶呜~先来了解一下什么是哈希吧? 当我们要在一堆东西中找到想要的那一个东西,我们常常通过比较来找,理想的情况是不经过任何比较,一次就能找到,怎么才能做到这样呢?那就在记录的储存位置和他的关键字之间建立 ...

  10. 14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量

    14.5.2 Changing the Number or Size of InnoDB Redo Log Files 改变InnoDB Redo Log Files的数量 改变InnoDB redo ...