Question pour les spécialistes de l'étymologie : quel langage de programmation a été le premier à utiliser la syntaxe try/catch/finally que l'on retrouve dans les langages Java/.NET actuels ?
Réponses
Trop de publicités?Je crois que c'était le C++ et je pense que Java/C# a ajouté finally pour le nettoyage des ressources (finally n'est pas dans le C++). Malheureusement, j'ai aucune référence... pour l'instant .
Une page soignée de toutes les syntaxes d'exception : http://en.wikipedia.org/wiki/Exception_handling_syntax
Je crois que c'est C++. Si ce n'est pas le cas, Stroustrup doit en donner le crédit. Dans son article : http://www.research.att.com/~bs/except.pdf Il ne mentionne aucune influence et ne fait référence à aucun autre matériel que le sien.
Posté sur Twitter par Mike Fikes partagé avec moi par Pawel Kapala :
MacLisp a ajouté la fonction
ERR
ce qui signale une erreur. SiERR
est invoquée dans le contexte dynamique d'uneERRSET
alors l'argument deERR
est renvoyée comme valeur de l'élémentERRSET
formulaire.Les programmeurs ont rapidement commencé à utiliser
ERRSET
yERR
non pas pour piéger et signaler les erreurs mais pour des raisons de contrôle plus générales (sorties dynamiques non-locales). Malheureusement, cette utilisation deERRSET
a également piégé discrètement des erreurs inattendues, rendant les programmes plus difficiles à déboguer. Une nouvelle paire de primitives,CATCH
yTHROW
a été introduit dans MacLisp en juin 1972 [souligné par moi] de sorte queERRSET
pourrait être réservé à son usage prévu, à savoir le piégeage des erreurs.La leçon de
ERRSET
yCATCH
est important. Les concepteurs deERRSET
et plus tardERR
avait à l'esprit une situation particulière et a défini une paire de primitives pour répondre à cette situation. Mais comme ces facilités fournissaient une combinaison de capacités utiles et puissantes (piégeage d'erreurs et sorties dynamiques non locales), les programmeurs ont commencé à les utiliser de manière inattendue. Les concepteurs ont alors dû revenir en arrière et diviser le système souhaité en plusieurs parties avec des interfaces alternatives. Ce modèle de conception soignée, d'utilisation involontaire et de reconception ultérieure est commun dans l'évolution de Lisp.
- extrait de "The Evolution of Lisp", par Guy Steele et Richard Gabriel
Source : https://twitter.com/mfikes/status/881943130588753920
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">“The Evolution of Lisp,” by Guy Steele and Richard Gabriel</p>— Mike Fikes (@mfikes) <a href="https://twitter.com/mfikes/status/881950560508940288">July 3, 2017</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
Le C++ a été le premier grand langage de programmation à introduire les exceptions (finalement, elles ne sont pas nécessaires en C++ car les destructeurs sont déterministes). Extrait de l'article de Stroustrup : http://www2.research.att.com/~bs/hopl2.pdf
la plus grande influence sur le C++ a été le travail sur les systèmes tolérants aux pannes, commencé à l'université de Newcastle en Angleterre par Brian Randell et ses collègues, et poursuivi par la suite. Newcastle en Angleterre par Brian Randell et ses collègues et poursuivis depuis dans de nombreux endroits.
Common Lisp est bien antérieur à C++, et était basé sur des Lisps antérieurs. Java a, bien sûr, été créé par des hommes de Lisp qui étaient très conscients de cela. Mais Java est un Lisp pollué par le C, et ils ont également ajouté les absurdités de la spécification des exceptions vérifiées.
Common Lisp est allé plus loin et a permis au catch d'interagir avec la routine de lancement, y compris pour dire au lancer de continuer. La pile n'était simplement pas déroulée jusqu'à ce que le catch soit terminé. Cela signifiait que vous pouviez lancer des avertissements tels que le manque de mémoire, ainsi que lancer des échecs.