8.0 KiB
18.3. Backend Workshop 3 - Bytecode Marshaling and Runtime Conformance
Status: Ready for Closure (v1 Draft Text)
Purpose
Fechar o contrato de emissão de bytecode/PBX a partir de IRVM, com conformidade explícita ao loader/verifier/runtime atual.
Context
- O runtime já define layout de módulo, parser de seções e invariantes de load-time.
SYSCé seção obrigatória (mesmo vazia),HOSTCALLé forma pré-load,SYSCALLfinal só após patching do loader.- O verifier rejeita
HOSTCALLnão patchado e valida estrutura de controle/stack sobre imagem final.
Decisions to Produce
- Contrato de marshaling de
IRVM -> BytecodeModule:const_pool,functions,code,debug_info(mínimo obrigatório),exports,syscalls.
- Política de encoding de instruções:
- little-endian,
[opcode u16][immediate],- encoding de saltos/calls conforme ISA.
- Política de emissão de
SYSC:- deduplicação por identidade canônica,
- ordenação por primeira ocorrência,
arg_slots/ret_slotscoerentes com metadado host.
- Contrato explícito “pre-load artifact vs executable image”:
- backend emite
HOSTCALLquando host-backed, - backend não emite
SYSCALLbruto no artefato pré-load, - intrinsics VM-owned seguem caminho distinto.
- backend emite
- Estratégia de conformidade e regressão contra runtime real.
Core Questions
- Qual política oficial de ordenação de funções no bytecode (ordem de source, topo sort, entry-first)?
- Como calcular
code_offset/code_lenpor função em flatten final decode? - Quais hooks mínimos de source attribution serão emitidos no
debug_infov1? - Quais validações o emitter faz antes de serializar vs o que é delegado ao loader/verifier?
- Como padronizar mensagens/erros de marshaling para manter diagnóstico determinístico?
- Qual suíte mínima de integração prova “bytecode emitido roda no runtime” sem packer?
Resolution (v1)
Nao ha open questions bloqueantes remanescentes nesta agenda.
As perguntas desta agenda ficam consideradas resolvidas para v1 pelos termos normativos abaixo.
Normative Text (Draft for Closure)
1) Escopo e fronteira
- Esta agenda define o contrato normativo de marshaling
IRVM -> BytecodeModulepara runtimecore-v1. - O backend executavel MUST produzir artefato pre-load compativel com loader e verifier do runtime.
- Esta agenda nao define packer/cart assembly.
2) Direcao JVM-inspired (adaptada)
- O backend adota modelo de referencia simbolica interna antes de indice numerico final:
- referencias simbolicas existem em
IRVMe no emitter interno; - indices finais (
func_id,sysc_index,intrinsic_id) sao materializados de forma deterministica no marshaling.
- referencias simbolicas existem em
- O runtime continua numeric-only na execucao final.
3) Contrato do BytecodeModule emitido
O emitter MUST preencher:
const_pool,functions,code,exports,syscalls,debug_infoconforme regra minima desta agenda.
O emitter MUST gerar secao SYSC sempre presente (inclusive vazia), conforme contrato do loader.
4) Politica de ordenacao e IDs
- A ordem de funcoes no artefato MUST seguir regra deterministica v1:
- entrypoint no indice
0; - demais funcoes por
(module_key, callable_name, source_start).
- entrypoint no indice
- O mesmo grafo de entrada admitido MUST produzir os mesmos indices e offsets.
SYSCMUST ser deduplicado por(module, name, version)e ordenado por primeira ocorrencia.
5) Layout de codigo por funcao
- O emitter SHOULD construir codigo por funcao (modelo method-local) e flatten apenas no passo final.
- No artefato final:
code_offsetMUST ser crescente e unico por funcao;code_lenMUST refletir exatamente o trecho da funcao;code_offset + code_lende cada funcao MUST estar dentro decode.len.
- A concatenacao final MUST ser deterministica.
6) Encoding de instrucao
- Encoding MUST ser little-endian.
- Layout de instrucao MUST ser
[opcode: u16][immediate]. - Saltos MUST usar imediato
u32relativo ao inicio da funcao. - O emitter MUST respeitar tamanhos de imediato definidos pela Core ISA alvo.
7) Pre-load vs executable image
- Para chamadas host-backed, o backend MUST emitir
HOSTCALL <sysc_index>no artefato pre-load. - O backend MUST NOT emitir
SYSCALL <id>bruto no artefato pre-load. - Chamadas VM-owned MUST seguir caminho de
INTRINSIC <id_final>e permanecer distintas deSYSC/HOSTCALL/SYSCALL. - O backend MUST assumir que patch
HOSTCALL -> SYSCALLe responsabilidade do loader.
8) Coerencia ABI de host bindings
- Cada entrada
SYSCMUST carregarmodule,name,version,arg_slots,ret_slots. - O emitter MUST validar coerencia de ABI declarada com metadado host conhecido no alvo de compilacao.
- Mismatch detectavel no compile target MUST falhar no compilador antes da serializacao final.
9) Debug minimo v1 (inspirado em line tables)
debug_infov1 MUST incluir:function_namespara todos osfunc_idxemitidos;pc_to_spanpara todo inicio de instrucao emitida.
- O objetivo minimo e preservar atribuicao de fonte acionavel para falhas backend/runtime que permaneçam source-atribuiveis.
10) Fronteira de validacao por camada
Modelo inspirado em separacao JVM (format/link/verify), adaptado:
- emitter valida formato e invariantes de marshaling;
- loader valida resolucao canonica, capability e ABI host;
- verifier valida estrutura de controle e pilha na imagem patchada.
O backend MUST executar prechecks de marshaling sem substituir a autoridade do loader/verifier.
11) Taxonomia de erros de marshaling
O backend MUST expor codigos estaveis para erros de marshaling em familias:
MARSHAL_FORMAT_*,MARSHAL_LINKAGE_*,MARSHAL_VERIFY_PRECHECK_*.
Quando atribuivel, diagnostico MUST incluir ancora de fonte primaria.
12) Otimizacao: criterio de responsabilidade
- Otimizacao semantica/estrutural de programa MUST ocorrer no backend (compile-time).
- Runtime MUST permanecer focado em carregamento, validacao e execucao deterministica.
- Ajustes internos de runtime sao permitidos apenas se nao alterarem semantica do programa nem contrato observavel de bytecode.
13) Suite minima Gate I (sem packer)
A conformidade minima de integracao MUST incluir fixtures:
SYSCpresente e vazio (caso sem hostcall);HOSTCALLvalido com patch paraSYSCALL;HOSTCALLcom indice fora de faixa;SYSCdeclarado e nao usado;SYSCALLbruto em artefato pre-load;- mismatch de ABI (
arg_slots/ret_slots); - capability insuficiente em load-time;
- caminho com
INTRINSICvalido.
14) Deferrals explicitos
Sem deferrals de perguntas abertas desta agenda.
Permanecem fora de escopo por fronteira:
- formato de packer/cartucho final;
- superfices avancadas de simbolizacao alem do minimo v1.
Expected Spec Material
- Atualização de
docs/general/specs/15. Bytecode and PBX Mapping Specification.md. - Atualização de
docs/general/specs/19. Verification and Safety Checks Specification.md. - Decision record de “bytecode backend v1 marshaling contract”.
- Plano de testes Gate I para backend executável.
Non-Goals
- Definir fluxo de empacotamento final de cartucho.
- Alterar o contrato do loader/runtime.
- Definir formato final de symbolication completo.
- Cobrir perf tuning de emissor.
Inputs
prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/EmitBytecodePipelineStage.java../runtime/crates/console/prometeu-bytecode/src/model.rs../runtime/crates/console/prometeu-bytecode/src/assembler.rs../runtime/crates/console/prometeu-bytecode/src/program_image.rs../runtime/crates/console/prometeu-vm/src/virtual_machine/loader.rs../runtime/crates/console/prometeu-vm/src/vm_init_error.rs../runtime/crates/console/prometeu-vm/src/verifier.rsdocs/pbs/specs/6.2. Host ABI Binding and Loader Resolution Specification.mddocs/general/specs/15. Bytecode and PBX Mapping Specification.md