L’évolution des systèmes
À l’époque des calculateurs électroniques et des premiers ordinateurs on ne peut pas réellement parler de programmation ; il serait plus exact de parler d’une configuration de la machine, comme pour les machines de Turing. Pour autant l’architecture de von Neumann amorce un processus durable : les programmes peuvent désormais être enregistrés en mémoire puis sur des mémoires de masse. Ils peuvent donc gagner en complexité, progressivement. Les premiers programmes sont des programmations de la machine : ils décrivent séquentiellement les opérations qu’elle doit effectuer. Il s’expriment d’abord en langage machine puis seront ensuite rendus plus lisibles à l’aide de langages de description de programmes en langage machine : les langages « assembleurs »1. Dans les années 1950 et au début des années 1960 les ordinateurs étaient si chers qui fallait les faire travailler en permanence. C’est l’origine des dispositifs de partage de temps (time sharing, 1961) et des systèmes multitâches (1958) puis multiutilisateurs : le moment de réflexion d’un utilisateur peut être le temps de calcul d’un autre. Ces méthodes permettront la mise en place des premiers grands systèmes partagés de banque et de réservation aérienne [Negroponte, p. 95]. Avec l’augmentation en complexité des ordinateurs (années 1970-1980) et surtout l’apparition des périphériques, en particulier de stockage, il devient nécessaire de disposer de logiciels de plus en plus spécialisés : firmware, systèmes d’exploitation, applications. Le firmware s’occupe des fonctions matérielles les plus élémentaires et de l’amorçage du système (c’est le BIOS des PC). Le système d’exploitation gère les périphériques (au début guère plus que l’affichage en mode texte, le clavier et les disques) et l’exécution des applications2. Les applications sont au service de l’utilisateur. Les fonctions se diviseront encore par la suite le système d’exploitation, en particulier, se décomposant en de nombreuses sous-unités oeuvrant de conserve : noyau, pilotes, HAL, gestionnaire de fenêtres et d’affichage, bibliothèques diverses, serveurs de données etc.
[Verroust] évoquant les années 1980 : « À cette époque les systèmes n’avaient ni la capacité ni la nécessité d’utiliser les systèmes d’exploitation pour mini et grands ordinateurs. Les premiers systèmes d’exploitation appelés moniteurs offraient seulement des fonctionnalités très basiques, et étaient chargés le plus souvent depuis de la mémoire morte. CP/M fut l’un des pionniers en matière de système d’exploitation installé sur un disque (et non sur mémoire morte). Ce système d’exploitation influença largement la conception de PC-DOS. Ce dernier, choisi par IBM comme système d’exploitation pour ses premiers PC, fit de Microsoft l’une des compagnies les plus rentables au monde. Les principales
1Les programmes en assembleur, destinés aux humains, sont « compilés » en langage machine pour être ensuite exécutés. Chaque machine ou famille de machines, puis chaque processeur ou famille de processeurs, possède son propre langage assembleur, très proche en réalité du langage machine lui-même pour ce qui concerne sa sémantique. 2Cf. le cours de Technologies informatiques et multimédias.
L’évolution logicielle
alternatives durant les années 1980 sur le marché des systèmes d’exploitation furent Mac OS en 1984, AmigaOS et Atari en 1985 et OS/2 en 1987. » Les années 1990 voient l’extension de la norme Unix et de systèmes de conception proche : linux (1991), WinNT (1993), MacOS 9 (1999) puis MacOS X (2001). La décennie 2000 voit l’explosion des OS “embarqués” (dont les netbooks et autres iPod). De même que les mini-ordinateurs dépassèrent en nombre puis en usage les gros systèmes, puis que les micro-ordinateurs dépassèrent les mini-, aujourd’hui l’informatique “embarquée” (assistants, nanos, netbooks, électroménager…) est en train de dépasser la micro-informatique.
L’évolution des langages de programmation
Si les firmwares restent longtemps, et encore maintenant, programmés en assembleur, les systèmes d’exploitation et les applications réclamaient des méthodes plus élaborées de programmation.
Le premier vrai langage de programmation effectivement utilisé est le FORTRAN (FORmula TRANslation) mis au point de 1953 à 1957 [Breton, p. 166]. Il s’agit d’un langage impératif, c’est à dire d’une succession d’instructions. D’autres langages seront développés pour répondre à des besoins particulier. Le FORTRAN était destiné principalement au calcul scientifique (il est encore marginalement utilisé, malgré la faiblesse de sa syntaxe). Le COBOL (COmmon Business Oriented Language), créé en 1959, est encore utilisé en gestion. L’Intelligence artificielle, un secteur de la recherche informatique, utilisera abondamment le LISP (1958), langage de programmation fonctionnelle3, dans les années 1970-1980, puis le PROLOG (1972), langage de programmation logique4, pour la construction de systèmes experts. Pour les bases de données on conçu un langage de description, de manipulation et de contrôle, le SQL (1970).
À côté de ces langages spécialisés, les programmeurs et les théoriciens avaient besoin de langages généralistes. C’est à cette fin que fut créé ALGOL (1958), dont dériva le Pascal (et ses nombreux dérivés : Turbo Pascal, Delphi…). Pour gagner encore en généricité et en commodité est créé en 1963 le langage de haut niveau BASIC, explicitement dédié aux débutants : Beginner’s All-purpose Symbolic Instruction Code. Lui aussi eut une riche descendance, dont le Visual Basic, le VBscript et VB.Net de Microsoft.
Enfin, avec la montée en complexité des programmes, il devenait de plus en plus pénible de traiter et de nommer différemment des procédures similaires du seul fait qu’elles s’appliquaient à des objets différents. On inventa donc, à partir de la recherche en Intelligence artificielle, des langages capables de définir des procédures ou des classes d’objets de façon abstraite, c’était la programmation orientée objet5. Aujourd’hui les principaux grands langages de programmation généralistes ont évolué et permettent une programmation objet.
Parmi tous ces langages une famille occupe une place à part par l’influence qu’elle aura sur Internet, les logiciels libres, puis le web. Le C est créé au début des année 1970 de conserve avec le système d’exploitation Unix par Dennis Ritchie et Ken Thompson au sein des laboratoires Bell. Unix (1969) était une forme de réaction aux systèmes d’exploitation extrêmement complexes et lourds de l’époque et en particulier Multics. Il était conçu pour fonctionner sur les petits systèmes (miniordinateurs) qui commençaient à se répandre à l’époque. Le C visait un objectif nouveau à l’époque de portabilité. Il deviendra C++ (1985) en acquerrant la programmation objet. Du C++ dérivera une version épurée, Java (1995), pour porter encore plus loin la portabilité et permettre une utilisation comme langage interprété. De Java découlera une simplification, Javascript (1995). Enfin PHP est extrêmement proche, dans son esprit et sa syntaxe, de cette famille de langages. Aujourd’hui, pour la programmation web côté serveur, Java domine largement les grosses applications et PHP les petites.
La programmation fonctionnelle, sans écarter complètement la programmation impérative, est construite sur le principe de la définition et de l’application de fonctions. Mathématiquement, elle met en oeuvre le lambda-calcul définit par Church en 1935. 4Les programmes sont des ensembles de règles de déductions. 5Le premier langage orienté objet est le Simula (1960). Celui qui diffusa largement l’idée est Smalltalk (1980), beaucoup utilisé en Intelligence artificielle. Celui-ci eut une influence considérable.
Pour la programmation web côté client Javascript est le standard de fait. Dans l’absolu Java occupe la première place des langages, C la seconde et C++ la troisième6.
Parmi les éléments les plus déterminants de la révolution industrielle (milieu 18e siècle-milieu 20e siècle) figure probablement les principes de division du travail, non seulement au sens social (répartition entre catégories, classes ou castes) ou au sens économique (qui culmine avec le taylorisme), mais également au sens technique avec la normalisation des pièces détachées. Il en va de même en informatique : une part toujours plus grande du travail des différents logiciels consiste en tâches qui ne lui sont pas spécifiques et qui peuvent donc être standardisées et rédigées une fois pour toute. À l’époque de FORTRAN cette idée est encore extrêmement rudimentaire : le langage permet simplement de définir des sous-programmes. Peu à peu cette notion se formalisera et les “bouts” de programmes, que l’on appelle « procédures » ou « fonctions », se regrouperont (à partir de la fin des années 1950) en ensembles appelés « bibliothèques. » Ces bibliothèques sont intimement liées, dans un premier temps, à un langage et à un système d’exploitation. Par exemple les opérations de manipulation de fichiers ou de communications entre processus, sont très génériques et n’ont pas à relever de chaque application en propre : il est beaucoup plus efficace de disposer de procédures standardisées regroupées en bibliothèques standards. Plus généralement, l’utilisation de telles bibliothèques permet de mettre en oeuvre les principes informatiques (théorisés) de modularité (separation of concerns) et d’encapsulation (information hiding)7. Ces principes seront considérablement développés et rendus rigoureux par la programmation orientée objet. Aujourd’hui on appelle « framework » un ensemble cohérent de bibliothèques (voire une seule, dans certains discours commerciaux).