Java是编译性语言还是解释型语言 ?

0.先说明一下怎么突然想到这个问题了.

大概思路应该是这个样子的 …

JVM –> Java内存区域 –>
运行时数据区域 –> JVM和运行时啥关系 –>
Java运行时是名词?表示状态?还是表示一个事物? –>
Java是编译型语言还是解释型语言 ?

Java是编译型语言

java的编译器先将其编译为class文件,也就是字节码;然后将字节码交由jvm(java虚拟机)解释执行;
所以很多地方都说”java是一种半编译、半解释执行”的语言;

近来(其实也不是很”近”)Oracle的(以前是Sun的)HotSpot VM采用了jit compile(just in time compilation)技术,
将运行频率很高的字节码直接编译为机器指令执行以提高性能, 所以当字节码被jit编译为机器码的时候,要说它是编译执行的也可以…

不过总体来讲,java的编译结果是被jvm”解释执行”的,所以这么说也能说通,
而其实这个”是编译还是解释”这个概念在这里已经有点模糊了,理解它的过程就行了,不必下一个”精确”的定义;
而我自己仍然赞成”java是编译型语言”的说法,因为”编译”其本质就是”把一个相对高级的语言转换为另一个相对低级的语言”,而由java -> class文件的编译已经满足了这个特征; 而后面你要说jvm是”解释执行”的,那其实硬件对于机器码又何尝不是”解释执行”呢?
(编辑于 2012-06-22 00:15)

作者:温悦
链接:https://www.zhihu.com/question/19608553/answer/14702010
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java是编译性语言还是解释型语言 ?

如上图, 从上至下分别是编译型语言,解释型语言,Java的执行模型。
看上去陷入了一个困境,Java到底是编译型语言呢,还是解释型语言呢?

一种朴素的判定方式:如果翻译器部分较为简单,我们说这个语言是”解释的”,反之如果翻译器部分很复杂,我们就说这个语言是”编译的”。

事实上这两者之间的界限是模糊的,因为”简单”和”复杂”都具有主观性。
“解释型”和”编译型”并不是一个清晰的描述。故强行将某种具有混合形式的语言划入两者之一是不当的。
但实践中肯定还是有进行分类的需求的,所以这里有一条启发性原则用以判断语言的类型:

如果翻译器对程序进行了彻底的分析而非某种机械的变换,而且生成的中间程序与源程序之间没有很强的相似性,我们就认为这个语言是编译的。
彻底的分析和非平凡的变换,是编译方式的标志性特征。

因此,Java应当被认作一种编译型语言。
——《PLP》1.4 Compilation and Interpretation
发布于 2014-12-09 18:30

作者:冯若航
链接:https://www.zhihu.com/people/vonng
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Java是解释型语言

个人认为,java是解释型的语言,因为虽然java也需要编译,编译成.class文件,
但是并不是机器可以识别的语言,而是字节码,最终还是需要 jvm的解释,才能在各个平台执行,这同时也是java跨平台的原因。
所以可是说java即是编译型的,也是解释型,但是假如非要归类的话,从概念上的定义,恐怕java应该归到解释型的语言中。
附:
编译型的语言包括:C、C++、Delphi、Pascal、Fortran
解释型的语言包括:Java、Basic、javascript

Java既是编译型语言 , 又是解释型语言

由Java的代码执行过程可知 ,一个Java 代码的执行过程是由 . Java–>. class–>对应平台机器码 ;
. Java–>. class是由 Javac 编译,这个过程符合编译型语言的特点(一次性编译,注意 并未编译为实际平台的机器码,)
而. class–>对应平台机器码 的这一过程 是由Java解释执行 (逐行解释为特定平台机器码)这一过程符合解释语言的特点 ;
所以说 Java既是编程语言 ,又是解释语言。

高级编程语言按照程序的执行方式分为编译型和解释型两种。
简单来说,
编译型语言是指编译器针对特定的操作系统将源代码一次性翻译成可被该平台执行的机器码;
解释型语言是指解释器对源程序逐行解释成特定平台的机器码并立即执行。
比如,你想阅读一本英文名著,你可以找一个英文翻译人员帮助你阅读,
有两种选择方式,你可以先等翻译人员将全本的英文名著(也就是源码)都翻译成汉语,再去阅读,
也可以让翻译人员翻译一段,你在旁边阅读一段,慢慢把书读完。
Java 语言既具有编译型语言的特征,也具有解释型语言的特征,
因为 Java 程序要经过先编译,后解释两个步骤,
由 Java 编写的程序需要先经过编译步骤,生成字节码(*.class 文件),这种字节码必须由 Java 解释器来解释执行。
因此,我们可以认为 Java 语言编译与解释并存。

Java是编译型语言,还是解释型语言,见仁见智( 墙头草 )

这个比””观点更随意 ,

说了这么多,让我们回头看一下java到底是编译型的还是解释型的。
首先,java需要编译,解释型语言不需要编译,然而java编译的结果又不是和其他编译型语言一样的二进制文件,而是class文件。
从这一点上来看,java介于二者中间;java编译完成以后,操作系统不能直接运行,而是需要java虚拟机解释执行class字节码文件。
因此虚拟机将字节码程序与操作系统及硬件分开,使得java程序能在异构平台上执行,从这一点上来看,java又属于解释型语言。
如果严格来说,java确实属于半编译半解释型语言,如果只从最后的执行步骤来看,java属于解释型语言。
至于它到底属于什么类型的语言,还是仁者见仁智者见智的。

编程语言描述为”编译型”或者”解释性”本来就是伪命题

很多资料会说,Python、Ruby、JavaScript都是”解释型语言”,是通过解释器来实现的。
这么说其实很容易引起误解:语言一般只会定义其抽象语义,而不会强制性要求采用某种实现方式。
例如说C一般被认为是”编译型语言”,但C的解释器也是存在的,例如Ch。同样,C++也有解释器版本的实现,例如Cint。
一般被称为”解释型语言”的是主流实现为解释器的语言,但并不是说它就无法编译。
例如说经常被认为是”解释型语言”的Scheme就有好几种编译器实现,其中率先支持R6RS规范的大部分内容的是Ikarus,支持在x86上编译Scheme;
它最终不是生成某种虚拟机的字节码,而是直接生成x86机器码。

解释器就是个黑箱,输入是源码,输出就是输入程序的执行结果,对用户来说中间没有独立的”编译”步骤。
这非常抽象,内部是怎么实现的都没关系,只要能实现语义就行。
你可以写一个C语言的解释器,里面只是先用普通的C编译器把源码编译为in-memory image,然后直接调用那个image去得到运行结果;
用户拿过去,发现直接输入源码可以得到源程序对应的运行结果就满足需求了,无需在意解释器这个”黑箱子”里到底是什么。
实际上很多解释器内部是以”编译器+虚拟机”的方式来实现的,先通过编译器将源码转换为AST或者字节码,然后由虚拟机去完成实际的执行。
所谓”解释型语言”并不是不用编译,而只是不需要用户显式去使用编译器得到可执行代码而已。

什么是编译型语言和解释型语言:
编译型语言(compiled language)指通过编译器(compiler)将源代码编译为机器码(machine code)后运行的语言,例如C、C++;
解释型语言(interpreted language)指由解释器(interpreter)直接执行,不需要编译成机器语言,例如 PHP、JavaScript。

编译型语言和解释型语言的优点和缺点:
由于解释型语言会在运行时翻译源代码,一般情况下运行速度不如编译型语言;
解释型语言由解释器运行,而不是直接运行在操作系统上,所以一般有较强的跨平台能力。

Java 是编译型语言还是解释型语言:
为了兼顾跨平台和运行速度,Java 源代码首先会被编译为字节码文件(.class),但并非是机器语言,而是需要在 JVM 上运行,而 .class 文件在 JVM 上是解释执行的。
所以 Java 兼具编译型语言和解释型语言的特点。为了更高的效率,JVM 还引入了 JIT(just-in-time,即时编译)编译器,在 Java 程序运行时进一步编译,转换成高度优化的机器代码。
现在的很多语言以及不能以编译型语言和解释型语言来区分了,因为很多语言都兼具编译型语言和解释型语言的特点。

作者:叉叉哥
链接:https://www.zhihu.com/people/wucao
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

伪命题
“Python是解释型语言,因为Python通常是解释执行的”
“C是编译型语言,因为C是编译执行的”
“Java是解释型语言,因为Java是有JVM解释执行的”

举个栗子 –> 如果我们把”让计算机执行一段代码”类比为”让不懂中文的外国厨师做一道菜”
解释方式执行一段代码,就好比是,你每次让一个英国厨师做一道水煮鱼,
就得先把中文菜谱里的第一步概念给翻译听,然后翻译再把这一步骤翻译成英文念给厨师听,
等英国厨师把这第一个步骤做完,你再把第二个步骤念给翻译听,
这里的翻译者就相当指导计算机执行代码的解释器.

编译方式执行 一段代码,就好比是,你预先把整个菜谱都交给翻译,
让他写出一份完整的英文菜谱,
这样你每次让英国厨师做水煮鱼的时候,就直接把英文菜谱给他.

他就可以照着英文菜谱很快的做出来了,
这里的翻译者就相当于编译器.

结果你就会发现,同样一个菜谱(一段代码),既可以解释执行,也可以编译执行.

所以将语言区分为解释型还是编译型,就好像有人说”宫保鸡丁是一道解释型的菜,回锅肉是一道编译型的菜”
因此”某个语言是编译型或者解释型”就是一个伪命题

更准确的说法是,某个语言的特定实现,是编译型或者解释型的.

比如JavaScript,既有解释型的实现,90年代初的浏览器Netscape Navigator里的JS引擎,
也有编译型的实现,Chrome浏览器里的V8引擎.

再举一个栗子,Chicken Scheme为Scheme这门语言提供了两套实现,
一个是解释器csi,一个是编译器csc.

很多时候,当一个团队在设计一门新语言时,
往往会为它开发一个解释器,用来测试这个语言.

如果哪天该团队或者公司想把这门语言推广到工业界,
就很可能为这个语言开发一个编译器,让这个语言的程序能更有效的执行.

总结 : 所谓的编译型,解释型并不是一门编程语言的特性,
而只是{语言实现}的特性.

作者:SchelleyYuki
链接:https://www.zhihu.com/people/schelley
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

总结

我还是比较喜欢”咬文嚼字” ,
观点上我站{ 编程语言描述为”编译型”或者”解释性”本来就是伪命题 }..

其实总结这些知识,也是在DDD,只不过业务是技术本身而已 .
主要还是要区分好哪些属性应该在哪些类里 , 分清限界上下文 .

摘抄文档

Original: https://www.cnblogs.com/love-zf/p/15677688.html
Author: zh89233
Title: Java是编译性语言还是解释型语言 ?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/538451/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球