Introdução

Neste estudo, será utilizado a linguagem de programação denominada Jack, desenvolvida no contexto do projeto Nand2Tetris. Essa é uma linguagem que foi desenvolvida como o objetivo didático, inclusive tendo vários elementos que facilitam o desenvolvimento de um compilador. Pode-se destacar as seguintes características:

Baixem aqui as ferramentas disponibilizadas pelo projeto nand2tetris. Documentação e as ferramentas, estão disponíveis no seguinte site.

A unidade básica de um programa Jack é a classe. Estas são definidas em um arquivo único e compilada separadamente.

Um programa Jack é uma coleção de uma ou mais classes, e uma classe é uma coleção de uma ou mais subrotinas. Uma classe em Jack tem a seguinte estrutura:

    class ClassName {
        variáveis de classe
        variáveis de instância
        
        construtor
        funções (método de classe) 
        métódos (método de instância)
        
    }

Sendo que para ser executado, é necessário que uma das classes seja nomeada como “Main”, e nela possua uma função nomeada de “main”, como no programa mínimo abaixo:

class Main { 
     function void main () {
       var String nome;
       let nome = Keyboard.readLine("Qual o seu nome? ");
       do Output.printString("Ola "); 
       *do Output.printString(nome);* 
       do Output.println(); 
       return;
      }
}

Ferramentas necessárias para testar é o compilador e a maquina virtual.

Compilador, que dado um arquivo na linguagem Jack formato jack, converte para o formato intermediário, que poderá ser executado por um emulador de maquina virtual

VM Emulator, é a máquina virtual, depois de compilado, basta abrir e executar o código no formato .vm

Tipos e valores

A linguagem Jack é uma linguagem estaticamente tipificada, ou seja, toda variável tem que ser declarada previamente e possuir um tipo de dado que não modifica durante a execução.

A linguagem suporta apenas três tipos de dados primitivos:

Tipo Valores
int 2 bytes (-32768 até 32767))
boolean true e false
char unicode (‘a’, ‘x’, ‘+’, ‘%’, ...)

Os tipos de dados compostos são criados a partir da especificação de novas classes.