kompact-io-landing/content/posts/unpicking-aiken-air.md

58 lines
1.8 KiB
Markdown

Aims:
- Describe the pipeline, and components getting from aiken to uplc.
## Air
Aiken compiles aiken code to uplc via _air_:
Aiken Intermediate Representation.
## Trace
Running `aiken build`...
The cli (See `aiken/src/cmd/mod.rs`) parses the command,
finds the context and calls `Project::build` (`crates/aiken-project/src/lib.rs`),
which in turn calls `Project::compile`.
#### `Project::compile`
1. Check dependencies are available _eg_ aiken stdlib.
2. Read source files.
1. Walk over `./lib` and `./validators` and push aiken modules onto `Project.sources`.
3. Parse each source in sources:
1. Generate a `ParsedModule` containing the `ast`, `docs`, _etc_.
The `ast` here is an `UntypedModule`, which contains untyped definitions.
4. Type check each parsed module.
1. For each untyped module, create a `CheckedModule`.
This includes typed definitions.
5. `compile` forks into two depending on whether it's been called with `build` or `check`.
6. From `CheckModules` construct a `CodeGenerator`
7. Pass the generator to construct a new `Blueprints`.
1. Blueprints finds validators from checked modules.
2. From each it constructs a `Validator` with the constructor `Validator::from_checked_module` (which returns a vector of validators)
1. Its here that the magic happens: The method `generator.generate(def)` is called,
where `def` is the typed validator(s).
This method outputs a `Program<Name>` which contains the UPLC.
2. These are collected together.
3. The rest is collecting and handling the errors and warnings and writing the blueprint.
#### `CodeGenerator::generate`
1. Create a new `AirStack`.
#### `AirStack`
Consists of:
1. An Id
2. A `Scope`
3. A vector of `Air`
The Scope keeps track of ... [TODO]
#### Air
Air is a typed language... [TODO]