#assembly #cpu #compiler #cargo-toml

nand7400

为nand7400计算机编写的汇编库,由我在WCL实习期间创建。

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次下载

MIT 许可证

95KB
2K SLoC

GitHub CircleCI Crates.io

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 工具链(rustupcargo)的 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