J'ai vu de nombreux curriculums CS et des suggestions d'apprentissage pour de nouveaux programmeurs qui appellent le programmeur en herbe à étudier un interprète lisp spécifiquement écrit en lisp. Tous ces sites disent des choses similaires à «c'est une révélation intellectuelle», «c'est une expérience d'illumination que tout programmeur sérieux devrait avoir» ou «il vous montre des relations matériel / logiciel» et d'autres déclarations vagues, en particulier de cet article tiré de ce mode d'emploi réputé .
Le sentiment général de ma question est, comment le lisp atteint-il les objectifs ci-dessus et pourquoi le lisp? Pourquoi pas une autre langue?
Je pose cette question parce que je viens de terminer l'écriture d'un interpréteur de schéma dans le schéma (tiré du SICP http://mitpress.mit.edu/sicp/ ) et maintenant j'écris un interprète python dans le schéma et j'ai du mal à avoir cette épiphanie légendaire qui est censé provenir spécifiquement de l'ancien. Je suis à la recherche de détails techniques spécifiques entre les deux langues que je peux exploiter dans leurs interprètes de schéma pour comprendre le fonctionnement des programmes.
Plus précisement:
Pourquoi l'étude d'un interprète écrit dans la langue qu'il interprète est-elle si soulignée - est-ce simplement un excellent exercice mental pour garder la langue originale et la langue construite droite ou y a-t-il des problèmes spécifiques dont les solutions ne peuvent être trouvées que dans la nature de la langue originale?
Comment les interprètes lisp démontrent-ils de bons concepts d'architecture pour la future conception de logiciels?
Que manquerais-je si je faisais cet exercice dans un langage différent comme C ++ ou Java?
Quel est le plat à emporter ou "outil mental" le plus utilisé dans cet exercice? **
** J'ai choisi la réponse que je l'ai fait parce que je l' ai remarqué que je l' ai acquise lors de cet exercice plus de compétences dans la conception d' outils d' analyse syntaxique dans ma tête que tout autre outil et je voudrais trouver différentes méthodes d'analyse qui peuvent mieux travailler pour le régime interprète que l'interpréteur python.
Réponses:
Au risque de donner une réponse "moi aussi", si vous l'essayez, vous verrez ...
Si vous étudiez les langages informatiques, vous aurez probablement l'impression qu'il s'agit au moins de la moitié de l'analyse. Si vous apprenez le Lisp, vous vous rendrez compte que l'analyse de la syntaxe de surface n'est rien de plus qu'une commodité pour les personnes (comme la plupart d'entre nous) qui n'aiment pas beaucoup de parenthèses simples irritantes.
Vous pourriez alors réaliser qu'un gros prix a été payé pour cette commodité. En Lisp, il est trivial pour un programme de construire un autre programme et de l'exécuter. Dans d'autres langues, c'est une technique avancée, comme la multiplication en chiffres romains.
Bien sûr, presque tout le monde demanderait "qui doit faire ça?" Eh bien, vous pouvez très bien voir que cela ouvre toute une perspective de choses que vous n'aviez même jamais réalisé que vous ne pouviez pas faire auparavant. Vous pouvez le faire dans d'autres langues, mais pas si facilement.
INSÉRÉ pour répondre au commentaire d'Izkata:
... c'est juste quelques-uns ...
Ensuite, vous vous rendez compte que certaines choses qui sont considérées comme «modernes» aujourd'hui sont à l'ancienne à Lisp depuis 40 ans. Comme la programmation fonctionnelle. Comme la collecte des ordures. Comme des fermetures.
Cela ne veut pas dire que les langues modernes n'ont pas de nouvelles bonnes idées, comme la POO, etc. Mais si vous apprenez le lisp, cela élargira votre perspective.
la source
You can do it in other languages, but not nearly so easily.
- Comme? (La question me semble être parce que de telles déclarations sont souvent faites, mais ne sont presque jamais plus précises)La réponse simple à votre question est d'essayer Lisp, de préférence en conjonction avec SICP . Ensuite, vous serez éclairé.
Cela dit...
Le code est des données
La plupart des langues font une distinction nette entre le code et les données; Lisp non. Cela permet, par exemple, d'écrire trivialement un analyseur Lisp en Lisp, et de manipuler du code Lisp dans Lisp. La meilleure description de cette illumination que j'ai trouvée est La nature de Lisp .
Cela est vrai en partie parce que la syntaxe de la langue est si simple. Cela rend possible des choses en Lisp (comme la métaprogrammation) qui ne sont pas pratiques dans d'autres langues parce que la syntaxe fait obstacle.
Lectures supplémentaires
Battre les moyennes
la source
En général, étudier un interprète vous donne un aperçu de sa langue et de ses fonctionnalités. En général, étudier le code dans un langage de programmation, c'est comme pratiquer un langage parlé en écoutant et en lisant: il vous familiarise avec ce que ce langage peut faire, comment il est utilisé et les "idiomes" courants. Plus précisément, Lisp est un langage homoiconique, ce qui signifie que sa syntaxe pour les expressions est la même que sa syntaxe pour les données. L'écriture de code en Lisp ressemble terriblement à l'écriture d'une liste, et vice-versa. Ainsi, interpréter du code Lisp avec du code Lisp est aussi simple que de parcourir des listes avec
car
etcdr
.Réfléchissez à la façon dont l'interprète s'interpréterait - dans de nombreuses implémentations d' interprètes méta-circulaires (où un langage homoiconique s'interprète lui-même) peuvent simplement "passer" par la fonction. Par exemple, pour implémenter
car
, prenez simplementcar
l'argument. Cela met l'accent sur les mécanismes de stockage de données et se concentre sur la fonctionnalité.Les interprètes peuvent être très compliqués, ce qui encourage une bonne architecture dans leur conception. Dans cet esprit, celui-ci dépend davantage de l'interprète individuel.
Ces langages ne sont pas homoiconiques, ils ne bénéficient donc pas de la grâce et de la simplicité d'un interprète méta-circulaire Lisp. Cela rend l'exercice plus difficile et peut-être moins courant, mais je ne dirais pas que c'est vraiment moins bénéfique.
Je ne suis pas sûr d'avoir une bonne réponse pour celui-ci; simplement qu'il aide à voir comment fonctionne l'interprète et, peut-être plus important encore, à le bricoler pour voir comment des modifications mineures de la langue peuvent être facilement mises en œuvre.
la source
LISP est lui-même structuré d'une manière qui le rend extrêmement facile à analyser. Si vous essayez d'écrire un compilateur, vous remarquerez que c'est beaucoup plus facile si tout dans votre langue est une expression et a un faible niveau d'ambiguïté. LISP force les parenthèses partout pour éliminer l'ambiguïté et n'a pas de déclarations, seulement des expressions.
Le fait même que LISP soit très facile à analyser encourage les utilisateurs à analyser leur propre code source et à faire des tours de magie avec. La ligne entre les données et le code devient floue et vous pouvez facilement faire des choses qui nécessitent normalement un certain effort, comme la réflexion, la réécriture de code dynamique, les plugins et la sérialisation.
Voilà l'essentiel. L'exercice est probablement destiné à vous donner un aperçu de ce qui est possible lorsque le code est facilement analysable par lui-même.
la source
Je ne suis pas sûr que ce soit vraiment important pour tout le monde. Vous pouvez être un développeur performant sans savoir comment fonctionne un interpréteur Lisp. Lorsque vous étudiez l'informatique, les idées de base de Lisp doivent cependant être apprises.
Les interprètes Lisp sont importants pour les programmeurs Lisp. Ils doivent comprendre comment fonctionne un interprète ([et un compilateur] 1 ), pour bien comprendre comment utiliser le langage.
Un interprète Lisp est souvent utilisé comme un outil en informatique pour enseigner aux étudiants quelques choses:
comprendre une définition de langage compacte et minimale grâce à une implémentation: Alan Kay l'a appelée les équations logicielles de Maxwell .
comprendre la programmation au niveau de la langue , en changeant et en étendant l'interpréteur
comprendre la programmation au niveau méta et les effets qu'elle a sur la conception et l'utilisation d'un langage de programmation. Par exemple, comprendre ce que signifie «citer» et pourquoi il est nécessaire
comprendre l'interprétation du langage de programmation Lisp et sa connexion au Lambda Calculus
En tant que dispositif d'enseignement, un interprète Lisp est utile, car il peut être appris et compris en peu de temps. Étant donné que peu d'étudiants connaissent déjà Lisp, les étudiants sont sur un terrain de niveau lorsqu'il s'agit d'apprendre les concepts ci-dessus.
la source