C与C++、C#有什么关系?

Serials


从历史时间和语言特性来看,他们有设计参考(

不是替代)关系。

下面是我画的一个比较概要的关系图

C到C++

C语言设计目标是提供一种能以简易的方式编译、处理低级存储器、产生少量的机器代码以及不需要任何运行环境支持便能运行的编程语言。

  • 在系统级别,相比汇编,C能兼顾性能和开发效率。

  • 而在应用层级别,尤其是面向对象思想流行以后,C++其实是作为C语言的增强版出现的。相比C,C++提供了更多编程友好性的特性并纳入标准,比如虚函数、运算符重载、多继承、标准模板库、异常处理、运行时类型信息、名字空间等。
  • 在应用层的设计开发效率和大型工程的设计组织上,C++就比较优势了,同时也没有丢弃C的性能优点。

名字:C++这个名字出现是在1983年,客观看C++并不是简单的扩展C,它的名字叫++C更合适,但是有点难看,并且C+也已经被占用了。

标准库:从K&R C到C89、C99、C11,对比C++和C#,就知道什么是简洁舒服了。

GCC的选择:GCC最先用C开发,从2008年开始移植到C++,理由是性能基本无差别,能设计出更好,更容易维护的程序。详情可参见Linda Jacobson 2013年3月13日发布的文章:“GCC's move to C++”。这里并不是讨论C++和C谁好好,而仅仅是在C和C++之间做选择时取舍点的一个例子。

C++到C#

C和C++的核心开发难点是在内存的管理(自由是把双刃剑)上;同时C++和C的可移植是建立在源码级别上或者提供额外的系统抽象层;不同系统间移植以及系统相关接口使用时,需了解标准库的区别以及编译、链接等构建过程的介入。

C#主要是降低C++和C带来的开发难度,在一定程度上保持性能。用官方的话说就是:“简单、现代、通用”。丰富的基础类库和应用程序模型、无微不至的IDE,微软就这样“诱拐”了大量的人上了这条大船。

这里不能简单比较C#和C++,还需要加上虚拟机(CLR)一起来看。

C#(这里换成.Net更合适)和Java一样,在设计核心是提供自动内存管理二进制级别的可移植性

1、自动内存管理:通过虚拟机(CLR)来提供,即对象的内存分配和释放由虚拟机来完成,称为垃圾回收器(GC)。主流的内存管理都抛弃了引用计数,CLR这里和JVM一样,也是使用标记清除及压缩算法;同时采用代龄机制利用局部性原理提升回收性能。

2、二进制级别的可移植性:实际上就是利用中间语言(IL)提供中间层来实现。中间语言同时还提供了基于不同语言(比如VB和C#)的二进制级别共享机制。


如果从进程的角度看,其实要理解.Net程序运行机制就比C++和C难多了,这个也是C#程序员进阶的最大难点。看下图的用户态堆栈在虚拟中的逻辑结构便可知一二。

上图源自CoreCLR的wiki资料:Stackwalking in the CLR


关于OS的移植性,NetCore正式版本出来后才算是正式宣布一个里程碑,Mono差不多可以退出舞台了。.Net前期注重不同语言的二进制级别共享和封闭式的全家桶,形成鲜明对比的是Java的标准加开源,现实告诉我们,.Net输得很惨。

名字:在C上面带上四个+,略显浮夸。微软主要想表示C#在一些语言特性方面对C++的提升的意思。

结束

以上只是简要概述C、C++、C#,他们各自有偏重的设计要点(同时影响了编程模式和设计实现)以及应用场景的差别。如果硬要在语言设计级别来分出个高下的话,一哥PHP没来,这场辩论会就显得很生硬。




迁徙de麻雀


C/C++/C#的关系与区别?

1.先说C: C是最早的高级语言,历史悠久,企业覆盖广,任何软件几乎都跑在C程序的上面,C更像编程语言的根。学习这门语言能够理解编程的本质,使得今后的IT职业生涯之路越走越宽。

2.再说C++:C++是完全兼容C的一门具备面向对象特点的语言,使得C的领域从系统级别,横跨到应用级别,覆盖领域更加广泛。C++同时延续了C的全部优点(具备面向过程和面向对象特点、编程本质掌握程度深)。

3.最后说C#:C#是微软研发的基于C特点的一门类似于Java的编程语言。其中C#有很多C语言的影子。C#是一门专注于windows平台开发应用程序的语言,而C/C++是兼容windows和Linux平台.

Windows应用

C#有.Net框架,C/C++有MFC、QT框架。

游戏开发

C#有U3D游戏框架, 而C++也有Cocos2D/3D游戏框架。

目前市场上的C#能够解决的方案,C/C++也能够解决。而且C/C++知识宽度会涵盖C#的知识。

我们来介绍一下每个层级:

硬件层级:就是实体硬件(包括、CPU、内存、显卡等)不属于软件范畴之内

汇编层级: 几十年前是在没有高级语言(C/C++/Java等)之前,是汇编的年代。汇编语言对于人类可读性非常差,不适合开发,现在由于有编译器的存在(比如GCC[C语言编译器]、JVM[java虚拟机]等),可以把“高级语言”写好的代码直接转化成“汇编语言”,所以市场汇编语言的工程师需求量变的很少。而高级语言需求量增大。高级语言的好处在于对于人类的可读性很好,在编程中可以用一些有含义的英文单词表示语义。

系统层级:我们知道,我们平时用的所有的APP、或者电脑软件都是跑在操作系统上的(Windows、Linux、Mac OS、Android、iOS等)。这些操作系统本身的代码都是C语言实现的,因为C语言是最早的高级语言,也是性能最优的语言,操作系统需要性能,多以都是选择C语言实现。C语言占据了整个系统层级,地位稳固,难以撼动!

应用层级:应用层级的程序,更加偏重软件的程序的执行流程和功能。而开发起来的体量很大,这样就需要具备面向对象的编程语法,因为面向对象是比较适合人类交流的编程方式。所以类似C++(基于C语言做了完善)、Java这类语言占主要地位。 应用级别语言编程语义流畅,但是性能依然没有C语言好。

脚本层级:在这一层级的语言,更加看重编程语义,让开发者的代码看上去很直观,而且写代码速度很快。但是有得必有失,增加了代码的可读性(给人类看,计算机并不能看懂),编译器把脚本语言翻译成汇编语言(计算机能看懂、人类看不懂)的成本就越大,从而延长的翻译的时间,而导致程序性能下降。


传智播客


C++是C的亲弟弟,而C#是则是他们二者的远房亲戚(其实更像是JAVA的表兄)。这三门语言都是十分优秀的编程语言,也都有很高的运行效率。三种编程语言的应用范围很广阔,下面我就来分别介绍一下三种语言的来历以及应用领域(插图为经典教材)。

  1. C语言。C语言诞生在大名鼎鼎的美国贝尔实验室,它的前身是B语言。C语言从诞生之初就获得了广大程序员的青睐,由于其简洁的语法,高效的执行效率(比较接近汇编的性能),在很多领域获得了广泛应用。比如操作系统,图像处理算法,硬件驱动,嵌入式设备编程等等。

  2. C++。尽管C语言已经足够优秀,但它毕竟是一门面向过程的编程语言,不符合人的思维习惯(人脑的思维习惯有点像面向对象)。于是在这种背景下就诞生了更加强大的C++,之所以说C++是C语言的亲弟弟,是因为C++同样诞生在贝尔实验室。C++在C的基础上增加了数据封装,继承,多态等编程特性,同时又全部兼容了C语言,使之成为C++的一个子集。C++语言背广泛用在操作系统,大型应用软件的开发中。

  3. C#。C#是由微软公司开发出来用来抗衡Java的一款现代编程语言(具有安全,稳定,简单的特点)。它吸收了很多Java语言的优点(比如自动垃圾回收),但微软公司为了避免法律纠纷,下意识的将其语法规则向C++看齐(也在一定程度上吸收了C++的诸多优点)。C#的语法简单,可以快速上手,开发效率很高,被广泛应用在了各类应用软件,游戏开发之中。

关于三种语言的关系就介绍这么多,欢迎打击关注太科罗技头条号,并在下方积极留言讨论。

太科罗技


C就像手动挡的小钢炮,老司机都喜欢,离合器配合油门,加速快还省油,一脚油门就能超车,就是需要经常要打开发动机盖检查是否漏机油,新手开起来还容易熄火。C#是自动挡的车,上班族的最爱,开起来特别容易,只要控制油门和刹车,省心省力,但是你上不了高速,有关部门还没修好,并且不能去外市,因为是外地牌照不给上路。C++是定制级跑车,改装人士的最爱,有人开它跑得过F1,有人开起来就像拖拉机。它配有全时四驱,四轮动力独立分配,城市和越野模式随意切换,加装套件还能在水面上开,汽车上能有的功能全部都有,就是没有行车电脑,所有功能都要自己控制开关。它有四套变速箱,分别控制每个车轮的动力分配,需要你用四个档位杆来进行换挡,并且还有另外的十几个按键来控制它的差速锁和空气悬挂,它也会漏机油,有时还会掉零件,新手不仅容易熄火,还会因为记不住哪个是点火开关而打不着火。


嗨慢点走


三种语言的发展过程回答中已经有很好的说明。这里说说3种语言的现状。C语言有时间响应准确的特点,至今仍被广泛用于各种工业控制系统的底层驱动及控制软件。C++改善了C语言语法结构过于简单,不适合开发大型复杂系统的短板,引入了面向对象的思想,受益于对C语言制作的底层程序良好的兼容性,C++被广泛用于开发各种基础的应用程序。C++受限于C语言的基本语法框架,无法取消指针操作,被很多倡导面向对象的人士诟病。这也使得C++的语法比较复杂,开发效率远低于其他面向对象的程序语言。为了弥补这一短板微软发布了C#。C#语法结构接近Java等主流面向对象的语言。大幅提升了开发效率。同时,C#还保持了对C甚至是汇编语言的兼容性。技术上说几近完美。但C#只能在Windows 家族的系统上运行,这个短板极大地制约了它的推广和普及。


日冲信息 黄


c是鼻祖,是c++和c#的祖宗,通俗比方,c是祖父,c++是伯父,c#是侄儿,c虽有结构、函数、指针等编程思维,但没有完整的对象概念,c++是对c的改进,采用全新的面向对象的编程思想,类包含数据、函数等,具有良好的封装性,可以继承派生,可以多态变化,对于软件工程规模化开发起到了很好的促进作用,c#继承了c++的编程思想,但又不同于c++,摒弃了c++的不实用不安全部分,加强优化了系统应用部分,c#依赖.net framework框架,配合采用庞大完善的框架类库,即时编译IL中间代码,兼顾功能和性能,方便各种需求应用开发,特别是当今互联网web盛行,c#大行其道普及流行


红尘匆匆过客梦


C++是带类的C,基本语法都差不多,细节上C++语法会更严谨。C++是面向对象的语言,从开发角度来说比C会方便不少,也更容易维护。C#是完全面向对象语言,跟Java一样的,更容易学习,逻辑相对前两者更简单明了。


小小的船和弯弯的月儿


c是祖先,c++继承了c并增加了自己独特的特性。c#跟前面的关系有,但是不太密切,相当于c的很远很远的孙子。java和c#一个辈份的,表兄弟关系。至于javascript 么,可以理解为野种,是隔壁老王的儿子。


星空147480491


在c的基础上延伸出来的语言,其实大部分语言都借鉴了c或底层是c

c是低级语言没有对象,所以有了对象的c叫c++,c#

java和javascript没啥关系,只是在javascrip刚完成的时候作者觉得java火就取名为javascript


分享到:


相關文章: