Páginas

quinta-feira, 20 de janeiro de 2011

Paradigmas

Fonte.

Em meu post sobre alguns termos utilizados na computação, acabei abordando a questão dos paradigmas, descrevendo-os superficialmente do seguinte modo: "mais do que técnicas, são modos de pensar/aproximações diferentes. Uma linguagem pode ou não dar suporte a determinado paradigma. Exemplos: orientação a objetos, imperativo, funcional".

Até aí tudo bem, mas faltou uma explicação mais detalhada. Afinal, como assim modos de pensar diferente? A máquina não é a mesma? Tudo não vai virar 1 e 0 de qualquer forma? Para tentar responder a essas e outras questões que podem surgir, listarei os principais paradigmas, situando-os em um contexto histórico.



  • Programação estruturada
Voltando um pouco no tempo. No princípio havia o verbo buscavam-se maneiras simples de representar a linguagem de máquina, o que não necessariamente implicava em uma vida mais fácil para os programadores. Primeiro eram as válvulas, gerando computadores colossais, depois vieram cartões perfurados, linguagem Assembly e por aí vai.

No caminho foram sendo desenvolvidas maneiras de representar essa maneira particular de pensar, focando-se na interpretação correta por parte do computador. Para isso o programador pode utilizar somente duas estruturas básicas: ação e decisão.

Ação corresponde às instruções pelas quais o program counter passa de forma linear, sendo processadas uma após a outra na ordem exata em que aparecem no código, enquanto decisão pode ser dividida em duas categorias: seleção (o conhecido if-else, por exemplo) e iteração (como while). Nossa, então com com algumas estruturas todos os problemas estão resolvidos?



  • Programação imperativa/procedural

Resposta curta e grossa à última pergunta: não. Agora vamos falar um pouco sobre programação imperativa e procedural, muitas vezes tidas como sinônimas. Não está errado, mas convém investigar mais à fundo. Muito bem, o paradigma estruturado ofereceu uma boa maneira de organizar o código e possibilitou a resolução de problemas simples, porém estabeleceu limites que impossibilitavam a construção de programas mais elaborados.

Que tipo de programas?

Um típico exemplo é o de fatorial. Dado um natural n, e sendo 0! = 1 e 1! = 1, seu fatorial n! = n * n - 1 * n - 2 * ... * 1 = n * (n - 1)!. Podemos calcular facilmente o valor de n! quando seu valor equivale a 0 ou 1, mas em casos maiores é necessário utilizar a técnica de recursividade. Por exemplo, 5! = 5 * 4!, sendo que 4! = 4 * 3!, 3! = 3 * 2! e 2! = 2 * 1!. É necessário invocar um mesmo procedimento repetidas vezes até chegar em 2!, cujo valor é 2.

E é isso que o paradigma procedural oferece: a possibilidade de dividir um problema complexo em partes menores, mais fáceis de se lidar, e manipular a sequência das instruções. Assim, a qualquer momento do programa, é possível ir a outra parte, o que colabora à reutilização do código.

É... só tome cuidado com os infames comandos jump e goto, vistos com extremo desprezo (fonte) .

E onde a programação imperativa entra na história?

Basicamente, um programa escrito baseado nesse paradigma consiste em várias ações modificadoras de estados. Parece complicado, mas é o modelo de computação mais adotado atualmente, e tenho 99.9% de certeza que você o conhece. Ao conceber a resolução de um problema, o mais intuitivo é focar-se nas instruções necessárias para chegar a um resultado. Ou seja, lida-se mais com o "como" do que o "quê" fazer.



  • Programação funcional

Basicamente o contrário do paradigma imperativo. Aqui a intenção é definir o "quê" fazer, descrevendo um programa por meio de funções matemáticas. Essas características tornam linguagens funcionais ideais nas aplicações científicas e no meio acadêmico de modo geral, podendo auxiliar nos estudos teóricos da Ciência da Computação. Um dos exemplos mais famosos é Lisp, que eventualmente tornou-se a principal linguagem utilizada em Inteligência Artificial.

Isso não significa que elas não tenham lugar algum no mercado (Mathematica e Erlang são exemplos), mas hoje em dia é difícil ver um aspirante a programador interessado em alguma delas, em contraste a linguagens como C/C++ e Java. E aí o leitor pode perguntar: "Então por que eu, em sã consciência, iria querer programar em uma linguagem funcional?".

Em primeiro lugar, porque é interessante, principalmente àqueles que passaram sua trajetória inteira como programadores nas linguagens pop. No começo pode ser bem frustrante, mas é mera questão de adaptar seu modo de pensar. Talvez só uma descrição não seja o suficiente, então confiram na prática e vejam se realmente não é bem diferente do usual.

Segundo, assim como Lisp que citei anteriormente, várias têm sim aplicações fora do mundo acadêmico. Destaque às aplicações que exigem cálculos específicos, como avaliação de dados para posterior formulação de estatísticas e análise financeira.



  • Orientação a objetos

Mesmo com o paradigma imperativo/procedural, os programadores ainda não conseguiam resolver problemas que exigiam elevada abstração de estruturas reais. Além disso, surgiu a necessidade de desenvolver linguagens focadas no cliente, pois até então a preocupação era com as necessidades do programador.

E aí entraram em cena as linguagens orientadas a objeto, baseadas na concepção e interação entre classes, moldes dos objetos em questão. Agora não bastava apenas trabalhar com a lógica, porque os dados também estariam presentes nos objetos. Hoje esse é o modelo dominante no mercado, sendo muito recomendado o conhecimento de ao menos uma linguagem orientada a objeto por parte de alguém que deseja seguir carreira em T.I.

Representação de uma classe em UML (por: Esa Pulkkinen).



  • Tem mais?
Evidentemente, mas eu estaria fugindo do escopo se entrasse em mais detalhes. Um paradigma em particular bem interessante é o de programação lógica, havendo também a metaprogramação e orientação a eventos (disponível em C#), além de outros sub-paradigmas que surgem por aí.

Nenhum comentário:

Postar um comentário