LISP est évidemment un avantage pour les choses AI , mais cela n'apparaît pas pour moi, LISP est plus rapide que Java, C # ou même C. Je ne suis pas un maître de LISP, mais je trouve incroyablement difficile de comprendre l'avantage que l'on aurait à écrire des logiciels d'entreprise dans LISP.
Pourtant, il est considéré comme le langage d'un hacker.
Pourquoi Paul Graham plaide-t-il pour Lisp? Pourquoi ITA Software a-t-il choisi LISP plutôt que d'autres langues de haut niveau? Quelle valeur at-elle sur ces langues?
Il y a quelques raisons pour lesquelles je travaille à devenir compétent avec Common LISP.
La seule vraie raison de choisir contre Common LISP est sans doute que les bibliothèques standard sont datées.
Je vais sortir sur un membre et dire que dans le cas général, la syntaxe ne devrait pas être un problème pour un travailleur logiciel professionnel.
J'aime LISP pour son
La programmation combat la complexité. Les abstractions sont le seul outil efficace pour combattre une complexité toujours croissante (avec notre taille de crâne très limitée et constante). Gérer les abstractions avec LISP, c'est comme avoir un génie avec n + 1 souhaits.
Je crois que la bonne réponse LISP est plus gnomique. Quelque chose comme: "Si vous devez demander, vous n'êtes pas prêt."
Ensuite, si quelqu'un pose des questions, la bonne réponse est soit "oui" s'il s'agit d'une question soit/soit soit "Vous n'êtes pas prêt."
Je pense que l'avantage LISP dans le domaine intelligence artificielle (AI) que tout le monde mentionne est un peu un accident historique ... LISP a commencé pour/dans l'IA, mais c'est un langage à usage général.
Je crois que la vitesse d'exécution n'est pas le seul aspect important d'un langage (je l'ai fait une fois, cependant). Cependant, l'un des aspects que j'aime à propos de LISP est que pour moi, il combine Python et C en un. Je peux commencer à coder sans déclarations et prototype immédiatement et très rapidement (le runtime et les REPL sont très importants pour cela.) Après avoir quelque chose en cours, j'ajoute des déclarations de type et "optimise" mon code, petit à petit. C'est un me demande d'appuyer sur une touche SLIME et de regarder le langage machine généré pour la fonction qui m'intéresse. En Python, il n'y a pas de déclarations de type, donc je ne peut pas obtenir plus de vitesse, mais en C, faire quelque chose rapidement est beaucoup plus douloureux. LISP est très utile dans ce cas.
Cela dit, j'aime LISP principalement en raison de macros . Lorsque vous comprenez enfin ce que les macros peuvent réaliser, je pense que vous pouvez facilement accepter les parenthèses. De plus, des éditeurs comme Emacs gèrent eux-mêmes les parenthèses pour que vous n'ayez pas à le faire. J'avoue, cependant, que je n'ai pas trouvé de parenthèses si mauvaises au début, et je sais que certaines personnes ne peuvent tout simplement pas les supporter. Mais comme le but des macros est de générer du code au moment de la compilation, le code dans LISP utilise une structure de données standard, et les parenthèses sont simplement une représentation du code sous forme de listes, ce qui est nécessaire pour rendre les macros simples à écrire.
Je ne connais aucune autre langue dans laquelle vous pouvez écrire de petites sous-langues pour mieux décrire votre problème avec la facilité de LISP. C'est l'avantage dont parle Paul Graham dans Battre les moyennes. C'est une modularité et une concision extrêmes. En Java je dois écrire beaucoup de texte brut pour exprimer une seule idée. Dans LISP, je pourrais écrire des macros qui génèrent ce code automatiquement, et ensuite les utiliser. Quoi qu'il en soit, vous devez comprendre quelques exemples de cela et puis juger par vous-même. Quand je l'ai "vu", j'ai été époustouflé, et je pense toujours que LISP est la plus grande langue pour cette seule raison. Je cherche toujours des macros dans les langues traditionnelles pour voir si elles correspondent la puissance des macros LISP, mais à ce jour je n'en ai pas trouvé.
Je terminerai par quelques critiques concernant les logiciels d'entreprise:
Les logiciels d'entreprise ont besoin de bibliothèques, et de bonnes, et LISP n'est pas bon dans ce domaine. Je n'ai généralement pas besoin d'eux, mais quand je le fais, je dois choisir parmi une petite sélection de logiciels incomplets que quelques personnes utilisent. Je devrais contribuer à résoudre ce problème, je suppose ...
Les logiciels d'entreprise sont généralement créés par de grands groupes de personnes, et je pense que la communication peut être entravée par les macros, car elles changent fondamentalement la langue. De nombreux programmeurs sont plus à l'aise pour détecter certains modèles dans le code, même si le texte du programme est plus long et plus répétitif. Je suppose qu'à ITA, ils ont des règles concernant les macros ou ils ont une énorme bibliothèque de macros qui facilite la collaboration (ou, plus simplement, tous les programmeurs sont des experts LISP).
Je n'aime pas LISP.
(J'aime beaucoup de concepts qu'il utilise, comment il rend les techniques puissantes disponibles en natif, etc.
Mais je n'ai jamais été convaincu de vraiment l'utiliser, ((même si plusieurs personnes ont essayé ) parce que les avantages de la langue peuvent être réalisé avec d'autres langages de programmation (certains directement, d'autres indirectement), donc il n'y a pas assez d'avantages pour que je passe le temps à l'apprendre et à supporter la syntaxe horrible.)))
Mais oui, pour des raisons que certaines personnes aiment, consultez ces questions sur le débordement de pile:
Il y en a probablement encore quelques-unes dans les questions connexes.
J'interpréterai "LISP" comme " LISP commun "; Je ne doute pas que d'autres réponses diront " Scheme ". (Indice: LISP est une famille de langues.)
Que signifie "plus rapide"? En termes de temps nécessaire pour exécuter un benchmark, non, ce n'est pas plus rapide que C ( mais cela peut être ).
"Rapide" en termes de temps nécessaire à Joe Random Hacker pour rédiger un programme de travail ou corriger un bug dans un grand système logiciel? Presque certainement.
Quant à ce hacker, je l'utilise car je veux écrire du code, pas du passe-partout. Je veux écrire quelque chose une fois , et ne pas me répéter continuellement. Et je veux interagir avec le programme pendant que je l'écris.
J'aime LISP parce que c'est un excellent moyen d'exprimer mes pensées. Le prédicat de ma langue préférée est "Si je pouvais choisir quelque chose pour exprimer des idées, quel serait-il?". Actuellement, c'est LISP * ( Scheme pour être précis), au point que je me retrouve à y écrire des notes de programmation. Comme IRL , notes papier et stylo. Même quand je pense aux programmes que je dois implémenter en PHP ou Ruby ou Python.
Ce n'est pas un truc que j'ai appris moi-même, ou quelque chose que je fais pour la crédibilité du nerd (personne ne peut voir l'intérieur de mon ordinateur portable de toute façon); c'est juste que LISP est tellement plus naturel pour moi de penser que n'importe laquelle des alternatives, et n'importe quel langage qui résonne avec vous qui est profondément celui que vous Trésor.
* Tout comme une note de bas de page cependant, Haskell comble l'écart assez rapidement à mesure que j'en apprends davantage.
Paul Graham répond lui-même à cette question en Qu'est-ce qui rendait LISP différent.
Gardez à l'esprit qu'il l'a utilisé pour son démarrage au milieu des années 1990, donc Python et Ruby n'étaient pas vraiment matures à ce moment-là (ou peut-être même pas nés).
LISP a fondamentalement tous les avantages des langages dynamiques, et je pense que pour la plupart des applications Web d'aujourd'hui, Python et Ruby sont assez impressionnants, et ils ont l'avantage des cadres et de la documentation et des communautés dynamiques.
La caractéristique qui tue est probablement que le programme entier est fait d'expressions. Cela signifie que vous pouvez en quelque sorte transmettre des blocs de code à des fonctions (ou des macros ...), car un bloc de code n'est rien de plus qu'une expression.
Python n'a pas exactement cette fonctionnalité; il faudrait définir des fonctions et les transmettre. Ruby semble avoir des blocs, c'est peut-être quelque peu limité par rapport à ce que LISP peut faire (je ne suis pas sûr).
J'ai eu une réaction instinctive à Scheme dans le passé, mais maintenant je suis prêt à donner un coup de feu à LISP ( Clojure , en fait).
Vous voyez, au fil des années, j'ai choisi des langages comme Java, C #, C++, Python, et les choses ne sont plus difficiles.
Clojure a de nombreuses promesses, semble être très propre et peut résoudre de nombreux problèmes du monde réel. Un cas solide pour un langage propre comme Clojure est l'avènement des ordinateurs multicœurs.
Ouais LISP!
EDIT: ITA Software a été fondé par MIT diplômés, et Scheme/LISP était la seule langue que beaucoup des diplômés MIT diplômés ont appris. Pour être juste cependant, un peut remplacer à chaud les algorithmes LISP sur un système de production en cours d'exécution, ce qui est un énorme avantage.
Ce que j'aime dans LISP, c'est qu'il transcende les paradigmes. Certaines personnes diront que LISP est fonctionnel, d'autres diront que c'est déclaratif et d'autres diront que c'est multiparadigm. Je pense que tout cela manque le point. Lorsque vous utilisez LISP, le paradigme n'est plus une contrainte.
Vous voulez des objets? Vous pouvez les avoir. Vous voulez une programmation fonctionnelle? Vous pouvez l'avoir. Vous voulez Prolog - programmation logique de style? Écrivez quelques macros. Vous voulez une programmation déclarative de style SQL? Fonce. Vous voulez utiliser un paradigme qui n'a pas encore été inventé? Je suis convaincu que cela peut être fait dans LISP.
Mis à part Forth - comme les langues, je n'ai pas encore vu une autre langue offrir ce niveau de flexibilité.
Le problème est le pouvoir. Puissance = travail (fonctionnalité du programme)/temps
"Nous ne voulions pas gagner les programmeurs LISP; nous recherchions les programmeurs C++. Nous avons réussi à en faire glisser beaucoup à mi-chemin vers LISP."
- Guy Steele, Java co-auteur de la spécification
Tracez une sorte de courbe entre C++ et Java. Continuez et à un moment donné, vous trouverez LISP.
J'apprends LISP ( newLisp ) pour deux raisons.
Raison numéro un: LISP me fait penser différemment, ce qui fait de moi un meilleur codeur Ruby.
Il semble très gênant de faire certaines choses dans LISP, par exemple l'itération imbriquée pour parcourir plusieurs listes. Cela m'oblige donc à utiliser d'autres choses, comme map
. Ma langue préférée, Ruby, a la même méthode de carte, mais je ne l'utilise pas toujours, car elle n'est pas familière: j'ai appris à faire les choses en utilisant une mauvaise technique, et lorsque la langue prend en charge cette technique, je continue de l'utiliser.
Raison numéro deux: LISP est pratique et possède de bonnes bibliothèques modernes.
Il y a un cadre Web très agréable et léger pour newLisp appelé libellule . Cela me permet d'utiliser du code newLisp au lieu de PHP pour certaines tâches. Je n'aime pas vraiment PHP, et newLisp semble plus amusant pour cette tâche spécifique que Ruby.
Raison numéro trois: LISP est cohérent syntaxiquement et conceptuellement.
Pour moi, c'est la grande différence entre Ruby et Python, cohérence.
"Plus rapide" n'est pas une chose simple à mesurer - cela dépend vraiment de l'aspect que vous comparez. En fonction de la tâche et de la mise en œuvre de LISP, les vitesses peuvent approcher C. Regardez le Great Benchmarking Shoot-Out pour plonger pour plus de détails. L'implémentation SBCL de LISP est comparable à Java 6 Server et est nettement plus rapide que Ruby ou Python.
Mais, la vitesse pure n'est pas la principale raison de choisir un langage de programmation - si c'était le cas, nous programmerions tous en langage d'assemblage toujours, non? Pour moi, la joie quotidienne de LISP est que le code est compilé, mais je n'ai pas besoin de supprimer l'application, de tout recompiler, puis de recommencer à zéro. Au lieu de cela, je peux changer une seule fonction et ce changement prendra effet partout, et je peux immédiatement voir l'effet dans mon application. De plus, cette approche très rapide "écrire, tester, écrire plus, tester plus" facilite beaucoup les tests immédiats lors de l'écriture du code (et vous pourrez ensuite transformer ces sondes interactives en tests unitaires plus tard).
Imaginez que vous écriviez un e-mail où, après chaque ligne, vous deviez appuyer sur un bouton pour compiler la sortie de votre e-mail à l'écran avant de poursuivre votre réflexion. C'est ce que l'écriture en Java ou une autre langue comme celle-ci est pour moi. Parfois, il y a une raison de le faire, et j'aime Java bien, mais LISP est juste plus réactif, et il est plus facile de faire le travail.
Pouvez-vous dire "fidélité à la marque"?
J'ai commencé à Fortran. Je l'ai aimé.
Je suis passé à LISP. Au début, je détestais ça. Ensuite, j'ai appris à l'aimer et à détester Fortran.
Plus tard Pascal, C, C++, divers assembleurs, C #. (En fait, je n'aime pas C #.)
Je suppose que je suis volage?
Lorsque LISP a été créé, ils sont partis des mathématiques et non de l'informatique (qui n'existait pas encore vraiment). Et l'équipe LISP a VRAIMENT réussi. LISP avait la collecte des ordures en 1960 environ! Ils ont vraiment fait du bon travail.
Je pense que la chanson The Eternal Flame le couvre.
Un gros tirage est la communauté. LISP a attiré les développeurs les plus ambitieux et les plus brillants depuis l'invention du langage. Partout où les chercheurs tentent de résoudre des problèmes qui n'ont jamais été résolus, vous trouverez probablement LISP, comme dans intelligence artificielle (AI) recherche, vision par ordinateur, planification, représentation des connaissances et optimisation heuristique complexe. La langue se prête à résoudre des problèmes à la fois de bas en haut et de haut en bas, ce qui semble aider à relever les défis les plus poilus.
La syntaxe extensible via les macros signifie qu'il est rarement nécessaire d'étendre la définition du langage. Une grande partie de ce qui nécessiterait une extension de langue dans une langue plus restreinte n'est qu'une macro avec LISP. Les programmeurs LISP sont donc libres d'utiliser des concepts de langage nouvellement inventés sans nouveau standard de langage et sans nécessairement une réelle pénalité de vitesse. À un niveau de base, les rames de code passe-partout sont rendues inutiles par de petites extensions. De nouvelles idées dans le flux de contrôle, comme l'unification du style Prolog, sont mises en œuvre de manière efficace et compacte en tant qu'extensions.
Le système OOP, CLOS , est dans une classe à part en termes de flexibilité. Il est très difficile d'aller retour au rudimentaire C++/Java/C # OOP après avoir goûté. GoF 5 modèles de conception deviennent inutiles car ils peuvent être exprimés simplement et directement.
Le langage n'a eu aucun propriétaire d'entreprise et aucune implémentation définitive, bien qu'il ait une norme ANSI avec de nombreuses implémentations conformes. De nouvelles implémentations majeures surviennent chaque décennie et les anciennes sont encore assez actives. Les experts peuvent prévoir d'utiliser leurs connaissances spécialisées pendant longtemps. Cela provoque une certaine friction anarchique et une fragmentation de la communauté, mais cela signifie également que le tapis ne peut pas être retiré et que le langage ne peut pas devenir moribond pour des raisons politiques d'entreprise ou de projet. Il y a toujours plusieurs implémentations commerciales et open source sur lesquelles on travaille. Les plus axés sur les performances comparent régulièrement dans un facteur 2x les implémentations de langage impératif les plus rapides et les plus financées.
Le talon d'Achille de la première commercialisation de LISP était l'empreinte mémoire pour accueillir à la fois les caractéristiques de sécurité de type du langage et les environnements de développement logiciel avancés qu'ils comprenaient, avec des fonctionnalités incroyables comme une documentation en ligne complète, y compris des graphiques. Un 64 Mo Symbolics LISP Machine n'était pas viable sur le plan des coûts par rapport à un poste de travail Sun de 8 Mo. Aujourd'hui, les prix RAM se sont effondrés et il y a un énorme intérêt pour les langages LISP, surtout si l'on considère que les langages Java traditionnels, C #, PHP les langages d'aujourd'hui n'ont avancé que très peu celles d'il y a 30 ans.
Il existe maintenant des langages modernes en concurrence avec LISP pour partager l'esprit avec des développeurs intelligents: Python, Lua , Erlang , Haskell , et OCaml . Mais aucun n'offre le même mélange de maturité, d'adaptabilité, de multiples implémentations conformes aux normes et de rapidité.
Je ne fais pas vraiment LISP. Mais l'endroit où je travaille fait éléments finis avec des millions de lignes principalement de Fortran. Le gars ici que je respecte le plus pour les trucs informatiques (codes mécanique des fluides numérique ) pense que la combinaison idéale est LISP à l'extérieur (principalement parce que vous évitez les problèmes de gestion de la mémoire), et Fortran pour le bas niveau algorithmes (Fortran est le meilleur pour exploiter les capacités vectorielles de SSE / AVX , et nous pensons qu'il est peu probable que cette avance se ferme).