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)
作者:温悦
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
如上图,从上⾄下分别是编译型语⾔,解释型语⾔,Java的执⾏模型。
看上去陷⼊了⼀个困境,Java到底是编译型语⾔呢,还是解释型语⾔呢?
⼀种朴素的判定⽅式:如果翻译器部分较为简单,我们说这个语⾔是“解释的”,反之如果翻译器部分很复杂,我们就说这个语⾔是“编译的”。
事实上这两者之间的界限是模糊的,因为“简单”和“复杂”都具有主观性。
“解释型”和“编译型”并不是⼀个清晰的描述。故强⾏将某种具有混合形式的语⾔划⼊两者之⼀是不当的。
但实践中肯定还是有进⾏分类的需求的,所以这⾥有⼀条启发性原则⽤以判断语⾔的类型:
如果翻译器对程序进⾏了彻底的分析⽽⾮某种机械的变换,⽽且⽣成的中间程序与源程序之间没有很强的相似性,我们就认为这个语⾔是编译的。
彻底的分析和⾮平凡的变换,是编译⽅式的标志性特征。
因此,Java应当被认作⼀种编译型语⾔。
—
—《PLP》1.4 Compilation and Interpretation
发布于 2014-12-09 18:30
作者:冯若航
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
Java是解释型语⾔
个⼈认为,java是解释型的语⾔,因为虽然java也需要编译,编译成.class⽂件,
但是并不是机器可以识别的语⾔,⽽是字节码,最终还是需要 jvm的解释,才能在各个平台执⾏,这同时也是java跨平台的原因。
所以可是说java即是编译型的,也是解释型,但是假如⾮要归类的话,从概念上的定义,恐怕java应该归到解释型的语⾔中。
附:
编译型的语⾔包括:C、C++、Delphi、Pascal、Fortran
解释型的语⾔包括:Java、Basic、javascript
Java既是编译型语⾔ , ⼜是解释型语⾔
由Java的代码执⾏过程可知,⼀个Java 代码的执⾏过程是由 . Java-->. class-->对应平台机器码 ;
. Java-->. class是由 Javac 编译,这个过程符合编译型语⾔的特点(⼀次性编译,注意并未编译为实际平台的机器码,)
java python是什么意思⽽. 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 程序运⾏时进⼀步编译,转换成⾼度优化的机器代码。
现在的很多语⾔以及不能以编译型语⾔和解释型语⾔来区分了,因为很多语⾔都兼具编译型语⾔和解释型语⾔的特点。
作者:叉叉哥
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
伪命题
"Python是解释型语⾔,因为Python通常是解释执⾏的"
"C是编译型语⾔,因为C是编译执⾏的"
"Java是解释型语⾔,因为Java是有JVM解释执⾏的"
再举⼀个栗⼦,Chicken Scheme为Scheme这门语⾔提供了两套实现,
⼀个是解释器csi,⼀个是编译器csc.
很多时候,当⼀个团队在设计⼀门新语⾔时,
往往会为它开发⼀个解释器,⽤来测试这个语⾔.
如果哪天该团队或者公司想把这门语⾔推⼴到⼯业界,
就很可能为这个语⾔开发⼀个编译器,让这个语⾔的程序能更有效的执⾏.
总结 : 所谓的编译型,解释型并不是⼀门编程语⾔的特性,
⽽只是{语⾔实现}的特性.
作者:SchelleyYuki
链接:
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,⾮商业转载请注明出处。
总结
我还是⽐较喜欢"咬⽂嚼字" ,
观点上我站{ 编程语⾔描述为"编译型"或者"解释性"本来就是伪命题 }..
其实总结这些知识,也是在DDD,只不过业务是技术本⾝⽽已 .
主要还是要区分好哪些属性应该在哪些类⾥ , 分清限界上下⽂ .
摘抄⽂档
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论