2026-01-12 18:37:53 +00:00

306 lines
5.4 KiB
Markdown

< [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) >