C/C++、Java、Python谁是编译型语言,谁是解释型语言?

  最近各大互联网公司线上笔试,编程题目里的编译器只支持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

  

时间: 2024-11-18 01:35:17

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

编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

最近在研究Python和Erlang.反复提到动态类型语言.动态语言.解释型语言这些概念.这些概念很生涩,在这里做一个总结. 编译型语言和解释型语言 1.编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言.一般需经过编译(compile).链接(linker)这两个步骤.编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件. 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行

动态语言和静态语言、编译型语言和解释型语言、强类型语言和弱类型语言的分析

一.动态语言和静态语言1. 我们常说的动.静态语言,通常是指: 动态类型语言 Dynamically Typed Language 静态类型语言 Statically Typed Language 可能还有:动.静态编程语言 Dynamic\Statically Programming Language 2.    动态类型语言:在运行期间检查数据的类型的语言例如:Ruby\Python这类语言编程,不会给变量指定类型,而是在附值时得到数据类型.Python是动态语言,变量只是对象的引用,变量a

【转载】编译型语言、解释型语言、静态类型语言、动态类型语言概念与区别

编译型语言和解释型语言 1.编译型语言 需通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言.一般需经过编译(compile).链接(linker)这两个步骤.编译是把源代码编译成机器码,链接是把各个模块的机器码和依赖库串连起来生成可执行文件. 优点:编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行. 缺点:编译之后如果需要修改就需要整个模块重新编译.编译的时候根据对应的运行环境生成机器码,

编译型语言,解释型语言,静态语言,动态语言概念

编译语言和解释语言 1.编译语言: 需要通过编译器(compiler)将源代码编译成机器码,之后才能执行的语言. 一般需经过编译,链接两个步骤: 编译:把原代码编译成机器码 链接:把各个模块和依赖库串起来生成可执行文件. 优点: 编译器一般会有预编译的过程对代码进行优化.因为编译只做一次,运行时不需要编译,所以编译型语言的程序执行效率高.可以脱离语言环境独立运行. 缺点: 编译之后如果需要修改就需要整个模块重新编译.编译的时候根据对应的环境生成机器码,不同的操作系统之间移植会有问题,需要根据运行

编译型语言与解释型语言

参考:http://jingyan.baidu.com/article/656db918ede71ee381249c05.html##1 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码. 而这种转换的方式有两种: 1)编译 2)解释 由此高级语言也分为编译型语言和解释型语言. 编译型语言: 使用专门的编译器,针对特定的平台,将高级语言源代码一次性的编译成可被该平台硬件执行的机器码

java是编译型还是解释型语言/

有人说Java是编译型的.因为所有的Java代码都是要编译的,.java不经过编译就无法执行. 也有人说Java是解释型的.因为java代码编译后不能直接运行,它是解释运行在JVM上的,所以它是解释型的.对于C和C++,它们经过一次编译之后,可以由操作系统直接执行,所以它们是编译型语言.而Java不一样,它首先由编译器编译成.class(字节码)文件,然后在通过JVM从.class文件中读一行解释执行一行,所以它是解释型的语言.也正是由于java对于多种不同的操作系统有不同的JVM,所以实现了真

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

V语言已在github正式开源,目前已收获近9000星,引发开发者的强烈关注. V语言到底是怎样一门语言?已经有了C/C++/Java/Python/Go..., 我们还需要另外一门语言吗? 先看看V语言对自己的定位:    Simple, fast, safe, compiled language for developing maintainable software.V语言将编写可维护软件,作为自己的定位.其鲜明的特点是简单.高效.安全.编译型语言. 大家都有这样的经历:接手别人的代码,发

Python是一款解释型语言

Q:Python是一款解释型语言 A:https://blog.csdn.net/u012184539/article/details/81348780 计算机是不能理解高级语言的,更不能直接执行高级语言,它只能直接理解机器语言,所以使用任何高级语言编写的程序若想被计算机运行,都必须将其转换成计算机语言,也就是机器码.而这种转换的方式有两种:编译.解释. **编译型语言** 在编译型语言写的程序执行之前,需要一个专门的编译过程,把源代码编译成机器语言的文件,如exe格式的文件,以后要再运行时,直

[LeetCode] 011. Container With Most Water (Medium) (C++/Java/Python)

索引:[LeetCode] Leetcode 题解索引 (C++/Java/Python/Sql) Github: https://github.com/illuz/leetcode 011.Container_With_Most_Water (Medium) 链接: 题目:https://oj.leetcode.com/problems/container-with-most-water/ 代码(github):https://github.com/illuz/leetcode 题意: 给一些