Você usaria (um dialeto) LISP para um aplicativo do mundo real? Onde e por quê? [fechadas]

31

O LISP (e dialetos como Scheme, Common LISP e Clojure) não obtiveram muito suporte da indústria, embora sejam linguagens de programação bastante decentes. (No momento, parece que eles estão ganhando força).

Agora, isso não está diretamente relacionado à pergunta: qual você usaria um dialeto LISP para um programa de produção? Que tipo de programa e por quê? Os usos do tipo de integração em algum outro código (por exemplo, C) também estão incluídos, mas observe que é isso que você quer dizer com sua resposta. Preferem-se conceitos amplos, mas também aplicações específicas.

Anto
fonte
6
O emacs conta como um aplicativo do "mundo real"? gnu.org/software/emacs/emacs-lisp-intro
S.Lott
1
@ S.Lott: Sim. Se você usar o elisp para criar extensões para o Emacs, tudo bem e uma aplicação de um dialeto LISP
Anto
O GNU Guile é destinado exatamente para esse fim.
1
Embora interessante, acho que essa pergunta não é mais adequada para este site. Múltiplas razões: 1 - muito ampla, 2 - convida a uma lista de respostas, 3 - nenhuma maneira clara de decidir qual é a resposta "certa", 4 - muito localizada no tempo ("não ganhou muito apoio da indústria"), 5- convida à discussão e debate.
Andres F.

Respostas:

18

Você usaria um dialeto LISP para um programa de produção?

absolutamente

Que tipo de programa e por quê?

Lisp é uma linguagem dinâmica de uso geral. Hoje, ele tem as mesmas dificuldades básicas que outras linguagens dinâmicas de uso geral que não são publicadas pela Microsoft: threads nativos, integração de GUI, operação determinística do GC e pequenas pegadas de memória.

Threads nativos são alcançados pelo LispWorks e SBCL, acredito. Possivelmente outros? Eu não investiguei completamente.

LispWorks e Franz Common Lisp - produtos comerciais - integram-se à GUI a graus de sucesso. Não tendo o $$ para comprá-los, não sei como funciona. Eu suspeito que eles funcionam muito bem ...

Uma operação de GC determinista pode ser feito (ele é feito em Java para algum nível de sucesso), mas eu não sei se os sistemas Lisp existentes (aqueles mantidos) têm qualquer código para fazer isso.

Pequena área de memória que acredito ser alcançada por alguns Lisps.

Meu ponto básico é que o Common Lisp está tecnicamente pronto para criar sistemas de produção. E faz .

A grande maioria dos desenvolvedores se assusta com (escolha uma) linguagens dinâmicas, macros, parênteses, falta de IDE favorito, má experiência na faculdade, poucos trabalhos nela e depois não a usa.

Pessoalmente, eu pularia na construção de um sistema de produção completo no Common Lisp do zero em um ambiente de equipe.

editar: eu realmente não respondi por que o Lisp em oposição a outros idiomas.

Na minha experiência com o Lisp - não significativo, mas consideravelmente mais que o 'olá mundo' -, achei a linguagem extremamente útil após as primeiras dores de "Argh new language". A maioria do idioma se encaixa de uma maneira muito regular e bastante óbvia, que eu realmente não acho que outros idiomas funcionem. Parte disso é a fusão de expressões e declarações. Parte disso é o tipo de dados da lista principal. Parte disso é o sistema de tipos. Parte disso é o sistema macro. Não me interpretem mal, porém, não são pontos de dor. Mas eles não me chutam na cara tanto quanto as dores de outras línguas.

Um exemplo simplista é a rotina de comprimento de lista do Python. A abordagem do Python é chamar len(mysequence). Mas, se pensarmos nisso, um comprimento é uma propriedade de uma sequência. Então, mysequence.len()é uma ideia mais apropriada. Lisp remove essencialmente essa distinção sintática. (length thing)é a sintaxe da chamada de função e a sintaxe do método. Claro, algumas pessoas acham isso frustrante e querem a diferença sintática. Eu preferiria ter a regularidade.

edit2: eu converti a parte da minha tese de mestrado que é executada na área de trabalho em Common Lisp e foi um prazer trabalhar até agora.

Paul Nathan
fonte
2
Pelo que ouvi dizer, o LISP é usado em sistemas de produção completos, mas geralmente apenas para determinados processos lógicos que são mais fáceis de codificar no LISP do que em outros idiomas. A IA de videogame e o pré-processamento de dados estatísticos foram exemplos que me foram citados. Certa vez, tive um gerente que dizia "Qualquer sistema suficientemente complexo possui uma implementação LISP meia-boca incorporada". Um ditado semelhante era "Qualquer sistema suficientemente inchado tem um leitor de e-mail embutido".
FrustratedWithFormsDesigner
4
@Frustrated: Sim, essas são as enésimas leis de Greenspun e jwz.
Paul Nathan
2
Muitos deles são resolvidos pelo Clojure, simplesmente pelo fato de serem especificamente projetados para serem compatíveis e substituir o Java. Mas é claro que também existem implementações de esquema e CL para a JVM (por exemplo, Kawa, ABCL).
Jörg W Mittag
4
Clojure é vagamente irritante para mim, porque é mais uma fragmentação.
Paul Nathan
fragmentação não é uma coisa ruim. O que é realmente irritante em Clojure é a falta de pares pontilhados. Pode ser contada como uma linguagem semelhante ao Lisp sem uma coisa tão fundamental?
SK-logic,
11

Eu pessoalmente conheço pessoas que usam o Lisp na forma de Clojure em alguns bancos de investimento e startups em Londres. Também escolhi o Clojure como a principal linguagem de desenvolvimento para minha própria startup, por isso estou disposto a colocar meu dinheiro onde minha boca está :-)

Eu achei uma experiência muito esclarecedora aprender o Clojure durante o ano passado (depois de muita experiência com Java e C #). Os principais motivos para isso são:

  • Ele tem uma forte ênfase na programação funcional (mais do que na maioria dos outros Lisps). O autor e BDFL Rich Hickey citou frequentemente Haskell como uma de suas inspirações para o design da linguagem, o que significa que você obtém coisas como estruturas de dados totalmente imutáveis ​​e sequências infinitas e preguiçosas etc.
  • Metaprogramação de macros - a filosofia "código é dados" do Lisp é difícil de entender, a menos que você realmente tenha experimentado, mas esse é um dos motivos pelos quais os Lisps são tão expressivos e produtivos. Você basicamente tem o poder de estender o idioma para corresponder ao domínio do seu problema.
  • Suporte fantástico para simultaneidade de vários núcleos - acho que o Clojure é a melhor linguagem para programação simultânea no momento. Consulte http://www.infoq.com/presentations/Value-Identity-State-Rich-Hickey para uma apresentação esclarecedora sobre isso.
  • O desenvolvimento interativo no REPL é uma maneira excelente e produtiva de criar aplicativos. Dá a você uma sensação real de poder modificar dinamicamente o código do aplicativo em execução e inspecionar programaticamente as estruturas de dados ao vivo ...

Também parece ser uma opção prática para o uso real da produção pelos seguintes motivos:

  • A execução na JVM com interoperabilidade Java muito fácil fornece acesso a todas as bibliotecas e ferramentas no ecossistema Java
  • Você está executando a JVM, que é uma plataforma testada e comprovada para aplicativos corporativos. O Clojure se beneficia de todos os recursos agradáveis ​​da JVM, como excelente compilação de GC e JIT gratuitamente.
  • Por padrão, é uma linguagem dinâmica , o que a torna muito conveniente para o desenvolvimento e a criação rápida de protótipos, com praticamente nenhum clichê. No entanto, você pode adicionar dicas de tipo estático para obter um bom desempenho onde você precisar.
  • É uma comunidade pragmática e útil - o tipo de cultura em que as pessoas fazem as coisas e o foco está em soluções bem projetadas que resolvem problemas reais
  • suporte para ferramentas em vários IDEs . Pessoalmente, uso o Eclipse com o plug-in no sentido anti-horário (porque preciso da integração do Java), mas há muitas outras opções.
Mikera
fonte
8

Eu usaria o LISP se fosse a melhor escolha para o trabalho. Apenas algumas coisas que influenciam a "melhor escolha":

  • suporte do fornecedor. A implementação do LISP que usamos - se algo der errado e interferir em nosso desenvolvimento e, portanto, em nossos prazos, o fornecedor trabalhará em direção a uma solução conosco?
  • suporte de biblioteca. Quais bibliotecas estão disponíveis? Manipulação de string, matemática, acesso a dados, servlets da Web (ou equivalentes a LISP), kit de ferramentas de janelas, etc ... Não quero ter que escrever essas coisas do zero.
  • suporte de ferramenta - Quão bom é o IDE? Sólido / estável ou escamoso? Bom suporte ao editor? Depurador integrado? Se eu precisar fazer o desenvolvimento da GUI no LISP, existe um IDE visual ou preciso codificar o layout da GUI manualmente ( odeio fazer isso).
  • adesão do desenvolvedor (eu realmente não quero gastar muito tempo ensinando meus colegas de equipe um idioma totalmente novo)

Todos esses fatores devem ser considerados ao decidir se o LISP é apropriado para um projeto. No mundo corporativo, eu nunca experimentei isso.

FrustratedWithFormsDesigner
fonte
Concordo com você que a produtividade geralmente é mais influenciada pelas ferramentas e bibliotecas disponíveis do que pelo próprio idioma (desde que o idioma ofereça algumas funcionalidades básicas).
Giorgio
6

Absolutamente. Paul Graham explica bem .

... Em 1995, sabíamos algo que acho que nossos concorrentes não entendiam, e poucos entendem até agora: quando você está escrevendo um software que só precisa ser executado em seus próprios servidores, pode usar o idioma que desejar. ..

Nós escolhemos Lisp. Por um lado, era óbvio que o desenvolvimento rápido seria importante nesse mercado. Estávamos todos começando do zero, então uma empresa que poderia realizar novos recursos antes que seus concorrentes tivessem uma grande vantagem. Sabíamos que o Lisp era uma linguagem muito boa para escrever software rapidamente, e os aplicativos baseados em servidor aumentam o efeito do desenvolvimento rápido, porque você pode liberar o software assim que for feito.

Se outras empresas não quisessem usar o Lisp, tanto melhor. Isso pode nos dar uma vantagem tecnológica e precisamos de toda a ajuda possível ...

Então você poderia dizer que usar o Lisp foi um experimento. Nossa hipótese era que, se escrevêssemos nosso software no Lisp, poderíamos executar recursos mais rapidamente do que nossos concorrentes e também fazer coisas em nosso software que eles não poderiam fazer. E como o Lisp era de alto nível, não precisaríamos de uma grande equipe de desenvolvimento, portanto nossos custos seriam mais baixos. Se assim fosse, poderíamos oferecer um produto melhor por menos dinheiro e ainda obter lucro. Acabaríamos recebendo todos os usuários, e nossos concorrentes não receberiam nenhum e, eventualmente, fechariam os negócios. Era isso que esperávamos que acontecesse.

Quais foram os resultados desse experimento? Surpreendentemente, funcionou. Eventualmente, tivemos muitos concorrentes, da ordem de vinte a trinta, mas nenhum de seus softwares poderia competir com o nosso. Tínhamos um construtor de lojas on-line wysiwyg que rodava no servidor e ainda parecia um aplicativo de desktop. Nossos concorrentes tinham scripts cgi. E sempre estávamos à frente deles em recursos. Às vezes, em desespero, os concorrentes tentavam introduzir recursos que não tínhamos. Porém, com o Lisp, nosso ciclo de desenvolvimento foi tão rápido que às vezes conseguimos duplicar um novo recurso dentro de um ou dois dias de um concorrente anunciando-o em um comunicado à imprensa. Quando os jornalistas que cobrem o comunicado de imprensa chegaram a nos ligar, teríamos o novo recurso também.

Deve ter parecido aos nossos concorrentes que tínhamos algum tipo de arma secreta - que estávamos decodificando o tráfego Enigma ou algo assim. Na verdade, tínhamos uma arma secreta, mas era mais simples do que eles imaginavam. Ninguém estava divulgando suas características para nós. Fomos capazes de desenvolver software mais rápido do que se imaginava possível ...

Kevin Cline
fonte
8
"... Paul Graham originalmente escreveu reddit, em lisp, nas costas de um guardanapo enquanto esperava um café. Era tão poderoso que precisava ser reescrito em python para que computadores comuns pudessem entendê-lo. foi escrito em lisp, quase não houve esforço para reescrever tudo, e a reescrita foi concluída entre dois ciclos de processador.O próprio Paul Graham foi completamente escrito em lisp, por uma versão anterior de si mesmo, também escrita em lisp, por um versão anterior do lisp. É lisp, paul graham, lisp, paul graham, todo o caminho. "
precisa
5

Onde: O Emacs é um aplicativo do mundo real que usa LISP.

Motivo: foi uma ótima maneira de expressar o mapeamento entre pressionamento de tecla e ação. É interpretado e rápido, bem definido e simples.

S.Lott
fonte
Gostaria de estender essa resposta, dizendo por que era bom para expressar o mapeamento entre ketstrokes e ações
Anto
@Anto: Na minha experiência, o Lisp facilita muito a criação de abstrações poderosas que podem representar de forma transparente qualquer ação que você possa executar em um editor de uma maneira muito consistente - depois de usar o Emacs um pouco, você pode adivinhar como quase tudo é feito . Isso torna possível mapear qualquer coisa que você possa fazer no editor para um pressionamento de tecla, com cada ligação parecendo muito semelhante entre si, facilitando a gravação e a manutenção.
Tikhon Jelvis
4

Ambos Macsyma e Autocad são baseados em um dialeto do Lisp. Eu os classificaria como 'mundo real' e também como Emacs.

Joris Geer
fonte
O Mathematica não é baseado no Lisp.
Rainer Joswig 07/03
2
O AutoCAD oferece o AutoLISP como uma API, mas está escrito em código gerenciado em C ++ e .NET.
CAD bloke
1
@RainerJoswig Macsyma provavelmente foi criado em vez de Mathematica.
precisa saber é o seguinte
2

Absolutamente eu consideraria isso. Especialmente para novos trabalhos de desenvolvimento com algum potencial de computação paralela. Esse parece ser um ponto ideal para esses tipos de linguagens funcionais.

Dave Kincaid
fonte
2

O Lisp é uma das melhores opções para implementar compiladores. E, como o uso de DSLs e eDSLs está aumentando agora, o Lisp está se tornando mais valioso. Estou usando um dialeto Lisp para todas as minhas tarefas relacionadas ao DSL.

SK-logic
fonte
0

No momento, estou tentando usar o newLisp como um substituto para o Php no meu site pessoal, através da estrutura Dragonfly . Se eu descobrir como fazer o Apache funcionar bem, eu o usarei (o servidor da Web incorporado funciona muito bem, mas eu preferiria trabalhar com o Apache). E uma vez que isso aconteça, usarei o newLisp em qualquer lugar em que usaria o Php, porque não gosto do Php e gosto do newLisp.

No momento, Clojure não é uma boa opção para aplicativos Android, mas sei que as pessoas estão trabalhando nisso. Então, se isso for descoberto, seria outro lugar para eu usar um dialeto do Lisp para aplicativos do mundo real ... mas, novamente, isso é porque eu simplesmente não gosto de Java.

Mas, honestamente, prefiro Ruby a Lisp ... mas isso é principalmente uma questão de comunidade e documentação.

philosodad
fonte
0

Eu implementei um aplicativo comercial proprietário no Common Lisp chamado Tankan que roda no Microsoft Windows como um executável nativo.

É um programa para treinar você mesmo a memorizar caracteres kanji japoneses.

O programa é executado como um servidor HTTP em segundo plano. A execução deste servidor e a navegação para suas páginas são coordenadas por um pequeno aplicativo de ícone da área de notificação do sistema (também conhecido como "Bandeja") que desenvolvi usando o Visual C ++.

O aplicativo de ícone da pequena bandeja inicia, monitora e para o servidor baseado em Lisp e se comunica com ele usando os tubos Win32 vinculados à sua entrada e saída padrão. Por meio de um canal, o servidor Lisp informa o aplicativo de ícone da bandeja da URL precisa com o número de porta correto, e esse aplicativo de ícone da bandeja pode iniciar o navegador pela API do Shell para navegar nessa URL. O usuário clica duas vezes no ícone para abrir a interface do usuário.

O programa Lisp mantém em sua memória um estado de sessão bastante complexo que contém o histórico de entrada do usuário e vários relacionamentos entre vários objetos. A notação de objeto circular do Lisp (ativada pela *print-circle*variável) e como ela funciona nos print-objectmétodos CLOS personalizados são de grande ajuda na implementação da persistência: os usuários podem salvar o estado no disco e retomar de onde pararam. Tudo é salvo, incluindo o estado da interface do usuário. Há muita subestrutura compartilhada no gráfico de objetos, bem como ciclos. Além disso, muitos itens estáticos que não precisam ser persistidos, como o conteúdo dos objetos de entrada do dicionário. Com os métodos personalizados de objeto de impressão ANSI Common Lisp, você pode criar representações impressas condensadas para objetos que são legíveis por máquina,

Quase nenhum JavaScript é usado na interface da web. Mesmo os controles para ocultar e mostrar partes da interface do usuário são feitos através do envio de formulários e da nova renderização do HTML. Portanto, todos os detalhes do estado da interface do usuário estão no servidor e persistem quando o usuário salva. A re-geração do HTML é muito rápida. Isso é feito por uma expressão gigante de aspas Lisp, que alimenta uma macro geradora de HTML. O código compilado pelo Clozure Common Lisp (CCL) faz com que isso aconteça tão rápido que você nem percebe que quando clica em um botão [+] na interface do usuário para abrir algo, está enviando uma solicitação a um servidor que regenera o página danada inteira, e não simplesmente executando algum JavaScript local para alterar a visibilidade de um elemento de documento local.

O programa foi originalmente desenvolvido com o CLISP. Graças ao ANSI CL ser uma linguagem padrão, com implementações que se adaptam bem e não muitas armadilhas furtivas na linguagem (comportamento "indefinido" ou "definido pela implementação"), ele é facilmente transportado para o CCL.

O CLISP não foi abandonado; ainda é usado para alimentar o back-end de licenciamento, usando muito da mesma base de código comum.

Desenvolvi um sistema de licenciamento original para o programa, usando criptografia de curva elíptica fornecida pela biblioteca IronClad, usada pelo servidor de licenciamento para assinar licenças para certificá-las. (Lembro-me de que poderia ter usado o programa de linha de comando do OpenSSL para gerar os parâmetros EC para a chave do servidor.)

As licenças são representadas como objetos Lisp. É uma homenagem à portabilidade do Lisp que um programa do Windows compilado pelo Clozure Common Lisp possa gerar uma licença baseada em expressão S, um programa CLISP em execução em um servidor Debian possa preencher o campo de assinatura digital ausente nesse objeto e enviá-lo de volta para o programa Windows que pode validar a assinatura.

No servidor, além do serviço de licenciamento baseado em CGI, eu simples API de linha de comando para gerenciar licenças. Você pode listar licenças, encontrar licenças específicas e editar seus atributos: por exemplo, editar a data de validade de uma licença temporária para conceder uma exceção ao usuário. O back-end de licenciamento também gera emails. Eu não usei nenhuma biblioteca para manipulação de CGI no lado do servidor: apenas código Lisp rolado manualmente para lidar com as variáveis ​​de ambiente Apache e argumentos da linha de comando. (Embora o código da biblioteca seja usado para lidar com codificação de URL e geração de HTML.) Nenhum banco de dados é usado para armazenamento; as licenças são geradas em um arquivo chamado licenses.lispe é isso.

Kaz
fonte
-1

Se alguém me pagou, com certeza.

Eles provavelmente estariam mais interessados ​​em pagar alguém que conhece o idioma. Eu só brinquei com elisp e esquema algumas vezes.

Edward Strange
fonte