As quatro linguagens mães: LISP

As quatro linguagens mães: LISP

Apesar da Inteligência Artificial ser um assunto recorrente hoje, ela foi uma disciplina criada muito antes dos computadores. Cientistas já discutiam modelos matemáticos para definir inteligência e com computadores, podiam estar estas ideias com uma linguagem de programação moderna.

O LISP é a linguagem deste artigo e vamos explicar como ela é influente até hoje.

Início da Inteligência Artificial

Em 1943, o primeiro neurônio artificial eletrônico foi criado por McCulloch e Pitts, sendo o pontapé inicial para o que hoje conhecemos como Redes Neurais Artificiais. Em 1950, Alan Turing propôs no artigo Computing Machinery and Intelligence, o Jogo da Imitação onde um computador é considerado inteligente se ele consegue se passar por um humano.

Mas o marco em que podemos definir o nascimento do campo de estudo Inteligência Artificial foi no seminário de Dartmouth em 1956. Nele, proeminentes matemáticos e cientistas da computação definiram o termo Inteligência Artificial e o que são atividades computacionais que podemos considerar inteligentes.

Todos estes pesquisadores faziam modelos e estudos sobre o assunto e viram que computadores poderiam fazer cálculos e processamento que viabilizaram muitas ideias. Porém, eles tinham um problema: faltavam linguagens de alto nível para tornar isso, já que, na época, computadores eram difíceis de programar.

Neste contexto, nasceu o LISP.

LISP

(begin

  (display "Hello, LISP!"")

  (newline))

Hello, LISP!

Em 1958, o MIT estava fervendo com os estudos de Inteligência Artificial liderados pelo professor John McCarthy e precisavam de uma linguagem de alto nível para estes projetos. Neste contexto surgiu o LIst Processor, o LISP. Ela foi implementada pela primeira vez por Steve Russel em um IBM 704 usando cartões perfurados.

O LISP tem uma fundação matemática, usando o conceito funções recursivas e S-expressions. Podemos dizer que LISP é uma linguagem do paradigma funcional pura que trabalha com listas de dados, sendo bastante diferente das outras linguagens da época.

John McCarthy jogando xadrez contra um computador programado em LISP. Detalhe para a elegância da gravata.
John McCarthy jogando xadrez contra um computador programado em LISP. Detalhe para a elegância da gravata.

LISP trouxe muitas contribuições às linguagens de programação modernas, iniciando pelas Macros. Se você já programou em C/C++, sabe que a macro é um recurso para estender a linguagem em tempo de pré-compilação. Basicamente, uma macro é um trecho de código que é substituído no código fonte por trechos mais complicados em que há a marcação da macro. Assim, deixa a leitura e a quantidade de código muito mais agradável e reduzida ao programador e também possibilita recursos extras.

Outra contribuição é a tipagem dinâmica. O que é isto? Simples, não precisamos declarar o tipo quando estamos trabalhando com um dado, ele por si só explica o seu tipo.

Exemplo: 1 é um inteiro, mas '1' é um caracter. Em outras linguagens como o Java, é necessário declarar o seu tipo ( int i = 1 ), estas linguagens são de tipagem estática.

A última grande contribuição está no interpretador da linguagem, o Coletor de Lixo. Para quem programa em linguagens Orientadas a Objetos como Java e Python, deve conhecer o famigerado Coletor de Lixo (GC - Garbage Collector) que é um recurso que faz limpeza de memória quando os dados ali não são mais usados.

Como LISP é uma ótima linguagem para definições de funções, vamos checar como seria o Fatorial em LISP. Aqui vou usar LISP 1.5:

(lambda (n)                            # lambda é a indicação de função anônima

    (cond ((eq n 0) 1)               # o if ou condicional é uma função! Se for igual a 0, retorna 1

        (T                                   # T indica um else da condicional

            (mul n                         # Multiplicação pelo valor de entrada N

                (fac (sub n 1))))))    # Aqui temos a recursão: função chamada com N-1

Dá para ver que tudo é sobre função e parênteses.

Aqui podemos ver coisas interessantes: tudo no LISP é uma função e mesmo estruturas bem conhecidas como IF-ELSE se comportam como funções. Outro ponto para se observar é que as funções são passadas como argumentos, ou seja, a função é um cidadão de primeira classe em linguagem funcional.

Por fim, podemos ver a recursão. Já que laços não têm muito sentido na programação funcional, as recursões cumprem a função do código ser executado diversas vezes.

Curiosidades

LISP tem um apelido maldoso: Lots of Irritating Stupid Parentheses ("Muitos parênteses estúpidos irritantes" em tradução livre). Como vimos no código, o ponto central da sintaxe do LISP são parênteses, o que gera é debate de amor e ódio entre programadores e é motivo de brincadeiras por parte dos programadores de outras linguagens.

Outra curiosidade está no cocriador do LISP, Stephen Russell, que foi um dos criadores dos primeiros jogos eletrônicos, o Spacewar! em 1962.

Space war, o primeiro game.

LISP ainda continua por aqui?

A resposta é não. O LISP inicial não existe mais e como foi uma linguagem estudada e desenvolvida em várias universidades americanas para diferentes computadores, gerou diversas novas versões. Devido a simples sintaxe, todos os LISPs têm a estrutura muito próxima, por isto, são chamados dialetos do LISP. Os mais famosos são Common LISP, Scheme, Racket e Clojure.

Porém, ele teve grandes contribuições. Uma delas foi a abertura do paradigma de programação funcional que gerou outras novas linguagens como o Haskell e Erlang e outras linguagens modernas multiparadigmas que implementaram parcialmente o paradigma funcional como Javascript, Ruby e Python.

Saiba mais sobre LISP aqui ou leia a história contada pelo próprio John McCarthy.

Conectou o passado ao presente?

Para o desenvolvimento desta série de artigos foi feito um trabalho arqueológico das linguagens originárias e a parte mais legal foi a percepção: "Ah, é daqui que surgiu isto. É por isso que funciona assim!".

Podemos ver que muitos detalhes e origens das implementações de cada linguagem moderna teve forte influência das linguagens originárias devido a cada problema que ela foi criada.

Espero que tenham gostado e aprendido um pouco mais sobre linguagens de programação antigas. E nos diga, quais das linguagens de programação que comentamos nos artigos mais influenciaram a sua linguagem favorita?

⚠️
As opiniões e comentários expressos neste artigo são de propriedade exclusiva de seu autor e não representam necessariamente o ponto de vista da Revelo.

A Revelo Content Network acolhe todas as raças, etnias, nacionalidades, credos, gêneros, orientações, pontos de vista e ideologias, desde que promovam diversidade, equidade, inclusão e crescimento na carreira dos profissionais de tecnologia.