chester's blog

technology, travel, comics, books, math, web, software and random thoughts

Linguagens De Programação Comparadas

| Comments

A comparação entre linguagens de programação (e incluem-se aí os ambientes sob os quais estas linguagens operam) é um assunto quase que inesgotável.

Quando abordado de forma leviana, acaba em discussões que pouco diferem das mesas-redondas futebolísticas: programadores movidos por um ímpeto de paixão e desejo de preservar seu investimento intelectual defendem com unhas e dentes suas linguagens prediletas, agindo como se todo o resto fosse secundário. O argumento também pouco varia: linguagens mais pragmáticas (de menor nível que a escolhida) são sempre “improdutivas” e as mais abstratas (de maior nível) “performam pouco”. Não é exagero afirmar que a maioria esmagadora das discussões sobre o assunto se dá sob este cenário, e é fácil perceber que, assim como suas contrapartes desportivas, pouco avançam.

Uma discussão mais aprofundada requer um estudo igualmente profundo (nas palavras de Robert Herrick, “no pain, no gain”). É preciso compreender não apenas as linguagens que estão sendo comparadas, mas também suas antecessoras. A abordagem histórica é importante porque uma linguagem não surge ao acaso – uma forte motivação é necessária, tal como a existência de um domínio cujos problemas não são apropriadamente descritos (ou processados) nas lingaugens pré-existentes – ao menos na opinião dos criadores da nova linguagem.

Mesmo trilhando este caminho, um erro comum (que já cometi) é concentrar os estudos naquilo que já se conhece. É uma abordagem muito produtiva: se eu trabalho com Java, não vou perder muito tempo com programação funcional; se uso PHP, é mais jogo procurar técnicas que otimizem o meu trabalho do que me envolver com as dificuldades do mapeamento objeto-relacional, e por aí vai.

Esta produtividade tem um custo – fica cada vez mais difícil situar o seu ambiente (e perceber onde ele pode melhorar). E quando a inenvitável mudança tecnológica vier (e sim, ela virá – independente do “padrão de mercado” ou do “imenso legado” – características já atribuídas a tantas outras linguagens, hoje marginais ou extintas), este custo se fará sentir, pois será muito mais difícil migrar para novos paradigmas.

Independente da justificação prática, achei que seria interessante aproveitar as férias da faculdade para preencher algumas lacunas pessoais neste assunto, o que me levou a alguns livros interessantes (que são o verdadeiro tema deste post). Vamos a eles:

A Little Smalltalk

Se você, programador Java, já se perguntou por que a classe-mãe-de-todas-as-classes se chama Object (e não “Class”), ou porque chamamos o paradigma de “orientação a objeto” (considerando que o desenho da aplicação acaba lidando mais com as classes do que com os objetos em si), aprender Smalltalk vai acender algumas luzes.

E é melhor ainda se este aprendizado se der sob uma ótica isenta de legado. A Little Smalltalk aborda um dialeto específico da linguagem, mas é mais do que suficiente para evidenciar variações sutis (por exemplo, em Smalltalk você não “chama um método”, e sim “envia uma mensagem”). Tais diferenças parecem, numa primeira análise, puramente estéticas/semânticas, mas ajudam a compreender as motivações (e reais limitações) existentes no Java como o usamos hoje.


Programming in Common Lisp

Lisp é como a Cher: de tempos em tempos volta com plena majestade. Seja quando Paul Graham defende seu aprendizado, seja quando programação funcional se torna o assunto da vez, vira e mexe algo aparece que desperta a curiosidade sobre esta linguagem.

Assim como o outro livro, Programming in Common Lisp trata de um dialeto específico, mas suficiente para ajudar a compreender os fundamentos, e separar o hype da realidade.

Para quem gosta de construções matemáticas “belas” (i.e., simples em suas definições, mas que possuem ramificações complexas), Lisp é um prato cheio: os reais fundamentos (CAR/CDR, lazy evaluation e cercanias) são bastante sintéticos, mas os desdobramentos (e aplicações) são infindáveis, e, a meu ver, justificam plenamente o interesse (ainda que teórico) em torno da linguagem e das técnicas associadas a ela.


Comparative Programming Languages – 2nd Edition

Muito mais denso que os anteriores, este livro traça um panorama das linguagens de programação mais relevantes, desde as primeiras tentativas de evoluir do código de máquina puramente numérico até os primeiros ambientes OO maduros.

Para quem, como eu, trabalha a maior parte do tempo com Java, é muito esclarecedor ter um contato com fontes de inspiração como Ada e Modula-2 (além de C++, que eu já conhecia, mas também ajudou ver em perspectiva).

E, independente da linguagem, aspectos como alocação de memória, passagem de parâmetros, escopo, tipagem e muitos outros são analisados em detalhe (do código fonte à execução final), considerando sempre o tripé performance-flexibilidade-confiabilidade.

Ao contrário de boa parte da literatura do gênero, Comparative Programming Languages não requer um background matemático, ou mesmo conhecimentos extremamente avançados em programação. A terceira edição (abordada no site) engloba linguagens mais modernas, mas a que li tem um bom equilíbrio entre a perspectiva histórica e a análise computacional.

Comments