306 lines
10 KiB
Markdown
306 lines
10 KiB
Markdown
# Globals and Lifecycle Lowering to IRBackend/IRVM Agenda
|
|
|
|
## Status
|
|
|
|
Open
|
|
|
|
## Parent Agenda
|
|
|
|
This agenda derives from:
|
|
|
|
- `19. Globals, Synthetic Module Init, and FRAME_RET Agenda`
|
|
|
|
Expected fixed inputs from previous stages:
|
|
|
|
- `19.1. PBS Globals Surface, Identity, and Module Boundaries Agenda`
|
|
- `19.2. PBS Lifecycle Markers, Program Init, and Frame Root Semantics Agenda`
|
|
- `19.3. Published Entrypoint, Synthetic Wrapper, and FRAME_RET Ownership Agenda`
|
|
|
|
## Purpose
|
|
|
|
Define how the already-decided globals and lifecycle model are represented and lowered through the executable compiler pipeline.
|
|
|
|
This agenda must close:
|
|
|
|
- the representation boundary for globals;
|
|
- module init synthesis;
|
|
- boot guard materialization;
|
|
- wrapper lowering;
|
|
- and the executable path that preserves the chosen `FRAME_RET` ownership.
|
|
|
|
## Domain Owner
|
|
|
|
`docs/compiler/pbs`
|
|
|
|
Este tema pertence ao domínio PBS, mas encosta diretamente nas specs gerais de lowering e nas interfaces entre frontend e backend.
|
|
|
|
## Context
|
|
|
|
Depois que surface, lifecycle e publication contract estiverem fechados, ainda restará decidir:
|
|
|
|
- em que boundary globals passam a existir como entidade explícita;
|
|
- se `IRBackend` carrega globals diretamente ou só uma forma anterior;
|
|
- como module init sintético é representado;
|
|
- como o wrapper published entrypoint é emitido;
|
|
- como o guard one-shot de boot é materializado.
|
|
|
|
Esta agenda é mecânica/arquitetural. Ela não deve reabrir decisões de linguagem.
|
|
|
|
## Inputs Already Fixed Elsewhere
|
|
|
|
Os seguintes inputs devem ser tratados como fixos aqui:
|
|
|
|
- surface e identidade de globals vindas de `19.1`;
|
|
- lifecycle semântico vindo de `19.2`;
|
|
- owner do published entrypoint e de `FRAME_RET` vindo de `19.3`;
|
|
- `GET_GLOBAL` e `SET_GLOBAL` já existem na VM.
|
|
|
|
## Decisions To Produce
|
|
|
|
Esta agenda deve produzir direção suficiente para fechar:
|
|
|
|
1. se globals entram explicitamente no `IRBackend` ou apenas em lowering posterior;
|
|
2. como module init é sintetizado;
|
|
3. como o guard one-shot de boot é materializado;
|
|
4. como o wrapper é lowered;
|
|
5. como `FRAME_RET` é preservado no ponto correto;
|
|
6. quais contracts gerais de lowering precisam propagação.
|
|
|
|
## Core Questions
|
|
|
|
1. `IRBackend` deve ganhar representação explícita para globals?
|
|
2. Se não, qual é o boundary intermediário responsável por materializá-los antes de `IRVM`?
|
|
3. Module init sintético é emitido como callable próprio por módulo?
|
|
4. O boot guard é global oculto, local estático de wrapper, ou outra forma interna?
|
|
5. O wrapper published entrypoint é um callable sintético explícito no graph do frontend?
|
|
6. Como manter attribution e diagnostics úteis para código sintético?
|
|
7. Que mudanças mínimas precisam acontecer em specs gerais fora de `docs/compiler/pbs`?
|
|
8. O lowering deve introduzir uma classe explícita de funções sintéticas com ergonomia própria, em vez de emissão ad hoc?
|
|
|
|
## Options
|
|
|
|
### Option A
|
|
|
|
Dar representação explícita a globals e callables sintéticos já no boundary de `IRBackend`, preservando attribution e identidade suficientes para lowering posterior.
|
|
|
|
### Option B
|
|
|
|
Manter `IRBackend` sem globals explícitos e adiar essa materialização para um lowering mais baixo.
|
|
|
|
### Option C
|
|
|
|
Tratar globals como açúcar compilado diretamente para slots/ops sem entidade intermediária estável.
|
|
|
|
## Tradeoffs
|
|
|
|
### Option A
|
|
|
|
- Prós:
|
|
- boundary mais explícito e testável;
|
|
- menor inferência textual em lowers posteriores;
|
|
- facilita explicar wrapper e init synthesis.
|
|
- Contras:
|
|
- aumenta o contrato do `IRBackend`;
|
|
- pode exigir propagação além do domínio PBS.
|
|
|
|
### Option B
|
|
|
|
- Prós:
|
|
- preserva o boundary atual por mais tempo.
|
|
- Contras:
|
|
- empurra complexidade para fases posteriores;
|
|
- dificulta conformance do shape intermediário.
|
|
|
|
### Option C
|
|
|
|
- Prós:
|
|
- menor aparente custo de modelagem.
|
|
- Contras:
|
|
- fraco para teste, attribution e manutenção;
|
|
- mistura lowering demais cedo.
|
|
|
|
## Recommendation
|
|
|
|
Seguir com a **Option A**, salvo impedimento forte de boundary cross-domain.
|
|
|
|
## Current Direction
|
|
|
|
Os pontos abaixo já podem ser tratados como direção fechada desta agenda, salvo objeção nova forte:
|
|
|
|
1. globals devem entrar explicitamente no `IRBackend`;
|
|
2. o pipeline não deve adiar globals para uma materialização implícita tardia abaixo desse boundary;
|
|
3. fragments de init por arquivo, init sintético por módulo, init de projeto e wrapper published entrypoint devem existir como callables sintéticos explícitos;
|
|
4. o boot guard deve ser materializado como um global oculto;
|
|
5. esse global oculto não pode ser referenciado nem alterado por userland;
|
|
6. o wrapper published entrypoint deve existir explicitamente no graph de lowering;
|
|
7. o lowering deve seguir direção direta para as operações de globals já suportadas em `IRVM`/VM, isto é, `GET_GLOBAL` e `SET_GLOBAL`;
|
|
8. attribution e diagnostics devem preservar separadamente:
|
|
- origem em source userland,
|
|
- e origem sintética gerada pelo compiler;
|
|
9. quando algum erro estrutural ou de lowering surgir em código sintetizado, a superfície sintética deve ser capaz de carregar attribution de volta ao código real que originou aquele trecho;
|
|
10. spans e diagnostics devem preferir apontar para código real de userland sempre que essa origem existir;
|
|
11. o frontend/lowering deve introduzir uma classe explícita de funções sintéticas com ergonomia própria;
|
|
12. a emissão dessas funções não deve ser ad hoc caso a caso.
|
|
|
|
## Synthetic Callable Direction
|
|
|
|
Esta agenda também fecha a seguinte direção arquitetural:
|
|
|
|
1. callables sintéticos não devem ser tratados como acidentes de emissão;
|
|
2. eles devem possuir classe/identidade própria no lowering;
|
|
3. essa classe deve cobrir pelo menos:
|
|
- fragmentos de init por arquivo,
|
|
- init sintético por módulo,
|
|
- init de projeto,
|
|
- wrapper físico publicado;
|
|
4. a ergonomia dessa classe própria deve facilitar:
|
|
- ordenação,
|
|
- attribution,
|
|
- debug,
|
|
- testes,
|
|
- e futuras extensões de lifecycle sem reabrir o modelo básico.
|
|
|
|
Também fica fechada a seguinte exigência de diagnóstico:
|
|
|
|
1. a superfície sintética precisa carregar origem suficiente para remapear erros ao código real;
|
|
2. quando existir origem userland inequívoca, o diagnóstico deve preferir essa origem em vez de um span puramente sintético;
|
|
3. spans puramente sintéticos só devem aparecer quando não houver origem real defensável.
|
|
|
|
## Hidden Boot Guard Direction
|
|
|
|
O boot guard também fica com direção fechada nesta agenda:
|
|
|
|
1. ele deve existir como global oculto de programa;
|
|
2. ele pertence ao estado interno publicado pelo compiler;
|
|
3. userland não pode nomeá-lo, ler seu valor ou alterá-lo;
|
|
4. sua única função é garantir a semântica one-shot do bootstrap no wrapper físico.
|
|
|
|
## IRBackend Shape Direction
|
|
|
|
Esta agenda também fecha o seguinte shape estrutural mínimo para o `IRBackend`.
|
|
|
|
### 1. Backend Globals
|
|
|
|
O `IRBackend` deve carregar globals explicitamente como entidades estruturais, não apenas como efeitos implícitos no corpo de funções.
|
|
|
|
Direção mínima recomendada para cada global:
|
|
|
|
- `name`
|
|
- `ownerModuleId`
|
|
- `type`
|
|
- `slot`
|
|
- `visibility`
|
|
- `isHidden`
|
|
- `origin`
|
|
|
|
Isso deve cobrir:
|
|
|
|
- globals de userland;
|
|
- e globals ocultos do compiler, incluindo o boot guard.
|
|
|
|
### 2. Backend Callables
|
|
|
|
O `IRBackend` deve distinguir explicitamente:
|
|
|
|
- callables normais de userland;
|
|
- callables sintéticos gerados pelo compiler.
|
|
|
|
### 3. Synthetic Callable Kind
|
|
|
|
O conjunto mínimo de kinds sintéticos desta agenda deve cobrir:
|
|
|
|
- `FILE_INIT_FRAGMENT`
|
|
- `MODULE_INIT`
|
|
- `PROJECT_INIT`
|
|
- `PUBLISHED_FRAME_WRAPPER`
|
|
|
|
### 4. Synthetic Origin
|
|
|
|
Todo callable ou global sintético deve carregar metadados suficientes para attribution e remapeamento de diagnóstico.
|
|
|
|
Direção mínima recomendada:
|
|
|
|
- `derivedFromFile`
|
|
- `derivedFromModule`
|
|
- `derivedFromUserSymbol`
|
|
- `primarySpan`
|
|
- `fallbackSyntheticLabel`
|
|
|
|
### 5. Hidden Global Kind
|
|
|
|
O boot guard deve aparecer como global oculto com identidade estrutural explícita, não como convenção informal de nome.
|
|
|
|
Direção mínima recomendada:
|
|
|
|
- `BOOT_GUARD`
|
|
|
|
## Diagnostics and Conformance Direction
|
|
|
|
Esta agenda também fecha o seguinte conjunto mínimo de checks estruturais e evidências de conformance.
|
|
|
|
### Structural Diagnostics / Validation
|
|
|
|
1. `synthetic wrapper entrypoint missing`
|
|
- quando o pipeline não conseguir publicar o wrapper exigido.
|
|
2. `published entrypoint is not function index 0`
|
|
- quando o lowering violar o protocolo físico.
|
|
3. `hidden boot guard is missing`
|
|
- quando a semântica one-shot exigir o guard e ele não existir.
|
|
4. `synthetic callable origin missing`
|
|
- quando o lowering gerar callable sintético sem attribution suficiente para diagnóstico defensável.
|
|
|
|
### Conformance / Fixture Expectations
|
|
|
|
1. fixture com `declare global` + `[Init]` por arquivo + `[Init]` de projeto + `[Frame]`;
|
|
2. evidência de geração de:
|
|
- file init fragment,
|
|
- module init,
|
|
- project init,
|
|
- published wrapper,
|
|
- hidden boot guard;
|
|
3. evidência de que o wrapper ocupa `func_id = 0`;
|
|
4. evidência de que `FRAME_RET` está no wrapper;
|
|
5. evidência de que erro em lowering sintético remapeia para span real quando houver origem de userland defensável.
|
|
|
|
## Spec and Learn Propagation Direction
|
|
|
|
Esta agenda também fecha a seguinte direção editorial:
|
|
|
|
1. specs de lowering devem explicar de forma normativa:
|
|
- a classe de callables sintéticos,
|
|
- o lifecycle de init no lowering,
|
|
- o wrapper publicado,
|
|
- o hidden boot guard,
|
|
- e a relação desses artefatos com attribution e diagnostics;
|
|
2. `learn` deve explicar esse modelo de forma didática com exemplos de código source;
|
|
3. `learn` deve mostrar como:
|
|
- `declare global`,
|
|
- `[Init]` por arquivo,
|
|
- `[Init]` de projeto,
|
|
- e `[Frame]`
|
|
se compõem até virar o wrapper físico publicado;
|
|
4. a explicação didática em `learn` deve privilegiar exemplos concretos de source e composição, não apenas descrição abstrata do pipeline.
|
|
|
|
## Expected Spec Material
|
|
|
|
Se esta agenda fechar, a propagação esperada atinge pelo menos:
|
|
|
|
- `13. Lowering IRBackend Specification.md`
|
|
- specs gerais de lowering/backend fora do domínio PBS, se necessário
|
|
- `12. Diagnostics Specification.md`
|
|
|
|
## Non-Goals
|
|
|
|
Esta agenda não deve:
|
|
|
|
1. redefinir surface syntax;
|
|
2. redefinir lifecycle;
|
|
3. redefinir manifest publication;
|
|
4. fechar catálogo final de fixtures.
|
|
|
|
## Next Step
|
|
|
|
Depois de fechar esta agenda, abrir ou aprofundar:
|
|
|
|
- `19.5. Diagnostics, Manifest Propagation, and Conformance Coverage Agenda`
|