最近各大互联网公司线上笔试,编程题目里的编译器只支持C/C++、Java,甚至有的支持javaScrpit和Pascal,就是不支持Python。让一直以来用惯了Python的我直吐血,于是今天痛定思痛还是熟悉一下Java,免得继续被虐。学习的过程中,看到这样一个争论“Java、Python谁是编译型语言,谁是解释性语言?”。我在网上查了很多资料,也结合了自己的理解,下面与大家分享一下。

  总的来说,如今编译型语言、解释性语言的分界线不再那么明显,应该避免把语言简单归类为“编译型”和“解释型”。

  我们最开始说C/C++是编译型语言,原因是相对于Ruby这样的解释性语言,C/C++需要通过编译器,把源代码编译成中间文件(.o和.obj),然后通过连接器和汇编器生成机器码,即一系列基本操作序列,可以直接让计算机执行。这些机器码也就是我们通常的exe文件。

  我们以Ruby为例谈一下解释型的语言,程序从源代码到被计算机执行,也要经历上述步骤。不同的地方在于,C/C++会把那些从源代码“变”来的机器码(即exe文件)保存起来,而Ruby直接将这些生成的基本操作序列(Ruby虚拟机)指令丢给Ruby虚拟机执行然后产生动作了。这就是我们所说的解释型语言。

  所以我们看到的现象是,编译型语言要先编译再运行,而解释性语言直接“运行”源代码。

  回到最开始的问题,如果以是“否保存机器码为exe文件”为区分,那么Java和Python都属于解释型语言。

  但具体来讲,Java和Python是有很大不同的。Java代码从源程序到执行,要经过的过程是:编译器(javac)把源代码转化为字节码,然后解释器(Java.exe)把字节码转换为计算机理解的机器码来执行,其过程中没有把“机器码保存为exe”的行为(这样讲也不完全准确,下面会讲到)。其中编译器和解释器都是Java虚拟机(JVM)的一部分,由于针对不同的硬件与OS,Java解释器有所不同,因此可以实现“一次编译、到处执行”。所以JVM是Java跨平台特性的关键所在。

  Java虚拟机(JVM)一种用于计算机设备的规范,可用不同的方式(软件或硬件)加以实现。编译虚拟机的指令集与编译微处理器的指令集非常类似。Java虚拟机包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收堆和一个存储方法域

  对于Python,其源代码到执行也要经过如下过程:源代码--->字节码--->机器码。跟Java相同的是,其过程中也没有把“机器码保存为exe”的行为。与Java不同的是,Python使用的虚拟机是基于其他语言实现的,比如我们一般使用的Python实际为Cpython,也就是其虚拟机由C实现,这个虚拟机负责把Python源码编译为字节码,再解释执行。另外,还有Jypython、Ironpython等。

  那为什么要这样实现?

  因为CPython中很容易为你的Python代码写C扩展,因为最终都是由C解释器执行的。另一方面,Jython则使得和其他java程序共同工作很容易:无需其他工作,你就可导入任何Java类,在你的Jython程序中使用其他Java类

  通过以上分析,显然,每种语言都有自己的优缺点。

  另外需要说明的是Python是种强类型的语言。有人可能会问,在python中,可以这样写而不报错,所以是弱类型的:

i=1
print(i)
i="hello world"
print(i)

  显然,这样的同学搞错了python的实现。实际上述代码中,i仅仅是一个指向,每次赋值,实际上只是改变了i的指向。

  实际上,这里python表现出的特性为,他是一种动态类型语言。动态类型语言是一种在运行期间才去确定数据类型的语言,与静态类型相反。VBScript 和 Python 是动态类型的,因为它们确定一个变量的类型是在您第一次给它赋值的时候。静态类型语言是一种在编译期间就确定数据类型的语言。大多数静态类型语言是通过要求在使用任一变量之前声明其数据类型来保证这一点的。Java 和 C 是静态类型语言。

  Python 是强制类型定义的。指的是加入我们有一个整数,如果不明确地进行转换 ,不能将把它当成一个字符串,所以显然,C/C++和Java都是强类型语言。 弱类型语言与强类型相反。VBScript 是弱类型的。在 VBScript 中,我们可以将字符串 '12' 和整数 3 进行连接得到字符串'123',然后可以把它看成整数 123 ,所有这些都不需要任何的显示转换。

  总结起来,Python是一种动态的,强类型语言

  现在回到“关于解释和编译的界限也不是特别清晰了”的问题。

    • Java需要预先把代码编译成虚拟机指令的,然后在运行这些虚拟机指令,有的教科书上会成为混合型或者半编译型。
    • 像Python和lua这样就更不好分了,可以直接解释源代码运行,也可以编译为虚拟机指令然后再运行。
    • php编译之后的结果可以被Web Server缓存起来,甚至还可以先被翻译为C++,然后再编译。
    • .NET 的CLR运行时是Windows的组成部分,编译好的.NET 系列语言的代码直接生成可执行文件,然后被“直接”执行,看起来跟C没有什么太大的差别。
    • JavaScript可以被V8引擎编译为机器码然后执行,如果在node.js下,这个编译结果被缓存起来了,你说这跟编译好再执行的C有什么区别

  我们再回到”Java编译、执行过程中没有把机器码保存为exe的行为“的话题。

  有些答案对JAVA的理解还停留在上古时代或者教科书里。
  其实,现在用编译型、解释型来分类编程语言已经有点力不从心了。
  JAVA的第一道工序是javac编译,当然目标文件是BYTECODE。后续可能有三种处理方式:
  1. 运行时,BYTECODE由JVM逐条解释执行,
  2. 运行时,部分代码可能由JIT翻译为目标机器指令(以method为翻译单位,还会保存起来,第二次执行就不用翻译了)直接执行;
  3. RTSJ。继JAVAC之后执行AOT二次编译,生成静态的目标平台代码(典型的就是IBM WEBSHPERE REAL TIME)。

  有的时候,可能是以上三种方式同时在使用。至少,1和2是同时使用的,3需要程序员手工指定。显然,生成了静态的目标平台代码,按照之前的定义,就属于编译型语言了
  所以讨论语言得更细化一点了,强类型的、弱类型的,静态的、动态的,GC-based的、手工管理内存的,有没有VM..

  参考链接:

  1、程序的编译与解释有什么区别?  http://www.zhihu.com/question/21486706

  2、为什么有这么多python?  http://www.oschina.net/translate/why-are-there-so-many-pythons

  3、Java是编译型语言还是解释性语言?  http://www.zhihu.com/question/19608553

  4、CSDN讨论,Python是强类型语言  http://bbs.csdn.net/topics/310260114

  

C/C++、Java、Python谁是编译型语言,谁是解释型语言?的更多相关文章

  1. JAVA,Python代码是编译执行还是解释执行?

    转载地址:http://blog.csdn.net/zv3e189os5c0tsknrbcl/article/details/78661641 有人在讨论 Python 代码是编译执行还是解释执行?这 ...

  2. Python编程基础(一)编程语言是什么?编译型语言和解释型语言的区别|Python是什么?

    编程语言是什么? 其实,程序指的就是一系列指令,用来告诉计算机做什么,而编写程序的关键在于,我们需要用计算机可以理解的语言来提供这些指令. 虽然借助 Siri(Apple).Google Now(An ...

  3. 『无为则无心』Python基础 — 2、编译型语言和解释型语言的区别

    目录 1.什么是计算机语言 2.高级语言中的编译型语言和解释型语言 (1)编译型语言 (2)解释型语言 (3)编译型语言和解释型语言执行流程 3.知识扩展: 4.关于Python 1.什么是计算机语言 ...

  4. 编程开发(C/C++&Java&Python&JavaScript&Go&PHP&Ruby&Perl&R&Erlang)

    使用Docker快速部署主流编程语言的开发.编译环境及其常用框架,包括C.C++.Java.Python.JavaScript.Go.PHP.Ruby.Perl.R.Erlang等. 在今后采用编程语 ...

  5. V语言横空出世,C/C++/Java/Python/Go地位不保

    V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V ...

  6. (八)map,filter,flatMap算子-Java&Python版Spark

    map,filter,flatMap算子 视频教程: 1.优酷 2.YouTube 1.map map是将源JavaRDD的一个一个元素的传入call方法,并经过算法后一个一个的返回从而生成一个新的J ...

  7. 芒果TV招聘研发工程师(JAVA PYTHON),地点长沙

    长沙芒果TV招聘高级 JAVA Python 工程师,工作地点:湖南广电   有兴趣的邮件0xmalloc@gmail.com; zealotyin@qq.com 公司有一大批从北京上海一线互联网企业 ...

  8. paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较

    paip.提高效率---集合的存取括号方式 uapi java python php js 的实现比较 ##java ----------- 在JDK1.7中,摒弃了Java集合接口的实现类,如:Ar ...

  9. paip.复制文件 文件操作 api的设计uapi java python php 最佳实践

    paip.复制文件 文件操作 api的设计uapi java python php 最佳实践 =====uapi   copy() =====java的无,要自己写... ====php   copy ...

随机推荐

  1. myeclipes出现{Could not create the view: An unexpected except

    今天编写代码的时候突然出现了web工程不能部署的情况,后面了解到主要是因为那个myeclipse非正常关闭或者突然断电的情况,我的是属于第一种的,下面整理一下这个解决方法 1.关闭myeclipse ...

  2. C基础练习题

    1.下面有关C程序操作过程的说法中,错误的是______. A.C源程序经过编译,得到的目标文件即为可执行文件 B.C源程序的链接实质上是将目标代码文件和库函数等代码进行连接的过程 C.C源程序不能通 ...

  3. 在DataGridView控件中启用换行

    实现效果: 知识运用: DataGridView控件公共属性DefaultCellStyle的WrapMode属性 public DataGridViewTriState WrapMode {  ge ...

  4. 通过存储过程批量生成spool语句

    过存储过程批量生成spool语句 CREATE OR REPLACE PROCEDURE pro_yx_full_txt IS export_handle UTL_FILE.file_type; v_ ...

  5. java8关于LocalDate,Date

    关于java8中的新的时间日期类 public static void main(String[] args) { Date date = new Date(); LocalDate localDat ...

  6. SSH程序框架之Spring与HIbernate整合

    spring整合hibernate 有两种方式 1.注解方式 2.xml方式实现 Spring整合Hibernate有什么好处? 1.由IOC容器来管理Hibernate的SessionFactory ...

  7. HTML5中Web存储

    HTML5 中web存储是一个比cookies更好的一个本地存储方式. 那么什么是HTML5存储呢? 使用HTML5可以在本地存储用户浏览的数据,HTML5技术没有出来之前是使用cookies进行本地 ...

  8. Android驱动开发读书笔记五

    第五章 本章介绍了S3C6410开发板的功能,开发板的不同主要是在烧录嵌入式系统的方式不同,以及如何在此开发板上安装Android. 1.安装串口调试工具minicom 首先需要一根USB转串口线,由 ...

  9. NOIP2016——大家一起实现の物语

    由于最近硬盘挂了,换了个固态硬盘,比赛结束后四天一直在装Linux,所以最近一直没怎么更新 看起来挺漂亮的 比赛前一个月申请停了一个月晚自习,在我们这座城市里能做到这种事情已经可以被称为奇迹了,并且在 ...

  10. 机器学习(一)之KNN算法

    knn算法原理 ①.计算机将计算所有的点和该点的距离 ②.选出最近的k个点 ③.比较在选择的几个点中那个类的个数多就将该点分到那个类中 KNN算法的特点: knn算法的优点:精度高,对异常值不敏感,无 ...