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
每月下载 1,642 次
用于 3 个 包
3.5MB
27K SLoC
包含 (Mach-o exe, 2MB) PaxCartridge
Pax-Compiler
本文档描述了pax-compiler的高层架构。
更多信息请参阅我们的 文档。
鸟瞰图
大概可以分为三个步骤
- 分析用户Pax项目(Pax模板+Rust)并生成Pax清单(总结Pax项目的数据结构)
- 将Pax清单代码生成到Pax卡(Rust目标无关库)。
- 使用此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_cartridge
在 code_generation/mod.rs
。
第三步:使用我们的帕克斯卡带构建底盘
这个过程的最后一步是用我们的卡带构建我们的目标平台(例如 Web/MacOS/..)的脚手架(见 底盘)。这项工作位于 building
模块中。这主要涉及构建生成的卡带,将其加载到我们的特定底盘中,然后构建该底盘。目前我们支持 3 个目标(Web/MacOS/iOS)。我们将卡带作为 WASM 加载到 Web 中,以及作为 .dylib
加载到我们的苹果目标中。
消费者
pax-compiler
的主要消费者是 pax-cli
和 pax-macro
。 pax-cli
是帕克斯用户调用来构建帕克斯项目的 CLI。 pax-macro
是定义我们用于帕克斯项目动态分析的 #[derive(Pax)]
宏的 crate(参见步骤 1)。
依赖关系
~40–57MB
~1M SLoC