13个不稳定版本 (3个破坏性更新)
0.4.1 | 2023年8月17日 |
---|---|
0.4.0 | 2023年8月3日 |
0.3.2 | 2023年7月17日 |
0.2.1 | 2023年7月16日 |
0.1.3 | 2023年7月10日 |
#252 in 编程语言
每月38次下载
95KB
2K SLoC
nand7400
为nand7400计算机编写的汇编库,由我在The WCL实习期间创建。
这个库是用Rust编写的,同时也直接绑定到Swift,所以你可以将其视为标准Swift包(见使用:Swift)。创建Swift绑定是因为nand7400计算机主要通过iOS/MacOS应用程序进行编程。
使用方法
Rust
你可以像使用其他标准Rust库一样使用这个库,无需任何附加条件。只需将其添加到你的Cargo.toml
文件中即可。
Swift
这个库几乎可以直接与Xcode
配合使用。要使用此库与Xcode
配合使用,你需要进入目标 > (你的构建目标) > 构建阶段 > 将库链接到二进制文件
,并在Nand7400
库中添加Nand7400
框架(框架是位于包下面的像银行或博物馆一样的图标)。否则,你将得到一个找不到模块
的错误,因为Xcode
不知道在哪里可以找到驱动库的框架。
语法
字面量
字面量简单地说就是十进制(基10)、十六进制(基16)、八进制(基8)或二进制(基2)中的任何数字。字面量可以有一个前缀,要么是+
,要么是-
在它们的前面。这表示字面量是有符号的(可以进入负数),并将按此方式解析。如果没有前缀,则字面量是无符号的(不能进入负数)。
<+|-><0x|0o|0b><0-9a-fA-F>
标识符
标识符是任何以字母开头并随后跟有任意数量的字母、数字或下划线的字符串。
<a-zA-Z_><a-zA-Z0-9_>
指令
指令是一个表示特定操作码的标识符。它们可以后面跟有若干个参数,这些参数可以是标识符或字面量。每行只能有1个指令,指令由换行符分隔。
<identifier> <identifier|literal...> <\n>
标签
标签表示指令后的内存位置,后面跟着一个冒号,是标识符。指令可以(但不是必须)在同一行后跟随,也可以在下一行。
<identifier>: <instruction?> <\n>
构建
重要!
实际上使用库不需要做任何这些——只需按照使用说明上面的指示操作。这仅在你想要在自己的机器上自己构建库的情况下。
项目结构概述
要开始构建库,您应该首先熟悉项目结构。这个仓库中有3个主要包
-
nand7400
:Rust 库本身。它没有依赖 UniFFI 或 Swift,是项目的核心。nand7400/examples
:使用 Rust 和 Swift 的库示例。
-
nand7400-ffi
:这是连接 Rust 和 Swift 的绑定库。它通过 Mozilla 的 UniFFI 来实现,还包含一个包装 rust 库,用于执行uniffi-bindgen
命令。 -
nand7400-bindings/swift
:绑定到nand7400
rust 库的 Swift 包。此包的文件是Package.swift
。
Rust
要构建 rust 库,只需在项目的根目录中运行 cargo build
即可。您可以将此库当作其他标准 rust 库一样使用。
Swift
重要!
如果您在
nand7400-ffi
包中更改uniffi
版本,您必须在包中的其他所有地方进行更改。否则,在 Xcode 中将无法正确编译(您将看到符号缺失/未定义的错误)。
要为 Swift 构建此库,您需要一个装有 Xcode 12 或更高版本且已安装标准 rust 工具链(rustup
和 cargo
)的 Mac。要构建,请运行 make package-swift
-- 这将自动调用 make setup-build
,设置构建包所需的所有内容。这将在 target
目录中创建一个 Nand7400FFI.xcframework
文件夹,一个 Nand7400FFI.xcframework.zip
文件,以及一个 Nand7400FFI.xcframework.zip.sha256
校验和文件。然后,您可以将 Nand7400FFI.xcframework.zip
上传供包下载,或者将包的二进制目标路径指向 Nand7400FFI.xcframework
文件。
当使用此库时,如果设置了 NAND7400_LOCAL
,则它将自动搜索本地构建的 XCFramework。否则,它将从 Github 发布版下载 XCFramework。
关于如何做到这一点的资源
以下是我用来帮助我学习如何将 Rust 绑定到 Swift 的资源
也许它们对您也会有帮助!
待办事项
- 添加 Swift 绑定。
- 标签宽度为 16 位,而不是 8 位(分别计作 2 个参数)。
- GitHub/CircleCI(?) 测试工作流程。
- 库的自动构建和打包。
- 自动上传到 Crates.io。
- 自动发布 GitHub 版本 + XCFramework 上传。
- 清理代码。
- 添加更多测试。
依赖项
~3–5MB
~85K SLoC