Content area
No universo das linguagens de programação existe uma diversidade grande de paradigmas, frequentemente motivados pela necessidade da resolução computacional de novos problemas, em novos contextos. Dois destes paradigmas, que atraem a atenção de programadores e cientistas da computação desde os primórdios das linguagens de programação, são o paradigma imperativo e o paradigma funcional.
Estes dois paradigmas assentam em ideias bastante diferentes. O paradigma imperativo baseia-se numa noção de estado e em programas que são sequências de comandos cuja execução vai provocando alterações ao estado. Por sua vez, o paradigma funcional baseia-se na noção matemática de função e a execução de programas (uma coleção de funções) corresponde ao cálculo do valor de uma expressão, envolvendo as funções definidas no programa.
No entanto, existem fragmentos do paradigma imperativo e do paradigma funcional que podem ser relacionados. De facto, o formato Single-Assignment (SA), do lado imperativo, e o formato Continuation- Passing Style (CPS), do lado funcional, que são usados como linguagens “intermédias” no processo de compilação de linguagens de programação mais abstratas, por facilitarem e agilizarem processos de optimização na geração de código máquina eficiente correspondem, na essência, a uma mesma linguagem.
Neste trabalho estuda-se de uma forma detalhada a relação entre programação imperativa no formato SA e programação funcional no formato CPS. Recorrendo a uma linguagem imperativa simples para representar o formato SA e a um subconjunto do λ-calculus para o formato CPS, construímos, entre eles, uma bijeção sintática (ao nível dos programas) e semântica (ao nível da execução de programas). Um resultado destas bijeções é que o formato SA pode ser pensado como uma certa escolha de representantes de classe para a noção de α-equivalência para programas imperativos correspondente a essa mesma noção para λ-termos
Durante o trabalho, foi ainda desenvolvida uma pequena ferramenta computacional, implementada na linguagem Haskell, que permitiu testar e animar os diversos conceitos envolvidos no estudo.