306 lines
5.4 KiB
Markdown
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) > |