Violet: 用 Swift 编写的 Python 虚拟机

Violet 是那些 Swift <-> Python 互操作的东西之一,除了这次我们从头开始实现整个语言。名字来自紫罗兰永恒花园。

许多未 观看 的韩剧 小时 都被 投入 其中, 所以任何⭐ 将不胜感激。

如果某些事情不起作用,您有一个有趣的想法或者可能只是一个问题,那么您可以开始一个问题或讨论。您也可以在 twitter @itBrokeAgain上联系我们(乐观,耶!)。


要求
64 位 - 用于BigInt和散列
平台
苹果系统
英特尔
11.6.2(大苏尔)+ Xcode 12.4(斯威夫特 5.3.2)
11.6.2 (大苏尔) + Xcode 13.0 (Swift 5.5)
苹果
12.3.1(蒙特雷)+ Xcode 13.3.1(斯威夫特 5.5.3)
Ubuntu
21.04 + Swift 5.4.2 - 使用make test和make pytest
码头工人
swift:latest(5.6.0) - 使用make docker-test和make docker-pytest
swift:5.3.2- 使用make docker-test-old和make docker-pytest-old
整个 Violet 是在 2014 rMBP 上编写的(最低规格:8GB 内存 + 128 GB 存储),因此可以肯定地说没有其他要求。

特征
我们的目标是与 Python 3.7 功能集兼容。

我们只对语言本身感兴趣,没有额外的模块。这意味着不支持导入除大多数基本模块(sys以及builtins其他一些模块)之外的任何内容(尽管您可以导入其他 Python 文件)。

有关已知未实现功能的列表,请参见Documentation目录。虽然没有未知的未实现功能列表......

未来的计划
垃圾收集是一个不错的功能。目前我们分配对象,但解除分配它们的唯一方法是调用py.destroy()which 会破坏整个 Python 上下文(以及它拥有的所有对象)。

顺便提一句。请记住使用with 语句来管理资源,不要依赖对象的生命周期(尤其是文件描述符)。

尾拨tuples。目前我们将tuple元素存储在 Swift 数组 ( elements: [PyObject]) 中。更好的想法是在元组之后分配更多空间并在那里存储元素(这在 中称为灵活数组成员C)。这节省了指针间接并且更适合缓存,因为我们可以在同一行中放置一些第一个元素type等__dict__。我们也可以对其他不可变容器类型执行此操作:

str- 当前原生 Swift String。这将迫使我们实现自己的String类型——不难,但需要很多时间。
int- 目前我们自己的BigInt实现(它确实将值存储在Int32指针内的范围内)。
来源
您可以在此处浏览所有模块导出 - open/public声明(由Ariel生成)。

核心模块

VioletCore — 由所有其他模块导入的共享模块。
包含NonEmptyArray, SourceLocation, SipHashtrap和unreachable. _
BigInt — 我们对无限整数的实现
虽然它实现了BigInt类型所期望的所有操作,但实际上它主要关注小整数的性能——Python 只有一种int类型,小数是最常见的。
在引擎盖下,它是(在V8之后称为)的联合(通过标记的指针)和带有 ARC 的堆分配(大小 + 符号表示),用于垃圾收集。<<这满口Int32Smi💤
虽然整个 Violet 试图尽可能易于阅读/访问,但这不适用于BigInt模块。数字很​​难,出于某种原因,人类决定“分裂”是一回事。
文件系统——我们的Foundation.FileManager.
代码质量各不相同。大多数时候是“呃……我需要实现另一个 IO 东西”。然后,后来,所有这些“嗯……”都被放入了一个模块中。在所谓的同时,狂野的迅捷系统🐯出现了,所以也许是时候使用它了?
我们不支持其他平台(Windows 等)的主要原因。
UnicodeData — 显然我们还捆绑了我们自己的 Unicode 数据库,因为为什么不……
这有点重要。
紫色

VioletLexer — 将 Python 源代码转换为令牌流。
VioletParser — 将标记流 (from Lexer) 转换为抽象语法树( AST)。
Yet another Recursive Descent Parser,对不明确的语法进行了一些小技巧。
AST类型定义由Elsa模块从Elsa definitions/ast.letitgo.
VioletBytecode — 我们虚拟机的指令集。
每个 2 字节enum Instruction。有一些有趣的情况,比如.formatValue(conversion: StringConversion, hasFormat: Bool)(其中StringConversionanenum有 4 个可能的值),但编译器应该会处理它。
没有相对跳跃,只有绝对跳跃(通过附加labels数组)。
指令集由Elsa模块从Elsa definitions/opcodes.letitgo.
用于CodeObjectBuilder创建CodeObjects (哇……真是个惊喜!)。
包括一个微小的窥孔优化器,因为有时语义取决于它(例如短路评估)。
VioletCompiler — 负责转换Parser.AST为Bytecode.CodeObject.
VioletObjects — 包含所有 Python 对象和模块。
Py表示 Python 上下文。常用用法:py.newInt(2)或py.add(lhs, rhs)。

包含int、str和list100 多种其他 Python 类型。

Python 对象表示为struct具有单个ptr: RawPtr存储属性的 Swift。ptr指向具有自定义布局的堆分配存储。布局由Sourcery使用sourcery: storedProperty注释生成。阅读目录中的文档Documentation!

// sourcery: pytype = int
public  struct  PyInt : PyObjectMixin {
   // sourcery: storedProperty
  公共 变量值:BigInt { self。值点。指针}

  公开 让ptr:RawPtr
}
包含引导 Python 所需的模块:builtins、sys、_imp和._os_warnings

不包含importlib和importlib_external模块,因为它们是用 Python 编写的。它们与 CPython 版本有点不同(我们有 80% 的代码,但只有 20% 的功能 <great-success-meme.gif>)。

PyResult<Wrapped> = Wrapped | PyBaseException用于错误处理。

VioletVM — 根据来自 的指令操作 Python 对象Bytecode.CodeObject,因此输出与实际操作类似CPython。
switch主要是对每一个可能的海量Instruction。
Violet — 主要可执行文件(呃……)。
PyTests — 从PyTests目录运行用 Python 编写的测试。
工具/支持

Elsa——用于代码生成的微型 DSL。
使用目录中.letitgo的文件Elsa definitions。
用于Parser.AST和Bytecode.Instruction类型。
Rapunzel — 漂亮的打印机,基于 Philip Wadler 的“更漂亮的打印机”。
用于以AST易于理解的方式打印。

 

[Python]

分类: 默认 标签: Swift Python 虚拟机 发布于: 2022-05-05 10:10:54, 点击数: