---
# System prepended metadata

title: '[GT4Py] Flexible Embedded Backends'
tags: [cycle 21]

---

# [GT4Py] Flexible Embedded Backends

 
<!-- Add the tag for the current cycle number in the top bar -->

- Shaped by: Hannes
- Appetite (FTEs, weeks): 1 cycle, 1 dev + 1 for knowledge transfer
- Developers: <!-- Filled in at the betting table unless someone is specifically required here -->

## Problem

The toolchain steps where put into workflows in the previous cycle.
Still some steps, specifically the ones checking the syntactical/type correctness, are hard-coded in the `field_operator`/`program` decorators.

The desired state would be to allow full customization of the toolchain via workflow steps by specifying a backend (TODO: to be renamed to `workflow`, `toolchain`, `transforms`, `???`?).

This would allow pure embedded (without linting through parsing+lowering+type deduction) without hacks.

This project also serves as knowledge transfer for the workflowified toolchain.

## Appetite

1 cycle

## Solution

Fixing the problem is both a cleanup and a feature:
- remove special-casing around "embedded backends"
- enable full customization

The linting steps which are currently in `post_init`s in decorators will be removed. Instead these steps become part of a backend (This is already in the pipeline: [#1516](https://github.com/GridTools/gt4py/pull/1516), only the calls remain in the decorators). A fully `None` backend will not do any checks or transformations.
To keep early checking we add an embedded backend with a linting step. To keep current behavior this will become the new default backend.
To be able to switch the default we need a customization option for the default backend, to allow field_operators to have non-checked backend even without explicitly setting a backend on each of them.


Additional design questions, for follow-up cleanup:
- clear separation of workflows that run at different times:
    - at load of the function: linting
    - at compile time (to enable AOT compilation, should not use runtime \*arg \*\*kwargs, only in case of jit)
    - at run time (should only call?)

## Rabbit holes
<!-- Details about the solution worth calling out to avoid problems -->
Having the no-checks embedded execution represented internally by a `None`-valued backend might not be achievable without special casing in the decorator classes.
Mitigate by time-boxing any exploration into this and else choose to convert a value of `None` passed to the decorator functions to another representation of the no-checks embedded execution (some kind of backend instance).

## No-gos
<!-- Anything specifically excluded from the concept: functionality or use cases we intentionally aren’t covering to fit the ## appetite or make the problem tractable -->

## Progress
<!-- Don't fill during shaping. This area is for collecting TODOs during building. As first task during building add a preliminary list of coarse-grained tasks for the project and refine them with finer-grained items when it makes sense as you work on them. -->

- [x] Task 1 ([PR#xxxx](https://github.com/GridTools/gt4py/pulls))
    - [x] Subtask A
    - [x] Subtask X
- [ ] Task 2
    - [x] Subtask H
    - [ ] Subtask J
- [ ] Discovered Task 3
    - [ ] Subtask L
    - [ ] Subtask S
- [ ] Task 4

