#pax #executable #projects #applications #cartridge #structure #building

pax-compiler

解析和构建Pax项目到应用程序可执行文件的编译器API

104个版本 (27个破坏性版本)

新增 0.35.0 2024年8月23日
0.32.0 2024年8月23日
0.22.0 2024年7月26日
0.12.8 2024年3月16日
0.0.1 2022年9月13日

#109 in WebAssembly

Download history 248/week @ 2024-05-04 803/week @ 2024-05-11 212/week @ 2024-05-18 210/week @ 2024-05-25 29/week @ 2024-06-01 18/week @ 2024-06-08 20/week @ 2024-06-15 11/week @ 2024-06-22 273/week @ 2024-06-29 138/week @ 2024-07-06 56/week @ 2024-07-13 463/week @ 2024-07-20 328/week @ 2024-07-27 5/week @ 2024-08-03 6/week @ 2024-08-10 884/week @ 2024-08-17

每月下载 1,642
用于 3 个

MIT/Apache

3.5MB
27K SLoC

Rust 17K SLoC // 0.0% comments Swift 4K SLoC // 0.1% comments TypeScript 2.5K SLoC // 0.1% comments JavaScript 2.5K SLoC // 0.0% comments Tera 503 SLoC Pest 166 SLoC // 0.3% comments Shell 39 SLoC // 0.3% comments

包含 (Mach-o exe, 2MB) PaxCartridge

Pax-Compiler

本文档描述了pax-compiler的高层架构。

更多信息请参阅我们的 文档

鸟瞰图

大概可以分为三个步骤

  1. 分析用户Pax项目(Pax模板+Rust)并生成Pax清单(总结Pax项目的数据结构)
  2. 将Pax清单代码生成到Pax卡(Rust目标无关库)。
  3. 使用此Rust卡构建目标平台可执行文件(底盘)。

所有这些的主要入口点是位于 perform_build 中的 lib.rs

步骤1: Pax项目 -> Pax清单

帕克斯(Pax)项目使用一个特殊的宏 #[derive(Pax)] 来装饰其关联的 Rust 代码。这些宏会生成代码以动态分析其标记的结构体。它们为每个标记的结构体添加一个 parse_to_manifest 函数。这个 parse_to_manifest 函数(模板可在这里找到 here)将关联结构体的信息存储在 ParsingContext 对象中,并对其 Pax 模板依赖调用 parse_to_manifest。它使用 parsing.rs 中的逻辑,并依赖于我们的 pest 语法(pax.pest)来理解模板依赖。对于根结构体(标记为 #[main],例如 here),我们还生成一个二进制目标,启动这个过程,并将累积的信息写入 Pax Manifest 并序列化到标准输出。这个二进制文件(命名为 parser)作为编译过程中的第一步启动(在 lib.rs/perform_build 函数中)。

第二步:帕克斯 Manifest -> 帕克斯卡带

接下来,我们生成帕克斯卡带。这项工作大致分为两步:编译 表达式 和生成卡带代码。前者涉及解析 Paxel(帕克斯的表达式语言)并生成等效的 Rust 代码。这项工作位于 expressions.rs。一旦表达式被编译,第二步是生成卡带代码。这位于 code_generation 模块中。我们使用 Tera 模板进行代码生成,大部分工作是将帕克斯 Manifest 转换为 Tera 上下文。主要入口点是 generate_and_overwrite_cartridgecode_generation/mod.rs

第三步:使用我们的帕克斯卡带构建底盘

这个过程的最后一步是用我们的卡带构建我们的目标平台(例如 Web/MacOS/..)的脚手架(见 底盘)。这项工作位于 building 模块中。这主要涉及构建生成的卡带,将其加载到我们的特定底盘中,然后构建该底盘。目前我们支持 3 个目标(Web/MacOS/iOS)。我们将卡带作为 WASM 加载到 Web 中,以及作为 .dylib 加载到我们的苹果目标中。

消费者

pax-compiler 的主要消费者是 pax-clipax-macropax-cli 是帕克斯用户调用来构建帕克斯项目的 CLI。 pax-macro 是定义我们用于帕克斯项目动态分析的 #[derive(Pax)] 宏的 crate(参见步骤 1)。

依赖关系

~40–57MB
~1M SLoC