Curso de Basic
Interpretadores x Compiladores
Você está em: MarMSX >> Cursos >> BASIC
[Artigo publicado na revista argentina Load MSX #37.]
Sobre compiladores e interpretadores
Todo computador digital manipula, por definição, exclusivamente códigos binários, que são interpretados pela CPU (Central Processing Unit, Unidade Central de Processamento) para executar comandos bem simples de manipulação de dados e cálculos elementares tais como soma e resto. Estes códigos são representados internamente através de longas cadeias de uns e zeros.
Entretanto, o computador MSX, por exemplo, é capaz de processar muito bem instruções como PRINT 3*SQRT(4)/36. De onde surge essa capacidade que, por si só, aparentemente é incompatível com o funcionamento da CPU? De um programa incorporado ao computador que se chama intérprete MSX Basic.
Esse intérprete é um programa em linguagem de máquina cuja tarefa consiste em traduzir para a linguagem de máquina as instruções que recebe em Basic. Uma vez que as instruções estejam em código de máquina, a CPU está pronta para trabalhar com elas, e portanto, entendê-las.
Dito isso, concluímos que a CPU não entende realmente o Basic, porque antes que possa executar programas escritos em tal linguagem, tem que traduzi-lo todo para a linguagem de máquina. É como quando alguém fala conosco, por exemplo em francês, e não entendemos esse idioma. Para comunicarmos com ele, necessitamos de um bom dicionário ou um intérprete que vai traduzindo para nós do francês para o português.
Analogamente, a parte do sistema operacional que realiza esse trabalho de tradução se chama intérprete do Basic. A "tradução" se realiza cada vez que executam as sentenças. O tempo necessário para realizar esta tradução se soma ao tempo de execução do processo especificado pelas sentenças.
Uma vez definido o que é um intérprete, passamos a analisar o que é um compilador e quais as suas vantagens frente ao intérprete.
Compilador vs intérprete
O ato de ter que se traduzir as instruções Basic antes de poder trabalhar com elas explica porque é mais lento utilizar programas escritos em Basic que os escritos em linguagem de máquina, por exemplo. o processo de traduzir uma linguagem para a outra leva tempo, além das instruções resultantes em código de máquina não serem tão eficientes para o tipo de função para o qual foram desenhadas.
Entretanto, um programa escrito em linguagem de máquina possui várias desvantagens frente ao intérprete. As mais destacadas são as seguintes:
- Os programas em linguagem de máquina são difíceis de ler e neles se complica a detecção de erros.
- São específicos para cada tipo de computador (não são portáveis).
- É utilizada uma grande quantidade de instruções.
- Os programas que utilizam aritmética complicada são difíceis de programar.
Por isso, como solução intermediária surge o compilador.
O processo de tradução de um programa Basic para o código de máquina utilizando o intérprete se realiza instrução a instrução. Assim, no seguinte programa:
10 FOR I=1 TO 100
20 PRINT I;
30 NEXT I
A linha 20 é traduzida 100 vezes, pois ainda que a instrução "PRINT I;" tenha sido traduzida, na segunda vez da execução o intérprete "esquece" a sua tradução anterior. O compilador, por sua vez, realiza uma tarefa similar a do intérprete. Entretanto, a realiza apenas uma vez.
Como o intérprete, o compilador traduz uma a uma as instruções Basic. Mas, a grande diferença está que o compilador traduz todo o programa em uma operação apenas, gerando uma versão completa do mesmo em código de máquina, que armazena como uma versão "objeto".
Seguindo com o exemplo anterior, o compilador traduz a instrução "PRINT I;" uma vez apenas e evita ter que traduzi-la 99 vezes.
Entretanto, tudo tem seu preço. A vantagem de fazer uma tradução única em um compilador tradicional se dilui ao ter que realizar vários passos até que se consiga um programa executável.
Os passo que se devem seguir em um compilador tradicional são estes:
- Utilizar um editor de textos para carregar o programa fonte e gravá-lo (geralmente em disco).
- Rodar o programa compilador que analisará o programa fonte e indicará se houve erros. Nesse caso, devemos ir ao passo a) novamente, e tantas vezes necessárias, até que não hajam erros de compilação (por exemplo, erros de sintaxe).
- Uma vez que o compilador traduziu com sucesso o programa fonte, gera outro arquivo denominado "código intermediário", que é um programa que está mais próximo da linguagem de máquina. Entretanto, falta ainda certas definições ("linkedição", em linguagem de informática. Consiste em transformar em endereços de memória definitivos as que geram o compilador, geralmente não fixadas, senão como de maneira relativa).
- Uma vez compilado o programa, se executa o mesmo para verificar que não hajam erros de lógica. Em caso de existir, o programa fonte deverá ser corrigido e repetir todo o processo de compilação até que se consiga que ele execute corretamente.
Material adicional - por MarMSX
O artigo exposto nos mostra o porquê dos programas em Basic serem bem mais lentos do que os programas compilados ou em linguagem de máquina. Entretanto, veremos como nos aproveitar do modo de interpretação para realizar tarefas mais rápidas no MSX, como por exemplo, a impressão de caracteres.
Como funciona a interpretação do comando PRINT? O interpretador identifica o comando PRINT, e então busca pela expressão ou texto a ser impresso. Nesse processo, todo o texto é impresso em linguagem de máquina. Dessa forma, o leitor já deve ter concluído que é mais vantajoso colocar uma string longa para ser impressa pelo comando PRINT executado uma vez, do que criar um loop para imprimir caractere a caractere.
Façamos a comparação. Primeiro o modo loop.
10 SCREEN 0:CLEAR 500
20 A$=STRING$(200,"A")
30 TIME=0
40 FOR I=1 TO 200
50 PRINT MID$(A$,I,1);
60 NEXT
70 PRINT"Tempo:";TIME/60;"segundos."
Saída:
Tempo: 1.183 segundos.
Depois, a impressão direta.
10 SCREEN 0:CLEAR 500
20 A$=STRING$(200,"A")
30 TIME=0
40 PRINT A$
50 PRINT"Tempo:";TIME/60;"segundos."
Saída:
Tempo: 0.1 segundos.
De forma análoga, vimos no capítulo 4 que é mais vantajoso utilizar comandos próprios do Basic que realizam diversos passos, do que realizar esses passos manualmente. Assim, vimos que utilizar o comando SWAP produz um resultado mais rápido do que realizar a troca de valores de variáveis na "mão". Isso porque tudo é feito em linguagem de máquina no SWAP.
Referências:
1. Turbo Basic, Hugo Caro. Revista Load MSX #37, Argentina. Tradução: Marcelo Silveira.