区别对比 Python、Perl、VB、Ruby、C/C++、C# .Net、PHP、Java… 等多编程语言
1. 编程语言类型:
首先,Python、C/C++、Java 都是强类型的编程语言。强类型的编程语言定义如下:
- 强类型的编程语言是一种强制类型定义的编程语言,即一旦某一个变量被定义类型,如果不经强制转换,那么它永远就是该数据类型。而弱类型的编程语言是一种弱类型定义的编程语言,某一个变量被定义类型,该变量可以根据环境变化自动进行转换,不需要经过现行强制转换。
- 强类型的编程语言包括:Python、C/C++、.Net、Java 等编程语言。其中 Python 是动态编程语言,是强类型定义编程语言,是类型安全的编程语言;Java 是静态的编程语言,是强类型定义编程语言,也是类型安全的编程语言;
- 弱类型的编程语言包括:VB,PHP,JavaScript 等编程语言。其中 VBScript 是动态的编程语言,是一种类型不安全的原因。
- 强类型的编程语言 和 弱类型的编程语言,其判断的根本是“是否会隐形进行编程语言类型转变”。强类型的编程语言在速度上可能略逊于弱类型的编程语言,但是强类型定义语带来的严谨性又避免了不必要的错误。
上面提到了 动态的编程语言 与 静态的编程语言,那就讲讲“动态的编程语言 与 静态的编程语言”的区别:
- 动态类型:动态性语言是指在运行期间才去做数据类型检查的语言,也就是说动态类型语言编程时,永远不用给任何变量指定数据类型,该语言会在第一次赋值给变量时,在内部将数据类型记录下来。Python 和 Ruby 就是一种典型的动态类型语言,其它的各种脚本语言,如 VBScript 也多少属于动态类型语言。
- 静态类型语言:静态类型语言与动态类则刚好相反,它的数据类型在编译期间检查,也就是说在写程序时要声明所有变量的数据类型,C/C++ 是静态类型语言的典型代表,其它静态语言还有 C#、Java 等。
对于动态语言与静态语言的区分,其根本在于判断是在运行期间去做数据类型还是在编译期间检查。
2. 面向过程与面向对象
C 语言是面向过程的,Python、C++、JAVA 都是面向对象的。
- 面向过程是直接将解决问题的步骤分析出来,然后用函数把步骤一步一步实现,然后再依次调用就可以了。
- 而面向对象是将构成问题的事物,分解成若干个对象,建立对象的目的不是为了完成一个步骤,而是为了描述某个事物在解决问题过程中的行为。
打个比方,我们想求长方形的面积:
++++++++++++++++++++++++++++++++++++++++++++++
面向过程会以,求解数学题的思路去思考:
设定长方形的长 和 宽分别为 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++
解释型的语言:Python、Java
另附上一张 JAVA 与 C/C++ 对比的图片,是笔者在学习时看到的,有些方面笔者也正在学习中,因此不一一解释了,供大家一起学习。

区别对比 Python、Perl、VB、Ruby、C/C++、C# .Net、PHP、Java… 等多编程语言的更多相关文章
- 工具推荐. 在线unix, 在线python/perl脚本测试环境
在线python, perl, javascript, Lisp, Ruby等 http://melpon.org/wandbox/ 正则表达式在线测试工具 http://tools.jb51.ne ...
- Atitit 颜色平均值cloor grb hsv模式的区别对比
Atitit 颜色平均值cloor grb hsv模式的区别对比 使用hsv模式平均后会变得更加的靓丽一些..2 public class imgT { public static void main ...
- Windows8 各种版本区别对比详解
微软的 Windows8 操作系统提供了4个不同的版本,分别是 Windows RT.Windows 8 标准版.Windows 8 Pro 专业版 以及 Windows 8 Enterprise 企 ...
- 基于Spark环境对比Python和Scala语言利弊
在数据挖掘中,Python和Scala语言都是极受欢迎的,本文总结两种语言在Spark环境各自特点. 本文翻译自 https://www.dezyre.com/article/Scala-vs-Py ...
- 【Centos】Postgresql连接测试(Perl和Ruby)
Centos安装了PostgreSQL之后,将考虑如何让Perl与Ruby连接它. Perl连接方式 1,安装Perl的数据库连接包 perl-DBD-Pg perl-DBI yum install ...
- 开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表( 附加翻译) h2数据库
开源数据库 H2, HSQLDB, DERBY, PostgreSQL, MySQL区别/对比图表 浪天涯博主翻译: referential integrity 参考完整性transactions 事 ...
- SpringCloud与Dubbo区别对比
1:SpringCloud与Dubbo区别对比 (1):活跃度 目前SpringCloud的活跃度明显远高于Dubbo(参考github) (2):主要区别 Dubbo Spring Cloud ...
- jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jquery筛选方法
jQuery---jq基础了解(语法,特性),JQ和JS的区别对比,JQ和JS相互转换,Jquery的选择器(基础选择器,层级选择器,属性选择器),Jquery的筛选器(基本筛选器,表单筛选器),Jq ...
- Oracle与MySQL的区别对比
本文对数据库Oracle与MySQL进行了区别对比,其中从并发性.一致性.事务.数据持久性等十三方面进行了对比. 本文摘自 51cto 一.并发性 并发性是oltp数据库最重要的特性,但并发涉及到资源 ...
- MarkDown编辑器的区别对比
标题: MarkDown编辑器的区别对比 作者: 梦幻之心星 sky-seeker@qq.com 标签: [MarkDown, 编辑器,区别] 目录: [软件] 日期: 2020-6-22 前提说明 ...
随机推荐
- 使用 Visual Studio 断点调试 DLL
继上文说到使用 IDA 和 WinDbg 调试无 dmp 文件 那么在有源码的情况下可以直接断点调试 DLL,目的是查看 DLL 内部的函数调用 场景: 程序执行到某个 DLL 时突然崩溃,先确定 ...
- 了解企业架构EA(Enterprise Architecture)
一.企业架构简介 企业架构:Enterprise Architecture,EA,或企业体系结构,是在信息系统架构设计与实践基础上发展起来的一个特殊领域. 但是企业架构现在还没有一个公认的定义,综合现 ...
- ubuntu18.04下创建虚拟环境
准备 ubuntu18.04自带python3.6版本 安装pip3 apt install python3-pip 安装virtualenv和virtualenvwrapper pip3 insta ...
- .net core6 Log4记录日志
一.引言 .net core6在文件方面是精简了,所以配置方面也发生了部分变化:下面记录下.net core6中怎么配置Log4 进行日志记录. 二.项目创建 1).首先引用两个包:在Nuget中引入 ...
- Google Chrome 开启多下载下载,提高文件下载速度
在地址栏输入: chrome://flags/#enable-parallel-downloading Parallel downloading改为Enabled后重启浏览器即可打开多线程下载 (多线 ...
- Java 异常处理(1) : try-catch- finally中finally的使用
1 package com.bytezero.throwable; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 impor ...
- Codeforces Round 914 (Div. 2)A~C
A 反过来考虑,由皇后和国王的位置去寻找骑士的位置,当一个点既可以被皇后找到,也可以被国王找到时就说明这个点是满足条件的 #include <bits/stdc++.h> #define ...
- 摆脱鼠标系列 - 百度搜索 - 火柴 - 快捷键 Ctrl两次
摆脱鼠标系列 - 百度搜索 - 火柴 - 快捷键 Ctrl两次 有两款软件 utools 和 火柴,试用后觉得火柴符合试用功能 这里只用网络搜索 其他功能均不用 搜索用双核浏览器 因为用的老的chro ...
- vscode 尾逗号不自动删除 'comma-dangle': 'off' eslint vue
vscode 尾逗号不自动删除 'comma-dangle': 'off' eslint 外层环境说明 vscode eslint - .elintrs.js vue - vue开发 vetur - ...
- base64 转文件上传
// 将base64转换为blob dataURLtoBlob (dataurl) { let arr = dataurl.split(',') let mime = arr[0].match(/:( ...