python源码只有编译成二进制代码才能执行_Java和Python都需要把代码编译成字节码,为什么Python算解释型语言而Java不算呢?...

看了那么多回答,讨论判断语言是编译型还是解释型,来谈一谈这个问题。

1,很多语言一般在非运行阶段(build阶段),必须有个“编译”到中间语言的过程(这个编译是广义的),然后由中间语言继续在build阶段转为机器码,或者在运行时执行中间语言。

需要在build阶段直接转为机器码的,比如c++,它的中间语言是汇编。

另外一种c#, java的中间语言是一种称为字节码的由虚拟机可以认识的语言,中间语言既可以在build阶段转为机器码,也可以由虚拟机在运行时解释执行。当然还有种方式jit,相当于运行时编译+解释混合模式。

2,还有一类语言可以在运行时直接解释执行。当然他可能也可以在build阶段转换为中间代码,或机器码,然后运行阶段解释或直接执行

比如python

文字往往是无力的,含糊的,公式才是王道。可以分a, b, c三种转换过程,其中每个过程是封闭的,对外透明不可拆分。

a: 源码到中间代码

b: 中间代码到机器码(b又可以分为b1: 中间代码编译为机器码执行; b2: 中间代码解释执行。一般是独立b2模式,或b1,b2混合模式,即jit)

c: 源码到机器码(或者通过中间代码中转)

然后分两种代码阶段 α, β。

α: build阶段

β: 运行阶段

然后,语言一般可以分为以下几类,(0代表什么都不做),并且在后面写上了解释执行还是编译执行的判定:

αc-β0 纯编译执行 C++

ac-β0 | α0-βc | αa-βb 纯编译执行 | 纯解释执行 | 编译-解释执行 python

ac-β0 | αa-βb 纯编译执行 | 编译-解释执行 Java C#

这个判定是我自己定的,先说理由。纯编译执行,纯解释执行那两个应该没有疑问。每个都有纯编译这个模式,这个也没啥好探讨的。而“编译-解释执行”这里,就是最重要的点,值得广大友人深究。

★★★核心观点:如果考虑广义含义的“编译”(即:源码到中间代码的“编译”是真正意义的编译),那么这个语言就是一种“编译-解释混合型”语言,而称为“编译型”语言是不严谨的,毕竟解释那个过程明摆着放在那里,以科学严谨的态度对待,这样说才比较合理。如果考虑狭义含义的“编译”,即将源码转为平台相关的代码(机器码),不需要再进行运行时代码转换的build方式,那么这个语言应该称为“解释型”语言。

★★★核心结论:对一个语言的性质判断,往往不是单一性质,需要根据实际情况下所使用具体模式来下定义,比如上述一个语言同时具备αc-β0, α0-βc, αa-βb三种模式,那这语言就具备三种性质:纯编译执行,纯解释执行,编译-解释执行。如果还要区分广义狭义的“编译”,那么就可以继续确定到底是编译-解释执行还是解释运行,而不能一拍脑袋认为是编译执行或者解释执行。

我个人觉得狭义含义的编译是传统上的理解,更接近理解习惯。把Java, C#语言称为编译型,实在是任性了,又要强调其编译的一等性,又要忽略其解释性。

有些人可能会认为,没必要考虑什么狭义编译,也没必要考虑把编译和解释放在同等地位,有编译就算编译。我觉得那也只是一种执念罢了,毕竟源码翻译为对外透明的仅语言层面的虚拟机可识别的中间代码,实际怎么做还要看具体机器、具体处理器架构,还要多一步虚拟机转换的,这要是称为“编译”的话,实在是硬要把传统习惯往时代浪潮上摩擦,搞一套强混淆强“多样性”的潮流啊。

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 1024 设计师:白松林 返回首页