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

    packimport java.util.ArrayList;import java.util.List; public class ArrayListRemove { public static v ...

  2. docker安装gitlab-ce

    pull and run docker pull docker.io/gitlab/gitlab-ce docker run -itd --name gitlab -p 10080:80 gitlab ...

  3. C#算术运算符

    一.C#算术运算符 C#语言的算术运算符主要用于数学计算中. 二.示例 using System;using System.Collections.Generic;using System.Linq; ...

  4. Nginx正向代理代理http和https服务

    Nginx正向代理代理http和https服务 1. 背景需求 通过Nginx正向代理,去访问外网.可实现局域网不能访问外网的能力,以及防止在上网行为上,留下访问痕迹. 2. 安装配置 2.1安装 w ...

  5. 20180901 JavaScript闭包和匿名函数自动调用

    引用: 1. JavaScript闭包_by runoob 2. JS中(function(){xxx})这么写是什么意思? (一)闭包是可以访问上一层函数作用域里变量的函数,即便上一层函数已经关闭. ...

  6. Linux下同进程多进程号实时监控

    一.需求: Linux上对一个进程名称可能会对应的多个进程号的进程进行监控,如果有多个则输出到一个日志文件. 以上问题针对的是一个定时程序还未运行结束,到下一个时刻程序又运行起来了,避免造成重复调用接 ...

  7. python入门:求1-2+3-4+5...99的所有数的和(自写)

    #!/usr/bin/env pyhton # -*- coding:utf-8 -*- #求1-2+3-4+5...99的所有数的和(自写) """ 给x赋值为0,给y ...

  8. 如何用纯 CSS 创作一个小球反弹的动画

    效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/OwWROO 可交互视频 ...

  9. stm32启动地址

    理论上,CM3中规定上电后CPU是从0地址开始执行,但是这里中断向量表却被烧写在0x0800 0000地址里(Flash memory启动方式),那启动时不就找不到中断向量表了?既然CM3定下的规矩是 ...

  10. spring+struts2+mybatis框架依赖pom.xml

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...