开发几个月后,我决定孟菲斯的北极星是完全在我的解释器中运行 Flask 服务器。我不知道这需要做多少工作,只知道这听起来很酷,而且可能会教会我很多东西。如果我今天要实现这个目标,我可能会选择 FastAPI 或什么都不选择,因为那对我来说很愚蠢。
Python 标准库
我遇到的一个重大决定是如何处理Python标准库。正如您可能熟悉的那样,语言的标准库在技术上并不是语言定义或运行时的一部分。它包含在版本中,以使语言和运行时更有用。想象一下没有线程或异步支持的 Python。您仍然能够计算表达式并实例化类,但大多数生产就绪程序需要某种并发支持。
一种选择是自己重写整个标准库。我正在构建一个解释器,不是吗?我相信这就是RustPython所采取的方法,这是一条令人钦佩的道路。我认为我已经有足够的时间让运行时正常工作,正在寻找任何和所有的捷径,并决定不这样做。
Python 标准库由两个主要部分组成:用 Python 实现的部分和用 C 实现的部分。很方便的是,我有自己的 Python 解释器。我可以直接从主机解释Python源文件来满足前者吗?是的,我可以。我需要支持他们使用的每一个语法和功能,但在那之后,它就可以工作了。
C 部分是它变得有趣的地方。早在 2023 年,我就决定在我的 Python 解释器中嵌入一个 Python 解释器,但我并没有完全理解这意味着什么。现在是时候思考这个问题并决定是否要继续采用这种方法还是选择另一条路。
Rust 和 Python 的互操作商店是 Pyo3。作为镇上唯一的游戏,Pyo3 使用外部函数接口 (FFI) 来允许 Rust 代码调用 CPython 二进制文件。这是通过同意应用程序二进制接口 (ABI) 来实现的,这是我在 AMD 的职业生涯中使用的一个概念。核心软件ftw!
导入模块
我最初的用例是运行 import sys 并让它给我一个可以执行成员访问操作的对象。我在这里进入口译员讲话,但这就是我正在谈论的 REPL 会话类型。
Python 3.12.5 (main, Aug 6 2024, 19:08:49) [Clang 15.0.0 (clang-1500.3.9.4)] Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys <module> >>> type(sys.modules) <class> </class></module>
使用 Pyo3 获取此功能非常简单。
pub struct CPythonModule(PyObject); impl CPythonModule { pub fn new(name: &str) -> Self { pyo3::prepare_freethreaded_python(); let pymodule = Python::with_gil(|py| PyModule::import(py, name).expect("Failed to import module").into() ); Self(pymodule) } }
我们可以使用它在孟菲斯驱动一个类似的 REPL 会话,假设您还记得让它运行的功能标志鸡尾酒。
Python 3.12.5 (main, Aug 6 2024, 19:08:49) [Clang 15.0.0 (clang-1500.3.9.4)] Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> sys <module> >>> type(sys.modules) <class> </class></module>
如果你问自己,难道你不能用这种方式导入整个标准库(包括用Python和C编写的部分),让你的整个生活、自由和幸福的追求变得更容易吗?答案是肯定的。这将是一个有效的方法!然而,这会让我的解释器更像是 CPython 的外壳,超出了我的预期。这是一个学习练习,所以我完全赞成任意决定。对于那些说在 Memphis 中加载任何 CPython 片段都会导致 Memphis 不是真正的解释器的纯粹主义者,我只想说:请向我展示你的解释器。
我使用 Memphis 和 CPython 在 REPL 会话中运行 import sys,对 htop 进行了快速测试。在 Memphis 上,由于这会将 CPython 库加载到内存中,因此 RAM 使用量(htop 中的驻留集大小)增加了约 5MB。作为比较,Memphis REPL 加载 sys 模块之后使用大约 9MB 的 RAM,而 Python REPL 加载 sys 模块之前和之后使用的 RAM 大约相同。我确信这不是同类比较,但它至少告诉我,孟菲斯不会慢慢地让我的电脑窒息而死。
转换对象并获得存在性
此设置的下一个复杂性涉及将我的 Memphis 对象表示形式转换为 CPython 表示形式,反之亦然。这是一项正在进行的工作,我的主要指令最初是“不要失败”,最近是“在进行有损转换时显示警告。”
这是我从 PyObject(Pyo3 端的对象表示)到 ExprResult(我的孟菲斯表示)的转换。
pub struct CPythonModule(PyObject); impl CPythonModule { pub fn new(name: &str) -> Self { pyo3::prepare_freethreaded_python(); let pymodule = Python::with_gil(|py| PyModule::import(py, name).expect("Failed to import module").into() ); Self(pymodule) } }
这是反向比较。请注意,对于这两者,我们必须传入一个 Python 对象,该对象控制我们对 CPython GIL(全局解释器锁)的访问。
memphis 0.1.0 REPL (Type 'exit()' to quit) >>> import sys >>> sys <module> >>> type(sys.modules) <class> </class></module>
这是一个我想进一步探索的丰富领域。以下是我考虑过的一些方向:
- 每次对象穿过 FFI 接口时都会进行转换。 (是的,我意识到缩写词扩展为外部函数接口接口。)这大致就是我已经在做的事情,我只需要拥有它而不是感觉自己像个冒名顶替者。这可能很简单,但效率很低。
- 保留一个注册表,以便每个对象在每一侧最多存在一次。这比 (1) 更有效,但它需要一个稳定的值,您可以使用它来查找和链接这些对象。
- 以 Rust 端的单一表示为目标,并根据需要使用 Pyo3 来代理和延迟转换字段。我相信这仍然会利用 (1) 的功能,但会以更有效的方式。
- 使 Memphis 对象的内存布局与 PyObject 的内存布局相匹配。与 #[repr(C)] 在 Rust 中的工作方式类似,这类似于 ABI 在函数调用中扮演的角色。鉴于双方需要进行评估的内容有所不同,我什至不确定这是否可能,但这引起了我的兴趣。
我有点超前了,因为我现在几乎无法加载 C 模块,但我的好奇心在这个领域确实没有尽头。
结局
当我在缓慢启动 Flask 的过程中遇到新的转换失败时,我继续对此进行研究。这个练习很好地提醒我们,所有对象(或类、模块等)都是一组以已知格式存在于内存中的属性。如果我们充分理解这种格式,我们应该能够做出令人难以置信的事情,无论是在 Memphis 还是 CPython 方面。
这一理念也推动了我对 From Scratch Code 的工作。如果您厌倦了无法让库在您的代码中工作,我鼓励您退后一步问:该库实际上在做什么?您是否需要它,或者可以使用更简单的解决方案吗?我相信培养对软件的好奇心,并且我很乐意帮助您将这种思维方式融入您的工具箱中。
如果您想将更多类似的帖子直接发送到您的收件箱,您可以在这里订阅!
别处
除了指导软件工程师之外,我还写了我作为一名成人诊断自闭症患者的经历。更少的代码和相同数量的笑话。
- 为什么我渴望得到认可? - 来自 Scratch 点组织
以上是口译员中的口译员的详细内容。更多信息请关注PHP中文网其他相关文章!

Python更易学且易用,C 则更强大但复杂。1.Python语法简洁,适合初学者,动态类型和自动内存管理使其易用,但可能导致运行时错误。2.C 提供低级控制和高级特性,适合高性能应用,但学习门槛高,需手动管理内存和类型安全。

Python和C 在内存管理和控制方面的差异显着。 1.Python使用自动内存管理,基于引用计数和垃圾回收,简化了程序员的工作。 2.C 则要求手动管理内存,提供更多控制权但增加了复杂性和出错风险。选择哪种语言应基于项目需求和团队技术栈。

Python在科学计算中的应用包括数据分析、机器学习、数值模拟和可视化。1.Numpy提供高效的多维数组和数学函数。2.SciPy扩展Numpy功能,提供优化和线性代数工具。3.Pandas用于数据处理和分析。4.Matplotlib用于生成各种图表和可视化结果。

选择Python还是C 取决于项目需求:1)Python适合快速开发、数据科学和脚本编写,因其简洁语法和丰富库;2)C 适用于需要高性能和底层控制的场景,如系统编程和游戏开发,因其编译型和手动内存管理。

Python在数据科学和机器学习中的应用广泛,主要依赖于其简洁性和强大的库生态系统。1)Pandas用于数据处理和分析,2)Numpy提供高效的数值计算,3)Scikit-learn用于机器学习模型构建和优化,这些库让Python成为数据科学和机器学习的理想工具。

每天学习Python两个小时是否足够?这取决于你的目标和学习方法。1)制定清晰的学习计划,2)选择合适的学习资源和方法,3)动手实践和复习巩固,可以在这段时间内逐步掌握Python的基本知识和高级功能。

Python在Web开发中的关键应用包括使用Django和Flask框架、API开发、数据分析与可视化、机器学习与AI、以及性能优化。1.Django和Flask框架:Django适合快速开发复杂应用,Flask适用于小型或高度自定义项目。2.API开发:使用Flask或DjangoRESTFramework构建RESTfulAPI。3.数据分析与可视化:利用Python处理数据并通过Web界面展示。4.机器学习与AI:Python用于构建智能Web应用。5.性能优化:通过异步编程、缓存和代码优

Python在开发效率上优于C ,但C 在执行性能上更高。1.Python的简洁语法和丰富库提高开发效率。2.C 的编译型特性和硬件控制提升执行性能。选择时需根据项目需求权衡开发速度与执行效率。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具