Embora a terminologia esteja longe de ser padronizada, uma maneira comum de categorizar os principais paradigmas de programação em
- Procedural
- Funcional
- Lógico
- Orientado a Objeto
- Genérico
Parece que você já sabe como é a programação procedural.
Em linguagens funcionais , as funções são tratadas como objetos de primeira classe. Em outras palavras, você pode passar uma função como argumento para outra função ou uma função pode retornar outra função. O paradigma funcional é baseado no cálculo lambda, e exemplos de linguagens funcionais são LISP, Scheme e Haskel. Curiosamente, o JavaScript também suporta programação funcional.
Na programação lógica , você define predicados que descrevem relacionamentos entre entidades, como president(Obama, USA)
ou president(Medvedev, Russia)
. Esses predicados podem ficar muito complicados e envolver variáveis, não apenas valores literais. Depois de especificar todos os seus predicados, você pode fazer perguntas ao seu sistema e obter respostas logicamente consistentes.
A grande idéia na programação lógica é que, em vez de dizer ao computador como calcular as coisas, você diz o que são. Exemplo: PROLOG.
O paradigma orientado a objetos é, de certa forma, uma extensão da programação procedural. Na programação procedural, você tem seus dados, que podem ser tipos primitivos, como números inteiros e flutuantes, tipos compostos, como matrizes ou listas e tipos definidos pelo usuário, como estruturas. Você também tem seus procedimentos, que operam nos dados. Por outro lado, no OO, você tem objetos, que incluem dados e procedimentos. Isso permite que você tenha coisas legais como encapsulamento, herança e polimorfismo. Exemplos: Smalltalk, C ++, Java, C #.
A programação genérica foi introduzida pela primeira vez em Ada em 1983 e tornou-se difundida após a introdução de modelos em C ++. Essa é a idéia de que você pode escrever código sem especificar os tipos de dados reais nos quais ele opera e fazer com que o compilador descubra. Por exemplo, em vez de escrever
void swap(int, int);
void swap(float, float);
....
você escreveria
void swap(T, T);
uma vez e faça com que o compilador gere um código específico para o T
que quer que seja, quando swap()
é realmente usado no código.
A programação genérica é suportada em vários graus por C ++, Java e C #.
É importante observar que muitas linguagens, como C ++, suportam múltiplos paradigmas. Também é verdade que, mesmo quando se diz que uma linguagem suporta um paradigma específico, ela pode não suportar todos os recursos do paradigma. Sem mencionar que há muita discordância sobre quais recursos são necessários para um paradigma específico.