Linguagens e Arquiteturas
Blog de Ronaldo Moreira sobre Linguagens de Programação, Arquiteturas e Tecnologia

Déjà vu

Fevereiro 7th, 2008 de Ronaldo Moreira

Vez por outra nos deparamos com algo aparentemente novo, mas que nos dá a sensação de já ter visto antes, um Déjà vu?!
Se você estiver acompanhando a evolução das linguagens, certamente já deve ter ouvido falar em Closures. Closures são blocos de código portáveis, e assemelham-se a funções que tem parâmetros e um dado de retorno. Você pode definir um desses blocos e guardá-lo em uma variável ou passá-lo como argumento para um método. Podemos rodar o código da Closure a qualquer momento através da variável que o referencia.
O conceito de Closures não é exatamente novo. Ele foi proposto nos anos 60 e implementado pela primeira vez nos anos 70 numa linguagem chamada Scheme.
Várias outras linguagens também provêem maneiras de portar código de modo semelhante.
No antigo Pascal é possível definir tipos ponteiros especiais para procedimentos e funções com parâmetros e tipo de retorno. Ponteiros deste tipo podem referenciar qualquer procedimento que tenha a mesma assinatura e invocá-lo naturalmente. Esse é o mesmo mecanismo utilizado nos eventos de Delphi. Em C e C++ essa capacidade ficou conhecida como Callback, largamente utilizado no interfaceamento com bibliotecas de funções. Java inicialmente preferiu implementar esses Callbacks através de interfaces, ou seja, ao invés de passar uma referência a um procedimento como argumento, passa-se uma instância de uma interface que tenha uma assinatura para um propósito específico.
Recentemente, vi os termos “Code-Block” e “Iterator” como características da linguagem Ruby. Ainda não consegui descobrir ainda se essas características nasceram junto com o Ruby ou quando elas teriam sido adicionadas a essa linguagem, mas isso me fez lembrar os tempos em que programava no bom e velho Clipper.

Clipper nasceu meio às avessas como compilador para uma linguagem de manuseio de dados, sofreu muitas críticas, não era orientado a objetos e foi até mesmo questionado como linguagem de programação. Mas, especialmente a partir da versão 5.0 de 1990, adotou características muito interessantes que vejo hoje em dia serem cada vez mais difundidas e utilizadas através de outras linguagens:
* O compilador convertia o código-fonte em p-code (Byte-Code?!) e embutia uma máquina virtual (CLR, JVM?!) nos executáveis monolíticos que produzia;
* Variáveis dinâmicas com tipagem dinâmica (Ruby?!), já foram muito criticadas por gerarem problemas de runtime, como “Tipos incompatíveis” ou “Variável não encontrada”. Mas, tudo isso está em moda novamente, amparado pelos testes unitários;
* Possuia um estágio de pré-compilação que tornava possível resolver símbolos e comandos definidos pelo usuário. Um mecanismo tão poderoso que permitia até criar uma linguagem inteiramente nova dentro do próprio Clipper para propósitos específicos (DSL?!);
* Pedaços de código-fonte na forma funcional podiam ser guardados em blocos chamados Code-Blocks?!.

Essa ultima característica do Clipper, além de homônima, tem exatamente a mesma sintaxe dos Code-Blocks do Ruby. O bloco a seguir quando avaliado, retorna verdadeiro para parâmetros cujo quadrado seja maior que 30:

bloco1 - bloco1

No Clipper, utilizava-se a função “Eval” para rodar um bloco de código e retornar seu valor. Em Ruby, o bloco é um objeto que possui um método “call”. Os Iterators de Ruby são idênticos às funções de vetores do Clipper e, novamente, o paradigma OO é a diferença.
Em Ruby pode-se encontrar um item em um vetor através do método “find” do vetor passando como parâmetro o critério da busca na forma de um Code-Block, ou rodar um código para cada item de um vetor através do método “each”. Há equivalentes em Clipper, como segue:

Exemplo 1 - Busca uma canção pelo nome num vetor de canções em Ruby e em Clipper:

bloco2 - bloco2

bloco3 - bloco3

Exemplo 2 - Exibe cada elemento de um vetor em Ruby e em Clipper:

bloco4 - bloco4

bloco5 - bloco5

É sempre bom estudarmos um pouco de história da computação pra gente não ser pego com cara de bobo, para evitar o efeito “Nossa!”, diante de novos nomes para velhas idéias. Os Déjà vu?!
Recomendo fortemente consultas à Wikipédia, que tem se mostrado uma ferramenta de estudo confiável e imparcial. Parabéns.

Enviado em Linguagens | Enviar por e-mail  | Hits para esta publicação: 572

Deixe uma resposta.

Você deve estar conectado para publicar um comentário.