HISTOIRE DES LANGAGES INFORMATIQUE

©2002 Jean Bellec

Retour histoire informatique

version partielle provisoire
noter que les hyperliens mentionnent des pages encore en construction, et que leur existence ne fait que refléter l'avancement de cette version partielle et peut-être partiale de l'histoire informatique.

La programmation des machines comme l'ASCC (Harvard MkI) ou les premières machines de gestion fut une opération de câblage, à la manière des automates industriels. IBM, Univac et Bull avaient développé le concept de tableau de connexion amovible qui avait l'avantage de ne pas immobiliser le système pendant le développement d'un programme particulier. Ensuite, ces constructeurs inventèrent un concept de tableau secondaire pour garder des morceaux de programme partagés, un prédécesseur des sous programmes en quelque sorte. Ces tableaux de connexion restèrent le moyen de programmer les machines jusque vers 1955, moment où les ordinateurs à programme enregistré sortirent des laboratoires.

La programmation par panneaux de connexions garda des traces dans le milieu des programmeurs d'applications de gestion où le concept de procédures avait du mal à pénétrer. Aussi, naquirent les Gestions Automatiques de Programme (nom donné par IBM France au Report Program Generator -RPG-) introduit sur les premiers petits ordinateurs de gestion et dont la dernière version RPG3 fut le langage principal de programmation du System 38 et de l'AS/400.
Je pense qu'on retrouve une trace de cette approche dans les tableurs (Visicalc, Multiplan et autres Excel) qui sont devenus le principal usage programmatique sur les micro-ordinateurs.

 

Les machines à programme enregistré dérivent des concepts de von Neumann au début des années 1950. La caractéristique principale de ces machines qui restait contestée dans les années 1960, mais s'imposa au moins partiellement par la suite, était de banaliser la mémoire principale -mémoire à tores ou tambour- entre données et programmes et de laisser envisager l'auto modification des programmes. L'usage de cette auto modification pouvait être un gain de place en réutilisant comme constantes certaines parties du programme -source de pénibles mises au point au début des années 1960,, ce pouvait aussi l'amorce d'une intelligence artificielle où le programme savait s'adapter aux péripéties du calcul. En pratique, la principale utilisation de la banalisation de la mémoire a été la programmation automatique, c'est à dire, la fabrication d'un programme à partir d'un langage de programmation au moyen d'un autre programme qu'on appellera, probablement abusivement, un compilateur. L'abus de ce mot était peut-être que la fonction de traducteur de langage était complémenté par la réunion de sous-programmes ou de macro-instructions.

Cette vision de la programmation automatique s'est à peu près imposée au début des années 1960 (et dure encore de nos jours), il ne faut pas ignorer qu'une autre solution avait été élaborée aussi à peu près simultanément, celle de l'interprétation d'un langage de haut niveau. Le concept d'interpréteur avait été utilisé par Wilkes en Grande Bretagne puis par IBM (S/360) et Bull (M-40 et Gamma 55) pour exécuter un code puissant et complexe au moyen d'une machine plus frustre et meilleur marché. Les microprogrammes de ces machines représentaient un interpréteur. Cette solution d'interpréteur perdurera dans des machines surtout utilisées interactivement, comme le système BASIC de Dartmouth et GE ou le PAF de Dimitri Starynkevitch la CAB500 de SEA en France. 
BASIC fut développé par John Kemeny et Thomas Kurtz à Dartmouth. Sa diffusion sur le time-sharing de General Electric le popularisa durant les années 1970 et ce langage fut diffusé dans divers dialectes et étendu vers le graphique et le multimédia sur les premières générations de microordinateurs. C'est en écrivant un processeur BASIC pour Altair que Bill Gates commença son ascension et créa Microsoft.
En fait ces interpréteurs utilisèrent très vite une solution intermédiaire avec les compilateurs: celle d'un parser qui transformait le code source en code intermédiaire et l'interpréteur proprement dit. On aura reconnu les solutions du P-code et des premières versions de Java.

Les premières ébauches de langages et de compilateurs se heurtaient à deux problèmes cruciaux à cette époque de puissance de calcul rare et chère: l'encombrement accru des programmes et la lenteur d'exécution. La comparaison avec un simple Autocode où à chaque instruction de code source correspondait une instruction machine était notablement en défaveur des langages et surtout des langages qui se voulaient indépendants de la machine sous-jacente. Le traducteur de langage Autocode fut appelé l'Assembleur. Ce n'est pas un hasard si la définition par John Backus de FORTRAN, dont la version intiale date de 1954, était inspirée par le code d'instructions de l'IBM 704. FORTRAN continua son évolution jusqu'à nos jours avec le FORTRAN II, en 1957 qui l'établit comme langage standrad scientifique, FORTRAN IV en 1962, Fortran 77 normailé en avril 1978, puis Fortran 90 en 1991.
A cette exception près, les constructeurs de machine laissèrent à de comités de normalisation peuplés de leurs scientistes et par des universitaires la définition en 1958 du langage ALGOL. Les concepts de ALGOL furent sensiblement innovants, ils ignoraient les particularités des registres pour faire les calculs sur des variables en mémoire, ils admettaient la possibilité de récursivité des procédures, ils standardisaient une structure de blocs lexicographiques. Certains constructeurs décidèrent de construire leur machine autour de Algol, c'est notamment le cas de Burroughs. Un inconvénient d'Algol est son ignorance de la notion de fichiers qui limita son usage soit à des programmes tournnat sur des machines spécifiques soit diffuser sur papier des algorithmes.


En parallèle, un comité de normalisation des applications de gestion, poussé par les administrations américaines et quelques grands clients, le CODASYL publia en 1959 les premières spécifications de COBOL.  La mémoire de Grace Hopper est associée à la naisssance de COBOL, essentiellement parce qu'elle apporta son expérience de FLOW-MATIC sur Univac I.
Ce langage n'aurait probablement pas eu le succès qu'il a connu sans les contraintes de l'administration américaine. Par rapport à FORTRAN et ALGOL, le CODASYL eut le souci de la résolution des problèmes pratiques des utilisateurs de fichiers séquentiels à base de cartes ou de supports magnétiques.
Aucun langage n'avait été conçu pour l'accès direct aux données que permettaient les disques magnétiques et les entrées directes par terminaux. Les comités de normalisation de COBOL se contentèrent d'ajouter des commandes (verbes) de positionnement dans les fichiers pour supporter les disques. Ce n'est pas un hasard si les transactions CICS ont  très longtemps été longtemps été programmées en macro-assembleur en y ajoutant des commandes spécifiques que d'autres constructeurs ajoutèrent au COBOL pour supporter le transactionnel. COBOL continua d'être amélioré par le CODASYL sous les versions 1961, 1968 et 1974 et 1980.

IBM, ne supportant COBOL qu'à contre coeur, essaya en 1964 de faire avec PL/1 un langage universel en prenant ce qu'il y avait de mieux dans ALGOL et en lui ajoutant les plus de FORTRAN et de COBOL. PL/1 s'essaya même à traiter du temps réel et du transactionnel en définissant le concept de process sans trop en mesurer l'application réelle. PL/1 traitant tous les formats de données et en particulier les chaînes de  bits était un langage tentant pour rayer l'assembleur de l'offre logiciel. Le concepteurs de MULTICS, puis après eux ceux de Honeywell (PL/6 pour CP-6, puis pour GCOS8) et Bull (HPL pour GCOS64 et GCOS7) pour en faire un langage d'écriture du système d'exploitation. Au prix d'une certaine interprétation des spécifications de PL/1 et/ou d'une pincée d'assembleur, le concept d'une programmation de système en langage de haut niveau fut acquis. IBM, plutôt que d'utiliser PL/1 pour ses nouveaux développements, en définit un sous-ensemble plus efficient PL/S. Un autre dialecte de PL/1 qui eut son importance fut PL/M développé en 1972 par Gary Kindall qui lui servit comme langage d'implémentation de CP/M.

Plutôt que de déformer PL/1 les concepteurs de UNIX autour de Ken Thompson aux Bell Laboratories préférèrent , à partir de langages d'implémentation utilisés au MIT (CPL, BCPL et B) développer en 1971 leur propre langage qui eut le succès que l'on sait, le langage C. Le plus célèbre des compilateurs C, appelé gcc, a été dans le cadre du projet GNU.

Un langage original, Forth, basé entièrement sur le concept de piles et de récursivité, eut un certain succès à la fin des données 1970. Il fut conçu en 1969 comme langage de process control par Chuck Moore, un astronome.

En fait, les concepteurs de langages cherchèrent le plus souvent à ce que tous les concepts utiles au programmeur soient définissables dans "leur" langage  suivant ainsi la tentation d'imiter l'évolution des langages naturels où cet utilisateur sans parler des Académies acceptent des mots étrangers pour les nationaliser. L'idée d'utiliser plusieurs langages différents pour écrire un même programme est un concept quelque peu abscons pour un esprit occidental. C'était cependant oublier qu'un programme est le plus souvent écrit par plusieurs personnes et, qui pis est, à des périodes différentes. Cette nécessité a d'abord été satisfaite par des extensions des concepts de sous-programmes et par des définitions rigoureuses des interfaces entre programmes (paramètres d'appel et de retour) spécification rigoureuse des données partagées, par le concept de package apparu un peu plus tard. Il devint donc possible de ne pas recompiler le programme depuis la totalité de ses modules en code source, ce qui était encore la règle sous-entendue par certains langages, mais d'éditer les liens entre modules par un processeur spécifique. Cette possibilité a été jugée nécessaire par les concepteurs des systèmes d'exploitation dès les années 1960, bien que c'est seulement avec le développement des langages orientés objet que ce concept a été pris en compte par les concepteurs de langage.

Une déformation des langages et de leurs compilateurs a été mis en oeuvre très tôt, c'est de faire précéder la compilation et même le parsing par un traitement syntactique au niveau du code source permettant d'étendre à volonté le langage. L''utilisation de macroprocesseurs plus ou moins sophistiqués de l'INCLUDE de C jusqu'au traitement récursif de TRAC et du MacProc de Bull, en passant a permis au programmeur COBOL d'écrire des transactions ou de réaliser une modularité spécifique -pas nécessairement rigoureuse, parce que non interprétée à l'exécution.

Parmi les langages nouveaux qui virent le jour à une cadence plus faible à partir des années 1975, il convient de citer ADA (1979), langage soumis à un concours par le Pentagone avec un objectif de remplacer JOVIAL , un ancêtre de 1960, et de se substituer à PL/1 en renforçant le typage des données et la solidité des interfaces. ADA vint trop tardivement pour s'imposer sur les main frames et trop tôt pour acquérir une place sur les micros trop peu puissants, à l'époque. Il se heurta à la concurrence de C et dut se contenter la niche des systèmes embarqués de l'US Air Force où il vole opérationnellement au dessus des continents. Le concours de spécification de ADA fut remporté par l'équipe de Jean Ichbiah à CII-HB.
En France, et pour des besoins à peu près identiques à ceux des États-Unis, les Armées décidèrent d'utiliser le langage LTR (Langage Temps Réel), ce qui eut pour effet de raréfier le marché potentiel de ADA.

 

Pascal fut un langage défini en 1970 à Zurich par le professeur Niklaus Wirth à des fins pédagogiques: moins complet que C, moins sujet à la "programmation spaghetti" que BASIC,  n'exigeant pas de compilateur volumineux, il était approprié aux micro-ordinateurs de première génération. Pascal fut même quelques temps vers 1980 un candidat pour remplacer le système d'exploitation de ceux-ci par un interpréteur de P-code (UCSD). On notera aussi à la même époque le succès de l'aventure Borland à partir d'un compilateur Pascal sur micros dont le prix menaça un temps le business de Microsoft. L'augmentation de la taille de mémoire disponible lui fit céder la place à C. L'équipe Wirth essaya de prolonger le développement de PASCAL avec Modula (1975)

 

C'est encore au cours des années 1970 que fut inventé le langage Smalltalk, développé au Xerox PARC par Alan Kay et Adele Goldberg. Ce langage ajoute à l'esprit de l'UCSD deux données importantes: la prise en compte d'un écran avec fenêtres (au lieu du paradigme Teletype ou cartes perforées utilisées jusqu'alors) et le concept d'objets communiquant par messages. L'insuccès de Smalltalk repris par Digitalk eut comme raison le caractère dogmatique excluant du système les programmes non écrits dans ce langage. Les définitions de Smalltalk pour un langage orienté objet, la définition de l'héritage des variables et le concept de création/destruction d'objet seront reprises dans le produit industriel le plus important C++ inventé par le danois Bjarne Stroustrup aux Bell Laboratories en 1983 et qui a su coexister avec C -en utilisant le compilateur C comme le traducteur du langage par le préprocesseur C++. Le succès de C et de C++ doit beaucoup à la disponibilité de la chaîne GNU développée initialement au MIT puis dans la communauté des logiciels libres. La gratuité de la chaîne de fabrication a stérilisé les efforts faits par certains pour fournir une  chaîne comparable. Il faut toutefois signaler la grande antériorité (1964) du langage norvégien SIMULA qui fut le pionnier des langages orientés objet.
Une variante de C++, C# fut introduite en 2000 par Microsoft. 

 

Au milieu des années 1980, une équipe de Sun autour de James Gosling se mirent à étudier le problème de programmation des objets distribués interconnectés sur Internet. En 1991, ils développèrent un langage nommé Oak. L'idée nouvelle était de développer un système de programmation unique pour des objets d'architecture interne différente et dont les programmes devaient pouvoir être téléchargés à distance. Avant d'être utilisés dans ce contexte, le concept fut étendu aux ordinateurs personnels dans le paradigme de "votre ordinateur est le réseau". ce langage est JAVA (introduit formellement en 1995) qui reprend l'essentiel des concepts de C ainsi que celui des langages interprétés en standardisant le langage intermédiaire destiné au téléchargement. Les premiers systèmes Java fonctionnèrent donc à la manière de Basic et eurent des difficultés à s'imposer contre C pour des raisons de performances que ne contrebalançaient pas l'amélioration d la robustesse. La puissance des microprocesseurs et les tailles de mémoire augmentant, il devint possible d'imaginer la réalisation de compilateurs Java "Just in Time" qui transformaient le langage intermédiaire en code machine spécifique du type de microprocesseur à chaque invocation du programme Java. Tout se passait comme s'il s'agissait d'une interprétation avec la rapidité d'un compilateur standard. JavaScript un dialecte sous-ensemble de Java devint rapidement le langage le plus répandu dans les applications distribuées du Web. 

 

Une autre famille de langages est dérivée des interpréteurs de commande eux-même dérivés des antiques Job Control Languages des systèmes de batch processing. Les JCL étaient devenus complexes et le besoin de paramétrage de ceux-ci par exemple par un jeu de macros s'imposa. Ensuite l'intérêt d'y introduire le concept de boucles fut reconnu. Nous avions l'embryon d'un nouveau langage de programmation certes spécialisé avec des éléments relativement ignorés des langages plus "sérieux".
Dans les systèmes time-sharing, l'équivalent du JCL se retrouvait dans les langages de  commande, qu'on appellera plus tard les shells.
L'analyse des besoins par des informaticiens plus rigoureux aboutit à la création d'une nouvelle famille de langages interprétés dont les plus connus sont REXX (introduit vers 1980 par IBM Hursley) et PERL (inventé en 1987 par Larry Wall). Bull en fusionnant les besoins du JCL et ceux de l'utilisation interactive créa le langage commun GCL sur GCOS7 au début des années 1980.

 

Le PHP (1995) est un langage de programmation interprété inventé en Scandinavie spécifiquement pour le développement des applications distribuées sur Internet. Alors que JAVA se plaçait délibérément comme langage client dans un modèle client-serveur où le serveur était un simple serveur de bases de données (machine SQL), PHP permet la programmation d'une application sur le serveur en utilisant un catalogue standard de ressources, suffisamment limité pour ne pas compromettre l'intégrité du serveur. Le succès de PHP actuellement est sans doute dû à son statut de "logiciel libre" associé au serveur Web Apache et au moteur de base de données MySQL.

 

 

Il reste à parler de langages qui visaient des marchés particuliers ou du moins qui n'ont pas cherché à en remplacer d'autres. Ces langages sont fondés sur des interpréteurs.

LISP a été développé dès la fin des années 1950 au MIT comme un langage automodifiable basé sur le traitement de listes. L'idée  de John McCarthy, dans la lignée de von Neumann, aura été de laisser à l'automate de base de l'interpréteur la responsabilité de l'optimisation ou de la recherche de convergence du processus décrit par le programme LISP. Ce langage fut -avant ALGOL- le premier à admettre la récursivité. Il fut aussi le premier à être indépendant de la gestion de mémoire et à nécessiter ce qu'on appellera la "garbage collection".
Sa version Lisp1.5 publiée en 1962 resta le standard jusqu'à l'éclosion de nombreux dialectes dans les années 1980 (Common Lisp, Le_Lisp, à l'INRIA, AutoLisp dans AutoCad, Scheme)
. IL a eu avec TRAC (Calvin Mooers MIT 1966) et Snobol (1962-1964) des continuations visant plus spécifiquement le traitement de chaînes de caractères -avec les restrictions posées par l'ASCII-. Prolog développé en Europe depuis 1972 à Marseille (Alain Colmerauer et Philippe Roussel) et Edinburgh n'a pas su s'imposer non plus probablement plus à cause de ses méthodes de commercialisation que par sa participation à la débâcle de la Ve génération japonaise.
LOGO se Seymour Papert, en 1968, fut un essai de populariser les langages de programmation en ajoutant aux constructions de base de LISP des primitives graphiques.

On notera aussi que les tableurs (Visicalc et EXCEL)  dans lesquels ont été insérés de véritables programmes procèdent de la même logique d'interprétation que les processeurs d'intelligence artificielle. Leur convivialité empirique a eu beau jeu de leur permettre de s'imposer devant leurs ancêtres.

APL inventé par Ken Iverson à IBM à la fin des années 1950 voulait un peu être aux nombres ce que LISP était aux chaînes de caractère. L'utilisation d'un jeu de symboles mathématiques non disponibles sur les claviers ordinaires a probablement été une des sources de son échec devant BASIC et les tableurs. Lui aussi est un langage interprété exécutable sans traitement préalable par le moteur de la machine.

Les ordinateurs se sont avérés capables d'exécuter des opérations non seulement sur des nombres mais sur des variables symboliques. C'est ainsi que sont nés les langages Macsyma (Joel Moses au MIT en 1969), puis Maple (Université de Waterloo en 1980) et Mathematica (Stephen Wolfram 1988) qui permettent les calculs mathématiques sous forme algébrique aussi bien que sous leur expression numérique.

On aura du mal à classer EMACS dans les langages de programmation. Mais tout comme les tableurs il s'agit d'un processeur spécialisé inspiré de LISP qui a été progressivement étendu pour avoir ces capacités de programmation. Son développement universitaire et sa diffusion dans le monde GNU a fait de Richard Stallman un auteur de programmes ayant marqué l'histoire de l'informatique.

On n'a traité ici que des langages répandus en dehors de leur équipe d'origine. A tous les langages à diffusion restreinte dont certains ont été à l'origine des langages mentionnés ci-dessus (BCPL pour C, LIS pour ADA...) il convient d'ajouter ceux destinés à des applications particulières (MUMPS, TeX, Postscript) dont certains méritent qu'on leur accorde une place sidans l'histoire du logiciel.

HISTOIRE et Commentaires sur les LANGAGES de PROGRAMMATION

  • FORTRAN
  • ALGOL
  • COBOL
  • PL/1
  • C
  • ADA
  • BASIC
  • LISP
  • SIMULA
  • SNOBOL
  • EMACS

ARTICLES

LINKS

Computer Language History contenant un arbre de la filiation des langages de programmation ainsi que des liens vers des histoires particulières aux différents langages.