Em meados dos anos 1950, os computadores já eram excelentes no cálculo numérico. John McCarthy queria confiar-lhes outra categoria de trabalho: manipular ideias representadas por símbolos, construir raciocínios e tratar expressões cujo tamanho não era conhecido antecipadamente.
Dessa ambição nasceu Lisp. Em vez de considerar um programa apenas como sequência fixa de instruções, Lisp representa o código com as mesmas estruturas usadas para os dados. Um programa pode assim examinar uma expressão, transformá-la e produzir outra. Esta propriedade influenciou profundamente a programação funcional e os sistemas interativos.
McCarthy associou esta investigação ao time-sharing, que permitia a várias pessoas trabalhar interativamente com o mesmo computador. Lisp e time-sharing procuravam transformar a máquina de processador de lotes em parceiro experimental.
Representar raciocínio, não apenas números
John McCarthy nasceu em 1927 em Boston e cresceu sobretudo em Los Angeles. Estudou matemática no California Institute of Technology e doutorou-se em Princeton em 1951.
As primeiras linguagens de alto nível, como FORTRAN, estavam sobretudo orientadas para números. McCarthy interessava-se por palavras, regras lógicas, provas e árvores de expressões. Em 1955 participou na proposta do projeto de verão de Dartmouth e introduziu a expressão inteligência artificial para designar um novo campo de investigação.
Para explorar essas ideias era necessária uma linguagem que tratasse símbolos tão diretamente como FORTRAN tratava números.
Porque as listas se tornaram centrais
Um raciocínio pode ser representado como uma expressão composta por outras expressões. Lisp, de list processing, faz por isso da lista a estrutura fundamental. Uma lista pode conter números, nomes ou outras listas.
A organização favorece a recursão: uma função trata uma parte e chama-se novamente para o restante até atingir um caso elementar. Lisp não inventou a recursão, mas tornou-a uma forma natural de trabalhar com estruturas encaixadas.
Em 1960, McCarthy publicou Recursive Functions of Symbolic Expressions and Their Computation by Machine, apresentando Lisp como um pequeno sistema de regras capaz de expressar cálculo geral.
Os parênteses de Lisp podem surpreender, mas a sua regularidade cria uma propriedade decisiva: uma expressão de código é ela própria uma lista. Código e dados partilham uma representação comum.
Esta homoiconicidade permite que um programa receba código como dado, o analise e construa uma nova versão. As macros Lisp utilizam este mecanismo para estender a linguagem sem alterar o compilador a cada necessidade.
McCarthy imaginava inicialmente uma notação mais convencional, as M-expressions. Quando Steve Russell percebeu que a função de avaliação descrita por McCarthy podia ser programada, as S-expressions entre parênteses tornaram-se diretamente executáveis e acabaram por constituir a sintaxe duradoura.
Automatizar uma memória dinâmica
As listas Lisp são criadas e abandonadas durante a execução. Libertá-las manualmente tornaria o código complexo e frágil. Lisp introduziu por isso o garbage collector, que identifica objetos ainda alcançáveis e recupera a memória dos restantes.
A gestão automática tem um custo, mas reduz erros e facilita estruturas dinâmicas. Java, JavaScript, Python, Go e muitas outras linguagens usam hoje variantes do mesmo princípio.
Uma linguagem construída por uma comunidade
Atribuir todo Lisp a McCarthy ocultaria o trabalho coletivo. Ele definiu os conceitos centrais, mas Steve Russell programou o primeiro avaliador; Daniel Edwards trabalhou na recuperação automática de memória; Timothy Hart e Michael Levin criaram um compilador inicial.
Lisp tornou-se rapidamente uma família: Lisp 1.5, Maclisp, Interlisp, Scheme, Common Lisp, Emacs Lisp e Clojure representam objetivos e épocas diferentes. A diversidade mostra tanto a força como a fragmentação de um modelo facilmente extensível.
Nos anos 1950, os computadores executavam frequentemente trabalhos em lote. McCarthy defendeu o time-sharing generalista: a máquina alterna rapidamente entre utilizadores e dá a cada um uma experiência interativa.
Lisp adapta-se particularmente bem a essa visão. Um interpretador pode ler uma expressão, avaliá-la e mostrar o resultado num ciclo contínuo, modelo conhecido como REPL. Programar torna-se uma conversa experimental com o sistema.
McCarthy desenvolveu esta visão no MIT e depois no Stanford Artificial Intelligence Laboratory, onde linguagens, terminais, redes e investigação evoluíam em conjunto.
O que Lisp transmitiu às linguagens modernas
Lisp já não é a única linguagem da investigação em inteligência artificial, mas muitas das suas ideias tornaram-se comuns: funções como valores, closures, recursão, memória automática, macros e ambientes interativos.
John Backus defenderia também a composição funcional; Guido van Rossum integrou ferramentas funcionais em Python; Brendan Eich inspirou-se em Scheme para algumas fundações de JavaScript.
McCarthy morreu em 2011. O seu legado está em ter mostrado que uma linguagem podia representar expressões simbólicas com simplicidade suficiente para que programas, regras e código fossem manipulados pelos mesmos mecanismos.
Cronologia
- 1927: nascimento em Boston.
- 1951: doutoramento em matemática em Princeton.
- 1955: proposta de Dartmouth e introdução da expressão «inteligência artificial».
- 1956: workshop de Dartmouth.
- 1958: primeiras formulações de Lisp no MIT.
- 1959: proposta sobre time-sharing generalista.
- 1960: publicação do artigo fundamental sobre Lisp.
- 1962: mudança para Stanford.
- 1965: fundação do Stanford Artificial Intelligence Laboratory com Lester Earnest.
- 1971: Prémio Turing.
- 2011: morte aos 84 anos.
Perguntas frequentes
John McCarthy programou sozinho o primeiro Lisp?
Não. Definiu os princípios e a descrição; Steve Russell implementou o primeiro avaliador e outros investigadores contribuíram para memória automática e compiladores.
Porque Lisp usa tantos parênteses?
Tornam explícita a estrutura encaixada e dão a código e dados uma representação regular, fácil de analisar e transformar.
Lisp é a primeira linguagem funcional?
É uma das primeiras a colocar funções e recursão no centro, mas a programação funcional formou-se a partir de várias tradições matemáticas e linguísticas.
Qual é a relação entre Lisp e inteligência artificial?
Lisp foi concebido para símbolos, regras e estruturas necessárias aos primeiros programas de IA e tornou-se durante décadas uma linguagem dominante nesse domínio.
Lisp ainda é utilizado?
Sim, através de dialetos como Common Lisp, Scheme, Emacs Lisp e Clojure, além da sua influência em muitas linguagens modernas.