< [Voltar](chapter-1.md) | [Sumário](table-of-contens.md) | [Adiante](chapter-3.md) > # ⚙️ **PROMETEU VM Instruction Set** ## 1. Visão Geral A **PROMETEU VM** é uma **máquina virtual stack-based**, determinística e orientada a ciclos. Seu Instruction Set foi projetado para: - ser **facilmente compreendido** - mapear diretamente conceitos de linguagens de alto nível - expor claramente custo de execução - permitir inspeção completa da pilha e da memória > A PROMETEU VM é intencionalmente simples. Simplicidade é uma característica pedagógica, não uma limitação. > --- ## 2. Modelo de Execução da VM ### 2.1 Componentes principais A PROMETEU VM possui: - **Program Counter (PC)** — endereço da próxima instrução - **Operand Stack** — pilha de valores - **Call Stack** — pilha de chamadas (frames) - **Heap** — memória dinâmica - **Global Space** — variáveis globais - **Constant Pool** — literais e referências --- ### 2.2 Ciclo de execução da VM Cada instrução segue o ciclo: ``` FETCH → DECODE →EXECUTE → ADVANCE PC ``` Cada instrução: - consome um número fixo de **ciclos** - tem efeitos observáveis na pilha/memória - nunca executa trabalho implícito oculto --- ## 3. Tipos Fundamentais da VM A PROMETEU VM suporta um conjunto **mínimo e explícito** de tipos: | Tipo | Descrição | | --- | --- | | `number` | ponto flutuante (64-bit) | | `boolean` | verdadeiro / falso | | `string` | UTF-8 imutável | | `null` | ausência de valor | | `ref` | referência para heap | > Não existem tipos implícitos, coerções mágicas ou overflows silenciosos. > --- ## 4. Convenções da Pilha - Operações consomem operandos **do topo da pilha** - Resultados são empilhados - A pilha cresce para cima - Ordem: **último empilhado = primeiro consumido** Exemplo: ``` PUSH3 PUSH4 ADD ``` Stack: ``` [3] [3, 4] [7] ``` --- ## 5. Categorias de Instruções O Instruction Set é organizado por função: 1. Controle de fluxo 2. Pilha 3. Aritmética e lógica 4. Variáveis 5. Funções 6. Heap e estruturas 7. Interação com periféricos 8. Sistema --- ## 6. Instruções da VM (v0.1) ### 6.1 Controle de Execução | Instrução | Ciclos | Descrição | | --- | --- | --- | | `NOP` | 1 | Não faz nada | | `HALT` | 1 | Encerra execução | | `JMP addr` | 2 | Salta para endereço | | `JMP_IF_FALSE addr` | 3 | Salta se topo da pilha for falso | --- ### 6.2 Operações de Pilha | Instrução | Ciclos | Descrição | | --- | --- | --- | | `PUSH_CONST k` | 2 | Empilha constante | | `POP` | 1 | Remove topo da pilha | | `DUP` | 1 | Duplica topo | | `SWAP` | 1 | Troca dois topos | --- ### 6.3 Aritmética | Instrução | Ciclos | Descrição | | --- | --- | --- | | `ADD` | 2 | Soma | | `SUB` | 2 | Subtração | | `MUL` | 4 | Multiplicação | | `DIV` | 6 | Divisão | > Custos refletem complexidade relativa, não tempo real. > --- ### 6.4 Comparações e Lógica | Instrução | Ciclos | | --- | --- | | `EQ` | 2 | | `NEQ` | 2 | | `LT` | 2 | | `GT` | 2 | | `AND` | 2 | | `OR` | 2 | | `NOT` | 1 | --- ### 6.5 Variáveis e Escopos | Instrução | Ciclos | Descrição | | --- | --- | --- | | `GET_GLOBAL idx` | 3 | Lê global | | `SET_GLOBAL idx` | 3 | Escreve global | | `GET_LOCAL idx` | 2 | Lê local | | `SET_LOCAL idx` | 2 | Escreve local | --- ### 6.6 Funções e Chamadas | Instrução | Ciclos | Descrição | | --- | --- | --- | | `CALL addr` | 5 | Chamada de função | | `RET` | 4 | Retorno | | `PUSH_FRAME n` | 3 | Cria frame local | | `POP_FRAME` | 3 | Remove frame | --- ### 6.7 Heap e Estruturas | Instrução | Ciclos | Descrição | | --- | --- | --- | | `ALLOC size` | 10 | Aloca no heap | | `LOAD_REF off` | 3 | Lê campo | | `STORE_REF off` | 3 | Escreve campo | > Toda alocação tem custo explícito. > > > O heap é finito e monitorado. > --- ### 6.8 Periféricos (Chamadas Nativas) | Instrução | Ciclos | Descrição | | --- | --- | --- | | `CALL_NATIVE id` | variável | Chamada ao sistema | Exemplos: - `gfx.sprite` - `input.btn` - `audio.play` O custo depende do periférico e é **documentado separadamente**. --- ## 7. Erros de Execução Erros são **explícitos e fatais**, nunca silenciosos: - stack underflow - acesso inválido ao heap - tipo incompatível - frame inválido Todos geram: - mensagem clara - estado da VM - stack trace --- ## 8. Determinismo e Garantias A PROMETEU VM garante: - mesma sequência de instruções → mesmo resultado - mesmos ciclos → mesma certificação - nenhuma otimização invisível - nenhuma execução especulativa > Se você vê a instrução, você paga por ela. > --- ## 9. Relação com Linguagens de Alto Nível Java, TypeScript e Lua são: - **linguagens-fonte** - compiladas para este Instruction Set - nunca executadas diretamente Diferentes linguagens: - geram bytecode diferente - mas executam na **mesma máquina** --- ## 10. Exemplo Completo ### Código fonte (conceitual) ```java x =3 +4; ``` ### Bytecode PROMETEU ``` PUSH_CONST3 PUSH_CONST4 ADD SET_GLOBAL0 ``` ### Custo total ``` 2 + 2 + 2 + 3 = 9 cycles ``` --- ## 11. Extensibilidade O Instruction Set é **versionado**. Novas versões podem adicionar: - instruções vetoriais - instruções de DMA - instruções de streaming - coprocessadores fictícios Nenhuma instrução existente muda de significado. < [Voltar](chapter-1.md) | [Sumário](table-of-contens.md) | [Adiante](chapter-3.md) >