Linguagens Elegantes

Algumas linguagens de programação são mais poderosas do que outras. Isso todo desenvolvedor sabe. Mas nem todos reconhecem o seguinte:

Algumas linguagens são muito mais elegantes do que outras.

Isso não significa dizer que programar em uma linguagem mais elegante seja mais fácil do que em uma menos elegante. Tampouco mais produtivo. Significa apenas dizer que a solução para um dado problema, quando escrita nessa linguagem, pode ser mais concisa, legível, e bela.

Bela, pois existe uma certa genialidade por trás das soluções elegantes. Sentimos um certo prazer estético ao encontrar algoritmos que dão uma solução inesperada, geral e concisa, para um problema complexo.

Talvez isso ocorra porque um dado problema por vezes possui um conjunto quase infinito de soluções possíveis. Tome, como exemplo, a tarefa de deixar um conjunto de números em ordem crescente. A maioria das pessoas vai usar a força-bruta, comparando cada elemento com todos os outros.

Mas foi preciso gênio para aplicar uma técnica de divisão-e-conquista para tratar esse problema de forma elegante. John Von Neumann criou o algoritmo Merge sort, que consiste em dividir o conjunto de números em pedaços menores, e recursivamente ordená-los e combiná-los até que se obtenha um conjunto de números em ordem crescente.

A ideia é bastante simples, mas o aspecto do código que implementa o algoritmo varia de acordo com o talento do programador e a linguagem utilizada. Quanto mais expressiva for a linguagem, quanto mais ela se aproximar da linguagem natural (e, portanto, mais se afastar da máquina), mais elegante fica o código.

Um dos melhores exemplos disso é uma implementação do Quick Sort em Haskell, que é um algoritmo bem parecido com o Merge Sort.

    quicksort :: Ord a => [a] -> [a]
    quicksort [] = []
    quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
        where
        lesser  = filter (< p) xs
        greater = filter (>= p) xs

A expressividade do Haskell permite que a ideia de divisão e conquista seja expressa de forma clara e concisa, pois não é preciso utilizar muitos símbolos que só fazem sentido para o computador. A ideia é expressa de uma forma mais pura, sem detalhar todos os passos da execução na máquina (alocação de memória, recursividade, declaração de variáveis, etc).

Se compararmos essa implementação com outra linguagem menos expressiva (aqui), vemos que o código em Haskell é bem mais elegante. Também notamos que as soluções dadas em linguagens mais expressivas tendem a ser mais elegantes. Basta ver neste link a solução escrita em linguagens como F#, Lisp, e Python.