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

转一个自己很久之间写过的文章(此博客已弃):计算机语言的分类_li_xunhuan的博客-CSDN博客_计算机语言分类​blog.csdn.netv2-3d6f0b0cdd7632882b0ca6d20143ea66_ipico.jpg

计算机语言的分类

到目前为止,我自己学过或者说碰过的语言有 C、Java、JavaScript、Python、Go。最近在学的是 Go,看到 Go meta描述是:静态、编译型。但是突然发现自己对于编译型的理解就是:该种语言若要执行,则需要从源码转换为二进制,而语言的静态和动态却摸不着头脑。看来自己基础不牢,需要总结了。

语言大致可以按一下分类:编译型、解释型、混合型;

动态类型语言、静态类型语言;

强类型、弱类型;

实际上,上述分类并不能说具有绝对的科学性。

一、编译、解释、混合型

定义编译型:需通过编译器(compiler)将源代码编译成机器码,然后链接为可执行文件。编译的工作流程大致为:源代码 → 词法分析 → 语法分析 → 语义分析 → 目标代码(编译) → 链接 → 可执行文件,其中:编译:把源代码编译成机器码;链接:把各个模块的机器码和依赖库串连起来生成可执行文件;

解释型:解释性语言的程序不需要编译,相比编译型语言省了道工序,解释性语言在运行程序的时候才逐行翻译。

混合型:编译器将源码编译成中间码而不再是二进制机器码,然后中间码需要被即时编译器翻译成目标平台的本地代码;

分类编译型语言:C、C++、Object-C、swift、Java;

解释型语言:JavaScript、Python、PHP;

混合型语言:C#;

局限性

这种方式的分类是被认为是不科学的,因为很多语言既可以认为是解释型、也可以认为是编译型,这种分类方式被指出是不科学的,见于:[RednaxelaFX](RednaxelaFX)在 https://www.iteye.com/blog/rednaxelafx-492667 中提到的:我是倾向于避开把编程语言描述为“编译型”或者“解释性”的。

详细地,下面以 Java 和 Python 为例子来解释这个问题。

Java 是这样从源码到被执行的(大致地~):

Java 源代码 -> javac 将其转为字节码(二进制码)->虚拟机中执行。

Java 按这种分类方式难以分类的原因就如上所示,首先编译其次在虚拟机中解释执行。为何说后者是解释?因为传统上我们认为从字节码到对应平台的机器码需要不同平台上的 JVM 提供支持,我们认为这个动作就是解释。

这样一来 Java 就难以按照这个分类方式进行分类了。实际上,我还是倾向于将 Java 称之为编译型语言,因为完全可以将 JVM 看做底层实现。这里粗粒度不宜过细,因为本质上说机器码被 CPU 接收然后运行,其中也涉及一段解释的过程。如此一来,世上只有解释型语言。

Python 虽然被普遍认为一门解释型语言,按理说应当不涉及编译过程。事实上,Python 解释器会将源代码转换为字节码,然后再由 Python 解释器来执行这些字节码。本质上,Python 解释器不就是完成了编译器+执行器这个模块的任务,既然含有编译过程,那么其被称为解释型语言就具有一定不合理性。

R 大所认为的:语言一般只会定义其抽象语义,而不会强制性要求采用某种实现方式。而编译、解释只是实现方式的一个步骤或者方式,按这种分类是不合理的。

二、动态类型、静态类型

定义

这种分类方式关注点是类型确定的时机,以运行开始为分类的时间节点。动态类型语言(Dynamic Typing):含义是类型只有在程序运行期间才能确定;

静态类型语言(Static Typing):在程序运行前类型已知且会进行类型安全检查。这一步通常被语言解释器完成。

分类动态类型语言:Python、Ruby、JavaScript;

静态类型语言:C、C++、C#、Java、Go;

以 Python 为例来说明动态类型语言所具备的特性:

# coding: utf-8

def sum(a, b):

return a + b;

print sum(1,2);

print sum("Hello ", "Word")

运行结果自然是:

> 3

> Hello Word

三、强类型、弱类型

定义

学术层面上对此分类方式有争议,不过粗浅地可以认为是如下这般:强类型:偏向于不容忍隐式类型转换。譬如说haskell的int就不能变成double;

弱类型:偏向于容忍隐式类型转换。譬如说C语言的int可以变成double;

分类强类型:Java、Python、Go;

弱类型:Javascript、C、C++;

实际上,如果不搞编程界的学术,不必执拗于一本编程语法书上告知你的该语言属于何种类型,如果你遍历地学习了某种语言,实际上已经知道语言具有那种语法特性。分类只是为了更好的抽象,而你已经掌握了具体,况且学术界对这类抽象没有准确的定义。

一个经典的编程语言动静态类型、强弱分类图如下:图片来源于(曾用)个人博客

修改说明:知乎竟然还不适配 MD.QAQ~

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