2008/01/07


GOTO o_chuveiro;

Um famoso debate no mundo da computação é entre aqueles que são "contra" e "a favor" da instrução GOTO. Este debate nunca fez muito sentido pra mim. A instrução GOTO é o cerne de toda a computação, mas é óbvio que é freqüentemente mais útil programar pensando em estruturas como um "for"... Só entendi a briga agora que li aquela carta do Dijkstra que dizem ter inaugurado a polêmica. Esta carta é sempre citada, mas foi raramente lida de fato, fazendo-a sofrer da mesma "síndrome do Necronomicon" que afeta por exemplo o livro Perceptrons de Minsky.

A carta de Dijkstra menciona uma preocupação que nada tem a ver com eficiência de programas, ou de capacidade de representação de linguagens. Dijkstra se preocupava com as limitações cognitivas do homem, e sua capacidade em entender naturalmente um programa de computador. Sua preocupação era com questões envolvidas na gênese da atividade de "programador de computadores", algo que acredito ter sido central em sua vida. Tem a ver ainda com a criação das linguagens de computador.

Acho muito anacrônico as pessoas continuarem esta discussão. Linguagens de computador já existem pra valer, e continuam sendo criadas. A atividade de programador já é algo definitivamente estabelecido. Precisamos considerar que estamos em um contexto diferente do de Dijkstra. É um absurdo transformar aquela questão em uma disputa entre programadores de Java, e projetistas de FPGAs.

Eu sempre simpatizei mais com a turma "a favor" do GOTO por considerar absurda a censura que se impõe sobre esta instrução que, junto da execução condicional, constitui a essência da computação. O que eu nunca havia compreendido é que aqueles que se colocam "contra" a instrução estão preocupados é com a legibilidade de códigos, e a facilidade em se gerar códigos corretos, e não com os fundamentos da teoria da computação e arquitetura de computadores.

Na verdade existem duas atividades distintas, ligadas à computação, onde ocorre um uso parcimonioso ou indiscriminado desta instrução potencialmente críptica. Aqueles preocupados com a manutenção de códigos, ou com a confecção de programas para fins específicos, devem de fato buscar padronizações como as oferecidas pela programação estruturada. Este grupo de pessoas, ao me ver, deveria se identificar com o sentimento de Knuth ao criar a linguagem WEB, e ainda propor que "programas deveriam nascer corretos, e não depurados até a exatidão". Entretanto, Knuth é tido como um opositor de Dijkstra na questão do GOTO...

Existe outro grupo de pessoas que se preocupa com o fenômeno da computação em si, e não com a confecção de programas para serem facilmente lidos por outras pessoas, ou para atender a encomendas. É nesta atividade que pode acontecer de nos depararmos com programas corretos, mas difíceis de compreender. Nestas ocasiões o programa sendo estudado é um enigma sendo resolvido, um código que se decifra. São de fato programas que desafiam as nossas capacidades cognitivas ao tentarmos entendê-los, e é de se compreender que pessoas acostumadas a trabalhar em uma das atividades estranhe os programas que ocorrem na outra.

A criação e análise de programas do primeiro tipo, os claros, naturais e fáceis, são valorizadas por profissionais de diversos tipos, que lidam com questões como manutenção de códigos e portabilidade. No caso de programas crípticos, esta programação é valorizada por um número de pessoas que suponho serem aquelas identificadas como "escovadores de bits". Acredito que o motivo da intensidade nos debates sobre a instrução GOTO se deve ao fato de que estas pessoas se sentem ofendidas pela sugestão de que esta instrução, que é a epítome da atividade desenvolvida por elas, seja considerada como inerentemente maléfica.

Acredito que este grupo de "escovadores de bits" possa ser comparado com os pesquisadores de ciências básicas, como físicos que fazem experimentos com forças básicas de interação na busca de novas formas de obter um certo efeito. Do outro lado teríamos engenheiros e técnicos na busca por dispositivos fáceis de se produzir e utilizar.

Já passou da hora de amadurecer o debate, e ver que não há o que se debater. A remoção do GOTO em linguagens de alto-nível é um fato cada vez mais fortemente estabelecido. Diria ainda que definitivamente, com a criação das instruções "try/catch"... Ou talvez falte ainda uma boa forma de se programar sinteticamente saídas alternativas de procedimentos...

***

Temos que entender que esse debate naquela época tinha a ver com programadores que queriam programar em alto-nível, e eram obrigados a fazer GOTO porque não havia alternativa. Eles queriam se libertar das amarras cognitivas do GOTO. Hoje em dia parece que existe uma tendência de programadores de alto-nível quererem amarrar os de baixo nível, exigindo que estes abandonem o GOTO. Que sentido faz isso?!? Porque as pessoas não podem ser simplesmente felizes no mundo moderno, em que pessoas como Guido van Rossum e Larry Wall podem criar suas linguagens sem o trabalho que isto exigia nos tempos de Grace Hopper?

Os tempos mudaram. Precisamos é avaliar melhor os tais limites cognitivos que interessavam a Dijkstra. Ele percebeu alguns, e lutou contra eles, e foi bem sucedido. Precisamos avançar esse trabalho, mas isto não significa de forma alguma fazer com que os escovadores de bits se ajoelhem e sejam proibidos de criar coisas como programas auto-modificáveis.

Precisamos estudar melhor ainda a forma como pessoas interpretam e escrevem programas. Precisamos entender melhor o processo, agora no novo contexto onde existem coisas como Perl e Python e Java e LISP e etc. Precisamos nos deslocar para esse novo mundo onde a existência de um número infindável de linguagens de computador diferentes existe, e esquecer, ou melhor, permitir que entre para a história o mundo de Dijkstra com seus cartões perfurados e etc.

Dijkstra não usava editor de texto, não gostava nem de máquinas de escrever. Não usava calculadora, não tinha televisão. É um sujeito que viveu um período muito específico da história em que isso era meio que normal, e manteve essa cultura até o fim da vida. Ao pensar nele me lembro um pouco de Maxwell escrevendo seu magnum opus sobre eletromagnetismo à luz de velas. Não quero dizer que ele era retrógrado, o que quero dizer é que ele subiu um degrau no desenvolvimento da humanidade, e temos agora que nos reconhecer neste nível mais alto, e pensar daqui pra cima, e não ficar pulando lá pra baixo achando que esse foi o final da história.

Em outras palavras, as pessoas agem como se o desenvolvimento posterior da evolução epitomizada por aquela carta de Dijkstra fosse o BANIMENTO do conceito de GOTO. Fosse a proibição desta palavra, fosse tornar imoral que alguém escrevesse um código desta forma. Assim surge a animosidade entre os escovadores de bits e programadores de alto-nível, algo que não faz o menor sentido.

Coisas como programas auto-modificáveis foram encontradas nos idos de 1950 e 1960, e passaram a ser cultuadas por alguns %os escovadores), e odiadas por outros, os programadores que não tinham muito tempo pra perder com isso, e a quem estas entidades crípticas atrapalhava. Hoje estes conseguiram se realizar, adquirindo linguagens que atendem a suas necessidades. Mas parece que uma forma de trauma surgiu. As tais entidades crípticas, as esfinges ou quimeras computacionais, que antes imperavam devido à inexistência de linguagens sofisticadas e à juventude da atividade de programação, estão sendo agora requeridas a se retirarem do universo, estão sendo banidas e recriminadas.

Estas estruturas são tidas como obscenas, num sentimento que lembra talvez o horror da comunidade de matemáticos frente a conceitos como os fractais e atratores caóticos %Mandelbrot denuncia este preconceito ingênuo em sua formidável obra). Este sentimento deve ser rejeitado.

***

Dijkstra fez um apelo para que as pessoas mergulhassem de cabeça no mundo da criação de linguagens de computador. A briga era com pessoas que passaram a vida programando em baixo-nível, e diziam que "passei a vida fazendo isso, porque haveria de parar"? A briga era contra pessoas que não viam que era possível se criar uma linguagem de um nível tão alto e distante dos circuitos. Era contra pessoas que possuíam uma restrição cognitiva que as impedia de ver o quão longe a idéia de linguagem de programação podia ir.

Antigamente existia apenas a programação de baixo nível, que irritava as pessoas com desejo de programar em alto-nível. Agora que ocorreu a revolução, e foi criado o mundo da computação de alto-nível, estas pessoas que o habitam parecem querer sugerir que aquele mundo arcaico deve como que ser extinto. Elas não vêem que o que houve foi uma expansão do universo da programação. Elas acreditam que antes havia algo "errado" , e que agora o erro, o "bug", deve ser exterminado.

O que havia não era errado. Era apenas pequeno demais. Agora já cresceu... A instrução GOTO e os programas auto-modificáveis ainda tem o seu lugar. A existência de alternativas que agradam mais a platéias específicas não significa que aquele outro show, que antes era o único que havia, deva acabar. Tem lugar pra todos!...

O sentimento de guerra dos anos 1960 deve ser encerrado. Temos que acabar também com essa coisa sádica na programação de falar para as pessoas o que elas não podem fazer ou o que devem fazer, ficar ditando os comportamentos dos outros. Cada um faz o que quiser. O importante é sempre divulgar todas possibilidades, em detalhes, e tentar compreender o que é mais adequado para que situação. Se um grupo de pessoas adota alguma restrição em um projeto coletivo, e a impõe através de uma hierarquia visando a melhor inter-operação das partes, bom pra eles. Não podemos ficar dentro das universidades falando em "acabar com o GOTO". Universidade é pra conhecer bem e avaliar todas possibilidades, e aconselhar sobre quando evitar ou não o tal GOTO, ou o Java, que seja...

O importante é que as tais restrições cognitivas mencionadas por Dijkstra permanecem muito pouco estudadas. O mundo da computação e programação continua sendo um bocado experimental, selvagem e confuso, em grande parte devido a um sentimento generalizado de vaidade de cada um por suas preferências. Ou talvez pelas preferencinhas do homem mais rico do mundo, e um punhado de mega-corporações.

Tem que acabar esse "contra-golpe" de programador de Java fazer careta pra GOTO e pra programa auto-modificável e o escambau, em retaliação por todos anos em que as pessoas foram obrigadas a escovar bit pra utilizar os computadores em seus serviços. Chega de trauminha, acabou a adolescência. Os programadores de "demos", vírus e outras paradas até gostam do sentimento de marginalidade, mas essa infantilidade tem que acabar, pelo menos dentro das universidades.

3 comments:

DJ Phill said...

Cara, parabéns pelo texto! Eu estava procurando na internet qual era o motivo dessa briga pelo GOTO. Porque será? Eu perguntei para o meu professor de Java se dá para usar goto no programa, ele quase deu um infarto... Ficou me dando esporro. Mas será que esse tal de goto é um mal da informática?

Eu usava tanto na época do Visual Basic e nenhum programa ficava mal estruturado. Eu penso assim: O programador escolhe o que quer fazer no programa. Como vai ficar a estrutura, isso é coisa do programador. Todo professor de faculdade é meio bitolado, quer que a estrutura seja do jeito dele, eles querem me condicionar para ser daquele jeito e não deixam que eu dê outra solução para o mesmo problema.

Gostaria de conversar contigo sobre esse tema!

Nicolau said...

Olá, Phill. Obrigado por sua participação!...

Poisé, você presenciou o fenômeno pessoalmente. Existe um numero significativo de programadores por aí de todas idades e posições hierárquicas que têm esse tipo de atitude em frente à menção do GOTO... Temos que acabar com esses faniquitos!

Vamos debater!!! :) Mas antes eu recomendo veementemente que você leia não só essa carta original do Dijkstra, mas ainda um artigo escrito pelo Knuth, sobre o qual só fiquei sabendo pouco depois de ter escrito esse texto aí no meu blog.

O artigo chama-se "Structured programming with goto statements", é bastante extenso, e mata a pau. Eu pretendo ainda escrever de novo sobre o assunto, de forma mais clara e direta, e agora sob a luz desse artigo do Knuth... De repente vc até me ajuda! :)

DJ Phill said...

Tudo bem, eu vou ler esses textos, já que eu gosto de ter a minha própria opinião a respeito das coisas do mundo.

O que eu mais vejo é que os alunos desses cursos de computação simplesmente repetem o que o professor diz.

Meu caso é diferente, apesar do Basic não ter moral nenhuma e alguns programadores começam a menosprezar quem usa linguagens mais simples do que Java, C+, eu acredito que o que você disse é certo e bem polêmico.

Tão polêmico quanto o aborto. Por incrível que pareça é! Por exemplo, o direito de usar GOTO para fazer o que eu quiser, usar quando eu quiser é meu. Não acho justo retirar isso e ter que fazer isso de um jeito mais complexo.

O GOTO me ajudava muito no Downtube (www.downtube.kit.net), claro que de vez em quando o programa dava um problema ou outro mas era só corrigir.

O que eu acho mais impressionante é que vários programadores que se consideram tecnófilos revolucionários, conseguem ter mente tão fechada quanto a isso.

É impressionante e contraditório ao mesmo tempo.

O negócio é o seguinte... se eu questionar alguma coisa com o meu professor, eu reprovo na faculdade!

Então deixa quieto!