High-Level vs. Low-Level ist keine Schwarz-Weiß-Sache, sondern eine kontinuierliche Skala. Die Begriffe beschreiben, wie nah eine Programmiersprache an der Hardware ist. Je höher die Stufe, desto mehr abstrahiert sie die Hardware.
Die unterste Ebene ist offensichtlich der binäre Maschinencode - dies ist die genaue Darstellung, die das Betriebssystem lädt und an die CPU weiterleitet. Assembly ist die erste Abstraktionsebene, die darauf aufbaut: Anstelle von Binärcode werden Mnemos geschrieben, von Menschen lesbare symbolische Codes, die binäre Maschinenbefehle darstellen. Dies ist, was Menschen für die Systemprogrammierung vor UNIX verwendet.
C ist der nächste Schritt in der Abstraktionskette, bei dem allgemeine Muster in Flusssteuerungskonstrukte gebündelt und maschinenspezifische Anweisungen in plattformunabhängige Syntax abstrahiert werden. Diese letzten Abstraktionen waren einer der Hauptfaktoren, die UNIX sowohl revolutionär als auch äußerst erfolgreich machten Dies bedeutete, dass derselbe Code für jede Plattform ohne größere Änderungen kompiliert werden konnte.
C ++ fügt eine weitere Abstraktionsebene hinzu: Es fügt Klassen hinzu (Zusammenfassung von vtables und Kontext, die in eine OOP-Syntax übergehen) new
und delete
(Bündelung der Speicherzuordnung und Variableninitialisierung in einem einzigen Konstrukt), Typprüfung zur Kompilierungszeit und Vorlagen (typsichere Kompilierungszeit) Metaprogrammierung) und eine Reihe von Syntaxkomforten zur Kompilierungszeit wie Namespaces, Funktions- und Operatorüberladung usw.
Python geht einen weiteren großen Schritt von der Hardware weg. C ++ gibt dem Programmierer weiterhin die volle Kontrolle über die Speicherzuweisung und ermöglicht die direkte Manipulation des Arbeitsspeichers. Python übernimmt die Speicherverwaltung für Sie. Anstatt Ihren Code mit Anweisungen für alle systemeigenen Maschinen zu kompilieren, wird er auf einer virtuellen Maschine ausgeführt. Dies ist mit einer Leistungsbeeinträchtigung verbunden (die manchmal schwerwiegend sein kann, aber normalerweise kein Grund zur Sorge ist), ermöglicht aber auch nette Dinge, die in C ++ schwierig und in C unerträglich schwierig wären, wie das Manipulieren von Funktionen und Klassen beim Ausführen Abrufen der Namen beliebiger Objekte zur Laufzeit, Instanziieren von Klassen nach Namen zur Laufzeit, Patchen von Affen usw. usw.
Wenn Leute also Sprachen in "High Level" und "Low Level" unterteilen, ziehen sie irgendwo eine willkürliche Linie, und diese Linie ist nicht immer dieselbe. 1970 lag die Grenze zwischen Assembler und C (das Ableiten von plattformspezifischen Maschinenanweisungen war der entscheidende Faktor); 1987 war es vielleicht irgendwo zwischen C und C ++; Heute kann es zwischen C ++ und Java liegen (wobei die automatische Speicherverwaltung der entscheidende Faktor ist).
Kurz gesagt: High-Level-Ness ist eine gleitende Skala, und für die drei Sprachen, die Sie erwähnen, ist es C <C ++ <Python.