2 个版本

新版本 0.1.1 2024 年 8 月 10 日
0.1.0 2024 年 7 月 30 日

#correct 中排名第 8

Download history 126/week @ 2024-07-28 68/week @ 2024-08-04

每月下载量 194

MIT/Apache

33KB
544

JYAFN 扩展

JYAFN 扩展对于添加标准实现无法提供的额外功能非常有用。主要用途是在拥有与 jyafn 不兼容的非常复杂的三方代码时(例如,调用原生函数)。这种代码通常 可以jyafn 中重新实现,但这将需要时间和金钱。如果此代码还包含一个不依赖于(或最小程度依赖于)Python 的实现,则通常可以简单地创建一个 C 包装器并将其通过扩展 API 暴露给 JYAFN。此类代码的一个典型例子是 LightGBM 库,其扩展在 extensions 文件夹中实现。

该软件包提供了一种在 Rust 中编写扩展的方法,完全不需要不安全代码。它将使用 Rust 宏生成所有样板代码,并以正确的方式管理所有不安全性。

什么是扩展?

扩展只是符合特定 C API 的共享对象。这些共享对象存储在文件系统中某个位置,默认在 ~/.jyafn/extensions 中,更一般地,在 JYAFN_PATH 环境变量中。当新的计算图声明一个依赖于扩展提供的资源类型的资源时,jyafn 将加载它们。因此,扩展具有一些重大期望

  1. 扩展是 可信 代码。它们不在与 jyafn 函数相同的有限和沙箱环境中运行。它们可以运行 任何 东西,从令人惊叹的复杂算法到错误甚至病毒。
  2. 扩展是依赖项,必须管理依赖项。它们需要从某个地方预先安装,否则依赖于它们的图将无法工作。
  3. 扩展是系统相关的。没有一种代码可以在任何地方运行。它们需要为每个架构编译。

因此,应将扩展的使用保持在最低限度,并仅将其保留用于高度可重用的代码。

什么是资源?

资源,简单来说,就像Python中的对象。它们可以被创建,并可以通过方法进行访问。与Python对象不同,它们被设计成严格不可变,并且必须可序列化(即在文件中表示为字节)。一个扩展可以声明一个资源列表,每个资源都可以声明一个方法列表。资源具有简单的生命周期

  1. 它由一些外部二进制数据表示创建。
  2. jyafn函数中的每次方法调用都会对其查询方法。
  3. 将其序列化为字节,以便与jyafn图中的其他部分一起存入文件,可能用于在另一台机器上读取和重新创建。

因此,我们有一个非常简单的创建资源的接口

  • from_bytes:从序列化的二进制数据构建一个新的资源。
  • dump:将资源表示为序列化数据。
  • get_method:获取有关方法的信息(其函数指针、输入和输出布局)以执行调用。

最后一个方法,size,也将被实现以跟踪每个资源的消耗。

下一步是什么

如果您打算推出自己的扩展,可以查看extensions文件夹中的示例实现。dummy扩展提供了一个非常简单的扩展的基本示例,而lightgbm扩展展示了LightGBM库的完整功能扩展。

但是,如果您像大多数人一样,正在寻找有关如何作为用户与扩展一起工作的信息,请查看“玩转扩展”(实现待定)以了解更多。

依赖项

~0.8–1.7MB
~36K SLoC