De haut niveau par rapport à bas niveau n'est pas une chose en noir et blanc, mais une échelle continue. Les termes sont utilisés pour décrire la proximité d'un langage de programmation avec le matériel; plus le niveau est élevé, plus il éloigne le matériel.
Le niveau le plus bas, évidemment, est le code machine binaire - c'est la représentation exacte que le système d'exploitation charge et envoie au CPU. L'assemblage est le premier niveau d'abstraction construit au-dessus: au lieu du code binaire, on écrit des mnémoïques, des codes symboliques lisibles par l'homme qui représentent des instructions machine binaires. C'est ce que les gens utilisaient pour la programmation des systèmes avant UNIX.
C est la prochaine étape dans la chaîne d'abstraction, regroupant des modèles communs dans des constructions de contrôle de flux et en résumé des instructions spécifiques à la machine dans une syntaxe indépendante de la plate-forme, et ces dernières abstractions ont été l'un des principaux facteurs qui ont fait d'UNIX à la fois révolutionnaire et très réussi, car cela signifiait que le même code pouvait être compilé pour n'importe quelle plate-forme sans aucun changement majeur.
C ++ ajoute une autre couche d'abstractions: il ajoute des classes (abstraction des tables vtables et du contexte passant dans une syntaxe OOP), new
et delete
(regroupement de l'allocation de mémoire et de l'initialisation des variables dans une seule construction), vérification du type à la compilation, modèles (compilation à la sécurité du type métaprogrammation), et un tas de commodités de syntaxe au moment de la compilation comme les espaces de noms, la surcharge des fonctions et des opérateurs, etc.
Python prend un autre grand pas loin du matériel. C ++ donne toujours au programmeur un contrôle total sur l'allocation de mémoire et permet une manipulation directe de la RAM; Python s'occupe de la gestion de la mémoire pour vous. De plus, au lieu de compiler votre code en instructions machine entièrement natives, il l'exécute sur une machine virtuelle; cela entraîne une pénalité de performance (qui peut parfois être lourde, mais n'est généralement pas quelque chose à craindre), mais cela permet également des choses intéressantes qui seraient délicates en C ++ et atrocement difficiles en C, telles que la manipulation de fonctions et de classes à l'exécution temps, obtenir les noms d'objets arbitraires au moment de l'exécution, instancier les classes par nom au moment de l'exécution, patcher les singes, etc. etc.
Ainsi, lorsque les gens divisent des langues en "haut niveau" et "bas niveau", ils tracent une ligne arbitraire quelque part, et cette ligne n'est pas toujours la même. En 1970, la ligne était entre l'assemblage et le C (l'abstraction des instructions machine spécifiques à la plate-forme étant le facteur décisif); en 1987, il se situait peut-être entre C et C ++; aujourd'hui, il peut se situer entre C ++ et Java (avec la gestion automatique de la mémoire comme facteur décisif).
Pour faire court: le niveau élevé est une échelle mobile, et pour les trois langages que vous mentionnez, c'est C <C ++ <Python.