Programação, estética e religião

August 19th, 2004 § 14 comments

O Jonas Galvez continua com suas divagações líricas sobre o Python, empolgado com as capacidades da linguagem. E ele tem razão. Em relação às linguagens em uso difundido atualmente, o Python aparece como uma das mais produtivas e mais interessantes. Quando eu penso que as linguagens mais usadas para programação Web atualmente são o PHP, Perl e VBScript — linguagens que são primariamente procedurais — eu fico até desanimado.

A escolha de uma linguagem de programação é sempre uma coisa meio religiosa. Debates do tipo “minha linguagem de programação é melhor que a sua” abundam na Internet e sempre que dois programadores se encontram. Eu já ultrapassei há muito a minha quota nessas guerras. Alias, você já ouviu falar em alguém que saiu do seu emprego por conta do desgosto com a linguagem de programação usada na empresa? Pois é, foi o que eu fiz. Escolha de linguagem é religião. No meu trabalho diário como programador, eu já usei uma dezena de linguagens diferentes, variando de linguagens descerebradas como o Basic até linguagens avançadas como o Lisp — embora, neste último caso, tenha sido mais como ferramenta de apoio. Difícil achar um empregador disposto a construir seus produtos em uma linguagem funcional.

De certa forma, a escolha de uma linguagem de programação para mim é uma escolha estética. Eu detesto o caractere de sublinhado (underscore), por exemplo. Toda linguagem que usa um número excessivo de sublinhados já perde pontos comigo, principalmente se for parecida com C. (Daí dá para deduzir minha opinião quando ao PHP, não?) Tudo bem, esse é um exemplo exagerado. Eu realmente não gosto de sublinhados, mas não deixaria de usar uma linguagem por causa disso.

Na verdade, eu acho que a estética da linguagem tem muito a ver com os mesmos fatores que a tornam poderosa. A estética da linguagem é derivada da intenção da linguagem, do modo como a qual foi concebida. E linguagens com uma visão muito precisa de suas capacidades tendem a ter um apelo estético maior para mim.

Eu me apaixonei por Smalltalk na primeira vez que vi um programa escrito na mesma. Uma linguagem com apenas cinco palavras-chave e onde todos os elementos são objetos não poderia causar outro efeito em mim. Essas duas premissas criam uma linguagem extremamente poderosa e cuja sintaxe é, ao mesmo tempo, extremamente agradável. Impressionamentemente, a sintaxe do Smalltalk permanece essencialmente inalterada desde sua estabilização como linguagem, há mais de 20 anos atrás. Isso é um tributo ao poder da mesma.

Existem dois fatores que eu considero cruciais para uma linguagem de programação: simplicidade e reflexividade. Esses dois fatores se unem para criar linguagens que são esteticamente interessantes. Estética, na verdade, não é uma função visual no caso de linguagens de programação. Antes, tem mais a ver com o modo pelo qual a linguagem permite a expressão de algoritmos de maneira simples, eficiente e compreensível.

Simplicidade é a capacidade da linguagem de expressar construtos programáticos com o menor vocabulário possível. É geralmente aceito que um programa em Smalltalk toma menos linhas que um programa equivalente em C ou Java. A linguagem é mais compacta, mais simples e mais expressiva. O Lisp vai até um pouco além nessa área. O Smalltalk tem cinco palavras-chave e algumas dezenas de regras de regras sintáticas. É possível argumentar que o Lisp não possui palavras-chaves e tem somente meia dúzia de regras sintáticas.

Reflexividade é a capacidade da linguagem de expor sua estrutura interna em sua própria implementação. Qualquer linguagem digna do seu nome possui reflexividade — mesmo que em um grau limitado. Voltando ao dois exemplos anteriores, tanto Smalltalk como Lisp são completamente reflexivas. No Smalltalk, além de ser possível descobrir e manipular toda a estrutura de um objeto dinamicamente, é possível modificar inclusive as classes mais básicas que compõem a linguagem. O Lisp talvez seja o exemplo máximo disso: a exposição do loop read-eval-print na própria linguagem permite que linguagens completamente novas sejam criados sobre o mesmos em a necessidade de acrescentar nada ao compilador ou máquina virtual.

Usando essas facilidades foi possível, por exemplo, incluir continuações no Smalltalk, algo que a linguagem não suporta nativamente. Ou modificar o Lisp para suportar orientação à objetos sem mexer um iota no compilador. Quando a própria pilha de uma invocação é um objeto, o céu é o limite.

Simplicidade e reflexividade equivalem a poder.

Eu imagino o que muitos programadores diriam quando soubessem que o Smalltalk permite que você digite parâmetros e resultados de um método e o sistema deduza que função você quer. Sim, é verdade. Se você digitar 2. 2. 4, ele dirá que existem três métodos que recebendo 2 e 2 como parâmetros e resultando em 4: multiplicação, soma e potenciação.Ou, digitando #('a' 'c 'b'). 'b', ele descobre que existem três métodos que atendem a esse padrão (last, median e third). Dessa forma é possível descobrir quais métodos concatenam strings, ou eliminam espaços em branco das mesmas, ou as dividem em partes delimitadas, ou coisas mais avançadas como testar se um ponto está dentro de um retângulo. Aprendizabilidade, em outras palavras (se é que essa palavra existe).

Simplicidade equivale a um aprendizado mais rápido, com menos erros por causas de falhas da linguagem. Quanto mais compacta a linguagem, menos áreas disponíveis para o programador dar tiros do próprio pé. Reflexividade, por outro lado, implica que quando o programador pedir o máximo da linguagem, a linguagem responderá adequadamente, sem necessidade de desvios tortuosos.

O Python é uma linguagem que fica próxima dessas duas em termos de simplicidade e reflexividade. Eu não saberia bem explicar o motivo da popularidade de Python como também não sei explicar o da falta de popularidade do Smalltalk e do Lisp. Parece ser mais uma questão de momento, já que as três linguagens estão disponíveis em várias plataformas com código em graus variáveis de liberdade. A pouca disseminação do Lisp talvez tenha algo a ver com o fato dela ser uma linguagem funcional, exigindo um tipo de estado mental diferente das linguagens imperativas comuns — algo notoriamente mais dificil de se adquirir. O interessante é que a sintaxe do Python é um desvio das sintaxes convencionais, tanto quando o Lisp o é, embora em uma escala menor. Isso talvez também explique parte do apelo.

Meu ponto aqui não é defender essa ou aquela linguagem. Apenas mostrar um pouco do que me atrai em uma linguagem de programação. Linguagens são objetos fascinantes. Elas têm um apelo que vai além da mera possibilidade de resolver um problema. E essa é uma das razões pelas quais eu continuo a programar. Há arte em construir um algoritmo em uma linguagem interessante. E essa é, acredito eu, a minha maior realização como programador.

§ 14 Responses to Programação, estética e religião"

  • TaQ says:

    “Elas tem um apelo que vai além da mera possibilidade de resolver um problema.”

    Nesse “além” a gente concorda, pois TEM que se resolver o problema, e se vier algum extra, melhor. :-)

    Agora, em relação à “arte” da coisa, fica um conceito mais “religioso”, por que a arte chega a ser abstrata de acordo com quem a interpreta.

    Muita gente acha horrível isso: http://www.universomarvel.com/usa/portadas/as503.jpg e adora isso: http://www.alaph.com/spiderman/pictures/covers/asm010.jpg e vice-versa. Eu pessoalmente gosto dos dois. 😉

    A resolução do problema (transmitir a mensagem visualmente, no caso) ao meu ver foi desempenhada com extrema eficiência, tanto com uma técnica mais simples e eficiente como com uma mais esmerada e trabalhosa. Digamos que essa questão abstrata na interpretação da coisa seja chamada nesse ponto de “gosto”, e como diz o ditado, gosto é como … ahn, nariz, cada um tem o seu. :-)

  • Ronaldo says:

    Sobre o seu comentário, foi justamente por isso que eu não entrei em detalhes de defender essa ou aquela linguagem. Essa escolha é muito pessoal mesmo. Daí o aspecto religioso que muita gente nega, mas que existe mesmo no plano individual.

    Por outro lado, dada as várias pelas quais um problema pode ser resolvido, eu acho que entra um pouco de arte mesmo — a tão mencionada elegância que programadores e matemáticos adoram. Existem algoritmos bons e ruins, implementados de maneiras boas e ruins. E certas implementações são reconhecidamente melhores. É claro que é difícil saber onde as questões de eficiência terminam e começam as escolhas pessoais. Mas como em qualquer outra área, há muito espaço para experimentação.

  • TaQ says:

    Mas essa que é a parte boa: muito espaço para experimentação, discussão, análise, a incógnita sobre onde termina um e começa o outro … mas desde que seja em um ambiente saudável e descontraído como estamos tendo aqui.

    Hoje em dia infelizmente flamers enchem muito o saco e acabam tirando todo o mérito disso, o que é uma pena. Como disse um certo sujeito aí, esse tipo de atitude parece coisa de quinta-série ehehe. :-)

  • Ronaldo says:

    Com certeza. Compiladores e linguagens de programação sempre foram uma área de grande atração para mim justamente pela possibilidade de experimentar com tanta coisa nova. Os desenvolvimentos atuais estão cada vez mais interessantes, tanto em termos de sintaxe como de semântica. É pena que o tempo ainda não me permita brincar mais com essas coisas.

    E será que todo mundo que gosta de programação está lendo os mesmos blogs? Essa referência aí é suspeita… 😛

  • ventonegro says:

    Ah, você iria odiar ver código meu então, pela profusão de sublinhados. :-)

    E se você gosta de simplicidade e elegância, dá uma olhada em Lua (http://www.lua.org).

  • Guaracy Monteiro says:

    Acho que mudar de emprego por causa da linguagem é mais uma quetão de inteligência do que religião. Quem trabalha com algo que gosta é mais produtivo, mais feliz, mais etc. Já basta ter que cumprir horário, desenvolver sistemas que não gosta, e outras coisinhas.

    O homem-aranha do TaQ me chamou a atenção para dois detalhes. Primeiro, que quem ve capa não vê conteúdo. :-)
    Em segundo lugar, que as coisas mudam um pouco a aparência mas a essência é, basicamente, a mesma.

    Para não me extender muito, acho que as linguagens ainda estão ligadas ao ambiente de desenvolvimento. Para quem acha que Smalltalk é apenas uma linguagem totalmente OO e que a sua faz a mesma coisa, por favor, não cometam o mesmo erro que eu cometia. Smalltalk é um ambiente integrado de desenvolvimento, com características não encontradas nem mesmo em ambientes mais modernos. Para complementar o exemplo do Ronaldo, imagino o que muitos programadores diriam se soubessem que é possível ter um servidor, várias pessoas acessando, e eu posso alterar ou incluir ou refatorar algo, sem tirar o servidor do ar e as alterações ficarem disponíveis aos usuários imediatamente. Ou então, fazer alterações em num programa que encontra-se em um equipamento de US$ 100M e que se encontra a 100M km de distância?
    Veja o parágrafo ‘Remote Agent’ em http://www.flownet.com/gat/jpl-lisp.html.

    Pois é, tudo isso com tecnologias ‘obsoletas’ de 20/40 anos atrás. Não sei o motivo de PHP ter sido escolhido como meio ‘padrão’, nem .NET ter se baseado em Java e não em Smalltalk. Talvez por existir muito mais programadores de nivel médio ou baixo do que nível superior a hacker.

  • Ronaldo says:

    Alex, se aquele código que eu vi no site for parte do que você está falando, eu posso perdoar os sublinhados. Eu sei reconhecer elegância quando eu vejo. :-) E complexidade também. 😛

    Sobre Lua, eu já andei dando minhas fuçadas em na mesma. Realmente é uma linguagem muito boa, embora parecida com C demais para meu gosto. Apesar disso, só o fato de estar sendo tão reconhecida e utilizada lá fora já é um tributo ao seu poder

  • Ronaldo says:

    Sobre mudar de emprego, verdade, verdade… :-)

    Também, excelente análise das capas. Isso vale tanto positivamente quanto negativamente. É por isso que a geração atual de linguagens repete tanto os erros do passado, eu acredito.

    E bons exemplos das linguagens mencionadas. O do Lisp é particularmente impressionante. O engraçado é que eu tenho um amigo que detesta quando esse tipo de exemplo é mencionado. Acho que ele fica um pouco amedrontado com as linguagens que domina. Tão pouco capazes de recursos avançados. É duro ver um programa de 150 linhas fazer o que Python pode fazer em duas…

    Eu quase escrevi seu último parágrago quando fiz o texto, mas fiquei com medo de ofender muita gente. Mas que eu concordo, eu concordo.

  • Guaracy Monteiro says:

    Só gostaria de acrescentar que, não é por ser iniciante que alguém será um mau programador. Apenas a falta de experiência pode não permitir que tome as decisões por si mesmo. É claro que aliado a alguns probleminhas como: Estou usando o Windows. Fui baixar o MT para testar localmente mas só tinha a versão três, cadastro, etc e resolvi baixar o conteúdo do site. Baixei e instalei o ActivePerl. Tudo certinho, sem ler a documentação, iniciei o Apache, mt e …. não tem o DBI.pm. Vou ter um trabalhinho extra e, se já dificulta a minha vida, o grau de dificuldade para um iniciante é muito maior.

    Como eu fui meio enfeitiçado pelo Lisp, só mais um comentário: “Lisp não possui palavras-chaves e tem somente meia dúzia de regras sintáticas”. É verdade, mas é possível escrever uma macro que necessite de uma BNF para descrever a sintaxe http://www.lisp.org/HyperSpec/Body/mac_loop.html
    É fácil o ‘for’ convencional que a gente aprende em 2 minutos que o ‘loop’ que vai demorar uns dois meses. :-)

  • Ronaldo says:

    Aliás, eu acredito que bons programadores se revelam no início. Eu já tive oportunidade de ver muita gente aprender a programar e a diferença entre aqueles que se tornaram bons programadores e os que não é muito grande. As capacidades de abstração existem ou não existem desde o começo. Agora, começar em um novo ambiente, ou em qualquer ambiente quando se tem pouca experiência é um desafio. Eu estou experimentando a mesma coisa que você com o .NET. O C# é muito parecido com o Java, mas a similaridade é superficial. Semanticamente são duas linguagens bens diferentes. E bibliotecas de classes sempre demoram meses para serem absorvidas.(A propósito, eu tenho o MT 2.661 para instalação aqui se você precisar.)

    Sobre o Lisp, essa é, na minha opinião, o segredo por trás da linguagem. A capacidade de implementar macros altamente adaptáveis e otimizáveis a coloca em uma posição superior a quase todas outras linguagens. O interessante é pegar a especificação e ver quanto da linguagem é implementado assim.

  • Neto Cury says:

    Sendo assim, acrescentemos:
    Futebol, política, religião e programação não se discutem hehehehe
    Abraços

  • Ronaldo says:

    Bem, eu nunca tive problema em discutir isso–mas eu sou um polemicista de natureza. Então… 😛

  • Paulo Geyer says:

    e se eu disser… ruby?
    http://www.ruby-lang.org/

    tudo é objeto, similar a smalltalk.
    muito lindo.

    depois de passear em milhares de linguagens de programacão, fico com C++ e Ruby.

    e PHP só pra incrementar a $variavel.

  • Ronaldo says:

    Ruby é uma excelente linguagem também, em termos semânticos. Não me agrada muito a sintaxe, mas tem um potencial muito bom.

    Agora, C++ é dureza. Apesar de já ter trabalhado com a linguagem, eu quero é distância completa da mesma para o resto da eternidade.

What's this?

You are currently reading Programação, estética e religião at Superfície Reflexiva.

meta