update VM specs
This commit is contained in:
parent
acd09a6468
commit
415b10bebc
@ -1,306 +1,405 @@
|
|||||||
< [Voltar](chapter-1.md) | [Sumário](table-of-contens.md) | [Adiante](chapter-3.md) >
|
< [Voltar](chapter-1.md) | [Sumário](table-of-contens.md) | [Adiante](chapter-3.md) >
|
||||||
|
|
||||||
# ⚙️ **PROMETEU VM Instruction Set**
|
# ⚙️ ** PVM (PROMETEU VM) — Instruction Set**
|
||||||
|
|
||||||
## 1. Visão Geral
|
## 1. Visão Geral
|
||||||
|
|
||||||
A **PROMETEU VM** é uma **máquina virtual stack-based**, determinística e orientada a ciclos.
|
A **PROMETEU VM** é uma máquina virtual:
|
||||||
|
|
||||||
Seu Instruction Set foi projetado para:
|
* **stack-based**
|
||||||
|
* determinística
|
||||||
|
* orientada a ciclos
|
||||||
|
* projetada para ensino e inspeção
|
||||||
|
|
||||||
- ser **facilmente compreendido**
|
Ela existe para:
|
||||||
- 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.
|
* mapear conceitos de linguagens de alto nível
|
||||||
Simplicidade é uma característica pedagógica, não uma limitação.
|
* tornar custo computacional visível
|
||||||
>
|
* permitir análise de execução
|
||||||
|
* servir como base do cartucho PROMETEU
|
||||||
|
|
||||||
|
> A PROMETEU VM é simples por escolha.
|
||||||
|
> Simplicidade é uma ferramenta pedagógica.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 2. Modelo de Execução da VM
|
## 2. Modelo de Execução
|
||||||
|
|
||||||
### 2.1 Componentes principais
|
### 2.1 Componentes Principais
|
||||||
|
|
||||||
A PROMETEU VM possui:
|
A VM possui:
|
||||||
|
|
||||||
- **Program Counter (PC)** — endereço da próxima instrução
|
* **PC (Program Counter)** — próxima instrução
|
||||||
- **Operand Stack** — pilha de valores
|
* **Operand Stack** — pilha de valores
|
||||||
- **Call Stack** — pilha de chamadas (frames)
|
* **Call Stack** — pilha de frames
|
||||||
- **Heap** — memória dinâmica
|
* **Heap** — memória dinâmica
|
||||||
- **Global Space** — variáveis globais
|
* **Globals** — variáveis globais
|
||||||
- **Constant Pool** — literais e referências
|
* **Constant Pool** — literais e referências
|
||||||
|
* **ROM** — bytecode do cartucho
|
||||||
|
* **RAM** — dados mutáveis
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 2.2 Ciclo de execução da VM
|
### 2.2 Ciclo de Execução
|
||||||
|
|
||||||
Cada instrução segue o ciclo:
|
Cada instrução executa:
|
||||||
|
|
||||||
```
|
```
|
||||||
FETCH → DECODE →EXECUTE → ADVANCE PC
|
FETCH → DECODE → EXECUTE → ADVANCE PC
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Cada instrução:
|
Propriedades:
|
||||||
|
|
||||||
- consome um número fixo de **ciclos**
|
* toda instrução tem custo fixo em ciclos
|
||||||
- tem efeitos observáveis na pilha/memória
|
* não há trabalho implícito invisível
|
||||||
- nunca executa trabalho implícito oculto
|
* execução é totalmente determinística
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 3. Tipos Fundamentais da VM
|
## 3. Tipos Fundamentais
|
||||||
|
|
||||||
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 ao heap |
|
||||||
|
|
||||||
| Tipo | Descrição |
|
Não existem:
|
||||||
| --- | --- |
|
|
||||||
| `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.
|
* coerções mágicas
|
||||||
>
|
* casts implícitos
|
||||||
|
* overflows silenciosos
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 4. Convenções da Pilha
|
## 4. Convenções da Pilha
|
||||||
|
|
||||||
- Operações consomem operandos **do topo da pilha**
|
* Operações usam o topo da pilha
|
||||||
- Resultados são empilhados
|
* Resultado sempre volta para a pilha
|
||||||
- A pilha cresce para cima
|
* Último empilhado = primeiro consumido
|
||||||
- Ordem: **último empilhado = primeiro consumido**
|
|
||||||
|
|
||||||
Exemplo:
|
Exemplo:
|
||||||
|
|
||||||
```
|
```
|
||||||
PUSH3
|
PUSH_CONST 3
|
||||||
PUSH4
|
PUSH_CONST 4
|
||||||
ADD
|
ADD
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Stack:
|
Estado:
|
||||||
|
|
||||||
```
|
```
|
||||||
[3]
|
[3]
|
||||||
[3, 4]
|
[3, 4]
|
||||||
[7]
|
[7]
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 5. Categorias de Instruções
|
## 5. Categorias de Instruções
|
||||||
|
|
||||||
O Instruction Set é organizado por função:
|
|
||||||
|
|
||||||
1. Controle de fluxo
|
1. Controle de fluxo
|
||||||
2. Pilha
|
2. Pilha
|
||||||
3. Aritmética e lógica
|
3. Aritmética e lógica
|
||||||
4. Variáveis
|
4. Variáveis
|
||||||
5. Funções
|
5. Funções
|
||||||
6. Heap e estruturas
|
6. Heap e estruturas
|
||||||
7. Interação com periféricos
|
7. Periféricos (syscalls)
|
||||||
8. Sistema
|
8. Sistema
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 6. Instruções da VM (v0.1)
|
## 6. Instruções — VM Set 1
|
||||||
|
|
||||||
### 6.1 Controle de Execução
|
### 6.1 Controle de Execução
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos | Descrição |
|
||||||
| --- | --- | --- |
|
| ------------------- | ------ | ----------------------- |
|
||||||
| `NOP` | 1 | Não faz nada |
|
| `NOP` | 1 | Não faz nada |
|
||||||
| `HALT` | 1 | Encerra execução |
|
| `HALT` | 1 | Encerra execução |
|
||||||
| `JMP addr` | 2 | Salta para endereço |
|
| `JMP addr` | 2 | Salto incondicional |
|
||||||
| `JMP_IF_FALSE addr` | 3 | Salta se topo da pilha for falso |
|
| `JMP_IF_FALSE addr` | 3 | Salta se topo for falso |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.2 Operações de Pilha
|
### 6.2 Pilha
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos | Descrição |
|
||||||
| --- | --- | --- |
|
| -------------- | ------ | ----------------- |
|
||||||
| `PUSH_CONST k` | 2 | Empilha constante |
|
| `PUSH_CONST k` | 2 | Empilha constante |
|
||||||
| `POP` | 1 | Remove topo da pilha |
|
| `POP` | 1 | Remove topo |
|
||||||
| `DUP` | 1 | Duplica topo |
|
| `DUP` | 1 | Duplica topo |
|
||||||
| `SWAP` | 1 | Troca dois topos |
|
| `SWAP` | 1 | Troca dois topos |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.3 Aritmética
|
### 6.3 Aritmética
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos |
|
||||||
| --- | --- | --- |
|
| --------- | ------ |
|
||||||
| `ADD` | 2 | Soma |
|
| `ADD` | 2 |
|
||||||
| `SUB` | 2 | Subtração |
|
| `SUB` | 2 |
|
||||||
| `MUL` | 4 | Multiplicação |
|
| `MUL` | 4 |
|
||||||
| `DIV` | 6 | Divisão |
|
| `DIV` | 6 |
|
||||||
|
|
||||||
> Custos refletem complexidade relativa, não tempo real.
|
|
||||||
>
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.4 Comparações e Lógica
|
### 6.4 Comparação e Lógica
|
||||||
|
|
||||||
| Instrução | Ciclos |
|
| Instrução | Ciclos |
|
||||||
| --- | --- |
|
| --------- | ------ |
|
||||||
| `EQ` | 2 |
|
| `EQ` | 2 |
|
||||||
| `NEQ` | 2 |
|
| `NEQ` | 2 |
|
||||||
| `LT` | 2 |
|
| `LT` | 2 |
|
||||||
| `GT` | 2 |
|
| `GT` | 2 |
|
||||||
| `AND` | 2 |
|
| `AND` | 2 |
|
||||||
| `OR` | 2 |
|
| `OR` | 2 |
|
||||||
| `NOT` | 1 |
|
| `NOT` | 1 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.5 Variáveis e Escopos
|
### 6.5 Variáveis
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos | Descrição |
|
||||||
| --- | --- | --- |
|
| -------------- | ------ | -------------- |
|
||||||
| `GET_GLOBAL idx` | 3 | Lê global |
|
| `GET_GLOBAL i` | 3 | Lê global |
|
||||||
| `SET_GLOBAL idx` | 3 | Escreve global |
|
| `SET_GLOBAL i` | 3 | Escreve global |
|
||||||
| `GET_LOCAL idx` | 2 | Lê local |
|
| `GET_LOCAL i` | 2 | Lê local |
|
||||||
| `SET_LOCAL idx` | 2 | Escreve local |
|
| `SET_LOCAL i` | 2 | Escreve local |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.6 Funções e Chamadas
|
### 6.6 Funções
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos | Descrição |
|
||||||
| --- | --- | --- |
|
|----------------| ------ |---------------------------------|
|
||||||
| `CALL addr` | 5 | Chamada de função |
|
| `CALL addr` | 5 | Chamada |
|
||||||
| `RET` | 4 | Retorno |
|
| `RET` | 4 | Retorno |
|
||||||
| `PUSH_FRAME n` | 3 | Cria frame local |
|
| `PUSH_SCOPE n` | 3 | Cria escopo (frame de execução) |
|
||||||
| `POP_FRAME` | 3 | Remove frame |
|
| `POP_SCOPE` | 3 | Remove escopo |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.7 Heap e Estruturas
|
### 6.7 Heap
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos | Descrição |
|
||||||
| --- | --- | --- |
|
| --------------- | ------ | ------------- |
|
||||||
| `ALLOC size` | 10 | Aloca no heap |
|
| `ALLOC size` | 10 | Aloca no heap |
|
||||||
| `LOAD_REF off` | 3 | Lê campo |
|
| `LOAD_REF off` | 3 | Lê campo |
|
||||||
| `STORE_REF off` | 3 | Escreve campo |
|
| `STORE_REF off` | 3 | Escreve campo |
|
||||||
|
|
||||||
> Toda alocação tem custo explícito.
|
Heap é:
|
||||||
>
|
|
||||||
>
|
* finito
|
||||||
> O heap é finito e monitorado.
|
* monitorado
|
||||||
>
|
* contabilizado no CAP
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
### 6.8 Periféricos (Chamadas Nativas)
|
### 6.8 Periféricos (Syscalls)
|
||||||
|
|
||||||
| Instrução | Ciclos | Descrição |
|
| Instrução | Ciclos | Descrição |
|
||||||
| --- | --- | --- |
|
| ---------------- | -------- | ------------------- |
|
||||||
| `CALL_NATIVE id` | variável | Chamada ao sistema |
|
| `CALL_NATIVE id` | variável | Chamada ao hardware |
|
||||||
|
|
||||||
Exemplos:
|
Exemplos:
|
||||||
|
|
||||||
- `gfx.sprite`
|
* `gfx.clear`
|
||||||
- `input.btn`
|
* `gfx.fillRect`
|
||||||
- `audio.play`
|
* `gfx.present`
|
||||||
|
* `input.get`
|
||||||
|
* `audio.play`
|
||||||
|
|
||||||
O custo depende do periférico e é **documentado separadamente**.
|
O custo depende do periférico e entra no CAP.
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 7. Erros de Execução
|
## 7. Erros de Execução
|
||||||
|
|
||||||
Erros são **explícitos e fatais**, nunca silenciosos:
|
Erros são:
|
||||||
|
|
||||||
- stack underflow
|
* explícitos
|
||||||
- acesso inválido ao heap
|
* fatais
|
||||||
- tipo incompatível
|
* nunca silenciosos
|
||||||
- frame inválido
|
|
||||||
|
|
||||||
Todos geram:
|
Tipos:
|
||||||
|
|
||||||
- mensagem clara
|
* stack underflow
|
||||||
- estado da VM
|
* tipo inválido
|
||||||
- stack trace
|
* heap inválido
|
||||||
|
* frame inválido
|
||||||
|
|
||||||
|
Geram:
|
||||||
|
|
||||||
|
* mensagem clara
|
||||||
|
* dump de estado
|
||||||
|
* stack trace
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 8. Determinismo e Garantias
|
## 8. Determinismo
|
||||||
|
|
||||||
A PROMETEU VM garante:
|
Garantias:
|
||||||
|
|
||||||
- mesma sequência de instruções → mesmo resultado
|
* mesma entrada → mesmo resultado
|
||||||
- mesmos ciclos → mesma certificação
|
* mesma sequência → mesmos ciclos
|
||||||
- nenhuma otimização invisível
|
* sem execução especulativa
|
||||||
- nenhuma execução especulativa
|
* sem otimizações invisíveis
|
||||||
|
|
||||||
> Se você vê a instrução, você paga por ela.
|
> Se você vê a instrução, você paga por ela.
|
||||||
>
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 9. Relação com Linguagens de Alto Nível
|
## 9. Relação com Linguagens
|
||||||
|
|
||||||
Java, TypeScript e Lua são:
|
Java, TypeScript, Lua etc:
|
||||||
|
|
||||||
- **linguagens-fonte**
|
* são linguagens-fonte
|
||||||
- compiladas para este Instruction Set
|
* compiladas para esse bytecode
|
||||||
- nunca executadas diretamente
|
* nunca executadas diretamente
|
||||||
|
|
||||||
Diferentes linguagens:
|
Todas rodam na **mesma VM**.
|
||||||
|
|
||||||
- geram bytecode diferente
|
|
||||||
- mas executam na **mesma máquina**
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 10. Exemplo Completo
|
## 10. Exemplo
|
||||||
|
|
||||||
### Código fonte (conceitual)
|
Fonte:
|
||||||
|
|
||||||
```java
|
```java
|
||||||
x =3 +4;
|
x = 3 + 4;
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Bytecode PROMETEU
|
Bytecode:
|
||||||
|
|
||||||
```
|
```
|
||||||
PUSH_CONST3
|
PUSH_CONST 3
|
||||||
PUSH_CONST4
|
PUSH_CONST 4
|
||||||
ADD
|
ADD
|
||||||
SET_GLOBAL0
|
SET_GLOBAL 0
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### Custo total
|
Custo:
|
||||||
|
|
||||||
```
|
```
|
||||||
2 + 2 + 2 + 3 = 9 cycles
|
2 + 2 + 2 + 3 = 9 ciclos
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 11. Extensibilidade
|
## 11. Execução por Tick
|
||||||
|
|
||||||
O Instruction Set é **versionado**.
|
A VM não roda infinitamente.
|
||||||
|
|
||||||
Novas versões podem adicionar:
|
Ela executa:
|
||||||
|
|
||||||
- instruções vetoriais
|
* até consumir o budget do **frame lógico**
|
||||||
- instruções de DMA
|
* ou até `HALT`
|
||||||
- instruções de streaming
|
|
||||||
- coprocessadores fictícios
|
O budget é definido pelo hardware lógico do PROMETEU (ex.: `CYCLES_PER_FRAME`).
|
||||||
|
|
||||||
|
Exemplo:
|
||||||
|
|
||||||
|
```
|
||||||
|
vm.step_budget(10_000)
|
||||||
|
```
|
||||||
|
|
||||||
|
Isso alimenta:
|
||||||
|
|
||||||
|
* CAP
|
||||||
|
* profiling
|
||||||
|
* certificação
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 12. Frame Lógico e `FRAME_SYNC`
|
||||||
|
|
||||||
|
O PROMETEU define **frame lógico** como a unidade mínima de atualização consistente do jogo.
|
||||||
|
|
||||||
|
* **Input é latched por frame lógico** (não muda enquanto o frame lógico não for concluído).
|
||||||
|
* O **budget de ciclos** é aplicado ao frame lógico.
|
||||||
|
* Um novo frame lógico só começa quando o frame atual termina.
|
||||||
|
|
||||||
|
### 12.1 Instrução de Sistema: `FRAME_SYNC`
|
||||||
|
|
||||||
|
A instrução `FRAME_SYNC` marca o **fim do frame lógico**.
|
||||||
|
|
||||||
|
| Instrução | Ciclos | Descrição |
|
||||||
|
| ------------ | ------ | ----------------------------- |
|
||||||
|
| `FRAME_SYNC` | 1 | Finaliza o frame lógico atual |
|
||||||
|
|
||||||
|
Propriedades:
|
||||||
|
|
||||||
|
* `FRAME_SYNC` é uma **instrução do sistema**.
|
||||||
|
* Não deve ser exposta como API “manual” ao usuário.
|
||||||
|
* O tooling/compilador pode **injetar** `FRAME_SYNC` automaticamente ao final do loop principal.
|
||||||
|
|
||||||
|
### 12.2 Semântica (o que acontece quando executa)
|
||||||
|
|
||||||
|
Ao executar `FRAME_SYNC`, o core:
|
||||||
|
|
||||||
|
1. **Finaliza** o frame lógico atual.
|
||||||
|
2. **Apresenta** o frame (`gfx.present()` ou `gfx.compose_and_present()` conforme o modelo do GFX).
|
||||||
|
3. **Libera** o latch de input.
|
||||||
|
4. **Reseta** o budget para o próximo frame lógico.
|
||||||
|
|
||||||
|
### 12.3 Overbudget (quando o frame não termina a tempo)
|
||||||
|
|
||||||
|
Se o budget do frame lógico acabar **antes** da VM alcançar `FRAME_SYNC`:
|
||||||
|
|
||||||
|
* a VM **pausa** (PC e pilhas permanecem no ponto exato)
|
||||||
|
* **não há present**
|
||||||
|
* o latch de input é **mantido**
|
||||||
|
* no próximo tick do host, a VM **continua** de onde parou, ainda no mesmo frame lógico
|
||||||
|
|
||||||
|
Efeito prático:
|
||||||
|
|
||||||
|
* se o código precisa de 2 budgets para alcançar `FRAME_SYNC`, o jogo passa a atualizar a ~30 FPS (frame lógico leva 2 ticks)
|
||||||
|
* isso é determinístico e reportável no CAP
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. Boot e Cartucho
|
||||||
|
|
||||||
|
O core:
|
||||||
|
|
||||||
|
* valida cartucho
|
||||||
|
* carrega ROM e dados
|
||||||
|
* seta PC inicial
|
||||||
|
* entra em modo RUN
|
||||||
|
|
||||||
|
O cartucho:
|
||||||
|
|
||||||
|
* contém bytecode
|
||||||
|
* assets
|
||||||
|
* metadata
|
||||||
|
* entry point
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 13. Extensibilidade
|
||||||
|
|
||||||
|
O Instruction Set é versionado.
|
||||||
|
|
||||||
|
Futuro:
|
||||||
|
|
||||||
|
* DMA
|
||||||
|
* streaming
|
||||||
|
* vetores
|
||||||
|
* coprocessadores fictícios
|
||||||
|
|
||||||
Nenhuma instrução existente muda de significado.
|
Nenhuma instrução existente muda de significado.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 14. Resumo
|
||||||
|
|
||||||
|
* VM stack-based
|
||||||
|
* custo explícito
|
||||||
|
* execução determinística
|
||||||
|
* integrada ao CAP
|
||||||
|
* base de todo cartucho PROMETEU
|
||||||
|
|
||||||
< [Voltar](chapter-1.md) | [Sumário](table-of-contens.md) | [Adiante](chapter-3.md) >
|
< [Voltar](chapter-1.md) | [Sumário](table-of-contens.md) | [Adiante](chapter-3.md) >
|
||||||
Loading…
x
Reference in New Issue
Block a user