7.6 KiB
Published Entrypoint, Synthetic Wrapper, and FRAME_RET Ownership 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 Agenda
Purpose
Define how PBS lifecycle is published into the executable artifact once globals and lifecycle semantics are already fixed.
This agenda must close:
- whether the published entrypoint becomes a synthetic wrapper;
- the semantic and publication relationship between user
frame()and the published entrypoint; - the new owner of
FRAME_RET; - and the contract boundary between source-derived entrypoint discovery,
FrontendSpec, and cartridge manifest publication.
Domain Owner
docs/compiler/pbs
Este tema pertence ao domínio PBS porque decide a fronteira entre semântica da linguagem, entrypoint publicado e artefato executável.
Context
Se frame() do usuário deixar de ser o callable publicado diretamente, o compiler precisará publicar outro root executável.
Isso abre quatro perguntas acopladas:
- quem é o entrypoint físico do artefato;
- qual callable continua sendo o root lógico do código do usuário;
- onde
FRAME_RETpassa a ser emitido; - e como manifest e
FrontendSpecrepresentam isso sem ambiguidade.
Esta agenda existe para fechar esse contrato antes de discutir detalhe de representação de IR.
Inputs Already Fixed Elsewhere
Os seguintes inputs devem ser tratados como fixos aqui:
- o modelo de globals vindo de
19.1; - o modelo de lifecycle e markers vindo de
19.2; FRAME_RETcontinua significando fim do frame lógico;- o runtime continua esperando um entrypoint published por frame.
Decisions To Produce
Esta agenda deve produzir direção suficiente para fechar:
- se o published entrypoint é um wrapper sintético;
- qual é a relação entre
frame()do usuário e esse wrapper; - onde
FRAME_RETpassa a viver; - como a autoridade de entrypoint sai de
FrontendSpece passa ao compiler PBS; - como o protocolo de runtime/manifest representa esse entrypoint.
Core Questions
- O compiler deve publicar um wrapper sintético como entrypoint real?
frame()do usuário deixa de ser o callable publicado e passa a ser apenas root lógico interno?FRAME_RETdeve ser emitido no wrapper, não mais no callable do usuário?- O compiler PBS deve se tornar a única autoridade para definir o entrypoint publicado?
- O wrapper sintético deve ocupar protocolarmente o entrypoint físico
0? - O campo
entrypointdeve deixar de existir nomanifest.jsoncomo estado alvo do protocolo? - Existe algum caso em que o wrapper não seja necessário depois de
19.2?
Options
Option A
Publicar um wrapper sintético como entrypoint físico, tratar frame() do usuário como root lógico interno, mover FRAME_RET para o wrapper, tornar o compiler PBS a autoridade exclusiva de entrypoint e fixar protocolarmente o entrypoint físico em 0.
Option B
Manter frame() do usuário como entrypoint publicado e tentar acoplar boot/lifecycle diretamente nele.
Option C
Publicar wrapper sintético, mas manter entrypoint no manifest como autoridade nominal paralela.
Tradeoffs
Option A
- Prós:
- separa lifecycle publicado do callable do usuário;
- acomoda boot one-shot de forma limpa;
- preserva o significado de
FRAME_RETcom owner mais correto. - alinha melhor o protocolo físico do artefato com a política já existente de
func_id = 0como entrypoint; - remove autoridade duplicada entre compiler, manifest e
FrontendSpec.
- Contras:
- exige trabalho claro de migração em manifest, runtime e
FrontendSpec; - torna a relação lógico/físico explicitamente dupla.
- exige trabalho claro de migração em manifest, runtime e
Option B
- Prós:
- preserva a superfície atual de publicação.
- Contras:
- mistura responsabilidades demais no callable do usuário;
- enfraquece a clareza do lifecycle.
Option C
- Prós:
- parece reduzir custo de transição imediata.
- Contras:
- mantém duas autoridades para entrypoint;
- cria dívida documental e de runtime desnecessária;
- enfraquece a ideia de entrypoint como protocolo fixo do artefato.
Recommendation
Seguir com a Option A.
Current Direction
Os pontos abaixo já podem ser tratados como direção fechada desta agenda, salvo objeção nova forte:
- o compiler deve publicar um wrapper sintético como entrypoint físico real;
- esse wrapper deve conter:
- boot one-shot,
- os inits necessários apenas uma vez,
- a chamada ao
frame()do usuário, - e o
FRAME_RETfinal;
frame()anotado com[Frame]permanece como root lógico do usuário;- o wrapper sintético é o root físico publicado;
FRAME_RETsai do final doframe()do usuário e passa a existir no wrapper;FrontendSpecperde autoridade para referenciar quem é o entrypoint;- a autoridade de entrypoint fica outorgada exclusivamente ao compiler PBS;
- o wrapper sintético deve ser compilado no entrypoint físico
0; - o estado alvo do protocolo deve remover
entrypointdomanifest.json; - o runtime/loader deve tratar o entrypoint como protocolo fixo do artefato, não como metadado nominal configurável no manifest.
Manifest and Runtime Direction
Esta agenda também já aponta para a seguinte direção de contrato:
- o campo
entrypointdeve deixar de existir nomanifest.jsoncomo estado final do protocolo; - o runtime deve assumir protocolarmente o entrypoint físico
0; - o compiler garante que esse índice
0pertence ao wrapper sintético publicado; - export nominal do callable deixa de ser a autoridade de boot;
- qualquer compatibilidade temporária com manifest nominal deve ser tratada apenas como transição, não como contrato final desejado.
Exports Boundary
Esta agenda também fecha a seguinte separação:
- exports nominais de funções podem continuar existindo no artefato;
- esses exports deixam de ser usados como autoridade de loader/boot;
- boot passa a depender exclusivamente do entrypoint físico
0publicado pelo compiler; - exports nominais permanecem apenas como superfície útil para tooling, debug, introspection e casos correlatos.
Remaining Open Points
Com a direção acima, os pontos que ainda pedem fechamento real nesta agenda ficam reduzidos a:
- a forma de propagação normativa dessa mudança para specs gerais de bytecode, lowering e cartridge contract.
Runtime Propagation
Esta agenda também deve referenciar explicitamente a discussão correspondente no domínio runtime:
../runtime/docs/runtime/agendas/025-cartridge-manifest-entrypoint-removal-and-runtime-protocol.md
Direção fechada desta agenda:
- não há linha de compatibilidade desejada como estado-alvo;
- a remoção de
entrypointdo runtime deve ser executada em prioridade alinhada ao compiler; - a agenda de runtime é o owner da discussão operacional de loader/VM/manifest no outro domínio.
Expected Spec Material
Se esta agenda fechar, a propagação esperada atinge pelo menos:
9. Dynamic Semantics Specification.md13. Lowering IRBackend Specification.md7. Cartridge Manifest and Runtime Capabilities Specification.md12. Diagnostics Specification.md
Non-Goals
Esta agenda não deve:
- escolher o encoding exato do wrapper no IR;
- definir estrutura detalhada de module init lowering;
- escrever fixtures completos de conformance.
Next Step
Depois de fechar esta agenda, abrir ou aprofundar:
19.4. Globals and Lifecycle Lowering to IRBackend/IRVM Agenda