Qu'est-ce qui a rendu Lisp si spécial

«Le plus grand des langages de programmation jamais créés«
— Alan Kay, «on Lisp»

Qu'est-ce qui a rendu Lisp si spécial

Lorsque McCarthy a développé Lisp à la fin des années 1950, il se distinguait radicalement des langages existants, le plus important étant Fortran.

Lisp a incarné neuf nouvelles idées :

1. Instructions conditionnelles (Conditionals). Les instructions conditionnelles sont des constructions if-then-else. Aujourd'hui, nous les considérons comme acquises. Elles ont été inventées par McCarthy lors du développement de Lisp. (Fortran à l'époque n'avait que des instructions goto, étroitement liées à l'instruction de branchement sur le matériel sous-jacent.) McCarthy, étant dans le comité Algol, a introduit les instructions conditionnelles dans Algol, d'où elles se sont répandues dans d'autres langages.

2. Types fonctionnels (A function type). Dans Lisp, les fonctions sont des objets de premier ordre — elles sont un type de données, tout comme les nombres, les chaînes, etc., et ont une représentation littérale, peuvent être stockées dans des variables, peuvent être passées comme arguments, etc.

3. Récursion (Recursion). La récursion, bien sûr, existait en tant que concept mathématique avant Lisp, mais Lisp a été le premier langage de programmation à la supporter. (Cela est peut-être implicite dans la création de fonctions en tant qu'objets de premier ordre.)

4. Nouvelle conception des variables (A new concept of variables). Dans Lisp, toutes les variables sont des pointeurs efficaces. Les valeurs sont ce qui appartient aux types, et non aux variables, et l'assignation ou le lien de variables signifie copier des pointeurs, et non ce à quoi ils pointent.

5. Garbage-collection (Collecte des déchets).

6. Programmes composés d'expressions (Programs composed of expressions). Les programmes en Lisp sont des arbres d'expressions, chacun retournant une valeur. (Certaines expressions Lisp peuvent retourner plusieurs valeurs.) Cela contraste avec Fortran et de nombreux autres langages réussis, qui distinguent « expressions » et « instructions ».

Il était naturel d'avoir une telle distinction dans Fortran, car le langage était orienté linéairement (pas étonnant pour un langage dont le format d'entrée était une carte perforée). Vous ne pouviez pas avoir d'instructions imbriquées. Et tant que vous aviez besoin d'expressions mathématiques à traiter, il n'y avait aucune raison de forcer quoi que ce soit d'autre à retourner une valeur, car il pouvait ne rien y avoir qui attendait un retour.

Les restrictions ont été levées avec l'émergence des langages structurés par blocs, mais à ce moment-là, il était déjà trop tard. La distinction entre expressions et déclarations était déjà établie. Elle est passée de Fortran à Algol et ensuite à leurs descendants.

Lorsqu'un langage est entièrement composé d'expressions, vous pouvez composer des expressions comme vous le souhaitez. Vous pouvez écrire soit (en utilisant la syntaxe Arc)

(if foo (= x 1) (= x 2))

ou

(= x (if foo 1 2))

7. Type de symbole. Les symboles se distinguent des chaînes, dans ce cas, vous pouvez vérifier l'égalité en comparant les pointeurs.

8. Une notation pour le code en utilisant des arbres de symboles.

9. L'ensemble du langage toujours disponible.. Il n'y a pas de distinction explicite entre le temps de lecture, le temps de compilation et le temps d'exécution. Vous pouvez compiler ou exécuter du code en temps de lecture, ou lire ou exécuter du code pendant que vous compilez, ou lire ou compiler du code en temps d'exécution.

Exécuter du code en temps de lecture permet aux utilisateurs de reprogrammer la syntaxe de Lisp ; exécuter du code en temps de compilation est la base des macros ; compiler en temps d'exécution est la base de l'utilisation des Lisp comme langage d'extension dans des programmes comme Emacs ; et enfin, lire en temps d'exécution permet aux programmes d'interagir en utilisant des s-expressions, une idée récemment réinventée dans XML.

Conclusion

Lorsque Lisp a été inventé pour la première fois, toutes ces idées étaient très éloignées des pratiques de programmation habituelles dictées par le matériel disponible à la fin des années 1950.

Avec le temps, le langage par défaut, incarné dans le succès des langages populaires, a progressivement évolué vers Lisp. Les points 1-5 sont maintenant largement répandus. Le point 6 commence à apparaître dans le mainstream. En Python, il existe une forme du point 7, bien qu'il n'y ait pas de syntaxe appropriée. Le point 8, qui (avec le point 9) rend possibles les macros en Lisp, existe encore uniquement en Lisp, peut-être parce que (a) il nécessite ces parenthèses ou quelque chose d'aussi difficile, et (b) si vous ajoutez cette dernière augmentation de puissance, vous ne pouvez plus prétendre avoir inventé un nouveau langage, mais seulement avoir développé un nouveau dialecte de Lisp ; -)

Bien que cela soit utile pour les programmeurs modernes, il est étrange de décrire Lisp en fonction de ses différences avec des techniques aléatoires adoptées dans d'autres langages. Ce n’est peut-être pas ce à quoi pensait McCarthy. Lisp n’a pas été conçu pour corriger les erreurs de Fortran ; il est plutôt apparu comme un sous-produit d'une tentative d'axiomatiser le calcul.

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster