Eu já vi muitos currículos de CS e sugestões de aprendizado para novos programadores que pedem que o aspirante a programador estude um intérprete de cisco escrito especificamente em cisco. Todos esses sites dizem coisas semelhantes a "é uma revelação intelectual", "é uma experiência de iluminação que todo programador sério deveria ter" ou "mostra as relações de hardware / software" e outras declarações vagas, principalmente de deste artigo, retirado de este respeitável como fazer .
O sentimento geral da minha pergunta é: como o lisp alcança os objetivos acima e por que o lisp? Por que não outra língua?
Estou perguntando isso porque acabei de escrever um interpretador de esquema em esquema (retirado do SICP http://mitpress.mit.edu/sicp/ ) e agora estou escrevendo um interpretador de python em esquema e estou lutando para ter essa epifania lendária isso deveria vir especificamente do primeiro. Estou procurando detalhes técnicos específicos entre os dois idiomas que posso explorar em seus intérpretes de esquema para entender melhor como os programas funcionam.
Mais especificamente:
Por que o estudo de um intérprete escrito na linguagem que ele interpreta é tão enfatizado - é apenas um ótimo exercício mental manter a linguagem original e a linguagem construída corretas ou existem problemas específicos cujas soluções só podem ser encontradas na natureza da linguagem? linguagem original?
Como os intérpretes lisp demonstram bons conceitos de arquitetura para o futuro design de software?
O que eu sentiria falta se fizesse esse exercício em uma linguagem diferente como C ++ ou Java?
Qual é a explicação mais usada ou "ferramenta mental" deste exercício? **
** Eu selecionei a resposta que eu fiz porque eu tenho notado que eu ganhei com este exercício mais habilidade em projetar ferramentas parsing na minha cabeça do que qualquer outra ferramenta única e eu gostaria de encontrar diferentes métodos de análise que pode funcionar melhor para o esquema intérprete que o intérprete python.
Respostas:
Correndo o risco de dar uma resposta "eu também", se você tentar, verá ...
Se você estuda linguagens de computador, é provável que tenha a impressão de que é pelo menos metade da análise. Se você aprender Lisp, perceberá que analisar a sintaxe da superfície nada mais é do que uma conveniência para pessoas (como a maioria de nós) que não gostam de muitos parênteses irritantes.
Então você poderia perceber que um grande preço foi pago por essa conveniência. No Lisp, é trivial para um programa criar outro programa e executá-lo. Em outras línguas, é uma técnica avançada, como multiplicar números romanos.
Claro, quase todo mundo perguntaria "quem precisa fazer isso?" Bem, você pode muito bem ver que ele abre uma visão inteira de coisas que você nem percebeu que não podia fazer antes. Você pode fazer isso em outros idiomas, mas não tão facilmente.
INSERIDO para responder ao comentário de Izkata:
... isso são apenas alguns ...
Então você percebe que algumas coisas consideradas "modernas" hoje são obsoletas em Lisp há 40 anos. Como programação funcional. Como coleta de lixo. Como fechamentos.
Isso não quer dizer que as línguas modernas não tenham novas boas idéias, como OOP, etc. Mas se você aprender o Lisp, isso ampliará sua perspectiva.
fonte
You can do it in other languages, but not nearly so easily.
- Gostar? (A pergunta me parece ser, pois declarações como estas são muitas vezes feitas, mas quase nunca ser mais específico)A resposta simples para sua pergunta é experimentar o Lisp, de preferência em conjunto com o SICP . Então você será iluminado.
Dito isto...
Código é dados
A maioria dos idiomas faz uma distinção nítida entre código e dados; Lisp não. Isso possibilita, por exemplo, escrever trivialmente um analisador Lisp no Lisp e manipular o código Lisp no Lisp. A melhor descrição desse esclarecimento que encontrei é A natureza do Lisp .
Isso é verdade em parte porque a sintaxe do idioma é muito simples. Possibilita coisas no Lisp (como metaprogramação) que são impraticáveis em outros idiomas porque a sintaxe atrapalha.
Leitura adicional
superando as médias
fonte
Em geral, o estudo de um intérprete fornece informações sobre o idioma e os recursos. Em geral, estudar código em uma linguagem de programação é como praticar uma linguagem falada ouvindo e lendo: familiariza-o com o que essa linguagem pode fazer, como é usada e com "expressões idiomáticas" comuns. Mais especificamente, Lisp é uma linguagem homoicônica, o que significa que sua sintaxe para expressões é a mesma que para dados. Escrever código no Lisp parece terrivelmente com você escrevendo uma lista e vice-versa. Assim, interpretar o código Lisp com o código Lisp é tão simples quanto percorrer listas com
car
ecdr
.Pense em como o intérprete se interpretaria - em muitas implementações meta-circulares (onde uma linguagem homoicônica se interpreta) pode simplesmente "passar" pela função. Por exemplo, para implementar
car
, basta usarcar
o argumento. Isso tira a ênfase dos mecanismos de armazenamento de dados e foca na funcionalidade.Os intérpretes podem ser muito complicados, o que incentiva uma boa arquitetura ao projetá-los. Com isso em mente, este é mais dependente do intérprete individual.
Essas linguagens não são homoicônicas, portanto não se beneficiam da graça e simplicidade de um intérprete meta-circular de Lisp. Isso torna o exercício mais difícil e talvez menos comum, mas eu não diria que é realmente menos benéfico.
Não sei se tenho uma boa resposta para essa; simplesmente que ajuda a ver como o intérprete funciona e, talvez mais importante, mexer com ele para ver como pequenas alterações no idioma podem ser facilmente implementadas.
fonte
O próprio LISP está estruturado de uma maneira que facilita a análise. Se você tentar escrever um compilador, perceberá que é muito mais fácil se tudo no seu idioma for uma expressão e tiver um baixo nível de ambiguidade. O LISP força parênteses em todos os lugares para eliminar a ambiguidade e não possui declarações, apenas expressões.
O fato de o LISP ser muito fácil de analisar incentiva os usuários a analisar seu próprio código-fonte e fazer truques de mágica com ele. A linha entre dados e código fica embaçada e você pode facilmente fazer coisas que normalmente exigem bastante esforço, como reflexão, reescrita dinâmica de código, plugins e serialização.
Essa é a essência disso. Provavelmente, o exercício pretende fornecer algumas dicas sobre o que é possível quando o código é facilmente analisável por si mesmo.
fonte
Não tenho certeza se é realmente importante para todos. Você pode ser um desenvolvedor de sucesso sem saber como um intérprete Lisp funciona. Ao estudar Ciência da Computação, as idéias básicas do Lisp devem ser aprendidas.
Os intérpretes do Lisp são importantes para os programadores do Lisp. Eles precisam entender como um intérprete ([e compilador] 1 ) funciona, para entender completamente como usar a linguagem.
Um intérprete Lisp é frequentemente usado como uma ferramenta em ciência da computação para ensinar aos alunos algumas coisas:
Entendendo uma definição de linguagem compacta e mínima por meio de uma implementação: Alan Kay chamou de Equações de Software de Maxwell .
entender a programação no nível da linguagem , alterando e estendendo o intérprete
entender a programação em metanível e os efeitos que ela tem no design e no uso de uma linguagem de programação. Por exemplo, entender o que 'citar' significa e por que é necessário
compreensão da interpretação da linguagem de programação Lisp e sua conexão com o cálculo Lambda
Como um dispositivo de ensino, um intérprete Lisp é útil, porque pode ser aprendido e entendido em pouco tempo. Como poucos estudantes já conhecem o Lisp, eles estão em um campo nivelado quando se trata de aprender os conceitos acima.
fonte