Quando os programadores discutem as vantagens de várias linguagens de programação, geralmente falam sobre eles em termos prosaicos, como ferramentas em um conjunto de dispositivos diferentes - um é mais adequado para a programação do sistema, o outro para colar outros programas para resolver o problema atual. Deveria ser assim. Os idiomas têm pontos fortes diferentes, e afirmar que um idioma é melhor do que outros idiomas sem especificar exemplos específicos significa apenas causar debates improdutivos e agudos.
No entanto, há uma linguagem que estranhamente desperta respeito universal:
Lisp . Os cruzados dos teclados, prontos para atacar quem se atreve a declarar que qualquer idioma é melhor que outros, concordam que o Lisp está em um nível diferente. Isso vai além dos critérios utilitários julgados por outras linguagens, uma vez que o programador médio nunca usou o Lisp para criar algo prático, e provavelmente nunca o fará, no entanto, o respeito pelo Lisp é tão profundo que ele é frequentemente creditado com propriedades míticas. Os quadrinhos xkcd favoritos de todos retratam Lisp pelo menos duas vezes: em um quadrinho, um personagem alcança a iluminação Lisp, o que o ajuda a entender a estrutura fundamental do universo. Em outro, um antigo programador de roupão entrega uma pilha de parênteses a seu padawan, explicando que esta é “uma arma elegante para tempos mais civilizados”, aludindo às possibilidades ocultas da
Força inerente a Lisp.
Outro ótimo exemplo é a paródia de Bob Kanefsky da música "Deus vive na Terra". Sua paródia foi escrita em meados dos anos 90 e é chamada de "Chama Eterna". Ela descreve como, aparentemente, Deus criou o mundo com a ajuda de Lisp. A seguir, um trecho e a versão completa pode ser encontrada no site da
GNU Humor Collection :
Afinal, Deus escreveu em Lisp
Quando ele encheu as folhas de verde.
Flores fractal e raízes recursivas:
O hack mais bonito que eu já vi.
E quando eu estudo os flocos de neve
E não encontro dois iguais
Eu sei que Deus ama a linguagem
Com seu próprio nome de quatro letras.
Falo apenas por mim, mas me parece que o meme cultural “Lisp é magia secreta” é o fenômeno mais estranho e interessante. O Lisp foi concebido em uma torre de marfim como uma ferramenta para pesquisar inteligência artificial, por isso sempre será um pouco desconhecido e misterioso para programadores comuns. No entanto, agora os programadores estão
pressionando um ao outro "tente Lisp antes de morrer", como se fosse algum tipo de droga psicodélica que amplia a consciência. Eles fazem isso apesar do Lisp ser a segunda mais antiga das linguagens de programação que ainda usam, perdendo apenas para o
Fortran , e isso é apenas um ano. Imagine que a empresa ou equipe que o desenvolveu o instruiria a anunciar alguma nova linguagem de programação. Não seria legal convencer a todos que sua nova linguagem tem poderes divinos? Mas como isso poderia ser alcançado? Como a linguagem de programação se tornou famosa como fonte de conhecimento secreto?
Como Lisp chegou a isso?
Byte Magazine Cover, agosto de 1979Teoria A: Linguagem Axiomática
John McCarthy , o criador de Lisp, não procurou inicialmente fazer de Lisp a essência elegante dos princípios computacionais. Mas, depois de uma ou duas idéias bem-sucedidas e várias melhorias, o Lisp se transformou exatamente nisso.
Paul Graham - falaremos sobre isso mais tarde - escreveu que, depois de criar o Lisp, McCarthy "fez o mesmo para a programação e Euclides para a geometria". Talvez as pessoas estejam procurando um significado mais profundo em Lisp, porque McCarthy o criou a partir de partes tão fundamentais que é difícil dizer se ele a inventou ou a descobriu.
McCarthy começou a refletir sobre a criação do idioma durante o
Projeto de Pesquisa em Inteligência Artificial de Verão de 1956 em Dartmouth . Este workshop foi uma conferência acadêmica contínua de várias semanas, a primeira no campo da IA. A propósito, foi McCarthy, então, como professor associado de matemática em Dartmoor, quem cunhou o termo "inteligência artificial", propondo realizar essa reunião. Participaram da conferência cerca de dez pessoas. Entre eles estavam Allen Newel e Herbert Simon, dois pesquisadores associados à RAND Corporation e à Carnegie Mellon University, que haviam acabado de concluir o desenvolvimento da linguagem
IPL .
Newel e Simon tentaram criar um sistema capaz de fornecer evidências na
lógica dos enunciados . Eles perceberam que seria difícil fazer isso, permanecendo no nível de suas próprias instruções de computador, então decidiram criar uma linguagem - ou, como a chamavam, um "pseudo-código" - que os ajudaria a expressar mais naturalmente o trabalho de sua "máquina de lógica teórica". Sua linguagem, IPL, a "linguagem de processamento de informações", era mais um dialeto de alto nível do assembler do que uma linguagem de programação no sentido moderno. Newel e Simon, possivelmente se referindo a Fortran, notaram que os “outros pseudo-códigos” que estavam em desenvolvimento estavam “ocupados” em representar as equações na notação matemática padrão. Em vez disso, sua linguagem se concentrou em apresentar declarações como listas de expressões simbólicas. Os programas IPL usavam sequências de montagem de macros para processar e avaliar expressões em uma ou mais dessas listas.
McCarthy achou que seria útil ter expressões algébricas em um idioma semelhante ao Fortran. Portanto, ele não gostou do IPL. Mas ele achava que as listas simbólicas são uma boa maneira de modelar tarefas do campo da IA, especialmente aquelas que incluem dedução. Era o germe do desejo de McCarthy de criar uma linguagem algébrica de processamento de listas, uma linguagem que lembrava o Fortran, mas podia lidar com listas simbólicas como o IPL.
É claro que hoje o Lisp não se parece com o Fortran. Nos próximos anos, as idéias de McCarthy para uma linguagem ideal de processamento de listas evoluíram. Suas idéias começaram a mudar em 1957, quando ele começou a escrever procedimentos para o programa de xadrez Fortran. A longa exposição de Fortran convenceu McCarthy de que havia vários pontos ruins em seu design, o principal deles era a desajeitada declaração do IF. McCarthy inventou uma alternativa, a expressão condicional "true", retornando a subexpressão A, se a verificação fornecida foi bem-sucedida, e a subexpressão B em outro caso, e executando apenas a subexpressão retornada. No verão de 1958, quando McCarthy estava trabalhando em um programa capaz de diferenciação, ele percebeu que sua expressão condicional "verdadeira" tornava as funções recursivas da escrita mais simples e mais naturais. O problema da diferenciação também levou McCarthy a escrever uma função maplist que usa outra função como argumento e a aplica a todos os elementos da lista. Foi útil para diferenciar as somas de um número arbitrário de membros.
Fortran não conseguiu expressar essas coisas, então, no outono de 1958, McCarthy perguntou a vários estudantes a tarefa de implementar o Lisp. Como McCarthy agora era professor associado do MIT, todos os alunos estudaram no MIT. Ao traduzir idéias em código funcional, McCarthy e os alunos fizeram mudanças que simplificaram ainda mais o idioma. O maior deles foi a sintaxe Lisp. McCarthy, a princípio, queria o chamado "Expressões-M", uma camada de "
açúcar sintático " que fazia a sintaxe do Lisp parecer com Fortran. Embora as expressões M possam ser traduzidas para expressões S - uma lista simples entre colchetes pela qual Lisp é famoso - as expressões S eram realmente uma representação de baixo nível para um computador. O único problema era que McCarthy denotava expressões M entre colchetes e não havia colchetes no perfurador IBM 026 usado no MIT. Portanto, a equipe do Lisp se limitou às expressões S e as usou para representar não apenas listas de dados, mas também o uso de funções. McCarthy e os alunos fizeram várias outras simplificações, incluindo a mudança para a gravação com prefixo e um modelo de memória em que o idioma tinha apenas um tipo de real.
Em 1960, McCarthy publicou o famoso trabalho em Lisp "Funções Recursivas de Expressões Simbólicas e Sua Computação por Máquina]. Até então, a linguagem havia sido reduzida a tal ponto que McCarthy percebeu que havia criado um "sistema matemático elegante", e não apenas outra linguagem de programação. Mais tarde, ele escreveu que muitas das simplificações do Lisp o transformaram em "uma maneira de descrever funções computadas, muito mais precisas do que as máquinas de Turing ou definições recursivas gerais usadas na teoria das funções recursivas". Em seu trabalho, ele introduziu o Lisp como uma linguagem de programação de trabalho e como um formalismo para estudar o comportamento de funções recursivas.
McCarthy explicou Lisp aos leitores, construindo-o a partir de um pequeno conjunto de regras. Mais tarde, Paul Graham seguiu os passos de McCarthy usando uma linguagem mais fácil de ler em seu ensaio
Roots of Lisp . Graham pode explicar o Lisp com apenas sete operadores primitivos, duas entradas diferentes para funções e seis funções de alto nível definidas por meio de operadores primitivos. A capacidade de definir Lisp com uma sequência tão pequena de regras simples certamente aumenta seu mistério. Graham chamou o trabalho de McCarthy de uma tentativa de "axiomatizar a computação". Eu acho que essa é uma ótima maneira de refletir sobre o apelo do Lisp. Em outras línguas, há claramente construções artificiais descritas por palavras reservadas, como while, typedef ou vazio estático público; parece que a descrição Lisp é limitada pela própria lógica dos cálculos. Essa qualidade e a conexão original de Lisp com um campo esotérico como a "teoria das funções recursivas" devem explicar o prestígio atual da linguagem.
Teoria B: A Máquina do Futuro
Duas décadas após a sua criação, o Lisp se tornou, de acordo com o famoso "
dicionário de cientistas da computação ", a "língua nativa" da pesquisa em IA. O Lisp se espalhou rapidamente nos estágios iniciais, provavelmente devido ao fato de sua sintaxe sistemática tornar a tarefa de sua implementação em novas máquinas relativamente simples. Mais tarde, os pesquisadores continuaram a usá-lo por causa de quão bem ele manipulava expressões simbólicas, o que era importante em uma época em que a maioria da IA era simbólica. O Lisp foi usado em projetos prolíficos de IA, como o programa de linguagem natural
SHRDLU , o
sistema de álgebra computacional
Macsyma e o sistema lógico
ACL2 .
Em meados da década de 1970, os pesquisadores de IA começaram a carecer de energia do computador. Por exemplo, o PDP-10 - a máquina de IA favorita de todos - tinha um espaço de endereço de 18 bits, que faltava cada vez mais para programas de IA no Lisp. Muitos programas de IA também tinham que ser interativos, e criar um grande programa interativo que funcionasse bem em um sistema de compartilhamento de tempo era uma tarefa difícil. A solução que Peter Deutsch, do MIT, propôs pela primeira vez foi desenvolver um computador dedicado para o Lisp.
Essas máquinas devem fornecer a cada usuário um processador dedicado otimizado para Lisp. Eles também tinham que ter um ambiente de desenvolvimento escrito em Lisp para programadores hardcore de Lisp. As máquinas Lisp, inventadas em um momento desconfortável no final da era dos minicomputadores, mas antes do auge da revolução dos microcomputadores, eram computadores pessoais de alto desempenho para a elite dos programadores.
Por um tempo, parecia que as máquinas Lisp seriam a onda do futuro. Várias empresas começaram a competir pela comercialização dessa tecnologia. O mais bem-sucedido deles foi o Symbolics, criado por veteranos do MIT AI Lab. Na década de 1980, a Symbolics lançou sua série de computadores 3600, popular na indústria de IA e em indústrias que exigem computação de alta potência. A linha 3600 incluía computadores com telas grandes, gráficos de bitmap, uma interface baseada em mouse e poderosos programas de gráficos e animação. Estas eram máquinas impressionantes que possibilitaram escrever programas impressionantes. Por exemplo, Bob Cali, que trabalhou no campo da pesquisa em robótica, escreveu para mim via Twitter que ele foi capaz de implementar e visualizar o algoritmo de busca de caminhos no Symbolics 3650 em 1985. Ele disse que gráficos de varredura e OOP (disponível nas máquinas Lisp graças à extensão Flavors) eram novos na década de 1980. A Symbolics estava na vanguarda.

Mas, como resultado, os computadores da Symbolics eram incrivelmente caros. A Symbolics 3600 custou US $ 110.000 em 1983. A maioria das pessoas só se maravilhava com o poder das máquinas Lisp e com a magia dos operadores que escreviam em Lisp de longe. Mas eles se maravilharam. A revista Byte descreveu as máquinas Lisp e Lisp várias vezes entre 1979 e o final dos anos 80. Na edição de agosto de 1979 da Lisp, o editor-chefe estava entusiasmado com as novas máquinas que estavam sendo desenvolvidas no MIT, "com uma montanha de memória" e um "sistema operacional avançado". Ele os considerou tão promissores que os dois anos anteriores em que o Apple II, o Commodore PET e o TRS-80 apareceram pareciam chatos. Cinco anos depois, em 1985, o autor da revista Byte descreveu o processo de escrever programas Lisp para o "Symbolics 3670 complexo e extremamente poderoso", e incentivou os leitores a aprender o Lisp, afirmando que era "o idioma que a maioria dos pesquisadores de IA precisa". e um candidato para uma futura linguagem de uso geral.
Perguntei a Paul MacJones,
que havia feito muito para salvar Lisp no Museu de História da Computação de Mountain View, sobre quando as pessoas começaram a falar sobre Lisp como um presente de criaturas de dimensões superiores. Ele disse que os recursos da própria linguagem certamente contribuíram para isso, mas também a estreita conexão entre o Lisp e as poderosas aplicações de IA nas décadas de 1960 e 1970. Quando se tornou possível comprar máquinas Lisp na década de 1980, mais algumas pessoas se encontraram fora de lugares como o MIT ou Stanford, e a lenda continuou a crescer. Hoje, poucas pessoas se lembram das máquinas Lisp e Symbolics, mas ajudaram a manter a aura do mistério Lisp até os anos 80.
Teoria B: treinamento em programação
Em 1985, professores do MIT, Harold Abelson e Gerald Sasman, bem como a esposa de Sasman, Julia, publicaram o livro Estrutura e Interpretação de Programas de Computador. No livro didático, os leitores foram ensinados a programar na linguagem Scheme, o dialeto Lisp. Foi usado no MIT para uma introdução à programação por duas décadas. Parece-me que este é um livro didático, o SICP, acrescentou misticismo ao Lisp. O SICP pegou o Lisp e mostrou como ele pode ser usado para ilustrar os conceitos profundos, quase filosóficos, da arte da programação. Esses conceitos eram comuns o suficiente para usar qualquer PL, mas os autores do SICP escolheram o Lisp. Como resultado, a reputação de Lisp foi complementada pela notoriedade deste livro estranho e brilhante que intrigou muitas gerações de programadores (e se tornou um
meme muito estranho ). Lisp sempre foi "o formalismo elegante de McCarthy"; agora também se tornou uma linguagem "ensinando os segredos ocultos da programação").
Vale a pena conversar um pouco sobre o quão estranho é este livro - porque me parece que sua estranheza e estranheza Lisp hoje se fundiram em um. Estranho começa na capa. Ele mostra um mago ou um alquimista se aproximando de uma mesa e pronto para começar algum tipo de bruxaria. Por um lado, ele tem uma pinça ou bússola, por outro - um globo com as inscrições "eval" e "apply". A mulher à sua frente aponta para a mesa; contra o fundo está a letra grega lambda que irradia no ar.

O que está acontecendo aqui? Por que há uma perna de animal na mesa? Por que uma mulher aponta para a mesa? Qual é o significado do tinteiro? Deveríamos entender que o mago revelou o conhecimento secreto do universo e que eles consistem em um ciclo de avaliação / aplicação e
cálculo lambda ? Aparentemente é. Somente essa imagem deveria ter acrescentado muito à percepção atual do Lisp.
Mas o texto do livro em si muitas vezes acaba sendo igualmente estranho. O SICP não é como a maioria dos outros livros sobre ciência da computação. Os autores do prefácio explicam que o livro não trata apenas de programação no Lisp - ele fala de "três truques ou fenômenos: a mente humana, um conjunto de programas de computador e um computador". Mais tarde, eles descrevem que estão convencidos de que a programação não deve ser considerada como uma disciplina da ciência da computação, mas como um novo registro da "
epistemologia processual". Os programas são uma nova maneira de estruturar pensamentos que são inseridos apenas ocasionalmente em um computador. O primeiro capítulo faz um breve tour pelo Lisp, mas a maior parte do livro trata de conceitos mais abstratos. Ele discute vários paradigmas de programação, a natureza do tempo e a identidade nos sistemas OO e, em um só lugar, quais problemas de sincronização podem surgir devido às limitações fundamentais da passagem de mensagens, que desempenham o papel da velocidade da luz na teoria da relatividade. Essas são coisas bastante obscuras.
E para não dizer que o livro é ruim. Ela é maravilhosa. Ele discute importantes conceitos de programação em um nível superior ao de todos os outros livros que li, conceitos sobre os quais pensei por um longo tempo, mas que não consegui descrever. Surpreendentemente, a introdução ao livro didático de programação pode descrever rapidamente as desvantagens fundamentais da OOP e as vantagens das linguagens funcionais que minimizam um estado mutável.
É incrível como isso se transforma em uma discussão sobre como o paradigma de streaming, provavelmente algo como o RxJS de hoje , pode oferecer o melhor de ambas as abordagens. O SICP destaca a própria essência do desenvolvimento de programas de alto nível, lembrando o trabalho original de McCarthy sobre Lisp. A primeira coisa que você quer fazer depois de ler este livro é fazer com que seus colegas programadores o leiam; se a encontrarem, virem a capa e não lerem, tudo o que será adiado é que algo misterioso chamado eval / apply dá aos bruxos um poder especial sobre mesas com pernas de animais. Eu ficaria impressionado com os sapatos deles.Mas talvez a contribuição mais importante do SICP tenha sido elevar o Lisp de um nível de curiosidade engraçado para a necessidade pedagógica. Muito antes do SICP, as pessoas se aconselhavam a aprender o Lisp para melhorar seu nível como programador. Edição de 1979 da Byte Magazine. O mesmo editor, que admirou as novas máquinas Lisp no MIT, explicou que vale a pena aprender esse idioma porque "representa um ponto de vista diferente nas tarefas". No entanto, no SICP, o Lisp foi apresentado não apenas como um contraste com outros idiomas. Foi usada como uma linguagem introdutória, sugerindo que é a melhor linguagem para aprender conceitos básicos de programação. Quando os programadores de hoje se aconselham a experimentar o Lisp antes de morrerem, provavelmente o fazem por causa do SICP. Afinal, Brainfuck provavelmente também oferece uma "perspectiva diferente sobre as tarefas".Mas as pessoas estudam Lisp, sabendo que há vinte anos o ponto de vista de Lisp tem sido tão útil que os alunos do MIT ensinaram Lisp a todas as outras línguas.Retorno Lisp
No ano em que o SICP foi lançado, Björn Straustrup publicou a primeira edição do livro " Linguagem de Programação C ++ ", que trouxe OOP para as massas. Alguns anos depois, o mercado de máquinas Lisp entrou em colapso e o inverno da IA começou . Nos dez anos seguintes, o C ++ e o Java se tornaram as linguagens do futuro, e o Lisp vegetou.Naturalmente, é impossível indicar quando exatamente as pessoas começaram a admirar Lisp novamente. Talvez isso tenha acontecido depois que Paul Graham, co-fundador do Y-Combinator e criador do Hacker News, publicou vários ensaios influentes descrevendo o Lisp como a melhor linguagem para startups. Ensaio Antes do Médio"Graham afirmou que as macros do Lisp tornaram a linguagem mais forte que outras. Ele afirmou que o uso do Lisp em sua startup da Viaweb o ajudou a desenvolver certas coisas mais rapidamente do que seus concorrentes. Alguns programadores estavam convencidos. Mas a maioria não mudou para o Lisp.Em vez disso, mais e mais recursos do Lisp começaram a cair nos idiomas favoritos de todos. Python adicionou geração de lista. Em c # - Linq. Em Ruby ... bem, Ruby é Lisp. Como Graham observou em 2001, "o idioma padrão, incorporado em muitos dos idiomas populares posteriores, evoluiu gradualmente para o Lisp". E enquanto outras línguas estão se aproximando gradualmente do Lisp, o próprio Lisp, de alguma forma, mantém sua reputação especial como uma linguagem misteriosa que poucos entendem, mas todos precisam aprender. Em 1980, no ano do 20º aniversário de Lisp, McCarthy escreveu que Lisp havia sobrevivido por tanto tempo, enquanto ele tomava "um ótimo local aproximado de algum tipo no espaço da PL". Mas isso subestima a influência real do Lisp. Ele sobrevive há cinquenta anos porque os programadores reconhecem relutantemente, década após década, que esta é a melhor ferramenta para sua tarefa. Ele sobreviveu apesar deque a maioria dos programadores não usa. Devido à sua origem e uso na pesquisa de IA, e talvez também ao legado do SICP, o Lisp continua a encantar as pessoas. E até que possamos imaginar Deus que criou o mundo com a ajuda de uma linguagem mais nova, o Lisp não vai a lugar algum.