10 KiB
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 Agenda19.2. PBS Lifecycle Markers, Program Init, and Frame Root Semantics Agenda19.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_RETownership.
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
IRBackendcarrega 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_RETvindo de19.3; GET_GLOBALeSET_GLOBALjá existem na VM.
Decisions To Produce
Esta agenda deve produzir direção suficiente para fechar:
- se globals entram explicitamente no
IRBackendou apenas em lowering posterior; - como module init é sintetizado;
- como o guard one-shot de boot é materializado;
- como o wrapper é lowered;
- como
FRAME_RETé preservado no ponto correto; - quais contracts gerais de lowering precisam propagação.
Core Questions
IRBackenddeve ganhar representação explícita para globals?- Se não, qual é o boundary intermediário responsável por materializá-los antes de
IRVM? - Module init sintético é emitido como callable próprio por módulo?
- O boot guard é global oculto, local estático de wrapper, ou outra forma interna?
- O wrapper published entrypoint é um callable sintético explícito no graph do frontend?
- Como manter attribution e diagnostics úteis para código sintético?
- Que mudanças mínimas precisam acontecer em specs gerais fora de
docs/compiler/pbs? - 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.
- aumenta o contrato do
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:
- globals devem entrar explicitamente no
IRBackend; - o pipeline não deve adiar globals para uma materialização implícita tardia abaixo desse boundary;
- 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;
- o boot guard deve ser materializado como um global oculto;
- esse global oculto não pode ser referenciado nem alterado por userland;
- o wrapper published entrypoint deve existir explicitamente no graph de lowering;
- o lowering deve seguir direção direta para as operações de globals já suportadas em
IRVM/VM, isto é,GET_GLOBALeSET_GLOBAL; - attribution e diagnostics devem preservar separadamente:
- origem em source userland,
- e origem sintética gerada pelo compiler;
- 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;
- spans e diagnostics devem preferir apontar para código real de userland sempre que essa origem existir;
- o frontend/lowering deve introduzir uma classe explícita de funções sintéticas com ergonomia própria;
- 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:
- callables sintéticos não devem ser tratados como acidentes de emissão;
- eles devem possuir classe/identidade própria no lowering;
- essa classe deve cobrir pelo menos:
- fragmentos de init por arquivo,
- init sintético por módulo,
- init de projeto,
- wrapper físico publicado;
- 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:
- a superfície sintética precisa carregar origem suficiente para remapear erros ao código real;
- quando existir origem userland inequívoca, o diagnóstico deve preferir essa origem em vez de um span puramente sintético;
- 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:
- ele deve existir como global oculto de programa;
- ele pertence ao estado interno publicado pelo compiler;
- userland não pode nomeá-lo, ler seu valor ou alterá-lo;
- 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:
nameownerModuleIdtypeslotvisibilityisHiddenorigin
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_FRAGMENTMODULE_INITPROJECT_INITPUBLISHED_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:
derivedFromFilederivedFromModulederivedFromUserSymbolprimarySpanfallbackSyntheticLabel
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
synthetic wrapper entrypoint missing- quando o pipeline não conseguir publicar o wrapper exigido.
published entrypoint is not function index 0- quando o lowering violar o protocolo físico.
hidden boot guard is missing- quando a semântica one-shot exigir o guard e ele não existir.
synthetic callable origin missing- quando o lowering gerar callable sintético sem attribution suficiente para diagnóstico defensável.
Conformance / Fixture Expectations
- fixture com
declare global+[Init]por arquivo +[Init]de projeto +[Frame]; - evidência de geração de:
- file init fragment,
- module init,
- project init,
- published wrapper,
- hidden boot guard;
- evidência de que o wrapper ocupa
func_id = 0; - evidência de que
FRAME_RETestá no wrapper; - 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:
- 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;
learndeve explicar esse modelo de forma didática com exemplos de código source;learndeve mostrar como:declare global,[Init]por arquivo,[Init]de projeto,- e
[Frame]se compõem até virar o wrapper físico publicado;
- a explicação didática em
learndeve 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:
- redefinir surface syntax;
- redefinir lifecycle;
- redefinir manifest publication;
- 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