Python 是解释型的还是编译型的,或者两者兼而有之?

2024-05-17

据我了解:

An 解释的语言是由解释器(将高级语言转换为机器代码然后执行的程序)实时运行和执行的高级语言;它一次处理一点程序。

A compiled语言是一种高级语言,其代码首先由编译器(将高级语言转换为机器代码的程序)转换为机器代码,然后由执行器(另一个运行代码的程序)执行。

如果我的定义有误,请纠正我。

现在回到Python,我对此有点困惑。无论你在哪里都知道Python是一种解释性语言,但它被解释为一些中间代码(如字节码或IL)并且not到机器代码。那么哪个程序执行 IM 代码呢?请帮助我了解 Python 脚本是如何处理和运行的。


首先,解释/编译不是语言的属性,而是实现的属性。对于大多数语言来说,大多数(如果不是全部)实现都属于一个类别,因此人们可能会节省几句话,说该语言也是解释/编译的,但这仍然是一个重要的区别,既因为它有助于理解,又因为有相当多的语言具有两种可用的实现(主要在函数式语言领域,请参阅 Haskell 和 ML)。此外,还有一些 C 解释器和项目尝试将 Python 的子集编译为 C 或 C++ 代码(随后编译为机器代码)。

其次,编译不限于提前编译为本机机器代码。更一般地说,编译器是一种将一种编程语言的程序转换为另一种编程语言的程序的程序(可以说,如果应用了重大转换,您甚至可以拥有具有相同输入和输出语言的编译器)。 JIT 编译器编译为本机机器代码在运行时,这可以提供非常接近甚至优于提前编译的速度(取决于基准和比较的实现的质量)。

但为了停止挑剔并回答你想问的问题:实际上(阅读:使用某种流行且成熟的实现),Python 是compiled。没有提前编译为机器代码(即“编译”受限制和错误,但可惜常见的定义),“仅”编译为bytecode http://en.wikipedia.org/wiki/Bytecode,但它仍然是至少具有一些好处的编译。例如,声明a = b.c()被编译为字节流,当“反汇编”时,看起来有点像load 0 (b); load_str 'c'; get_attr; call_function 0; store 1 (a)。这是一种简化,实际上可读性较差,而且级别较低 - 您可以尝试使用标准库dis module http://docs.python.org/library/dis.html看看真正的交易是什么样子的。解释这一点比解释更高级别的表示更快。

该字节码要么像参考实现 (CPython) 一样被解释(请注意,直接解释和首先编译为某种中间表示形式并解释它之间在理论上和实际性能上都存在差异),要么被解释并编译为在运行时优化机器代码,如PyPy http://pypy.org/.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python 是解释型的还是编译型的,或者两者兼而有之? 的相关文章

随机推荐

  • 在 Visual Basic 中将窗体放置在屏幕右下角

    当表单加载时 如何将表单定位在屏幕的右下角 我正在使用 Visual Basic 2010 Express Thanks 编辑 我这样做了 看起来效果很好 Dim x As Integer Dim y As Integer x Screen
  • 管理调试和发布连接字符串

    在 NET SQLServer 应用程序中管理调试和发布连接字符串的好方法是什么 我有两个 SQL Server 一个是生产服务器 一个是构建 调试服务器 我需要一种在部署 ASP NET 应用程序时在这两个服务器之间进行切换的方法 目前
  • 什么时候通过引用传递不是一个好主意?

    这是一个我从未真正理解的内存分配问题 void unleashMonkeyFish MonkeyFish monkey fish new MonkeyFish std string localname Wanda monkey fish g
  • window.onbeforeunload 在 Android Chrome 上不会触发 [alt.解决方案?]

    我开发了一个简单的聊天应用程序 我正在使用 window onbeforeunload当有人关闭选项卡 浏览器时 基本上是当用户离开房间时 通知其他用户 这是我的代码 scope onExit function scope chatstat
  • Freemarker没有分配staticUtil

    我在liferay 6 2上工作了应用程序显示模板 我使用freemarker帮助对liferay的动态数据列表进行分页 当我升级到liferay 7时 这是一个问题 Liferay 7使用代码 lt assign records ddlD
  • .NET Core MVC 中的可选模型属性绑定

    我已经创建了一个AccountModel它具有以下属性 public class AccountModel Required EmailAddress public string Email get set Required StringL
  • 限制可选 DOM 复选框

    我试图限制用户可以选择的复选框数量 这些复选框是为数组中的每个项目生成的 DOM 输入对象 我目前对此没有运气 因此非常感谢任何帮助 谢谢 在这里小提琴 http jsfiddle net vVxM2 222 http jsfiddle n
  • 如何加载页面特定的rails 4 js文件?

    我正在阅读资产管道的 Rails 指南文档 它指出 CoffeeScript 页面特定生成的文件 如果清单上有 require tree 指令 则默认情况下可供用户使用 这对我不起作用我必须包括这个 在特定控制器上 我缺少什么 资产管道会将
  • Spring Boot自动装配存储库始终为空[重复]

    这个问题在这里已经有答案了 每次我进入我的服务类时 存储库似乎都没有自动连接 因为它不断抛出 NullPointerException 谁能帮我检查一下我缺少什么吗 这是我的代码 演示应用程序 java package com exampl
  • Jest - 模拟函数,从另一个文件导入

    测试的文件使用从另一个文件导入的函数 import myFunc from myFile 如何在该文件的测试中模拟该函数的返回值 我正在使用笑话 这对我有用 我不确定这是否是一个好的做法 import as myFile from myFi
  • 如何用图片替换UITableView?

    我有一个 UITableView 默认为空白 直到用户编辑并向其添加数据 我想显示一张带有说明的图像 直到用户编辑它为止 图片的大小非常适合导航栏和标签栏之间 有没有办法以编程方式执行此操作 您可以使用removeFromSuperview
  • 为什么这个C程序不能编译?这有什么问题吗?

    为什么这个C程序不能编译 这有什么问题吗 我已经试过了wxDevC 和 Turbo C 3 0 Main c include
  • 如何使用 MVVM 打开和关闭新 Windows?

    对于 MVVM 和 WPF 什么是处理打开和关闭新窗口和对话框的好 直接方法 打开和关闭应该由 ViewModel 驱动 对吗 但 ViewModel 不应该知道视图 我通常为此使用接口 例如 如果我想在单独的窗口中编辑记录 我有一个接口
  • ARC 不允许将 Objective-C 指针隐式转换为“void *”

    这意味着什么 我有什么选择 ARC 不允许将 Objective C 指针隐式转换为 void 我正在将 Xcode3 项目移植到 iOS5 它使用 AudioSessionInitialize 如下 AudioSessionInitial
  • 在 swift 中将简单字符串转换为 JSON 字符串

    我知道有一个同标题的问题here https stackoverflow com questions 30825755 convert string to json string in swift 但在那个问题中 他试图将字典转换为 JSO
  • 了解 sort() 比较函数

    我正在使用一个电子商务平台 该平台无法重新排序产品属性字段的选项 这真的很糟糕 因为要插入新选项 您几乎必须删除所有现有选项并重新开始 我正在尝试在客户端进行操作 这是我正在处理的内容 这是针对鞋码的 9 EE 9 1 2 EE 10 EE
  • cv2.drawContours() - 取消填充字符内的圆圈(Python,OpenCV)

    根据 Silencer的建议 我使用了他发布的代码here https stackoverflow com questions 48244328 copy shape to blank canvas opencv python 482465
  • 多重继承争论 II:根据 Stroustrup 的说法 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我非常了解关于为什么接口继承优于多重继承的传统争论 这里已经有一篇文章 C 应该有多重继承吗 https stackoverflow com q
  • 在 PostgreSql 中计算百分比

    例如我有一个这样的表 string adm A 2 A 1 B 2 A 1 C 1 A 2 通过 SQL 查询 我想要这样的结果 string perc adm A 50 B 100 C 0 我想要每个字符串中数字 2 出现的百分比 我可以
  • Python 是解释型的还是编译型的,或者两者兼而有之?

    据我了解 An 解释的语言是由解释器 将高级语言转换为机器代码然后执行的程序 实时运行和执行的高级语言 它一次处理一点程序 A compiled语言是一种高级语言 其代码首先由编译器 将高级语言转换为机器代码的程序 转换为机器代码 然后由执