iMática logo
iMática logo2
www.matematica.br

Emulador/Compilador "Computador à Gavetas"

[ Início | Emulador | Compilador | Download]

O Compilador do iCG é bastante simplificado, implementando um sintaxe próxima aquela da linguagem C, entretanto possibilitando anotar os comandos (palavras reservadas) em Português (ou Inglês, multi-lingua).

Este modelo foi construido (e testado) para mostrar ao aprendiz como é possível construir programas complexos a partir de instrucões simples (que na prática, em computodores eletrônicos reais, são implementados por circuitos eletrônicos).

Didaticamente pode-se utilizar uma de duas opcões: a partir das instrucões de máquina (Emulador) deduzir a linguagem de programação; ou a partir dos comandos (Compilador), mostrar como é possível gerar automaticamente o código objeto (linguagem de máquina ou baixo nível).
Particularmente destacamos a primeira opção, que é uma abordagem "de baixo para cima" (bottom up). Ela é bastante interessante por permitir que o próprio aprendiz proponha a generalização de blocos de instrucões para se construir comandos complexos (como uma "Expressão", uma "Atribuição" ou um comando "Se"), podendo assim perceber como se pode "definir" uma linguagem de programação mais alto nível.

Na figura abaixo está (de modo estático, é apenas uma figura) a interface Compilador do iCG. No lado esquerdo, ocupando a maior área, está o local para o usuário digitar seu programa, na linguagem alto nível. Na figura está um código correspondente a soma de valores até que usuário digite o valor "0", quando o laço é interrompido e a soma é apresentada. No lado direito, está o código objeto correspondente ao código fonte. Para simular a execução deste código objeto, deve-se ir para a área do Emulador.


Figura do Compilador contendo um programa com 17 instruções (programa para somar valores até ser digitado um 0)

Os comandos disponíveis no iCG estão descritas na tabela abaixo.

  ItemRepresentaçãoExplicação
Operadores relacionais (ROp)==, !=, <=, >=, <, >operadores para compor Expressões Lógicas
Operadores lógicos (LOp) &&, ||, ! (e, ou e negação)operadores para compor Expressões Aritméticas
Expressão Aritmética (EA) EA+EA, EA-EA, EA*EA, EA/EAExpressões Aritméticas (exemplos: 2+3, 2-3, 2*3, 2/3)
Expressão Lógica (EL) EA ROp EA, EL LOp ELExpressões Lógicas (exemplos: 2<3, a < (2+3), a+1!=3*b/10)
Atribuição"var = EA;"uma variável recebe o valor de uma Expressão Aritméitca (exemplo: s = s+2;)
Seleção "se (EL) BCMD [senao BCMD]"comando de seleção (exemplo: se (a<10) escreva(b); senão escreva(c);)
Repetição "enquanto (EL) BCMD"comando de repetição (exemplo: enquanto (a<10) { escreva(s); s=s+1; a=a+1; })
Entrada "leia(var);"comando de repetição (exemplo: enquanto (a<10) { escreva(s); s=s+1; a=a+1; })
Saída "escreva(var);"comando de repetição (exemplo: enquanto (a<10) { escreva(s); s=s+1; a=a+1; })
Tabela com comandos iCG:

Note que não está implementado saída de constantes (não usar escreva(2)). Se for necessário fazer uma "impressão" de valor, deve-se utilizar uma variável.

No início da aprendizagem de computação, deve-se destacar para o aprendiz dois conceitos básicos. O primeiro é o sentido de um comando como s = s+1;, o qual precisa ser entendido como "variável 's' recebe o valor inicialmente em 's', acrescido do valor '1'". O segundo conceito é que, se o tipo de variável usada for inteiro, a Expressão Lógica 2*(n/2)==2 pode ser falsa, como em n=3: 2*(3/2) = 2*1 = 2. Isso ocorre devido à divisão 3/2 ser feita com precisão inteira, resultando num truncamento dos valores decimais.
Vele ressaltar que no "mundo ideal" da Matemática, a comparação 2*(n/2)==2 resultaria sempre verdadeiro, ou seja, seria uma tautologia.

Para ilustrar a utilidade deste "truque aritmético", podemos usá-lo para determinar se um valor é ou não par. O código iCG para decidir se uma variável guarda um número par ou ímpar, imprimindo "1" se par e "0" se ímpar, poderia ser:

  Código iCGExplicacões sobre os comandos
leia(n);leia um valor armazenando na variável de nome n
sim=1; nao=0; variávels auxiliares para imprimir se n par ou se ímpar
se (2*(n/2)==n) se resultado da EL for verdadeiro execute comando abaixo,
   escreva(sim);    escreva valor "1"
senaosenão execute o comando imediatamente abaixo
   escreva(sim);    escreva valor "0"
Código iCG para decidir se valor é par ou ímpar: par imprime "1", ímpar imprime "0".

Como no iCG todas as variáveis são do tipo de inteiro, foi usado um truque de primeiro dividir n por 2, se n for par resulta um valor, entretanto se for ímpar, perde-se um valor número de 0,5. Essa é a razão da linha se (2*(n/2)==n): se n for par é do tipo 2*k, logo n/2 = (2*k)/2 = k (aqui igualdade matemática, não é atribuição), resultando sempre um valor inteiro, logo será verdade que 2*(n/2)==n.

 

voltar
voltar