sexta-feira, 7 de outubro de 2022

A História esquecida do BASIC Estruturado

Hoje em dia, praticamente todas as linguagens de programação são Estruturadas (não precisam de GOTO). Assim, não é de admirar que este assunto seja praticamente desconhecido actualmente. Se alguém perguntar sobre isso a um estudante de engenharia de programação, a resposta mais provável é que não sabe o que é isso. Mas nem sempre foi assim.

Apesar de em 1958 surgir a linguagem ALGOL 58, a primeira linguagem de programação estruturada, tal passou mais ou menos despercebido porque nessa altura os programas eram pequenos e fáceis de programar.

Depois em 1964 foi inventada a linguagem BASIC. Era uma linguagem com estrutura semelhante à linguagem Assembly de modo a ser mais fácil construir os compiladores e interpretadores.

Exemplo de programa em Assembly:

Endereço, Comando

1234 LD A,25
1236 JP C,1232
1239 ADD A,1
1241 RET

Versão em BASIC:

Número de linha, Comando

1234 LET A=25
1236 IF C THEN GO TO 1232
1239 LET A=A+1
1241 RETURN

Mas, as memórias dos computadores estão sempre a aumentar de capacidade e, por volta de 1970 os programas já eram muito grandes e eram cada vez mais difíceis de programar e manter. Tornava-se necessária uma melhor forma de programar. Foi então que se levou a estruturação a sério e foram criadas a linguagem Pascal (1970) e a linguagem C (1971). A partir daí todas as linguagens começaram a ser estruturadas.

Assim, entre 1970 e 1990 a estruturação era um assunto muito importante e foram publicados dezenas de livros sobre o assunto. Mas a linguagem BASIC esteve muitos anos estagnada e só em 1985 começou a deixar de ter números de linha... Porquê?

A linguagem BASIC, como era fácil de implementar, tornou-se a linguagem preferida dos construtores de microcomputadores. E os microcomputadores não eram considerados como sendo computadores para trabalho a sério.

De vez quando saía uma versão melhor. Por exemplo: SBASIC (1976), BBC Micro (1981) e Sinclair QL (1984). Mas, só em 1985 é que o assunto foi resolvido oficialmente com o artigo "IEEE 755". E, também foi nesse ano que surgiu a linguagem QuickBASIC (mais tarde QBASIC), o primeiro BASIC estruturado sem números de linha.

Em 1987, o Zé Oliveira escreveu uma série de 8 artigos sobre este assunto no MicroSe7e (suplemento do jornal O Se7e). Estas propostas de melhoramento da linguagem BASIC foram implementadas 30 anos depois quando foi lançado o ZX Spectrum Next.

Eis as vantagens do BASIC estruturado:

  •   É mais fácil conseguir que funcione da primeira vez,
  •   É mais fácil de ler,
  •   É mais fácil de alterar, e
  •   É mais fácil de reutilizar.

São necessárias apenas 3 coisas:

  1. Método de programação TOP-DOWN com rotinas: Escreve-se primeiro a rotina principal invocando outras rotinas secundárias e depois faz-se o mesmo com as rotinas secundárias. Cada rotina deve ser o mais pequena possível para se ler e compreender rapidamente e, se for possível, a sua listagem deve caber no écran.
  2. Estruturas de controle (ciclos e condições): FOR-NEXT, REPEAT-UNTIL, WHILE-DO, IF-THEN-ELSEIF-ELSE.
  3. Variáveis locais. Se possível, usar também variáveis locais (apenas visíveis dentro das suas rotinas).

Vejamos alguns exemplos simples de programação estruturada extraídos do livro "Structured BASIC for the IBM PC" (1985), adaptados para funcionar no ZX Spectrum. Comecemos pela parte mais importante da programação estruturada: a técnica TOP-DOWN para dividir as tarefas em rotinas pequenas:

100 REM PROGRAMA Construir2Casas
110 PLOT 0,0
120 GO SUB 200 : REM ConstruirCasa
130 PLOT 150,0
140 GO SUB 200 : REM ConstruirCasa
150 STOP
190 :
200 REM ROTINA ConstruirCasa
210 GO SUB 300 : REM DesenharParedes
220 GO SUB 400 : REM DesenharTelhado
230 RETURN
290 :
300 REM SUBrotina DesenharParedes
310 DRAW 60,0: DRAW 0,30: DRAW -20,0:
315 DRAW 0,-30: DRAW 60,0
320 DRAW 0,50
330 DRAW -100,0
340 DRAW 0,-50
350 RETURN
390 :
400 REM SUBrotina DesenharTelhado
410 DRAW 0,50
420 DRAW 10,20
430 DRAW 80,0
440 DRAW 10,-20
450 RETURN


A parte seguinte dos CICLOS e blocos IF ainda estava um pouco confusa em 1985 - apesar de já estar bem definida desde 1970 na linguagem Pascal...

Em 1985, um ciclo REPEAT seria assim:

100 REM REPEAT
110 PRINT "Dentro do ciclo REPEAT"
120 INPUT A$
130 IF A$ = "STOP" THEN GO TO 150
140 GO TO 100: REM reiniciar ciclo
150 REM UNTIL STOP

Mas, devia ser assim com apenas um GOTO:

100 REM REPEAT
110 PRINT "Dentro do ciclo REPEAT"
120 INPUT A$
130 IF NOT (A$ = "STOP") THEN GO TO 100
140 REM UNTIL A$ = "STOP"

Em 1985, um ciclo WHILE seria assim:

100 INPUT A$
110 REM WHILE A$ <> "STOP"
120 IF NOT (A$ <> "STOP") THEN GO TO 160
130 PRINT "Dentro do ciclo WHILE"
140 INPUT A$
150 GO TO 110: REM reiniciar ciclo
160 REM END WHILE

Note-se que ainda aqui temos os indesejáveis GOTOs.

Em 1985, um bloco IF-THEN-ELSE seria assim:

100 INPUT A$
105 REM IF-THEN-ELSE
110 IF NOT (A$ = "TRUE") THEN GO TO 150: REM ELSE
120 REM IF true THEN
130 PRINT "Condicao verdadeira"
140 GO TO 170
150 REM ELSE
160 PRINT "Condicao falsa"
170 REM END IF

Um facto importante a não esquecer é que é fácil converter um programa escrito numa linguagem estruturada para uma versão em linguagem NÃO estruturada. Mas pode ser muito difícil - ou praticamente impossível -, converter um programa escrito numa linguagem NÃO estruturada para uma versão em linguagem estruturada. Quem tentar tirar os GOTOs dum programa escrito em BASIC depressa verificará isso...

Para ver um exemplo de um livro sobre BASIC estruturado, clicar aqui.

Sem comentários:

Enviar um comentário