|
由本人翻译。本文适合于新手阅读。原文地址:
<hr/>如果你是个有雄心壮志的程序员,你可能会很难选择将哪里作为开始。这世上的编程语言浩如烟海,就比如C#、C++和C里面,哪一种最有用呢?
你可能听说过C系编程语言的三个成员。不过,在选择其中一个之前,你需要先弄清楚C#、C++和C之间的区别。
什么是C语言?
我们先从C语言(C programming language)开始,因为它是三种语言中资格最老、使用最广的一种。丹尼斯·里奇(Dennis Ritchie)于1972年发明了它,然后于1978年出版。里奇最开始的设计初衷是想要开发新版本的Unix系统。
在此之前,Unix操作系统用的是汇编语言(assembly language),这是计算机可读的最底层的编程语言。C的发明彻底改变了编程和操作系统。至于那些剩下的,正如他们所说,都成为历史了。
C仍然是一种底层编程语言,其执行效率几乎与汇编代码一样高。它提供最基本的对内存的访问,并且只要很少的运行时支持。
尽管C语言早在40年前就已被发布,但它仍然是有史以来使用最广泛的编程语言。程序员们仍然在操作系统、内核级软件开发、硬件驱动程序和需要用上旧代码的应用程序里使用它。
大多数老派的程序员都认为C是最好的编程语言,因为许多新的语言都是以C为基础的。由于其年代久远,这反倒使得C也可以提供一些安全保障。使用它的人数相比较少,因而它更不容易成为黑客的攻击目标。
什么是C++?
C++是作为C语言的扩展而开发的。它是由丹麦一位名叫本贾尼·斯特劳斯特卢普(Bjarne Stroustrup)的博士生创建的。他的目标是:在不牺牲速度和效率的情况下,扩展C语言并,添加面向对象(object-oriented)的编程功能。
一般认为C++是一种中级的编程语言,因为它建立在底层的C语言的基础上,但有更高级的功能。
自1985年C++首次发布以来,它已成为另一种极其高产的编程语言。它与C一起用于操作系统的开发,但在那些赫赫有名的服务器和PC软件也能见到它的身影。
如果你已在C语言上有了坚实的基础,那么理解C++就容易多了;然而,如果你想直接进入面向对象编程,你仍然可以吧C++作为你的第一语言。
(注:想要了解C++的历史,可以看BS的著作《The Design and Evolution of C++》,也可以戳他个人主页里的FAQ。)
什么是C#?
C#(发音是“C Sharp”)是一种高级的、面向对象的编程语言,同样也是作为C语言的扩展而创建的。2002年,安德斯·海尔斯伯格(Anders Hejlsberg)带领的微软(Microsoft)团队开发了C#。它基于.NET框架,但它的主干仍然是C语言。
C#会将代码编译成字节码(byte-code),而不是机器码。这意味着它在可以在虚拟机上运行,并且会被动态转换为机器码。它为基础C代码添加了垃圾回收(garbage collection)、对未初始化变量的检查、边界检查和类型检查等功能。
C#通常用于内部或企业应用程序,而不是商业软件。你可以在.NET框架中的客户端和服务器端开发中找到它。
(注:除此之外,Unity引擎也使得C#在游戏业蓬勃发展了)
虽然C#是这三种语言中技术上最复杂的,但相比C或C++而言,C#更不容易出错,而且学起来也相对快一些。
主要不同
C和C++是非常相似的编程语言,但仍有很多不同之处。另一方面,C#与Java等语言有更多的共同点。这里有一个简单的指南,可以帮助你理解C#、C++和C之间的区别。

Photo credit to Codecondo
C与C++
要想完全理解C和C++之间的区别,你先得了解什么是“面向对象编程(object-oriented programming, OOP)”。“面向对象”这个术语起源于50年代末或60年代初的麻省理工学院,面向对象编程(或OOP)使用一个称为“对象”的概念。对象是“类(class)”或程序代码模板(template)的实例。类可以由数据或代码的“例程(procedures)”(也称为方法(methods))组成。
C语言不是面向对象的,这是两者之间最显著的区别。C是所谓的“过程式”的编程语言,而C++是个混血,它既可以是过程式的,也可以是面向对象的。
除此之外,C和C++之间还有其他关键的区别:
- C++是作为C的扩展而创建的,这意味着它可以运行大多数C代码。但反过来,C可不能运行C++代码。
(注:严格来说,C 不是 C++ 的子集。虽然大多数(风格良好的)C语言程序也可以作为C++语言,但有些C程序不是正确的C++,甚至有几种编程的方式在 C 和 C++ 中具有不同的含义。但是 C++ 支持所有C 支持的编程技术。随着C和C++的各自独立的发展,它们已成为兄弟而非父子了:-)
- 作为一种面向对象的语言,C++支持封装(inheritance)、继承(encapsulation)和多态(polymorphism),而C不支持。
- 在C语言中,数据和函数是一种“自由的主体”,也就是说,你可以使用外部的代码来操作它们。而C++可以将数据和函数封装在一个对象中,所以这些数据结构和运算符对外部代码来说是隐藏的。
- C++使用名称空间(namespace),将相同逻辑的代码组织到一起中,以防止名称冲突。这是因为当代码库包含多个库时,可能会发生名称冲突。C不使用命名空间。
- C使用函数来实现输入和输出,而C++使用对象来实现输入和输出。
- C++支持引用(reference)变量,而C不支持。变量的引用是一个已经存在的变量的别名,其实就是创建了一个简短的符号(而指涉同一变量),以加快编程速度。
- C不提供错误或异常处理,但C++提供。
(注:C和C++的区别还远不止这些,更多参考同样可以戳BS的FAQ。)

图源《The Design and Evolution of C++》Chapter 0
C++与C#
作为一种现代得多的编程语言,C#的设计使其于客户端和基于web的应用程序中,与当前的http://Microsoft.NET框架一起工作。
虽然C++是一种面向对象的语言,但C#被认为是一种基于组件(component)的编程语言。面向对象编程专注于类之间的关联,这些类链接在一起,形成一个大的二进制可执行文件,而面向组件编程使用可交换的代码模块,这些代码模块独立工作,不需要知道内部细节就可以使用。
下面是C++和C#之间的一些其他主要区别。
- C++编译成机器代码,而C#编译成CLR(注:Common Language Runtime,一种.NET框架的虚拟机组件),由http://ASP.NET解析。
- C++会要求手动回收内存,但C#在虚拟机中运行,它可以自动处理内存管理的事情。(注:C++11提供了GC ABI)
- C#不使用指针,而C++可以在任何地方使用指针。(注:C#事实上在有限范围内支持指针,即所谓unsafe的代码。)
- C++可以在任何平台上使用,尽管它设计之初是基于Unix的系统。C#虽已标准化,但很少在Windows环境之外使用。(注:现在.NET和C#都能够跨平台了。)
- C++可以创建独立的、或是控制台应用程序。C#可以创建控制台、Windows、http://ASP.NET和移动应用程序,但无法创建独立的应用程序。
C与C#
虽然C和C#在技术上有关,但它们是极为不同的语言,异大于同。有C语言背景对学习C#很有用,因为它们有些语法是相似的;然而,C#的语法十分宽容,以至于你可以在完全不懂C的情况下也能轻松学习它。
你应该先学哪种语言?
现在你已经清楚地了解了C#、C++和C之间的区别,那么,如何选择自己第一个要学的呢?
新手程序员
如果你以前从未学过编程,许多计算机科学的专家会建议你先学习C。不仅仅因为它比后继语言更简单、特性更少,而且许多其他语言都用上了C引入的语法和概念。因此,当你学了C之后再学习其他的语言都会简单不少。
中级程序员
如果你已经对一些编程概念熟念于心,并且已经学会了用其他语言写代码,那么你可能需要从C++开始。现在,面向对象的编程语言比过程语言更常见,如果你已经有了一些OOP的经验,学习C++就更容易了。
高级程序员
如果你已经学习了多种编程语言,并且正在努力提高你的技能水平,那么,你对三种C系语言的选择取决于你希望从中获得什么。
一些年轻的程序员选择学习C,作为一种学习编程基础知识的方式。有些资深的程序员往往看不起年轻一代,因为他们不尊重自己的根。所以C语言的知识仍然可以作为新工作里的信条。
C++在工作中仍然被广泛使用,因此具备C++开发的能力可以带来许多工作机会。如果你在使用面向对象语言上经验丰富,并且正在寻找另一种语言,以最小的学习代价往简历上添一笔,那么C++是一个很好的选择。
如果你的主要愿望是步入.NET和基于web的开发,那么C#可能是你的最佳选择。虽然它不像其他两种语言那样广泛地使用,但它在企业级开发团队中仍然有很高的需求。
结论
了解了C#、C++和C之间的差异后,你会更容易做出自己的选择。所有这些语言都有各自的优点和缺点,无论学习哪个都不会浪费你的时间。选择在你的手上! |
|