在 Github 上查看

Jython 3 路线图

这份讨论文档试图概述通往 Jython 3 的步骤,由 MVP 功能定义。可能存在明显的遗漏。它故意没有日期。

除了交付功能外,它还旨在满足某些自愿约束,这些约束被认为从长远来看是健康的。

为了实现这些目标中的第二个(历史),在以下内容中,如果暗示我们实现了一些类或包,默认方法将是建立在先前的技术之上并对其进行认可。为了在每个源文件中实现这一点,我们使用 git-move(提交),然后修改最接近的对应 Jython 2 文件。

中间提交通常会生成一个无法构建的版本,并且不应将其作为提示推送到项目存储库。随后的编辑和另一个提交将纠正这一点。死代码通常是件坏事,应该保留,直到我们知道我们不会恢复它来提供以后的功能。可能需要创建存根来满足未恢复代码中的引用。

一个粗略的计划

焦土政策

  1. 重构代码库,使其能够使用 Gradle 构建。遗留代码保留在原位,等待移动和修改。

  2. 第一个构建目标是一个库 jython-3.8a1-DEV,但最初它将为空。

  3. 提供一些基本地标(模块化项目结构)和一个用于控制子系统日志消息的约定。(这对我们来说是一个调试辅助工具,并演变为生产使用中的信息。)

类型和算术

  1. 概述对象、类型、操作、槽的架构。指定抽象对象 API(类似于 CPython 的)。

  2. 实现 PyBaseObjectPyType 和一些简单类型(大多数没有操作)。仅实现 Java API 并为类型构造和继承编写 JUnit 测试。

  3. 实现类型槽,向简单类型添加槽函数,并实现抽象对象 API。通过 JUnit 测试整个过程,调用抽象对象 API。从这里开始,添加的新操作意味着新的抽象对象 API 和匹配的 JUnit 测试。

  4. 验证通过 API 调用算术运算是否实现了可接受的性能。可能使用微基准测试进行测量,这些测试作为库上的应用程序构建。add(a, b) 的性能与 CPython a+b 的性能相当是可接受的性能。(目标是一系列操作,而不仅仅是 +。)微基准测试套件应该随着功能的添加而增长。

解释器和线程

  1. 概述解释器、帧和线程模型的架构。

  2. InterpreterPyFramePyCode 支持执行 CPython 字节码的初始子集。从这里开始,添加新功能包括对字节码解释器的功能库进行相应的添加,以便接受依赖于该功能的字节码。

  3. 读取 CPython 输出的代码对象的方法。它可能只是一个临时机制,或者是对 pickle 的部分实现。

  4. PyJavaFunctionPyJavaModule(但还没有 import)。

  5. builtins 模块的初步形式。随后,将根据需要在此添加对象。

  6. 微基准测试,在兼容的 Jython PyFrame 中执行 Python 片段的编译形式。目标是与 CPython timeit 在相同片段上的结果相当。代码和引用从字符串生成。(是否有可能创建一个框架,使这个不断扩展的套件工作量最小?)

  7. 微基准测试验证与 CPython f(args, kwargs) 的一致性,涵盖各种参数模式 f()f(x)f(x, k=1) 等。

  8. 验证并发线程的正确操作,特别是类型在构造过程中不会逃逸不完整。随着添加可能存在并发错误风险的功能,此套件应该不断扩展。

描述符协议

  1. 对象模型的进一步架构,旨在完整描述在 Python 或 Java 中定义的类型以及多重继承。

  2. 在 Python 中定义的类的实现(但仍然由 CPython 编译)。

  3. 描述符协议和机制,用于从类中填充 PyType 字典和槽。通过 JUnit(直接或通过抽象对象 API)进行测试。

  4. 使用 Java 中的注释定义类、成员和方法。(类似于 Jython 2 的暴露器,但更透明、有文档记录,并使用 MethodHandle 简化)。

对象实验

考虑将每个 Object 变成 Python 对象对性能和 Java 集成透明度的优势。探索对常见内置类型的“可接受实现”的想法,以允许例如 String 成为 str。使用 CallSite 作为 MethodHandle(已在槽中)的使用者进行实验。

解决 PyObjectObject 的困境。

Java 集成

将 Java 对象视为 Python 对象的方法和基本实现,当它们没有被明确识别(内置)时,它们具有与 Java 类相关的 Python 类型。对编译为 Java 的代码进行性能微基准测试。

模块导入

  1. 模块和导入器的架构概述,特别关注 Java 包和模块的语义。Python 中模块概念的进步应该使我们能够避免在 Jython 2 中发现的一些特殊情况和反复操作。

  2. sysio 的基本形式。随后,根据需要添加对象。

  3. 实现紧密遵循 CPython 的导入机制。

  4. 使用自定义查找器(可能)从 Java 导入对象。

编译器

  1. 根据需要在编译器中进一步选择 stdlib 模块。

  2. 从 Python ASDL 生成的 AST 类。生成的类是 ast 模块中的 Python 对象。(问题:它们应该在 Java 中生成吗?使用 ANTLR?)

  3. 从 Python 源代码到 AST 的编译器,可能使用 PEG 解析器。(如果采用 PEG,请使用 CPython 编译它,并使用 Jython 运行它)。

  4. 从 AST 到 CPython 字节码的编译器:如果可能,使用 Python 中的版本(使用 CPython 编译)。否则,在 Java 中遵循 CPython 实现。(Jython 2 遗留中没有 CPython 字节码编译器)。

Jython 命令

  1. Jython 3 控制台命令作为基于库的 Java 应用程序。

  2. 在所有主要操作系统上调用 Jython 的方法。

Python stdlib

逐步引入 stdlib 及其回归测试套件。

CPython 回归测试套件对于推动我们的一致性和完整性非常有用,但测试过程本身依赖于很大一部分语言和 stdlib 已经工作。

实现说明

一些原则,一些来自 jython-dev 或脱机讨论。

构建环境

所有这些都应该从一开始就遵循,以保持可接受的质量 (即 MVP)。

一些不应采用的道路