Pourquoi les anciens langages de programmation continuent-ils d'être révisés?

46

Cette question n'est pas "Pourquoi les gens utilisent-ils encore les anciens langages de programmation?" Je le comprends très bien. En fait, les deux langages de programmation que je connais le mieux sont C et Scheme, tous deux remontant aux années 70.

Je lisais récemment des articles sur les modifications apportées aux versions C99 et C11 par rapport à C89 (qui semble toujours être la version de C la plus utilisée dans la pratique et la version que j'ai apprise de K & R). En regardant autour de vous, il semble que chaque langage de programmation très utilisé reçoit une nouvelle spécification au moins une fois par décennie environ. Même Fortran reçoit toujours de nouvelles révisions, malgré le fait que la plupart des utilisateurs l'utilisent toujours.

Comparez cela à l’approche du système de composition TeX, par exemple. En 1989, avec la sortie de TeX 3.0, Donald Knuth déclara que TeX était complet et que les versions futures ne contiendraient que des corrections de bugs. Même au-delà de cela, il a déclaré qu'à sa mort, "tous les bogues restants deviendront des fonctionnalités" et qu'aucune autre mise à jour ne sera faite. D'autres sont libres d'utiliser TeX et l'ont fait, mais les systèmes résultants sont renommés pour indiquer qu'ils sont différents de TeX officiel. Ce n'est pas parce que Knuth pense que TeX est parfait, mais parce qu'il comprend la valeur d'un système stable et prévisible qui fera la même chose dans cinquante ans.

Pourquoi la plupart des concepteurs de langages de programmation ne suivent-ils pas le même principe? Bien sûr, lorsqu'une langue est relativement nouvelle, il est logique qu'elle passe par une période de changements rapides avant de s'installer. Et personne ne peut vraiment s'opposer à des modifications mineures qui ne font que codifier des pseudo-normes existantes ou corriger des lectures inattendues. Mais lorsqu'une langue semble encore avoir besoin d'amélioration après dix ou vingt ans, pourquoi ne pas simplement la bifurquer ou recommencer, plutôt que d'essayer de changer ce qui est déjà utilisé? Si certaines personnes veulent vraiment faire de la programmation orientée objet en Fortran, pourquoi ne pas créer "Objective Fortran" à cette fin et laisser Fortran lui-même?

Je suppose que l’on pourrait dire que, indépendamment des révisions futures, C89 est déjà une norme et que rien n’empêche les utilisateurs de continuer à l’utiliser. C'est un peu vrai, mais les connotations ont des conséquences. En mode pédant, GCC mettra en garde sur une syntaxe dépréciée ou ayant une signification légèrement différente en C99, ce qui signifie que les programmeurs C89 ne peuvent tout simplement pas ignorer la nouvelle norme. C99 doit donc comporter un avantage suffisant pour imposer ces frais généraux à tous les utilisateurs du langage.

C'est une vraie question, pas une invitation à argumenter. Bien entendu, j’ai une opinion à ce sujet, mais pour le moment, j’essaie seulement de comprendre pourquoi ce n’est pas simplement la façon dont les choses se passent. Je suppose que la question est:

Quels sont les avantages (réels ou perçus) de la mise à jour d'une norme linguistique par opposition à la création d'une nouvelle langue basée sur l'ancienne?


la source
2
De nombreux compilateurs peuvent être appelés avec des commutateurs qui appliqueront des normes plus anciennes (par exemple, le --std=xcommutateur de GCC ). Ce n'est donc pas comme si la création de normes plus récentes aboutissait à des outils qui déstabilisaient le code plus ancien.
Blrfl
2
Comment définissez-vous "un nouveau langage basé sur l'ancien"? Je dirais que Fortran 90 est un "nouveau langage" basé sur l’ancien F77. Cela a complètement changé la façon dont vous programmez - source fixe vs source libre, mémoire dynamique vs statique, etc. Vous pourriez également soutenir que Fortran 2003 est un "nouveau langage" basé sur F90 - il a ajouté une programmation orientée objet tout en préservant la compatibilité avec F90. Cela ressemble à la relation entre C ++ et C.
tpg2114
1
Je pense que cette question est très importante et je ne comprends pas pourquoi certains veulent la fermer. C'est un phénomène très intéressant qui a probablement une explication. Il y a quelques (20?) Ans, je lisais de nouvelles fonctionnalités de Fortran et je me suis posé la question suivante: si les programmeurs de Fortran ont besoin de ces fonctionnalités, pourquoi ne pas simplement passer au C? En ce qui concerne le C ++, je me suis récemment penché sur la même chose : si les développeurs C ++ veulent utiliser lambdas, pourquoi ne pas passer à OCaml ( linux-nantes.org/~fmonnier/ocaml/ocaml-wrapping-c.php )? Pourquoi préfèrent-ils créer un nouveau langage et l'appeler encore C ++?
Giorgio
3
@ tpg2114 La différence entre (FORTRAN 77: Fortran 90) et (C: C ++) est que Fortran 90 est réputé avoir remplacé FORTRAN 77, au point que l’on dit aux gens: "Si vous voulez apprendre le Fortran, apprenez le Fortran 2003 ou au moins 90, parce que c'est la norme maintenant. " Personne ne dirait quelque chose comme: "Si vous voulez apprendre le C, apprenez le C ++ car c'est le nouveau standard", car ils sont présentés dans deux langues différentes. Comme je l'ai dit, les connotations ont des conséquences.
6
PARCE QUE C NE MEURT JAMAIS
Adel

Réponses:

13

Je pense que la motivation des concepteurs de langage pour réviser les langages existants est d'introduire l'innovation tout en veillant à ce que leur communauté de développeurs cible reste unie et adopte le nouveau langage: déplacer une communauté existante vers une nouvelle révision d'un langage existant est plus efficace que de créer une nouvelle communauté. autour d'une nouvelle langue. Bien sûr, cela oblige certains développeurs à adopter la nouvelle norme, même si l'ancienne règle convenait: dans une communauté, vous devez parfois imposer certaines décisions à une minorité si vous souhaitez que la communauté reste unie.

En outre, considérons qu'un langage général tente de servir le plus grand nombre de programmeurs possible et qu'il est souvent appliqué à de nouveaux domaines pour lesquels il n'a pas été conçu. Ainsi, au lieu de viser la simplicité et la stabilité du design, la communauté peut choisir d'incorporer de nouvelles idées (même issues d'autres langues) au fur et à mesure que la langue évolue vers de nouveaux domaines d'application. Dans un tel scénario, vous ne pouvez pas vous attendre à bien faire les choses du premier coup.

Cela signifie que les langues peuvent subir de profonds changements au fil des ans et que la dernière révision peut paraître très différente de la première. Le nom de la langue n'est pas conservé pour des raisons techniques, mais parce que la communauté de développeurs accepte d'utiliser un ancien nom pour une nouvelle langue. Ainsi, le nom du langage de programmation identifie la communauté de ses utilisateurs plutôt que le langage lui-même.

Pour l’OMI, de nombreux développeurs trouvent cela acceptable (ou même souhaitable), c’est qu’une transition progressive vers une langue légèrement différente est plus facile et moins déroutante qu’un saut dans une langue complètement nouvelle qui leur demanderait plus de temps et d’efforts pour la maîtriser. Considérez qu’un certain nombre de développeurs ont une ou deux langues préférées et n’apprécient guère l’apprentissage de nouvelles langues (radicalement différentes). Et même pour ceux qui aiment apprendre de nouvelles choses, apprendre un nouveau langage de programmation est toujours une activité difficile et qui prend du temps.

En outre, il peut être préférable de faire partie d'une grande communauté et d'un écosystème riche que d'une très petite communauté utilisant un langage moins connu. Ainsi, lorsque la communauté décide de passer à autre chose, de nombreux membres décident de suivre pour éviter l'isolement.

En guise de commentaire, je pense que l'argument qui consiste à autoriser l'évolution tout en maintenant la compatibilité avec le code existant est plutôt faible: Java peut appeler du code C, Scala peut facilement s'intégrer au code Java, C # peut s'intégrer au C ++. De nombreux exemples montrent que vous pouvez facilement interfacer avec du code hérité écrit dans une autre langue sans avoir besoin de la compatibilité du code source.

REMARQUE

D'après certaines réponses et certains commentaires, il semble que certains lecteurs aient interprété la question comme suit: "Pourquoi les langages de programmation doivent-ils évoluer?"

Je pense que ce n’est pas l’essentiel de la question, car il est évident que les langages de programmation doivent évoluer et pourquoi (nouvelles exigences, nouvelles idées). La question est plutôt "Pourquoi cette évolution doit-elle avoir lieu dans un langage de programmation au lieu de générer de nombreux nouveaux langages?"

Giorgio
la source
Cette réponse me semble la plus logique parmi celles que j’ai vu ici: mettre à jour une langue vous permet d’hériter (au moins de certaines) de la communauté existante, des bibliothèques, etc. Je me souviens avoir lu que le plus gros problème de Lisp est le grand nombre de dialectes incompatibles qui rendent difficile le maintien d'une communauté; mettre à jour une langue existante pourrait être un moyen d'éviter de fragmenter d'autres communautés de la même manière.
@SunAvatar: Autant que je sache, Lisp compte plusieurs dialectes, mais certains ont plus de succès que d'autres (Common Lisp, Scheme, Racket, Clojure). Chaque fois que vous commencez une nouvelle langue, vous prenez le risque que seule une très petite communauté se rassemble autour d'elle. Dans la communauté Lisp, cela semble être une pratique courante: si quelqu'un a une nouvelle idée, il branche et voit ce qui se passe. Pour les créateurs d'autres langues, perdre la communauté n'est pas une option.
Giorgio
@SunAvatar: Je ne vois pas l'héritage des bibliothèques existantes comme un argument de poids. Vous n'avez pas besoin de la compatibilité du code source pour cela. Voir par exemple comment Clojure et Scala peuvent utiliser du code Java.
Giorgio
1
Les langues ne meurent pas, seuls les programmeurs qui les utilisent.
Evan Plaice
@SunAvatar: Il existe également des communautés qui essaient de suivre une politique différente: un nom identifie une langue et si une partie de la communauté crée un dialecte trop divergent, elles utilisent un nouveau nom pour éviter toute confusion. Voir, par exemple, racket-lang.org/nom-nom.html
Giorgio
21

La compatibilité ascendante est votre réponse. Une langue donnée, en particulier une langue largement utilisée telle que C, peut avoir un code en fonctionnement, non modifié, pendant des décennies. S'il est nécessaire d'effectuer des tâches de maintenance, il est utile de disposer de compilateurs capables de cibler ce type de plate-forme tout en fonctionnant sur des systèmes modernes destinés au développement. Les normalisations et les mises à jour de versions linguistiques aident à maintenir les pratiques de programmation à jour tout en fournissant un sentiment de familiarité aux programmeurs expérimentés qui peuvent être réticents à apprendre un tout «nouveau» langage.

Gardez à l'esprit que beaucoup de langues mises à jour sont moins mises à jour que "ont de nouveaux éléments brillants verrouillés". Les bêtes d'antan se cachent souvent encore à l'intérieur.

Pour ce qui est de Knuth, rappelez-vous qu’il est un universitaire et que TeX n’est prouvé que comme correct, pas mis à jour.

Ingénieur du monde
la source
14
Le problème du texte scientifique au format Tex = format n’a pas beaucoup changé. Le domaine des langages de programmation = trouver de nouvelles utilisations pour de nouveaux ordinateurs, est plutôt plus étendu. C'est la même raison pour laquelle le latin n'ajoute pas autant de nouveaux mots qu'en anglais
Martin Beckett
Je ne pense pas que la compatibilité en amont soit une raison valable: Scala peut être facilement intégré au code Java existant, mais ce n'est pas un super-jeu de Java. Je pense donc qu’en général, il n’est pas nécessaire qu’un nouveau langage soit compatible avec un ancien au niveau du code source. Il est suffisant de disposer d'un mécanisme bien défini pour appeler du code hérité à partir du nouveau code.
Giorgio
@Martin Beckett: "Le problème du texte scientifique en format Tex n'a pas beaucoup changé.": Je pense que vous manquez le but de la question. Le PO ne demande pas s'il faut innover dans les langages de programmation (personne ne peut nier que l'innovation est nécessaire), mais pourquoi les anciens langages sont révisés au lieu d'en créer de nouveaux.
Giorgio
Les systèmes reposent sur des investissements en temps, en argent et en expertise (expérience acquise dans une langue donnée). Les nouveaux efforts ont coûté beaucoup plus que les efforts de maintenance (dans les trois catégories). Sans améliorations du langage et de la plate-forme en général, le coût de la maintenance augmente, puis le coût d'un nouveau système est plus attractif et la véritable réorganisation de l'application COBOL sur une plate-forme totalement différente pour la huitième fois de sa vie peut sembler anodine comme une telle affaire plus.
JustinC
Sans les normes mises à jour du langage COBOL et les développeurs de l'outil COBOL, ils ont ajouté leurs propres fonctionnalités uniques en cours de route, améliorant ainsi le langage et la capacité d'opérer sur des plates-formes modernes plus larges et plus courantes. l'application n'aurait pas survécu 60 ans. Alors que les coûts relatifs ont certainement augmenté plus tard dans sa vie, en raison d'une raréfaction des compétences, les efforts déployés ont été minimes pour un dollar par rapport à une réécriture régulière lorsque la langue du moment est apparue.
JustinC
5

Je pense que la réponse évidente est que des progrès sont encore réalisés dans la conception des langages et l'architecture système, et que suffisamment de gens se soucient des langages plus anciens pour pouvoir tirer parti des nouvelles techniques (plusieurs cœurs, de meilleurs modèles de thread ou de mémoire) pour pouvoir les maîtriser. sur ou cuit dans la norme de langue. Il est également utile d’avoir une "seule vraie façon" de faire (par exemple, l'analyse XML, l'accès aux bases de données) sur laquelle vous pouvez compter, quel que soit le compilateur ou la plate-forme sur laquelle vous vous trouvez, plutôt que de dépendre de tiers. bibliothèque qui peut ou non être installée (et peut être ou non la version dont vous avez besoin, etc.).

RGT
la source
Donc, si "suffisamment de gens se soucient des anciennes langues" en est la raison, diriez-vous que votre réponse peut être reformulée en "attachement sentimental aux langues existantes"? Je ne dis pas cela de façon péjorative, j'essaie simplement de comprendre votre réponse.
Avner Shahar-Kashtan
Non, je voulais dire que les langues sont toujours utilisées et qu'elles sont utilisées par des personnes qui souhaitent tirer parti des dernières techniques. Je ne pense pas que quiconque va ajouter un support multithreading à ALGOL car (autant que je sache), il n'est pas utilisé activement. FORTRAN et COBOL, cependant, sont toujours utilisés pour développer de nouveaux systèmes, de sorte que leurs spécifications linguistiques sont mises à jour périodiquement pour intégrer de nouvelles techniques et technologies.
TMN
1

Les concepts ou objectifs fondamentaux autour desquels s'articule le langage à usage général ne perdent pas leur pertinence. Cependant, des changements mineurs dans l'environnement de travail ou le matériel exigent que des mises à jour ou de petites fonctionnalités soient ajoutées à une langue.

La façon dont les algorithmes sont exprimés dans un langage ne changera pas, même si celui-ci peut nécessiter une prise en charge plus propre des types 64 bits, une prise en charge plus régulière des expressions régulières ou une prise en charge plus robuste des nouveaux types de systèmes de fichiers.

Il existe quelques cas où de «nouvelles» fonctionnalités sont ajoutées aux langues existantes, mais dans de nombreux cas, ces modifications constituent une simplification des tâches que les gens faisaient déjà à la dure. (Voir C ++ en utilisant des fonctions d'ordre élevé au lieu de pointeurs de fonctions et de foncteurs.)

Ben
la source
1
Les changements que vous décrivez dans le deuxième paragraphe sont assez irréprochables (par ce que je veux dire non seulement que je ne m'oppose pas, mais que personne ne peut sérieusement s'opposer). Quant à lambdas, je ne peux pas commenter sur leur utilité en C ++, mais pourquoi donner la peine de les ajouter si ne pas modifier les algorithmes manière sont exprimés?
Oh, ils sont incroyablement utiles. Ne vous méprenez pas. C'est l'ajout le plus important en C ++ (IMO). Je pense que je ne comprenais pas ce que je voulais dire par là. On choisit généralement C ++ pour avoir un accès direct à la mémoire, aux performances déterministes et à un potentiel d'optimisation élevé. Cela ne change pas avec les récents ajouts. Nous avons simplifié beaucoup d'autres tâches de programmation pour lesquelles vous avez choisi C ++, mais le C ++ est toujours valide et utile pour les mêmes raisons. Le schéma est mis à jour régulièrement, mais le code en tant que données et le style ne changent pas. Vous choisissez donc le schéma pour les mêmes raisons qu’il ya 20 ans.
Ben
"Quant aux lambdas, je ne peux pas dire leur utilité en C ++, mais pourquoi se donner la peine de les ajouter sinon de changer la façon dont les algorithmes sont exprimés?": Je vais encore plus loin: pourquoi les ajouter à C ++ au lieu de passer à un langage qui les a depuis le début?
Giorgio
2
@Giorgio Pour contrôler les fonctionnalités de cache et d'abstraction dans le langage. Si aucune langue existante ne fournit les deux, vous ne pouvez pas changer de langue sans en sacrifier une. Vous devez modifier une langue ou en créer une nouvelle.
mike30
@mike: Qu'entendez-vous par "fonctionnalités de cache"?
Giorgio
-2

C'est un peu comme une considération du langage parlé.

Dans le passé, il y avait des mots qui n'étaient pas utilisés aussi souvent qu'ils le sont maintenant (ou utilisés pour un sens différent).

par exemple. sympa: en (très vieux), l’anglais a un sens presque inverse de celui que nous utilisons aujourd’hui, en particulier pour décrire le caractère de quelqu'un.

Mauvais: il n’ya pas très longtemps, mauvais n’avait qu’un seul sens, maintenant il peut vouloir dire quelque chose de "super étonnant" (il est utilisé de façon fesicous (j’ai probablement manqué le mot épelé fesicous)!

Une autre nouveauté est le téléphone mobile «Text Speak» pour les langues écrites.

Personnellement, je ne vois pas pourquoi un langage de programmation ne se développerait pas de manière similaire. Les mots et les fonctions ont des significations / actions spécifiées, et il est nécessaire de changer pour incorporer de nouvelles idées, de nouvelles méthodologies.

Je connais des gens qui parlent beaucoup de langues différentes et ils suggèrent souvent qu’après 3 ou 4, il devient plus facile d’en apprendre une nouvelle.

Je ne sais pas s'il y a des programmeurs qui ont une expérience similaire, je ne serais pas surpris s'il y en avait.

Je sais que je me sens heureux de programmer en JAVA (tout comme je me sens heureux de parler en anglais) Cela ne signifie pas que je ne peux pas communiquer en «anglais américain» ou en «anglais australien», bien qu'il y ait des «pièges» à surveiller . Un peu comme aller de Java à PHP en Perl, les constructions sont similaires, mais il y a peu de pièges pour me prendre et me faire cogner la tête contre le mur.

Cela diffère du passage de l'anglais au français ou de Java à SAS. Celles-ci sont si différentes qu'il faut beaucoup de temps pour les maîtriser.

Quoi qu'il en soit, c'est mon point de vue.

DaveM
la source
Je pense que vous pensez à "facétieux".
Uliwitness