Les grandes classes de langages de programmation

Tout automate séquentiel, et donc en particulier tout ordinateur suppose l'existence implicite d'un langage interne . Chaque ordre élémentaire est représenté par une information décrivant une action sur un objet physique ou une donnée.

Par suite de contraintes techniques, les ordres du langage interne d'un automate séquentiel ont en général une structure extrêmement compliquée. Ce code interne est habituellement un code binaire décodé par les circuits logiques de la machine selon les règles de l'algèbre de Boole.

L'exécution d'un algorithme sur un ordinateur se fait par l'exécution d'une suite d'ordres appelée programme. Donc :

Un programme est la suite d'ordres décrivant un algorithme pour une machine

Définition :

Un langage de programmation est un langage spécialisé non ambigu destiné à décrire des algorithmes pour un ordinateur réel ou idéal.

Comme tout langage, un langage de programmation a une syntaxe. Il comporte les éléments suivants :

Un langage de programmation est non-ambigu (en anglais " context-free ") : TOUT y est défini, à la différence des langues naturelles.

1er niveau : une instruction par instruction-machine physique réelle

2ème niveau

Langages externes dépendants de la machine (1er FORTRAN)

3ème niveau

Portabilité et langages indépendants de la machine

Un programme écrit en un langage de 2ème et 3ème niveau est traduit en langage-machine par un programme spécial appelé compilateur

Voici le même programme en langages de premier niveau:

Code interne Représentation en octal  Autocode symbolique Assembleur
 110000100     504                      LOP   4            LOP    A
 110000101     505                      LOP   5            LOP    B
 010000000     200                      ADD                ADD
 100000011     403                      ECROP 3            ECROP  C

Et en langages de haut niveau :

en PL/1   C = A + B ;
en BASIC  let C = A + B

Nous allons définir et caractériser les grands langages de programmation. Nous nous limiterons aux principaux car il en existe des centaines et il s'en crée chaque mois :

Les langages spécialisés :

Les premiers langages « externes » furent créés pour des domaines d'application spécialisés. La spécialisation d'un langage apparait dans les types d'objets sur lesquels il opére et le type d'opérations qu'il réalise.
Premier langage de haut niveau créé, le FORTRAN est et reste le grand langage de calcul scientifique malgré ses faiblesses syntaxiques. Pour les applications de gestion, le COBOL (COmmon Business Oriented Language) reste un standard international. Les besoins du temps réel entrainèrent la création du JOVIAL (avec primitives de synchronisation), les spécialistes d'intelligence artificielle créèrent le langage LISP (for LISt Processing) qui, entre autres, traite les relations entre objets, des congrès internationaux définirent un langage de description d'algorithmes appelé ALGOL (ALGOrithmic Language) devenu depuis PASCAL. Pour manipuler des chaînes de caractères, traiter des textes, John GRISWOLD créa le SNOBOL en 1962.

Les langages universels

L'apparition de gammes d'ordinateurs uniques pour toutes les classes d'application, le besoin de mélanger calcul scientifique et gestion de fichiers, le désir d'effectuer du traitement de listes dans des programmes scientifiques, de gérer des chaînes de caractères en gestion, etc. entraînèrent la conception de nouveaux langages de programmation offrant toutes les possibilités des divers langages spécialisés dans un langage unique. Les plus célèbres en furent le PL/1 et l'ALGOL 68.

Le PL/1 fut le langage de programmation le plus universel jamais réalisé. Il avait un gros défaut : il nécessitait une puissance de calcul énorme et beaucoup de mémoire à une époque où les gros ordinateurs n'avaient que 64k octets de mémoire ! De plus IBM en fit une arme commerciale, ce qui mobilisa contre lui tous les organismes de normalisation, enfin on avait sous-estimé le poids de l'histoire, des habitudes prises, et en particulier COBOL et FORTRAN restèrent largement en usage. De plus, dans une institution, l'usage d'un langage de programmation définit un territoire de pouvoir.

PL/1 réunissait en un seul langage dérivé d'ALGOL un système bien formalisé de gestion de fichiers (supérieur à celui de COBOL) et un bon mécanisme d'édition, toutes les fonctions de calcul scientifique (y compris sur des tableaux, des nombres complexes, avec gestion de la précision, et sur des mots de 64 bits fixes ou flottants), un mécanisme complet de traitement de listes (comme LISP), la réentrance (comme ALGOL et LISP), un jeu complet d'opérateurs pour manipuler les chaînes de caractères et de bits, des primitives de synchronisation pour gérer multitâches et multitraitement (ce qui conduisit les militaires à être les plus gros utilisateurs de PL/1). De plus le PL/1 était muni d'un macro- générateur qui permettait des extensions du langage. Par ailleurs la syntaxe de PL/1 et ses différents niveaux de codage en faisaient un langage très facile à apprendre.

Toutes ces caractéristiques conduisirent à utiliser le PL/1 (ou son dérivé le PL/S) comme langage de programmation de systèmes jusqu'au niveau des fonctionnalités élémentaires des machines. Aujourd'hui, la place du PL/1 est occupée en fait dans ce domaine par le langage C, hélas inélégant.

L'utilisation simple de certains gros progiciels (en particulier les systèmes de gestion de bases de données) conduisit à créer des langages spécialisés comportant de puissantes fonctions globales. On appelle souvent ces langages L4G (« Langages de 4ème Génération »). Le plus célèbre exemple en est le SQL, langage de commande normalisé pour les bases de données relationnelles. Le langage PROLOG conçu pour programmer les systèmes de raisonnement artificiel dits « systèmes experts » rentre dans cette catégorie, même si on a aussi utilisé les fonctionnalités relationnelles de LISP pour cet usage particulier.

Les langages interprétés sont des langages conçus pour que leurs instructions puissent être exécutées immédiatement au fur et à mesure de leur écriture par un programmeur. Leur intérêt pédagogique est évident et les langages FOCAL (créé par DEC) et surtout BASIC ont joué un rôle important. On appelle interpréteur le programme qui exécute les instructions de tels langages. Une mention doit être faite pour APL, langage interprété de haut niveau à usage scientifique, travaillant sur des tableaux de données et qui fait appel à un grand nombre de symboles spéciaux représentant ses opérateurs régis par une algèbre ingénieuse. Cela lui permettait en particulier de ne pas encombrer la mémoire centrale à l'époque où celle-ci était de très petite taille.

Les langages de commande constituent une classe particulière de langages interprétés dont les ordres visent à faire exécuter des opérations à un système matériel ou logiciel. Les instructions globales destinées à des systèmes d'exploitation en sont un exemple typique (JCL ou Job Control Language). Les progrès des matériels ont permis l'utilisation d'un langage de commande de système appelé REXX( Real Time EXecutive ). Ce langage, utilisé à la fois pour diriger de grands systèmes d'exploitation (VM, MVS) mais aussi ceux de microordinateurs (DOS, OS/2) et de stations de travail (UNIX) est par ailleurs un puissant langage de programmation.

On appelle système d'exploitation ou système de conduite (operating system) un ensemble de programmes destinés à assurer une utilisation automatisée simple et efficace de l'ensemble des ressources d'un système informatique (Entrées-Sorties, bibliothèques, écoulement des travaux, priorités, etc). Ces programmes ont été longtemps écrits en langage-machine pour plusieurs raisons : les fonctionnalités nécessaires manquaient dans les langages externes et on a besoin d'utiliser les performances maximales de la machine. Toutefois les progrès dans les langages de programmation permirent de programmer les fonctions physiques des machines en langage d'usage commode. On conçut ainsi un petit nombre de langages-système. Les plus célèbres : le PL/S qui est une extension-système du PL/1 et surtout le langage C, conçu par les auteurs du système d'exploitation UNIX afin d'assurer la portabilité de ce système sur des machines différentes. Il suffisait d'écrire un compilateur C pour chaque machine.

Les langages de programmation pour le temps réel utilisés pour programmer des systèmes industriels, militaires, etc. posent des problèmes voisins de ceux des langages-système. Il s'agit d'atteindre de hautes performances, de décrire des actions sur les dispositifs les plus divers ( des fusées aux machines-outil ) de gérer des synchronisations temporelles, etc. Le premier langage de ce type fut le JOVIAL. Le PL/1 fut beaucoup utilisé. L'armée française utilise un excellent langage non public de type ALGOL appelé LTR et l'armée américaine a fait réaliser un gros langage appelé Ada.

Les besoins de la simulation, certains problèmes de conduite en temps réel et une approche ergo-nomique ont conduit à définir une classe importante de langages, les langages orientés-objet. Ces langages associent aux objets traités un ensemble de propriétés pouvant aller jusqu'à des algorithmes qui y sont liés. Ils présentent un très grand intérêt mais posent des problèmes de mise en oeuvre efficace très délicats sur des machines monoprocesseur. L'énorme intérêt de ce type de langages pourra conduire à concevoir pour eux des architectures matérielles multitraitement bien adaptées de type MIMD. Mentionnons SIMULA conçu en Suède pour des problèmes de simulation et de conduite industrielle, SmallTalk approche originale et élégante de la programmation, C++ version orientée-objet de C, EIFFEL puissant langage orienté-objet.

On appelle macro-langage un langage de programmation spécialisé qui à partir de descriptions globales de fonctions par des macro-instructions ajoutées à un langage classique fait appel à des macro-programmes écrits au préalable et rangés dans des bibliothèques pour générer des séquences de code, parfois très importantes et résultant de traitements complexes. Lors d'une phase initiale de traitement, ces séquences de code sont placées dans le programme-source à la place de la macro-instruction et le résultat peut alors être envoyé alors à l'assembleur ou au compilateur normal. Le premier grand macro- assembleur avait été écrit pour la Série 360 et était destiné à construire automatiquement d'énormes programmes-système écrits en assembleur et taillés sur mesure pour la configuration décrite dans la macro-instruction. Une caractéristique précieuse du PL/1 était l'existence d'un macro-PL/1 permettant toute extension du langage (par exemple calcul formel, calcul matriciel, opérations graphiques, etc.).

Systèmes de conduite ( « Systèmes d'exploitation » ou "Operating Systems" )

Ils sont apparus au début des années 60 lorsqu'on a commencé à construire de gros systèmes informatiques de structure complexe, afin d'y optimiser l'usage des ressources et de tenter d'en simplifier l'emploi.
En dehors de quelques petits modules disparates, le premier système de conduite consciemment réalisé comme tel fut l'EXEC1 d'Univac pour l'Univac 3. La mémoire centrale était alors petite et extrêmement coûteuse et les entrées/sorties très lentes. On exécutait plusieurs programmes à la fois en vidant la mémoire centrale sur un tambour rapide pendant les lectures de cartes et impressions afin d'y exécuter un autre programme. Cette technique de multiprogrammation est dite de permutation ou d'échange ( plus connue sous le nom de Swapping ). Lorsque les mémoires devinrent moins coûteuses (donc plus grandes) et plus rapides, les limitations de vitesse des tambours pénalisèrent lourdement cette technique qui fut pratiquement abandonnée.
Les machines de la 3ème génération ont été explicitement conçues pour utiliser des langages de haut niveau et pour être gérées par des systèmes de conduite. Elles comportaient dans ce but des dispositifs matériels et des instructions spéciales. En même temps que le 360, IBM avait étudié un ambitieux système de conduite idéal appelé l'OS dont la réalisation s'avéra extrêmement difficile, ce qui conduisit à la commercialisation de plusieurs compromis (TOS et DOS). Univac réalisait (toujours en swap) l'EXEC II pour la série scientifique 1107, 1108, etc.

Aujourd'hui on appelle Système de conduite ( Operating System ) un

ensemble de programmes conçus dans le cadre d'une philosophie cohérente d'utilisation d'où découlent des règles strictes de normalisation, et destiné à utiliser d'une manière simple, efficace et sûre toutes les ressources d'un système.
Quelles sont ces ressources ?

Les différences considérables de vitesse et d'occupation entre les différents organes conduisent à faire utiliser les ressources rapides et coûteuses par plusieurs utilisateurs ou travaux en même temps afin d'utiliser les temps d'attente imposés par les opérations mécaniques (impression, etc.).

On parle de multiprogrammation lorsque plusieurs utilisateurs totalement indépendants travaillent en même temps sur un système, et de multitâches lorsqu'un utilisateur utilise lui-même dans son programme ses temps d'attente E/S pour effectuer une partie de ses calculs.

Donc dans un ordinateur moderne l'utilisateur n'a pas accès directement aux ressources physiques de la machine. Il les utilise par l'intermédiaire de méthodes d'accès en passant par un noyau ou superviseur. Implanté dans une zone protégée de la mémoire ce superviseur exécute directement les opérations privilégiées de la machine selon les requètes qui proviennent des utilisateurs en général à l'aide d'une instruction spéciale appelée pratiquement partout SVC.
Les opérations privilégiées interdites aux utilisateurs sont bien entendu les entrées/sorties physiques, la gestion de la protection de la mémoire, les actions directes sur les registres centraux, etc.

Ce sont les méthodes d'accès des systèmes de conduite qui permettent à un usager d'ignorer les opérations souvent très complexes nécessaires pour gérer les innombrables dispositifs d'entrée/sortie. On appelle pilote ( handler ou driver ) le module-système qui assure la gestion d'un périphérique particulier à partir de requètes simples normalisées.

La baisse du coût de la mémoire a permis d'abandonner le système pénalisant du swap. en faisant résider dans des zones différentes de la mémoire centrale plusieurs programmes indépendants. Mais pour des programmes de très grande taille on a réalisé une variante du swap appelée mémoire virtuelle (Burroughs en 1968 adopté par IBM en 1974) permettant de donner à l'usager la disposition d'une mémoire directement adressable de taille supérieure à la taille physique disponible, en utilisant une extension sur disque gérée automatiquement.

Bibliographie

BOUZEGHOUB Mokrane, GARDARIN Georges, VALDURIEZ Patrick - Les Objets - Paris, Eyrolles, 1997.
MEYER Bertrand & BAUDOIN Claude - Méthodes de programmation - Paris, Eyrolles, 1978.
MOREAU René - L'approche objets, concepts & techniques - Paris, Masson, 1995.
PETERSON Wesley - Introduction to programming languages - Englewood Cliffs, Prentice-Hall, 1974.
SAMMETT Jean H. - Programming Languages : history & fundamentals - Englewood Cliffs, Prentice-Hall, 1969. Cet ouvrage fondamental est régulièrement mis à jour sous forme d'articles dans la presse scientifique spécialisée.
SITBON Evelyne & André - Les structures de listes - Paris, Masson, 1974.