全面对比 Python、Go、VB、PHP、C/C++、C#、.Net、Java、… 等多种编程语言的区别
1. 语言类型:
首先,C/C++、Java 、Python都是强类型的语言。强类型语言的定义如下:
- 强类型语言是一种强制类型定义的语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。而弱类型语言是一种弱类型定义的语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。
- 强类型语言包括:Java、.Net、Python、C/C++ 等语言。其中 Python 是动态语言,是强类型定义语言,是类型安全的语言,Java 是静态语言,是强类型定义语言,也是;类型安全的语言;
- 弱类型语言包括:VB,PHP,JavaScript 等语言。其中 VBScript 是动态语言,是一种类型不安全的原因。
- 强类型语言和弱类型原因其判断的根本是是否会隐形进行语言类型转变。强类型原因在速度上可能略逊于弱类型语言,但是强类型定义语带来的严谨性又避免了不必要的错误。
上面提到了动态语言与静态语言,那就讲讲动态语言静态语言的区别:
- 动态类型语言:动态性语言是指在运行期间才去做数据类型检查的语言,也就是说动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。Python 和 Ruby 就是一种典型的动态类型语言,其他的各种脚本语言,如 VBScript 也多少属于动态类型语言。
- 静态类型语言:静态类型语言与动态类则刚好相反,它的数据类型在编译期间检查,也就是说在写程序时要声明所有变量的数据类型,C/C++ 是静态类型语言的典型代表,其他静态语言还有 C#、Java 等。
对于动态语言与静态语言的区分,其根本在于判断是在运行期间去做数据类型还是在编译期间检查。
2. 面向过程与面向对象
C 语言是面向过程的,C++、JAVA、Python 都是面向对象的。
- 面向过程是直接将解决问题的步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用就可以了。
- 而面向对象是将构成问题的事物,分解成若干个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在解决问题过程中的行为。
打个比方,我们想求长方形的面积:
++++++++++++++++++++++++++++++++++++++++++++++
面向过程会以,求解数学题的思路去思考:
设定长方形的长和宽分别为 x 和 y,
确定长方形面积的算法
编写出计算面积的函数
将 x、y 传入相对应的函数,求解长方形的面积。
++++++++++++++++++++++++++++++++++++++++++++++
面向对象会以,描述对象的思路去思考:
对规则图形的一般属性和性质进行定义,如周长和面积
在规则图形的基础上,创建长方形,描述长方形的属性和性质
创建长方形的对象,调用它的面积函数,以求解长方形的面积
++++++++++++++++++++++++++++++++++++++++++++++
从这个简单的例子中我们可以看出面向对象和面向过程解决问题的不同,但似乎他们的规模并没有太大区别。这是因为例子中问题规模非常小,当我们实际解决一个规模不小的问题时,可能会涉及多个对象间的交互、代码的复用及扩展问题,此时面向对象的优点就显现出来了。毕竟,面向对象就是为了降低系统的耦合度而提出的。(耦合度:各模块间相互联系程度的度量) 但面向过程也并非一无是处,其优良的效率是面向对象难以达到的。
因此,我们可以将他们的优缺点概括如下:
面向过程
特性
自顶向下、逐步求精、模块化
优点
性能比面向对象高,因为类调用需要实例化,开销比较大,比较消耗资源。
如单片机、嵌入式开发、Linux/Unix 等一般采用面向过程开发,因为在它们看来性能是最重要的因素。
缺点
没有面向对象易维护、易复用、易扩展
(按照面向过程的思想,在解决问题时,各函数之间是为了这个问题服务;而面向对象的思想,则是站在提出问题的主体的角度去解决问题,可将解决这一具体问题的步骤,抽象为解决这一类问题的方法,以后再遇到类似的问题,可以复用解决思路)
面向对象
特性
封装、继承、多态、抽象
优点
易维护、易复用、易扩展
缺点
性能比面向过程低
3. 编译型和解释型语言
计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码。而这种转换的方式有两种:
1.编译
2.解释
由此高级语言也分为编译型语言和解释型语言。
主要区别在于,前者源程序编译后即可在该平台运行,后者是在运行期间才编译。所以前者运行速度快,后者跨平台性好。
编译型语言
编译型语言使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码,并包装成该平台所能识别的可执行性程序的格式。
特点
在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直接使用编译结果即可,如直接运行exe文件。因为只需编译一次,以后运行时不需要编译,所以编译型语言执行效率高。
总结
1. 一次性的编译成平台相关的机器语言文件,运行时脱离开发环境,运行效率高;
2. 与特定平台相关,一般无法移植到其他平台;
3. 现有的 C/C++、Objective 等都属于编译型语言。
解释型语言
使用专门的解释器对源程序逐行解释成特定平台的机器码并立即执行。是代码在执行时才被解释器一行行动态翻译和执行,而不是在执行之前就完成翻译。
特点
解释型语言不需要事先编译,其直接将源代码解释成机器码并立即执行,所以只要某一平台提供了相应的解释器即可运行该程序。
总结
1. 解释型语言每次运行都需要将源代码解释称机器码并执行,效率较低;
2. 只要平台提供相应的解释器,就可以运行源代码,所以可以方便源程序移植;
3. Python 等属于解释型语言。
编译型与解释型,两者各有利弊
前者由于程序执行速度快,同等条件下对系统要求较低,因此像开发操作系统、大型应用程序、数据库系统等时都采用它,像 C/C++、Pascal/Object Pascal(Delphi) 等都是编译语言,而一些网页脚本、服务器脚本及辅助开发接口这样的对速度要求不高、对不同系统平台间的兼容性有一定要求的程序则通常使用解释性语言,如 Java、JavaScript、VBScript、Perl、Python、Ruby、MATLAB 等等。
关于 Java
Java 和其他的语言不太一样。因为 Java 针对不同的平台有不同的 JVM,实现了跨平台。所以 Java 语言有一次编译到处运行的说法。
1. 你可以说它是编译型的:因为所有的 Java 代码都是要编译的,.java 文件不经过编译就什么用都没有。
2. 你可以说它是解释型的:因为 Java 代码编译后不能直接运行,它是解释运行在 JVM 上的,所以它是解释运行的,那也就算是解释的了。
3. 但是,现在的 JVM 为了效率,都有一些JIT优化。它又会把 .class 文件的二进制代码编译为本地的代码直接运行,所以,又是编译的。
笔者认为 Java 更偏向解释型的语言,因为虽然 Java 也需要编译,编译成 .class 文件,但是并不是机器可以识别的语言,而是字节码,最终还是需要 jvm的解释,才能在各个平台执行,这同时也是 Java 跨平台的原因。
因此可以如下分类:
编译型的语言:C/C++
解释型的语言:Java、Python
另附上一张 JAVA 与 C/C++ 对比的图片,是笔者在学习时看到的,有些方面笔者也正在学习中,因此不一一解释了,供大家一起学习。
热门相关:重生之我的书记人生 万象真经 孽徒快坑师 酒店供应商 惊世第一妃:魔帝,宠上身!