Java具有面向对象、跨平台、安全稳定、多线程等特点,适合于网络编程。Java源自C++,它从C++中继承了大多数语言成分,但是它也对C++进行了大量简化。例如,它抛弃了C++中复杂和容易引起问题的头文件、编译指令、预处理器、指针、结构、隐式类型转换、操作符重载、多重继承和goto语句等。增加了字节码、虚拟机、垃圾内存收集、接口、GUI支持、多线程、异常处理、网络编程、各种类库等内容。
Java语言的跨平台和安全性,都依赖于它的JVM(Java Virtual Machine,Java虚拟机)。Java是一种编译型解释语言(对比:Fortran/Pascal/C/C++为编译语言,早期的Basic为解释语言),它先将Java源代码(*.java)编译成专用的字节码(*.class),再利用各个计算机平台上安装的JVM来运行这些字节码。
Java通过取消指针和添加虚拟机,在增强了安全性的同时,也具备了跨平台的能力。但这些却是以牺牲编程的灵活性和程序的运行效率为代价换来的。所以,Java并不太适合于,对运行效率要求很高的本地(客户端)的(系统)编程。
开始时,Java虽然从C++继承了大量面向过程和面向对象的特征,但是并没有继承模板。只是到了JDK 1.5(J2SE 5.0, 2004 年 9 月 30 日 推出)才加入对编译时静态绑定的泛型编程的支持。所以,Java现在与C++一样,也可以算是一种同时具有面向过程、面向对象和泛型编程的特征的混合型程序设计语言。
l C#
眼看Java占领了利润丰厚的服务器端编程的大部分市场,微软公司心有不甘。为了与Sun公司的Java和J2EE竞争,1996年Bill Gates用重金从Borland公司挖来(Turbo Pascal和Delphi的开发者)Anders Hejlsberg。Hejlsberg转到微软后,先后开发出Visual J++(1997)、.NET框架中的CLI(Common Language Infrastructure公共语言基础设施)和C# 语言(2000)。
丹麦人Anders Hejlsberg,1961年出生在丹麦首都哥本哈根,1980年在读大学期间,就开始为计算机公司写软件,后来他在丹麦创办了自己的Poly Data公司,为DOS和CP/M编写了Pascal编译器PolyPascal。1983年他和他的公司被Philippe Kahn创办的Borland公司所收购,并很快(1983.11.20)推出革命性的产品Turbo Pascal,由Hejlsberg编写编译器,Kahn编写编译界面。它是世界上第一个IDE(Integrated Development Environment集成开发环境),运行在MS-DOS之上。
后来Borland公司又推出具有类似IDE的其它产品,如Turbo Basic、Turbo C、Turbo C++、Turbo Prolog等,在Windows操作系统出现后,又推出Borland Pascal、Borland C++(由越南人Eugene Wang开发,由于与Kahn不和,他离开Borland到了Symantec,又开发出Symantec C/C++)、C++Builder等。由于微软公司利用其在操作系统中垄断地位(WinAPI和OLE等),用(从Borloand公司挖来的许多人开发出的)Visual C++ 1.0打垮了曾经占统治地位的Borland C++ 3.1。作为反击,Hejlsberg为Borland公司又开发出划时代的产品——Delphi(以Object Pascal为基础,组件思想优秀)。Java发布后,Hejlsberg对其有很多改进的想法,但是得不到当时老板的支持(Kahn因为公司亏损,已经被他自己创办的Borland公司扫地出门),所以他才愿意到微软公司去。他改造了Java,并随Visual Studio 6.0推出Visual J++。由于Sun公司状告微软违反合同(私自修改Java),并胜诉,所以Sun收回了给微软的Java授权。这也正是微软不得不自己开发出.NET环境和C# 语言的主要原因。
C#(C Sharp)语言源自C++(数字符# Sharp升半音符,可以视为由4个加号组成,相当于(C++)++),模仿了Java(微软不承认这点)。C# 的很多内容都与Java相似,例如虚拟机、垃圾内存收集、接口、GUI支持。但是,与Java不同的是,C# 保留了指针,不过限制了指针的使用。C# 还引入了值类型、引用类型、元数据、装箱和拆箱转换等概念(这些概念在最新版本的Java中也有,在C++0x中也会引入与元数据类似的“概念”)。
C# 是一种面向对象的程序设计语言,最初是作为.NET的一部分而开发的。换句话说,.NET是围绕C# 而开发的。C# 的面向过程和对象的语法,是基于C++的,但也包含了另外几种程序设计语言的特征(其中最显著的是Delphi、Visual Basic和Java),C# 特别强调简易性(如所需符号比C++的少、所需修饰比Java的少)。
从某种意义上来说,C# 是最直接地反映了底层CLI的一种程序设计语言,它非常依赖于.NET框架,因为它被特地设计成能充分利用CLI所提供的特征的一种语言。例如,绝大多数的C# 内置类型,全都对应于CLI框架所实现的值类型(value-types)。
用C# 编写的应用程序,需要CLR(Common Language Runtime公共语言运行时)的一个实现,才能运行。这与Java的虚拟机JVM有点相似,但是与Java不同的是,CLI应用程序要被编译两遍,第1遍由C# 编译器,将C# 源程序被编译成平台抽象字节码,即IL(Intermediate Language中间语言)代码,存放在PE(Portable Executable可移植的可执行)文件中(似Java的.class);第2遍,在应用程序首次运行时,由CLR的JIT(Just-In-Time即时/实时)编译器,将IL代码编译成本地客户端的机器代码(.exe)。
与C和C++比较,C# 在许多方面有所限制和增强,包括:
n 指针——C# 是真正支持指针,但是其指针只能在非安全作用域中使用,而只有具有适当权限的程序,才可以执行标记为非安全的代码。绝大多数对象的访问是通过安全的引用(references)来进行的,而引用是不会造成无效的,而且大多数算法都是要进行溢出检查的。一个非安全指针,不仅可以指向值类型,还可以指向子类和System.Object。也可以使用指针(System.IntPtr)来编写安全代码。
n 托管(managed受控)——在C# 中,托管内存不能显式释放,取而代之的是(当再没有内存的引用存在时的)垃圾收集。但是,引用非托管资源的对象,例如HBRUSH,是可以通过标准的IDisposable接口的指示来释放指定内存的。
n 多重继承——在C# 中多重继承被禁止(尽管一个类可以实现任意数目的接口,这点似Java),这样做的目的是为了避免复杂性和“依存地狱”,也是为了简化对CLI的结构需求。
n 转换——C# 比C++更类型安全,唯一的缺省隐式转换也是安全转换,例如加宽整数和从一个派生类型转换到一个基类(这是在JIT编译期间间接强制进行的)。在布尔和整数之间、枚举和整数之间都不存在隐式转换,而且任何用户定义的隐式转换,都必须显式地标出。
n 数组声明——和C/C++的数组声明的语法不同,C# 中用“int[] a = new int[5];”代替了C/C++的“int a[5];”
n 枚举——C# 中的枚举被放入它们自己的命名空间
n 特性——可在C# 中可以使用特性(properties,属性集),访问类似于C++中成员域,与VB相似
n 类型反射与发现——在C# 中可以使用完整的类型反射与发现,这些都会用到元数据所提供的信息
n 模板——为了简单性,C# 1.0中不支持模板等泛型编程技术
C# 2.0的新特征:
n 部分类——一个类可分开到多个文件中实现
n 泛型——C# 从2.0起,开始支持泛型或参数类型。C# 还支持一些C++模板不支持的特性,例如对泛型参数的类型约束。另一方面,C# 的表达式不能用作泛型参数,而这在C++中却是允许的。C# 的参数化的类型为虚拟机的首个类对象,允许优化和保存类型信息,这一点与Java不同。
n 关键字yield——迭代器的一种新形式,可通过功能类型的关键字yield,来使用协同例程
n 匿名委托——提供了闭包功能
n 结合运算符??——返回表中的第一个非空值,例如:
object nullObj = null;
object obj = new Object();
return nullObj ?? obj // returns obj;
n 可空值类型——可空值类型由问号?来标记(例如,int? i = null;),它可以改善与SQL数据库的交互
Visual C# 1.0是随.NET框架1.0和Visual Studio .NET 2002一起推出的;Visual C# 1.1,是随.NET框架1.1和Visual Studio .NET 2003一起推出的;Visual C# 2.0是随.NET框架2.0和Visual Studio 2005一起推出的。
C# 语言,已于2001年12月成为欧洲标准:ECMA -334 C # Language Specification(C#语言规范),2002年12月和2005年6月又分别推出ECMA-334的第2版和第3版。2003年4月C# 成为国际标准:ISO/IEC 23270:2003 Information technology -- C# Language Specification(信息技术——C# 语言规范)。
微软对C++的扩展
为了适应自己新提出的.NET框架(framework)和CLR(Common Language Runtime公用语言运行时)运行环境,使C++能够编写在.NET环境中运行的托管(Managed)程序,微软公司在它的Visual C++中,对标准C++进行了托管扩展。
在随.NET框架1.0/1.1和Visual Studio .NET 2002/2003一起推出的Visual C++ 7.0/7.1中,这种扩展叫做Managed C++(托管C++,简称为MC++);而在随.NET框架2.0和Visual Studio 2005一起推出的Visual C++ 8.0中,又改称为C++/CLI。
其中,CLI(Common Language Infrastructure公共语言基础设施)是微软公司提出的一种所谓垮语言(如C#、VB、C++、J#、Jscript)、跨平台(如Windows、Unix、Linux、Mac OS)的分布式计算方案和运行平台架构。CLI是.NET的核心,CLR只是CLI在Windows平台上的一个实现。也有人把.NET和CLI移植到了Linux、Solaris、Mac OS X和Unix上,但是至今还没有被广泛认同和应用(参见网站http://www.mono-project.com)。
CLI已经成为ECMA(European Computer Manufacturers Association欧洲计算机厂商协会)标准(ECMA-335,2005年6月推出第3版)和ISO标准(ISO/IEC 23271, 2006 年 10 月 1 日 推出第2版,对应于ECMA-335的第3版)。
C++/CLI也已于2005年12月成为欧洲标准——ECMA-372, C++/CLI Language Specification, 1st edition (December 2005) (C++/CLI语言规范),但是至今仍未成为国际标准。
C/C++语言谱系图