Desenvolvimento

6 nov, 2018

História do Lisp: abra os olhos para programação funcional

Publicidade

Como começou minha paixão por parênteses (ops, Lisp)?

Tenho uma formação na área de Matemática Aplicada (começa aí a loucura), e Lisp foi uma das poucas linguagens de programação que me deparei dentro da academia (já programava em Perl profissionalmente e conhecia Python). Quando vi aqueles parênteses, de cara pensei: “Isso não é para mim (isso é uma loucura de Matemática/Acadêmico que nunca saiu para o mercado de trabalho)”.

Com o passar das aulas eu comecei a achar os parênteses confortáveis (seres humanos acostumam muito rápido com tudo) e comecei a achar estranho a forma de pensar para escrever a lógica do software (por exemplo, (+ 1 2)). Lisp usa Notação polonesa como forma de expressão. Isso foi complicado acostumar – no dia a dia usava uma linguagem de programação “normal” e dentro da academia, funcional (sem saber que era funcional).

Com o tempo comecei pegar gosto pela forma de pensar (funcionalmente) e acabei entrando para um projeto (no mercado, não acadêmico), que usava Common Lisp na sua implementação SBCL (Steel Bank Common Lisp, que é mantido até hoje).

Nesse momento eu virei super fã da linguagem e sua forma de lidar com software (de verdade) em produção. A empresa trabalhava com dados estatísticos do mercado de Pesquisa Cliníca, e LISP foi tomado como linguagem por matemáticos. Isso facilitou muito a comunicação entre o time de engenharia e acadêmicos.

Como tudo começou?

É um conjunto de linguagem de programação especificada pelo John McCarthy, em 1955, com sua primeira versão em 1958 (durante um projeto de pesquisa em inteligência artificial), influenciado pelo seu aluno Alonzo Church. A motivação de McCarthy surgiu da ideia de desenvolver uma linguagem algébrica para processamento de listas para trabalho em IA (inteligência artificial).

Seu nome vem de LISt Processing (a lista é a estrutura de dados fundamental desta linguagem). Tanto os dados como o programa são representados como listas, o que permite que a linguagem manipule o código fonte como qualquer outro tipo de dado, nascendo assim o Lisp 1, a versão que realmente foi distribuída por McCarthy e outros do MIT (Massachussets Institute of Tecnology). Foi Lisp 1.5 (manual de programadores), assim chamada porque continha várias melhorias no interpretador Lisp 1 original, mas não foi uma grande reestruturação como planejado que seria o Lisp 2.

Linha do tempo de linguagens que segue o dialeto Lisp

Vou começar a partir do Lisp 1.5, pois foi o primeiro a ser distribuido.

  • Lisp 1.5 (1955 – 1965)/Dialeto: primeira implementação distribuída por McCarthy e outros do MIT.
  • Maclisp (1965 – 1985)/Dialeto: desenvolvido pelo MIT Project MAC (não relacionado a Apple, nem ligado com McCarthy).
  • Interlisp (1970 – 1990)/Dialeto: desenvolvido pela BBN Tecnologia para PDP-10 rodando no sistema operacional Tenex, adotado, em seguida, pela máquina Xerox Lisp o InterLisp-D.
  • ZetaLisp (1975 – 1995)/Dialeto: denominada Lisp Machine – usado nas máquinas Lisp, descendente direto de Maclisp. Tendo como grande influência o Common Lisp.
  • Scheme (1975 – mantido até hoje)/Dialeto: diferente de Common Lisp, linguagem que usa dialeto Lisp
  • NIL (1975 – 1980)/Dialeto: sucessor direto do Maclisp, com muitas influências de Scheme. Essa versão do Common Lisp estava disponível para plataformas de grande alcance e foi aceita por muitos como um padrão, de fato, até a publicação do ANSI Common Lisp (ANSI x3.226-1994).
  • Common Lisp (1980 – mantido até hoje)/Dialeto: aka Common Lisp the Language (a linguagem) – as tentativas e divergência entre ZetaLisp, Spice Lisp, nil, e S-1 Lisp para criar um dialeto sucessor para Maclisp. Common Lisp estava disponível para plataformas de grande alcance e foi aceita por muitos como padrão até a publicação do ANSI Common Lisp (ANSI X 3.226-1994).
  • CCL (1984 – mantido até hoje)/Implementação: baseado no dialeto Common Lisp, antiga MCL
  • T (1985 – mantido até hoje)/Dialeto: derivado de Scheme, escrito por Jonathan A. Rees, Kent M. Pitman e Norman, Adams da Yale University com experiencia de design de linguagem e implementação. Em 1987 foi publicado o livro “The T Programming Language: A Dialect of LISP“.
  • Emacs Lisp (1985 – mantido até hoje)/Dialeto/Implementação: usado como linguagem de script (configuração) do editor Emacs (mantido pelo projeto GNU).
  • AutoLISP (1985 – mantido até hoje)/Dialeto/Implementação: feito para AutoCAD, rodando nos produtos AutoCAD Map 3D, AutoCAD Architecture e AutoCAD Mechanical.
  • OpenLisp (1985 – mantido até hoje)/Dialeto: desenvolvido por Christian Jullie escrito, em C e Lisp, que deu origem a implementação ISLISP.
  • PicoLisp (1985 – mantido até hoje)/Dialeto: Open Source para Linux e outros sistemas compatíveis com POSIX.
  • EuLisp (1990 – 2015)/Dialeto: escopo estático e dinâmico, introduzido para Indústria e Academia Europeia.
  • ISLISP (1990 – mantido até hoje)/Dialeto: feito para International Standard sob licença de Dominio Público.
  • newLISP (1990 – mantido até hoje)/Dialeto: linguagem Open Source escrita por Lutz Mueller, ditribuída pela licença GPL (GNU General Public License) com fortes influencias de Common Lisp e Scheme.
  • Racket (1990 – mantido até hoje)/Dialeto: multi paradigma que veio da familía Scheme, um de seus objetivos de projeto é servir como uma plataforma para a criação de linguagens, design e implementação. Sua runtime usa JIT.
  • GNU Guile (1990 – mantido até hoje)/Implementação: usado para extensão de sistema para o Projeto GNU, baseado em Scheme.
  • SBCL (1999 – mantido até hoje)/Implementação: baseado no dialeto Common Lisp com recurso de alta performance no compilador, suporte a unicode e threading. Nasceu como fork do Carnegie Mellon University Common Lisp por Andrew Carnegie e Andrew Mellon.
  • Visual LISP (2000 – mantido até hoje)/Dialeto/Implementação: antigo AutoLisp após ser comprado pela Autodesk.
  • Clojure (2005 – mantido até hoje)/Dialeto/Implementação: começou sendo baseado em Common Lisp rodando na JVM (Java Virtual Machine), trazendo retrocompatibilidade com todas as linguagens que rodam na JVM. É possível importar classes Java, por exemplo.
  • Arc (2005 – mantido até hoje)/Dialeto/Implementação: desenvolvido por Paul Graham e Robert Morris, escrito usando Racket.
  • LFE (2005 – mantido até hoje)/Dialeto/Implementação: Lisp Flavored Erlang, implementado em Erlang.
  • ACL2 (2005 – mantido até hoje)/Dialeto/Implementação: criado por Matt Kaufmann e J Strother Moore dentro da University of Texas, em Austin.
  • Hy (2013 – mantido até hoje)/Dialeto/Implementação: apelido para Hylang, implementado em Python. Nasceu dentro da PyCon 2013, escrito por Paul Tagliamonte.
  • Rum (2017 – mantido até hoje)/Dialeto/Implementação: implementado em Go, projeto extremamente novo. Veja o GitHub e a timeline visual.

Não para por aqui. Existem muitas outras derivações.

É isso mesmo! Lisp é uma linguagem de programação que tem vários dialetos e implementações, com a ANSI Common Lisp utilizada como o dialeto mais utilizado.

Existe outra linguagem (mais usada que Lisp), o SQL ANSI (American National Standards Institute): PostgreSQL, MySQL, Oracle, Microsoft SQL, entre outros.

Todos têm como dialeto o SQL ANSI, mas evoluiu a partir do default.

Por onde começar estudar Lisp?

Vamos supor que você gostou da loucura das diversas implementações e quer estudar essa linguagem. Por onde você começa? Qual interpretador usar? Eu, particularmente, gosto do SBCL (particularmente é o que mais tenho usado para desenvolvimento). Em produção uso CCL – se você trabalha com alguma tecnologia que roda em JVM vai para Clojure.

Segue alguns links: