版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、主流编程语言优劣考.、八 、-刖言力,各安其位,这些语本文的目的并非是想挑起语言之争,而是希望通过客观地分析每一种主流语言的能 辨明其长短,让程序员能够扬长避短,有效地使用各种语言。让各种语言能够 为你更好的服务。程序员应当成为语言的主人,而不是语言的奴隶。正文这里,我将比较一下几种主流编程语言:C, C+, Java,.NET,Ruby,JavaScript。其他主流编程语言,如PascalQelphi,我不太熟悉。希望熟悉的朋友能够补全对 言的评价。至于Basic,它的版本差异很大,而且能力不太全面,这里也不做评价。语言特性对比表C C+Java.NET Ruby JavaScript类型
2、无类型强类型强类型强类型强类型强类型静态/动态静态静态静态检验类型动态解释执行动态动态支持面向过程是是否否否是支持基于对象否是否是是是支持范型否否是是否否 支持模板否是否否否否支持面向对象否是是是否否 可能你对于我这样的语言评价有些疑问,请首先看我的另一篇文章基于对象和面向 对象 编程范式辨析和主流编程语言中的应用理清相关的概念。我对与面向对象和基 于对象的 定义和流行的定义不太一样。C 语言优劣考C 语言由来让我们先回顾一下历史。电脑使用 CPU 旨令,通过寄存器,内存等物件执行计算。最早的编程,是直接使用 代表 CPU 旨旨令的机器码编写的。直接使用二进制的数据编程,当然很容易出错。于是,
3、人们后来发明了一种方法,就是使用英语单词作为助记符,代表各条 CPU 旨 令。这就是汇编语言。现在,程序员可以使用英语单词进行编程,然后使用一个解释程 序, 把汇编指令翻译成机器语言,再交给计算机执行。1970年,UNIX操作系统的研制者丹尼斯 ?里奇(Dennis Ritchie)和肯?汤普逊(Ke n Thompso n) 为了更好地编写操作系统,发明了 C 语言。C 语言比汇编语言更先进。它使用了面向过程的编程范式。同时它仍是一门十分接近汇编语言,面向机器的编程语言。适合编写操作系统和其他直接操纵硬件硬件的 编程。面向过程编程范式下面是我查到的过程式设计的定义:过程式设计:1 、自上而下
4、 (top-down) 的设计方式:是一个自顶向下,逐步求精的过程;2、以 main 函数概括出整个应用程序需要做的事情,而 main 函数由对一系列的子 函 数的调用组成;main 中的每一个子函数都可以被精炼成更小的函数。重复这个过程,即可完成一个过程式的设计;3、 特征是以函数为中心,以函数作为划分程序的基本单位,数据往往处于从属地位。过程式设计的优点:易于掌握与理解,符合人们的思维习惯;过程式设计的缺点:1、不能适应问题比较复杂,或者需求经常变化的情况;2、数据与操作分离开,对数据与操作的修改变得很困难;3、程序架构的依赖关系不合理: main 函数依赖于子函数,子函数又依赖于更小的
5、子函 数;而子函数往往是细节的实现,这些实现是经常变化的,造成的结构就是: 程序的核心逻辑依赖于外延的细节,一个细节上的小改动,会引起一系列的变动。 我对于面向过程编程范式是这样理解的: 面向过程编程,就是使用函数代表处理的过程。这些函数使用的数据,要么是参 数,要 么是外部的数据。使用函数编程,这看上去很像函数式编程。但面向过程的编程范式不同于函数式编 程。 函数式编程的函数,一般不使用外部的数据。不维持外部的状态。这有很多优 点,但也 同样有了很大的局限性,不似面向过程编程这样方便。C 语言就是典型的面向过程编程语言。它通过函数抽象了过程处理。函数,就是 C 语言的接口。C 语言中,数据常
6、常作为全局的变量保存起来。这样,使用 C 语言编程就很难保证 其他代码不破坏函数依赖的数据的状态。这是 C+ 基于对象编程范式出现的原因。 这个 我们稍后再说。我们再看看 C 语言对机器指令的抽象。C 语言是一门十分接近汇编语言的语言。所以有人说 C 语言既是一门高级语言 ( 面 向过 程,函数 ),也是一门低级语言 (面向机器,直接反映计算机的实际计算过 程)。C 语言使用原生类型,数组, Struct 等来表示数据。 C 语言中,数据在内存中的表 示是十 分确定的。程序员可以充分控制。如,C 语言中可以使用 memcpy (直接复制内存中的数据。现在,大多数的操作系统原生函数库,都使用 C
7、 语言作为其接口。绝大多数的语言 都具 备与 C 语言函数库进行互操作的能力。C 语言可以说是程序世界的世界语。C 语言的优点1, 面向过程开发,以函数为中心。简单有效。实现了简单的接口。2, 面向机器,让用户可以完全的操纵机器,效率较高。C 语言运行高效,广泛应用于各种计算领域。对于简单的任务,非常有效C 语言的缺点1,函数无法有效控制需要的数据。不能保证外部状态不变。容易出现Bug2, 对于机器的控制太强,也就是依赖太强。由于过于强调效率,使用C 语言编程时,更多的需要考虑机器,而不是问题本身。由于过于关注机器,而不是问题域本身,因此抽象能力不足。容易出现各种 Bug 对于编写大型的程序,
8、常常力不从心。C 语言的使用方法C 语言作为一种简单高效的编程语言,适用于编写简单的程序。在编程中,应该注 意扬 长避短,使用面向过程的编程范式,少用对机器的依赖。1, 使用函数编程时,应该尽量使用函数参数传递状态,少用全局数据。因为,你无法保证全局数据不被其他代码改变。这样使用函数,叫作 "纯函数 "。类似于函数式编程的用法。而且,使用这种方式编程,由于不存在全局数据,在进行多线程开发时,还不需要考虑多线程问题。2, 使用结构化的编程方式。不要卖弄技巧。3, 函数是接口。尽量使用函数调用,而不是直接的代码。通过层层分层,分配职 责,编 写出短小精悍,易于维护的代码。4,
9、尽管 C 语言是一种面向机器的语言。但是,我们还是应该尽量少地依赖机器。 多从问 题域来考虑和抽象问题。女口,少用内存假设等等。因为,我们会使用很多种 语言,C, C+, Java, C#等语言的很多语法类似。但是实际的表现,各个语言都是不同的。如果过分考虑 C 的机器特性,那么很可能会因为记错而编写出错误的代 码。5, 代码,首先是给人看的。顺便给机器执行! 不要处处优化代码。只应该优化性能瓶颈。因为优化的代码,常常表示很难看懂!6, 应该大量使用 Struct 组织相关的数据。 在用 C 语言编程时, 也应该树立类型和 对象状 态的概念。把 Struct 作为函数的参数传递数据。C+语言优
10、劣考在C语言优劣考中曾经说过:C语言中,数据常常作为全局的变量保存起来。这 样,使 用C语言编程就很难保证其他代码不破坏函数依赖的数据的状态。这是C+基于对象编程范式出现的原因。C+最初是作为C语言的扩展出现的,最初的名字就叫"带类的C"。后来,C+逐渐演化 成一门独立的语言。但还是和C语言兼容。基于对象的编程范式基于对象的编程范式,又称 "抽象数据类型 "(ADT) 。面向过程的编程范式中,函数无法控制函数外的共享数据。这使面向过程的编程语言不能很好地编写大型系统。为了解决这个问题,人们发明了基于对象的编程范 式。就是把数据和处理数据的函数都封装在一个
11、类中。这样,共享的数据就不会再被外部的代码改变了!下面是我查到的定义:抽象数据类型 (Abstract Type 简称 ADT)ADT 是指抽象数据的组织和与之相关的操作。可以看作是数据的逻辑结构及其在逻 辑结 构上定义的操作。ADT 的描述规范一个 ADT 可描述为:ADT ADT-NameData: /数据说明数据元素之间逻辑关系的描述Operations : / 操作说明Operatio n1 :/操作1,它通常可用C或C+的函数原型来描述In put : 对输入数据的说明Preconditions : 执行本操作前系统应满足的状态 /可看作初始条件Process : 对数据执行的操作O
12、utput : 对返回数据的说明Postconditions : 执行本操作后系统的状态 /"系统 "可看作某个数据结构Operation2 : / 操作 2/ADT抽象数据类型可以看作是描述问题的模型,它独立于具体实现。它的优点是将数据 和操 作封装在一起,使得用户程序只能通过在 ADT 里定义的某些操作来访问其中的 数据,从 而实现了信息隐藏。在 C+中,我们可以用类(包括模板类)的说明来表 示ADT用类 的实现来实现ADT因此,C+中实现的类相当于是数据的存储结构 及其在存储结构上实 现的对数据的操作。ADT 和类的概念实际上反映了程序或软件设计的两层抽象: ADT
13、相当于是在概念层(或称为抽象层)上描述问题,而类相当于是在实现层上描述问题。此外,C+中的类只是一个由用户定义的普通类型, 可用它来定义变量 (称为对象或类的实例 ) 0 因此, 在C+中,最终是通过操作对象来解决实际问题的,所以我们可将该层次看作是应用层。例如, main 程序就可看作是用户的应用程序。C+支持多范型的开发方式:面向过程,基于对象,面向对象,模版。C+和C语言是兼容的。因此,你完全可以使用 C+编译系统编写C语言的程序,因此, 支持面向过程编程是很自然的。但是,使用面向过程编程,还能说是在使用C+编程吗?另外,需要注意,C+语言,实际上是一种不同于 C语言的新语言。在内存上,
14、除 了一 些 C 语言的元素之外,新的语言元素并不像 C 那样面向机器。对于C+,你不能使用memcpy等内存操作的函数,很可能会出现错误。因为C+语言建立在一些高级概念的规范上,这些规范并没有规定内存如何分配等机器方面的细节。我在基于对象和面向对象编程范式辨析和主流编程语言中的应用一文中已经指出基于对象和模板是必须组合在一起使用的技术。C+ 中首选的编程范式是 "模板支持的基于对象 "的编程范式。实现静态多态然后才是面向对象的编程范式。实现动态多态。最后是 C 语言风格的面向过程编程。C+的使用方法使用 C/C+ 开发环境,我们可以同时使用 C 和 C+ 开发。既然 C+
15、 和 C 是兼容的, 我 认为完全没有理由使用 C 语言,而不使用 C +进行开发。即使是很小的问题,使用 C+啲"模板支持的基于对象"的编程范式也是首选的开发 方式。另一方面,在整个类库的外部,如果我们希望向其他语言提供接口,那么我们还应 当提 供C语言的API函数作为接口。C 语言是程序世界的世界语。使用 C+的基本类型,struct,STL库的 Vector, STL的string : c_str()等都可 以得 到C语言兼容的接口。还不能使用异常。因为C语言不支持异常,而且C+本身的异常, 在不同的编译器中也可能不兼容。总之1, 使用 C+ 开发,只在外部接口中使用
16、 C 语言开发。使用 "模板支持的基于对象 " 的编 程范式,或者面向对象的编程范式。不要使用面向过程的编程范式。2, 尽量把代码放到类中,而不是使用全局或者命名空间的变量。3, 尽量不要使用操作符重载。4, 必须注意到C+不像C语言那样面向机器,不能对 C+寸象的内存布局进行假 设。 不能根据内存内的数据直接构建对象。不要进行内存操作。5, C + +还是很面向机器的。很多语言规则都规定了内存的布局,必须按照规则定 义、初始化等等。这和 Java, .NET, Ruby 等语言不同。用惯高级语言的程序员特 别需 要注意C+和C对程序员的繁琐要求。C/C+的设计哲学中,始终
17、把自己作为一门系统编程语言,针对机器进行了很多优化。因此,对于人,就很不照顾了。很多规则很不人性化。但没办法,你必须适应 它们! 它们就是为了高效而生的。它们就是汇编的替代者。Java 语言优劣考Java 是一门静态强类型面向对象的编程语言。它是 C+ 和 Smalltalk 取长补短的产 物。Java 是静态编译的强类型语言。你必须声明变量的类型,以便编译器能够检查代码的类型是否正确。这和 C+ 是相同的。 Java 是一门类型非常安全的编程语言。Java 只支持一种编程范式:面向对象编程范式。对于过时的面向过程编程范式并不支持。也不支持基于对象的编程范式,也没有模板。原因可能是,当java
18、在90年代中期刚刚诞生时,面向过程的编程已被唾弃。而C+勺基于对象的编程方式,由于没有和模板相互结合,而名声扫地。C+寸于面向对象的编程范式的支持又比较差。于是,汲取经验教训之后, Java 作为一门纯正的面向对象编程语言诞生了。Java 使用面向对象的编程范式实现了动态多态,实现了抽象化的编程方式。取得了巨大的成功。Java 语言中,除了基本类型是值类型之外,没有任何值类型,你也不能创建任何值类型。这样,基于对象编程这条路就被卡死了。虽然丧失了值类型的效率,但是也避免了基于对象编程的大量错误。Java 语言中所有方法也都是虚函数。这也是为了保证纯正的面向对象编程。Java 语言是静态面向对象
19、编程范式的顶峰。使用面向接口的抽象编程,是有效使 用 java 开发的唯一途径!另一方面, Java 实际上是一门动态语言。它是动态解释执行的。和Ruby,JavaScript 等一样。这使 java 具备了运行时的灵活性。可以实现自省,反射等C+ +等传统静态语言无法实现的功能。.NET 语言优劣考.NET是java的兄弟。是微软因为被Sun排除在java之外而开发的一套语言。主 要包括 C#, VB.net,C+/CLI 等语言。它的设计理念基本和 java 相同,也是一个支持静态面向对象编程范式的平台 对于.NET语言平台,我选择 C#和C+/CLI这两种语言进行论述。VB.NET和C#
20、类 似, 这里就不再多说了。C#C#.net 还支持值类型,也就是基于对象的编程范式。(当然, .NET 框架也是支持值类型的)C#.net 的泛型类型替换是在运行时执行的。 对于引用类型(在堆内存中创建实例的 类型), 它使用类型强制转换,而不是 C+模板的源代码生成来实现参数化类型。对于值类型,则使用类似于 C+模板的MSIL中间代码生成机制实现。顺便提一下,java的泛型实现和C#勺机制类似。也是使用强制类型转换实现。而且? Java 中没有值类型,也不能对基本类型进行泛型操作,因此没有C#和C+中的源代码扩张问题。但是,老实说, java 的泛型机制确实太弱了!C#语言首选的是面向对象
21、编程范式。C#也可以使用泛型支持的基于对象的编程范式。使用值类型,对于用惯面向对象编程范式的C#和java程序员来说有一定的难度。而且,提升的效率也并不很高。同时,在语法层面上,C#乏型是实现参数化类型的更简单方法,不具有C+模板的复杂性。此外,C#并不尝试提供C+模板所提供的所有功能。因此, C# 乏型支持的基于对象编程要比模板支持的基于对象的编程要弱很多。理念上,泛型编程有些不伦不类,有着太强的面向对象编程的气味。C#中,使用泛型支持的基于对象的编程范式不如面向对象编程范式。我认为,C#语言还是应该首先使用面向对象编程范式。C+/CLI C+/CLI是为了让C+使用.NET平台而提供的扩展
22、机制。.NET 平台是类似于 java 的静态强类型动态执行的执行平台。 是面向对象编程范式 理念的 框架。C+/CLI使用了新的语法,使用 C+/CLI进行.NET开发时,类似于C#编程。同时,也可以使用模板进行 C+/CLI 编程。这是 C+/CLI2005 新增的功能使用C+/CLI进行.NET编程时,既可以使用C#羊式的面向对象编程。也可以使用模板 支持的基于对象的编程范式进行开发。可以把模板支持的基于对象的编程范式和 .NET 的面向对象的编程范式结合起来使 用。C+/CLI可以同时使用原生C+和.NET编程。如果使用.NET框架执行,那么C+原 生 代码就会存放在生成的 MSIL中
23、间代码中,在运行时再使用 C+S译器编译成机 器码。.NET 的互操作机制.NET 运行时本身就是使用 COMS 写的,是一个 COM 艮务器。因此, .NET 和 COMS 操 作是非常简单的。也可以使用 COM技术,用C/C+直接调用.NET内的方法。在互操作上。 .NET 比 java 实现得更好。不能从 C 语言调用 Java 方法,只能从 java 代码 中使用 JNI 调用 C 方法。总体评价.NET是java的表兄弟。又做出了一下改变。1,定义了 .NET 的汇编语言。基于 .NET 的汇编语言可以支持任何语言在 .NET 平台 上执 行。 Java 自然也可以作为一个平台。但是
24、 java 平台的设计目标就是 java 这 一种语言, 因此没有定义汇编语言,只有 java 的机器码。2,支持值类型。 虽然用处不大,但是可以提高性能,也方便与 C 语言的函数库交 互。3, 泛型的实现比 java 强大。4, 特别是C+/CLI,具有模板*NET运行库的强大能力。Ruby 语言优劣考Ruby 是一种强类型的动态解释型语言。在 Ruby 中一切都是对象。使用 Duck Typing" 像鸭子一样编程 "的编程理念。 Ruby 有类型,但是变量不确定类 型。 这也实现了动态的多态能力。不象 Java , .NET 等静态面向对象编程语言,不需要使用什么都不
25、作,仅仅表示类 型的 规范的接口。 Ruby 中使用变量时不需要声明使用什么接口或者类型。任何类型都可以,只要确实有这样的方法或者数据成员存在即可!类似于C+的模板编程,只是C+的模板需要指定参数的类型。Ruby不需要指定变 量 的类型,因此不需要模板那样的机制。Ruby 这样不指定变量类型的语言使用起来非常灵活。按照动态语言的观点,既然编译时不能完全找出运行时的错误,不如不要编译时检 查, 也不要编译。使用单元测试来寻找错误。但是, C+, Java , .NET 这样的编译时检查类型的语言也有自己的优点:1, 更加安全,编译时就会发现错误。2, 可以实现 IDE 的智能提示。而 Ruby
26、这样的语言就不可以。因为 C+, Java 的变 量 使用时都指定了类型,因此可以在 IDE 中智能提示可能的成员。而 Ruby 这样的动态语言的变量都没有指定类型,所以无法为你提供智能提示。使用Ruby,应该使用"动态类型语言"的基于对象的编程范式,使用隐式的接口。 使用的类 不需要有一个共同的基类。让各个实现类互相独立存在就行了。记住,这是和C+的模板支持下的基于对象的编程范式类似的基于对象 (ADT 抽象数据类型 ) 的编程!Ruby 程序 !不要试图用java , C#这样的语言的面向对象的编程思维方式来编写JavaScript 语言优劣考JavaScript 是一
27、门长期以来被忽视的语言。它的重要性和能力都被大大的低估 了!这是因为Java和.NET崛起以来,"静态类型语言"的面向对象的编程范式受到广泛 的推崇。 作为动态语言,函数式语言的 JavaScript 长期以来被广大 Java ,.NET 程 序员视为畸形 怪胎!老实说,长久以来,我也一直是以厌恶的眼光看待它。多少 次,它让我很抓狂。尽管 JavaScript 已经诞生了这么多年,但是把 JavaScript 作为一门很有前途的动 态强类 型语言,函数式语言来看待还是新鲜事物。还没有见到很多关于这方面和设 计模式的研 究。JavaScript 支持面向过程的编程范式这是 JavaScript 使用最广泛的一种编程范式。简单、快速、有效。JavaScript 代码需要通过网络传输到用户浏览器中,因此 JavaScript 的使用一般都是简单的几 个数据提交和验证功能。如果使用 Ruby 那样的动态基于对象的编程范式编码显得 有些 小题大做,又浪费带宽。JavaScript 支持"动态类型语言 "的基于对象的编程范式如果 JavaScript 仅仅支持过时的面向过程的编程范式,那么JavaScript 就真的是大家心目中的鸡肋了。这些年来,广大程序员都
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 养老院工资奖惩制度
- 专卖店考勤奖惩制度
- 保洁员考核奖惩制度
- 揭阳一中奖惩制度
- 奖惩制度实办法
- 汽车4s店质检奖惩制度
- 测绘奖惩制度制度
- 消防安全考评奖惩制度
- 渣土车运输奖惩制度
- 煤矿师带徒奖惩制度
- 我的祖国音乐教学课件
- 2024年西藏自治区事业单位《职业能力倾向测验(D类)》考试真题及答案
- 2002年山东省泰安市中考数学真题【含答案解析】
- 2025年G1工业锅炉司炉试题及答案(1000题)
- 上市公司投后管理制度
- 2025年高考英语试卷及答案(新课标Ⅰ卷)
- 建筑公司班组管理制度
- 2025年云南省中考数学-26题二次函数降次幂题35道
- 电商运营总监合同协议
- 中山市施工合同标准文本
- 2025届上海市嘉定区初三一模语文试卷及答案
评论
0/150
提交评论