Ce qui a rendu Lisp spécial

" Le plus grand langage de programmation jamais créé "
- Alan Kay, «sur Lisp»



Lorsque McCarthy a développé Lisp à la fin des années 1950, il était radicalement différent des langues existantes, dont la plus importante était le Fortran .

Lisp a mis en œuvre neuf nouvelles idées:

1. Conditions . Les instructions conditionnelles sont une construction if-then-else. Maintenant, nous les prenons pour acquis. Ils ont été inventés par McCarthy lors du développement de Lisp. (Fortran à l'époque n'avait que des déclarations qui étaient étroitement liées aux instructions de la branche sur le matériel sous-jacent.) McCarthy, alors qu'il faisait partie du comité Algol, a fait des déclarations conditionnelles à Algol, d'où elles se sont propagées dans d'autres langues.

2. Types de fonctions (type de fonction) . En Lisp, les fonctions sont des objets de la première classe - elles sont un type de données, comme des nombres, des 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écursivité . La récursivité, bien sûr, existait comme un concept mathématique avant Lisp, mais Lisp était le premier langage de programmation à le supporter. (Cela est peut-être impliqué dans la création de fonctions en tant qu'objets de première classe.)

4. Un nouveau concept de variables . En Lisp, toutes les variables sont des pointeurs efficaces. Les valeurs sont ce que les types ont, pas des variables, et assigner ou lier des variables signifie copier des pointeurs, pas ce vers quoi ils pointent.

5. Collecte des ordures .

6. Les programmes sont composés d'expressions (Programmes composés d'expressions) . Les programmes Lisp sont des arbres d'expression, chacun renvoyant une valeur. (Certaines expressions Lisp peuvent renvoyer plusieurs valeurs.) Cela contraste avec Fortran et de nombreux autres langages réussis qui distinguent les «expressions» et les «déclarations».

Il était naturel d'avoir une telle différence dans Fortran parce que la langue était orientée linéairement (pas surprenant pour une langue dans laquelle une carte perforée était le format d'entrée). Vous ne pouviez pas avoir de déclarations imbriquées. Et bien que vous ayez besoin d'expressions mathématiques pour fonctionner, il était inutile de forcer quelque chose d'autre à renvoyer une valeur, car il se peut qu'il n'y ait pas quelque chose qui attendait un retour.

Les restrictions ont été levées avec l'avènement des langages structurés en blocs, mais il était déjà trop tard. La distinction entre expressions et déclarations a déjà été fixée. Il est passé de Fortran à Algol et ensuite à leurs descendants.

Lorsque la langue est entièrement constituée d'expressions, vous pouvez créer des expressions comme vous le souhaitez. Vous pouvez écrire soit (en utilisant la syntaxe Arc )

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

soit

 (= x (if foo 1 2)) 

7. Un type de symbole . Les caractères sont différents des chaînes, auquel cas vous pouvez vérifier l'égalité en comparant les pointeurs.

8. Une notation pour le code utilisant des arbres de caractères.

9. La langue entière toujours disponible . Il n'y a aucune différence apparente entre le temps de lecture, le temps de compilation et le temps d'exécution. Vous pouvez compiler ou exécuter du code pendant la lecture, ou lire ou exécuter du code pendant que vous compilez, ou lire ou compiler du code lors de l'exécution.

L'exécution de code pendant la lecture permet aux utilisateurs de reprogrammer la syntaxe Lisp; l'exécution de code au moment de la compilation est la base des macros; la compilation à l'exécution est la base de l'utilisation de Lisp comme langage d'extension dans des programmes comme Emacs; et enfin, la lecture au moment de l'exécution permet aux programmes d'interagir à l'aide d'expressions s, une idée récemment réinventée en XML.

Conclusion


Lorsque Lisp vient d'être inventé, toutes ces idées étaient très loin des pratiques de programmation habituelles dictées par le matériel disponible à la fin des années 1950.

Au fil du temps, la langue par défaut, incarnée dans le succès des langues populaires, a progressivement évolué vers Lisp. Les points 1-5 sont désormais répandus. Le point 6 commence à apparaître dans le courant dominant. En Python, sous une certaine forme, il y a le point 7, bien qu'il n'y ait pas de syntaxe appropriée. L'article 8, qui (avec l'article 9) rend les macros possibles en Lisp, ne l'est toujours qu'en Lisp, peut-être parce que (a) il nécessite ces crochets ou quelque chose d'aussi mauvais, et (b) si si vous ajoutez cette dernière augmentation de puissance, vous ne pouvez plus prétendre avoir inventé une nouvelle langue, mais seulement développé un nouveau dialecte de lisp; -)

Bien que cela soit utile pour les programmeurs modernes, il est étrange de décrire Lisp en termes de différence avec les astuces aléatoires utilisées dans d'autres langues. Ce n'est peut-être pas ce que McCarthy pensait. Lisp n'a pas été conçu pour corriger les erreurs Fortran; il apparaissait davantage comme un sous-produit d'une tentative d' axiomatiser les calculs .

Source: https://habr.com/ru/post/fr476994/


All Articles