Dans le monde de l'informatique, et plus spécifiquement du génie logiciel, il est de coutume de raisonner en terme de couche, c'est à dire de truc qu'on en empilerait les uns sur les autres de façon à avoir une structure, certe complexe, mais facile à comprendre et à maintenir.
L'exemple le plus formalisé est l'exemple de la pile en réseau. Chaque notion en réseau est encapsulée dans une couche (le matériel, la communication point à point, la notion de réseau et d'adressage, la notion de transmission de données, et leur format). On a donc, si on suit la documentation de l'osi, 7 couches répondant à des besoins spécifiques.
Cette notion de couche permet l'idée qu'une couche peut être remplacée par une autre de manière plus ou moins transparente. C'est ce qui se passe dans le cas des réseaux, où un protocole peut en remplacer un autre sans que le système ne soit à repenser. Par exemple, sans qu'il n'y ai rien à faire, ATM est arrivé chez nous via les modems ADSL qui se connectent le plus souvent en PPPoa, point-to-point[1] over ATM.
Cela dit, dans d'autres domaines, comme la façon de programmer la machine, cette formalisation n'est pas aussi claire... On parle bien de langage de haut niveau et de bas niveau, mais ce qui est placé dans ces deux familles n'est pas identique suivant les personnes, et même les contextes. Exemple typique, le langage de programmation C est considéré comme un langage de haut niveau pour certain, et par un langage de bas niveau pour d'autres. Autre exemple, il est d'avis généralisé que Python est un langage de haut niveau. Mais dans le cadre du serveur d'application de Zope, et vis à vis de DTML, on peut très clairement classer python, le langage sous-jacent, comme un langage de bas niveau...
Comme on le voit, on classe les langages comme étant de haut niveau ou de bas niveau par rapport à d'autres langages, sans autre formalisation. Le problème est que beaucoup de monde parle de langages de haut niveau sans même préciser de quel niveau il s'agit. Certains vont même jusqu'à parler de langages de très haut niveau, ou de xième génération, confondant une chronologie avec un ordre dans la chaine de traduction. En effet, chaque langage a besoin d'une couche inférieur pour fonctionner, jusqu'à arriver au matériel, où ce qu'on appelle le langage machine correspond en fait à des interrupteurs judicieusement choisis pour animer l'unité arithmétique et logique d'un circuit électronique.
On pourrait objecter que n'importe quel langage pourrait se traduire directement en langage machine. Mais dans les faits, ça ne se fait pas. Pour prendre un parrallèle, c'est comme si tous les programmes communiquant en réseau devait générer le signal eux même et envoyer les informations de ce signal au DSP [2]. Dans les faits, il y a pleins de mécanismes qui font le travail pour eux. De la même façon, mis à part les assembleurs qui sont des programmes assez spécifiques, aucun programme ne génère du langage machine directement.
De cet état de fait, on peut donc monter une hiérarchie pour établir un classement de langage. Par exemple, un classement comme :
- opcodes internes AMD en binaire < langage d'assemblage x86 < langage C < Python < HTML < ZPT[3]
Une instance[4] de cette hiérarchie se représenterait donc par un empilement de langages qui s'appuieraient les uns sur les autres pour exécuter ce qui a été programmé. De là, on pourrait généraliser cet empilement, en y attribuant des rôles spécifiques à chaque couche. Bien sur, ça reste à définir, et je ne pense pas avoir les connaissances ni l'expérience pour mener à bien cette reflexion correctement.
Une objection que je vois à ce modèle serait le cas des machines virtuelles, qui se basent sur des langages de plus haut niveau pour émuler des couches de plus bas niveau. Exemple avec Java (que je situe entre le C et le python, si on classe les langages) les opcodes de la jvm se situeraient aux alentours du langage d'assemblage, et la jvm en elle même se situerait au niveau du circuit électronique, alors que la jvm de Sun par exemple, est probablement écrite en C, qui est lui même situé au dessus du langage d'assemblage. Cela dit, même le modèle réseau OSI souffre de contre exemple du même type : on peut tres facilement trouver des implémentations fonctionnelles de TCP au dessus de HTTP[5], sachant que c'est en pratique HTTP qui se situe au dessus de TCP (fonctionnement normal).