困惑数年的问题,Python到底是语言,还是工具,哈佛教授完美诠释
<div style="color: black; text-align: left; margin-bottom: 10px;">
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/pgc-image/1533215135264dc335207b3~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1723888536&x-signature=VvFpSW8llAhIrVRtokIPq80GnmQ%3D" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Python是出类拔萃的</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">然而,这是一句非常模棱两可的话。<span style="color: black;">这儿</span>的"Python"到底指的是什么? 是Python的抽象接口吗?是Python的通用实现CPython吗(不要把CPython跟Cython搞混了)?<span style="color: black;">也</span><span style="color: black;">或</span>指的完全是其他的东西呢?可能我<span style="color: black;">另一</span>指的是Jython,<span style="color: black;">或</span>IronPython,<span style="color: black;">或</span>是PyPy。<span style="color: black;">亦</span><span style="color: black;">或</span>转而谈论的又是RPython<span style="color: black;">或</span>RubyPython(这两者是完全<span style="color: black;">区别</span>的东西)。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">上面<span style="color: black;">说到</span>的<span style="color: black;">哪些</span>技术经常被提起和引用, 它们的<span style="color: black;">运用</span>目的和场景是完全不<span style="color: black;">同样</span>的(<span style="color: black;">最少</span>,它们的操作方式是完全不<span style="color: black;">同样</span>的)</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">自从我<span style="color: black;">运用</span>Python工作<span style="color: black;">败兴</span>,我<span style="color: black;">已然</span>用过了<span style="color: black;">各样</span>各样的.*ython工具了。<span style="color: black;">然则</span>直到<span style="color: black;">近期</span>我才花时间去理解到底它们是干嘛的,它们是<span style="color: black;">怎么样</span>工作的,<span style="color: black;">为何</span>它们是不可或缺的。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">在这篇<span style="color: black;">文案</span>里面,我会介绍<span style="color: black;">各样</span>Python的实现,最后以对PyPy的介绍结尾, <span style="color: black;">由于</span>我个人认为它是Python的<span style="color: black;">将来</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">所有的都从理解什么是"Python"<span style="color: black;">起始</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">倘若</span>你对<span style="color: black;">设备</span>码,虚拟机之类的很熟了,你<span style="color: black;">能够</span>跳过开头,直接从 "即时编译: PyPy和它的<span style="color: black;">将来</span>" 这部分<span style="color: black;">起始</span>看起。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Python是解释型的还是编译型的?</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">这是个Python新人都会迷惑的问题。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">首要</span><span style="color: black;">必须</span>明了的是Python只是一个接口。有一个关于Python应该做什么以及怎么做的<span style="color: black;">详细</span>说明(就像其他任何接口<span style="color: black;">同样</span> ),并且对应的有<span style="color: black;">非常多</span><span style="color: black;">详细</span>的实现(<span style="color: black;">亦</span>像其他接口<span style="color: black;">同样</span>)。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">其次<span style="color: black;">必须</span><span style="color: black;">晓得</span>的是“解释型”和“编译型”是<span style="color: black;">详细</span>实现的特性,而不是接口的特性。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">因此</span>,这个问题本身就<span style="color: black;">无</span>组织好。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">Python是解释型还是编译型的?这个问题真的<span style="color: black;">无</span>组织好。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">对<span style="color: black;">运用</span>最广泛的实现(CPython:用C实现的,<span style="color: black;">一般</span>简单的说成Python,若你不<span style="color: black;">晓得</span>我所说的这些,那很肯能你在<span style="color: black;">运用</span>的<span style="color: black;">便是</span>CPython)而言,这个问题的答案是:解释型,但带有<span style="color: black;">有些</span>编译型特征。CPython把Python源码编译*成字节码,之后再解释这些字节码,执行之。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">*<span style="color: black;">重视</span>:这个编译不是<span style="color: black;">一般</span><span style="color: black;">道理</span>上的编译。<span style="color: black;">一般</span><span style="color: black;">咱们</span>说的编译,<span style="color: black;">指的是</span>把高级语言代码转换成<span style="color: black;">设备</span>码。但<span style="color: black;">这儿</span>的编译<span style="color: black;">实质</span>上是另一种<span style="color: black;">道理</span>上的编译。(译者,这句话不是很懂,原文是it is a ‘compilation’ of sorts,不知作何解,求教各位读者。)</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">再<span style="color: black;">仔细</span>看下上面的答案吧,这有助于<span style="color: black;">咱们</span>理解本文中后面会讲到的几个概念。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">字节码 vs. <span style="color: black;">设备</span>码</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">认识</span>字节码和<span style="color: black;">设备</span>码(<span style="color: black;">或</span>native code)的区别是很重要的,最好的办法或许是<span style="color: black;">瞧瞧</span>例子:</p>C代码被编译成<span style="color: black;">设备</span>码,将在处理器上直接执行。每一条指令<span style="color: black;">掌控</span>CPU工作。Java代码被编译成字节码,将在Java虚拟机(JVM)这个抽象的计算机上执行。每一条指令由JVM处理,JVM同计算机本身之间交互。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">简而言之:<strong style="color: blue;"><span style="color: black;">设备</span>码快的多,但字节码更易迁移,<span style="color: black;">亦</span>更安全。</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">设备</span>码随<span style="color: black;">设备</span>的变化而变化,但字节码在所有的<span style="color: black;">设备</span>上都是<span style="color: black;">同样</span>的。有人可能会认为<span style="color: black;">设备</span>码是对特定环境优化了的。</p>回到CPython,工具链的执行过程如下:CPython编译你的Python源代码,生成字节码。<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">字节码随后在CPython虚拟机上执行。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">初学者常常<span style="color: black;">由于</span>看到.pyc文件而假设Python是编译型的。这<span style="color: black;">亦</span>有<span style="color: black;">有些</span><span style="color: black;">恰当</span>性:.pyc文件正式之后要解释的字节码文件。<span style="color: black;">因此</span>,你若之前运行过你的Python代码,生<span style="color: black;">成为了</span>.pyc文件,再次运行时就要快得多,<span style="color: black;">由于</span>不<span style="color: black;">必须</span>再次编译生成字节码了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">可选的虚拟机:Jython,IronPython等</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">正如我之前所述,Python有<span style="color: black;">非常多</span>实现。前面<span style="color: black;">亦</span><span style="color: black;">说到</span>,CPython是最通用的。这是一个用C实现的,被认为是”默认“的实现。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">但其他的呢?其中最显赫的之一<span style="color: black;">便是</span>Jython,一个用Java实现的采用了JVM的实现。CPython生成在CPython虚拟机上运行的字节码,而Jython生成在JVM上运行的java字节码(这同编译Java程序生成java字节码的过程是<span style="color: black;">同样</span>的)。</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/pgc-image/15332133055969902e16082~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1723888536&x-signature=aEUIx2DFGxoNwLr3gEMgSHdxstQ%3D" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">”为啥你要用其他的实现?”,你可能会如此发问。好吧,对<span style="color: black;">研发</span>者而言,<span style="color: black;">区别</span>的实现对<span style="color: black;">区别</span>的技术<span style="color: black;">困难</span>的支持程度不<span style="color: black;">同样</span>。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">CPython</strong>中很容易为你的Python代码写C扩展,<span style="color: black;">由于</span><span style="color: black;">最后</span>都<span style="color: black;">是由于</span>C解释器执行的。另一方面,Jython则使得和其他java程序<span style="color: black;">一起</span>工作很容易:无需其他工作,你就可导入任何Java类,在你的Jython程序中<span style="color: black;">运用</span>其他Java类。(题外话,若你<span style="color: black;">无</span>认真思考,这一段会很难。此时<span style="color: black;">咱们</span><span style="color: black;">已然</span>在讨论把不同语言的代码混在<span style="color: black;">一块</span>,并编译成同一程序。(Rostin 提出混合Fortran和C代码编程<span style="color: black;">已然</span>有一段时间了。<span style="color: black;">因此</span>,这并不<span style="color: black;">鲜嫩</span>,但仍然很酷。))</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">下面是一个例子,一段合法的Jython代码:</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"> on java1.6.0_51</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">>>> from java.util import HashSet</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">>>> s = HashSet(5)</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">>>> s.add("Foo")</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">>>> s.add("Bar")</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">>>> s</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">IronPython是另一很流行的Python 实现,完全用C#实现,针对.NET平台。她运行在<span style="color: black;">能够</span>叫做.NET虚拟机的平台上,这是微软的 Common Language Runtime (CLR),同JVM相对应。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">你可能会说,Jython:Java::IronPython:C#。它们各自运行在相同的虚拟机上,你能从你的IronPython中导入C#的类,从你写的Jython代码中带入Java类,等等</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">你完全<span style="color: black;">能够</span><span style="color: black;">不消</span>任何非CPython的实现就能完成你手上的任何工作。<span style="color: black;">然则</span><span style="color: black;">运用</span>这些技术<span style="color: black;">亦</span>是有<span style="color: black;">非常多</span>的好处的,大部分取决于你<span style="color: black;">此刻</span>所<span style="color: black;">运用</span>的技术栈。 你<span style="color: black;">运用</span>了<span style="color: black;">非常多</span>基于JVM的语言?Jython<span style="color: black;">便是</span>为你准备的。<span style="color: black;">运用</span>的都是.NET世界的语言?<span style="color: black;">那样</span>你应该试试IronPython了(或许你<span style="color: black;">已然</span>在用了)</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/pgc-image/15332133054779ac6a0b86e~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1723888536&x-signature=y5OnRWhiBYwbt5TQuIYreZrap30%3D" style="width: 50%; margin-bottom: 20px;"></div>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">顺便说一下(尽管这不是<span style="color: black;">运用</span><span style="color: black;">区别</span>的实现的理由),<span style="color: black;">重视</span>Python的<span style="color: black;">各样</span>实<span style="color: black;">此刻</span>对待你的Python源码的时候所做的处理方式是完全不<span style="color: black;">同样</span>的。<span style="color: black;">而后</span>这些差异是很小的,<span style="color: black;">因为</span>这些实现都在<span style="color: black;">一直</span>的发展改进中,随着时间的推移,这些差异会慢慢融合和兼容。<span style="color: black;">例如</span>,IronPython默认<span style="color: black;">状况</span>下<span style="color: black;">运用</span>Unicode字符串,<span style="color: black;">然则</span>在2.x版本的CPython中默认是ASCII字符串(<span style="color: black;">倘若</span><span style="color: black;">运用</span>了非ASCII字符串,会抛出一个UnicodeEncodeError错误),<span style="color: black;">然则</span>在3.x版本里面CPythong<span style="color: black;">已然</span>默认支持Unicode字符串了。</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">即时编译: PyPy和它的<span style="color: black;">将来</span></strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">咱们</span><span style="color: black;">已然</span>有了一个<span style="color: black;">运用</span>C写的Python实现,一个用Java写的,一个用C#写的。接下来<span style="color: black;">便是</span>:用Python写的Python实现(有心人可能会<span style="color: black;">重视</span>这句话有点问题,是个死循环,^_^)</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">接下来<span style="color: black;">咱们</span>看下什么<span style="color: black;">地区</span>容易搞混淆。<span style="color: black;">首要</span>,<span style="color: black;">咱们</span>讨论下即时编译器JIT</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><strong style="color: blue;">JIT: <span style="color: black;">为何</span>会有这个?它的原理是什么?</strong></p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">大众</span>都<span style="color: black;">晓得</span>本地<span style="color: black;">设备</span>码的速度比字节码的速度快<span style="color: black;">非常多</span>。<span style="color: black;">那样</span>,<span style="color: black;">倘若</span><span style="color: black;">咱们</span>能将<span style="color: black;">有些</span>字节码直接编译成本地<span style="color: black;">设备</span>码再去运行它会<span style="color: black;">怎么样</span>呢?<span style="color: black;">咱们</span><span style="color: black;">必要</span>花费<span style="color: black;">有些</span>代价(<span style="color: black;">例如</span>时间)在编译字节码到本地<span style="color: black;">设备</span>码上,<span style="color: black;">倘若</span><span style="color: black;">最后</span>的运行时间更快,<span style="color: black;">那样</span>这个代价<span style="color: black;">便是</span>值得的。这<span style="color: black;">便是</span>JIT编译器的动机,一种混合<span style="color: black;">认识</span>释器和编译器好处的技术。简单来讲,JIT<span style="color: black;">便是</span>想<span style="color: black;">经过</span>编译技术<span style="color: black;">提高</span>脚本解释器系统的速度</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;"><span style="color: black;">爱好</span>这篇<span style="color: black;">文案</span>的话,转发+评论哦!让<span style="color: black;">大众</span><span style="color: black;">瞧瞧</span>你独特的见解哦!</p>
<p style="font-size: 16px; color: black; line-height: 40px; text-align: left; margin-bottom: 15px;">好了给<span style="color: black;">大众</span>送上这一篇文的福利 私信“01”<span style="color: black;">就可</span>获取哦!</p>
<div style="color: black; text-align: left; margin-bottom: 10px;"><img src="https://p3-sign.toutiaoimg.com/pgc-image/1533213868260e78d2b2e2f~noop.image?_iz=58558&from=article.pc_detail&lk3s=953192f4&x-expires=1723888536&x-signature=IYspdcWyquq1trF%2Fk6oKW0DP%2FIo%3D" style="width: 50%; margin-bottom: 20px;"></div>
</div>
你的见解独到,让我受益匪浅,期待更多交流。 你的话语真是温暖如春,让我心生感激。 这篇文章真的让我受益匪浅,外链发布感谢分享! 你的见解真是独到,让我受益良多。 你的努力一定会被看见,相信自己,加油。 说得好啊!我在外链论坛打滚这么多年,所谓阅人无数,就算没有见过猪走路,也总明白猪肉是啥味道的。
页:
[1]