外链论坛

 找回密码
 立即注册
搜索
查看: 66|回复: 4

困惑数年的问题,Python到底是语言,还是工具,哈佛教授完美诠释

[复制链接]

2621

主题

148

回帖

9912万

积分

论坛元老

Rank: 8Rank: 8

积分
99120731
发表于 2024-8-17 08:00:44 | 显示全部楼层 |阅读模式

Python是出类拔萃的

然而,这是一句非常模棱两可的话。这儿的"Python"到底指的是什么? 是Python的抽象接口吗?是Python的通用实现CPython吗(不要把CPython跟Cython搞混了)?指的完全是其他的东西呢?可能我另一指的是Jython,IronPython,是PyPy。转而谈论的又是RPythonRubyPython(这两者是完全区别的东西)。

上面说到哪些技术经常被提起和引用, 它们的运用目的和场景是完全不同样的(最少,它们的操作方式是完全不同样的)

自从我运用Python工作败兴,我已然用过了各样各样的.*ython工具了。然则直到近期我才花时间去理解到底它们是干嘛的,它们是怎么样工作的,为何它们是不可或缺的。

在这篇文案里面,我会介绍各样Python的实现,最后以对PyPy的介绍结尾, 由于我个人认为它是Python的将来

所有的都从理解什么是"Python"起始

倘若你对设备码,虚拟机之类的很熟了,你能够跳过开头,直接从 "即时编译: PyPy和它的将来" 这部分起始看起。

Python是解释型的还是编译型的?

这是个Python新人都会迷惑的问题。

首要必须明了的是Python只是一个接口。有一个关于Python应该做什么以及怎么做的详细说明(就像其他任何接口同样 ),并且对应的有非常多详细的实现(像其他接口同样)。

其次必须晓得的是“解释型”和“编译型”是详细实现的特性,而不是接口的特性。

因此,这个问题本身就组织好。

Python是解释型还是编译型的?这个问题真的组织好。

运用最广泛的实现(CPython:用C实现的,一般简单的说成Python,若你不晓得我所说的这些,那很肯能你在运用便是CPython)而言,这个问题的答案是:解释型,但带有有些编译型特征。CPython把Python源码编译*成字节码,之后再解释这些字节码,执行之。

*重视:这个编译不是一般道理上的编译。一般咱们说的编译,指的是把高级语言代码转换成设备码。但这儿的编译实质上是另一种道理上的编译。(译者,这句话不是很懂,原文是it is a ‘compilation’ of sorts,不知作何解,求教各位读者。)

仔细看下上面的答案吧,这有助于咱们理解本文中后面会讲到的几个概念。

字节码 vs. 设备

认识字节码和设备码(native code)的区别是很重要的,最好的办法或许是瞧瞧例子:

C代码被编译成设备码,将在处理器上直接执行。每一条指令掌控CPU工作。Java代码被编译成字节码,将在Java虚拟机(JVM)这个抽象的计算机上执行。每一条指令由JVM处理,JVM同计算机本身之间交互。

简而言之:设备码快的多,但字节码更易迁移,更安全。

设备码随设备的变化而变化,但字节码在所有的设备上都是同样的。有人可能会认为设备码是对特定环境优化了的。

回到CPython,工具链的执行过程如下:CPython编译你的Python源代码,生成字节码。

字节码随后在CPython虚拟机上执行。

初学者常常由于看到.pyc文件而假设Python是编译型的。这有些恰当性:.pyc文件正式之后要解释的字节码文件。因此,你若之前运行过你的Python代码,生成为了.pyc文件,再次运行时就要快得多,由于必须再次编译生成字节码了。

可选的虚拟机:Jython,IronPython等

正如我之前所述,Python有非常多实现。前面说到,CPython是最通用的。这是一个用C实现的,被认为是”默认“的实现。

但其他的呢?其中最显赫的之一便是Jython,一个用Java实现的采用了JVM的实现。CPython生成在CPython虚拟机上运行的字节码,而Jython生成在JVM上运行的java字节码(这同编译Java程序生成java字节码的过程是同样的)。

”为啥你要用其他的实现?”,你可能会如此发问。好吧,对研发者而言,区别的实现对区别的技术困难的支持程度不同样

CPython中很容易为你的Python代码写C扩展,由于最后是由于C解释器执行的。另一方面,Jython则使得和其他java程序一起工作很容易:无需其他工作,你就可导入任何Java类,在你的Jython程序中运用其他Java类。(题外话,若你认真思考,这一段会很难。此时咱们已然在讨论把不同语言的代码混在一块,并编译成同一程序。(Rostin 提出混合Fortran和C代码编程已然有一段时间了。因此,这并不鲜嫩,但仍然很酷。))

下面是一个例子,一段合法的Jython代码:

[Java HotSpot(TM) 64-Bit Server VM (Apple Inc.)] on java1.6.0_51

>>> from java.util import HashSet

>>> s = HashSet(5)

>>> s.add("Foo")

>>> s.add("Bar")

>>> s

[Foo, Bar]

IronPython是另一很流行的Python 实现,完全用C#实现,针对.NET平台。她运行在能够叫做.NET虚拟机的平台上,这是微软的 Common Language Runtime (CLR),同JVM相对应。

你可能会说,Jython:Java::IronPython:C#。它们各自运行在相同的虚拟机上,你能从你的IronPython中导入C#的类,从你写的Jython代码中带入Java类,等等

你完全能够不消任何非CPython的实现就能完成你手上的任何工作。然则运用这些技术是有非常多的好处的,大部分取决于你此刻运用的技术栈。 你运用非常多基于JVM的语言?Jython便是为你准备的。运用的都是.NET世界的语言?那样你应该试试IronPython了(或许你已然在用了)

顺便说一下(尽管这不是运用区别的实现的理由),重视Python的各样此刻对待你的Python源码的时候所做的处理方式是完全不同样的。而后这些差异是很小的,因为这些实现都在一直的发展改进中,随着时间的推移,这些差异会慢慢融合和兼容。例如,IronPython默认状况运用Unicode字符串,然则在2.x版本的CPython中默认是ASCII字符串(倘若运用了非ASCII字符串,会抛出一个UnicodeEncodeError错误),然则在3.x版本里面CPythong已然默认支持Unicode字符串了。

即时编译: PyPy和它的将来

咱们已然有了一个运用C写的Python实现,一个用Java写的,一个用C#写的。接下来便是:用Python写的Python实现(有心人可能会重视这句话有点问题,是个死循环,^_^)

接下来咱们看下什么地区容易搞混淆。首要咱们讨论下即时编译器JIT

JIT: 为何会有这个?它的原理是什么?

大众晓得本地设备码的速度比字节码的速度快非常多那样倘若咱们能将有些字节码直接编译成本地设备码再去运行它会怎么样呢?咱们必要花费有些代价(例如时间)在编译字节码到本地设备码上,倘若最后的运行时间更快,那样这个代价便是值得的。这便是JIT编译器的动机,一种混合认识释器和编译器好处的技术。简单来讲,JIT便是经过编译技术提高脚本解释器系统的速度

爱好这篇文案的话,转发+评论哦!让大众瞧瞧你独特的见解哦!

好了给大众送上这一篇文的福利 私信“01”就可获取哦!

回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-26 04:08:17 | 显示全部楼层
你的见解独到,让我受益匪浅,期待更多交流。
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-8-26 13:13:48 | 显示全部楼层
你的话语真是温暖如春,让我心生感激。
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-5 03:35:48 | 显示全部楼层
这篇文章真的让我受益匪浅,外链发布感谢分享!
回复

使用道具 举报

0

主题

1万

回帖

1

积分

新手上路

Rank: 1

积分
1
发表于 2024-9-9 01:52:48 | 显示全部楼层
你的见解真是独到,让我受益良多。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

站点统计|Archiver|手机版|小黑屋|外链论坛 ( 非经营性网站 )|网站地图

GMT+8, 2024-10-4 03:22 , Processed in 0.069577 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.