Máquina Virtual - Lucas-S-T/LittleLanguage GitHub Wiki

Máquina Virtual

Little Language é uma linguagem interpretada que roda em uma Máquina Virtual, sendo capaz de simular: uma Memória Virtual, um Contador de Programa, múltiplas Pilhas(Stacks) e diferentes Conjuntos de Instruções.

Memória

Diferente de um computador normal, Little Language tem uma forma diferente de gerenciar a memória, a Máquina Virtual é equipada com 1024 diferentes ponteiros de memória, ou seja, você poderá alocar apenas 1024 variáveis ao mesmo tempo, porém, não há limites de quantos bytes pode ser alocado em um único ponteiro (Claro, o limite é sua quantidade de RAM).

Conjunto de Instruções

Sempre que uma função é declarada, automaticamente, um novo conjunto de instruções é criado dentro da Máquina Virtual. Assim como a memória, o conjunto de instruções também tem um limite de 1024 conjuntos diferentes. Ou seja você poderá declarar apenas 1023 funções diferentes(1024-1 contando com o conjunto principal de instruções).

Pilha(Stack)

Atualmente a Máquina Virtual contém dois tipos diferentes de pilha, e todas elas tem um tamanho máximo de 1024 valores.

Instruction Set Stack: Essa pilha é responsável por salvar o conjunto de instruções que está sendo executado no momento, quando você chama uma nova função, o conjunto de instruções atual é salvo na pilha e o conjunto principal é alterado para a função anteriormente chamada. Dado o limite da pilha, a quantidade máxima de profundidade de uma função é 1024 chamadas.

Function ID Stack: Sempre que uma nova funcão é chamada, um novo Function ID aleatório é gerado, e o da funcão anterior é salvo nessa Stack para ser recuperado quando a funcão retornar. Isso permite um controle melhor da memória, fazendo a VM ser capaz de limpar as variáveis utilizadas dentro de uma funcão quando a mesma retornar e permitir um escopo de variáveis.

Program Counter Stack: Sempre que o conjunto de instruções é alterado, é necessário salvar o valor atual do contador de programa para ser possível continuar a ordem de execução do conjunto
anterior após o retorno de uma função.

General Stack: Essa é a única Stack que você pode manipular através dos comandos PUSH e POP, ao dar PUSH em uma variável o conteúdo dela é copiado para Stack, seu conteúdo não é perdido, ao dar POP a uma outra variável ela é automaticamente alocada com a mesmo tamanho da Stack, em seguida, ela recebe o conteúdo previamente colocado na pilha.

Contador de Programa

O Contador de Programa sempre irá iniciar em 0, sendo ele, a primeira instrução do conjunto principal de instruções. Sempre que você chama uma função, o Contador de Programa voltará a zero, apontado para a primeira instrução da função chamada. Tenha isso em mente quando utilizar pulos relativos, não é possível pular para fora da função, para sair dela, você deve obrigatoriamente utilizar a instrução RET.