Hohe Programmiersprache - High-level programming language

In der Informatik ist eine höhere Programmiersprache eine Programmiersprache mit starker Abstraktion von den Details des Computers . Im Gegensatz zu Low-Level - Programmiersprachen , kann es verwenden natürliche Sprachelemente , einfacher sein, zu verwenden oder automatisieren kann (oder sogar verstecken vollständig) wichtige Bereiche von Computersystemen (zB Speicherverwaltung ), so dass der Prozess ein Programm einfacher zu entwickeln und verständlicher als bei der Verwendung einer niedrigeren Sprache. Der bereitgestellte Abstraktionsgrad definiert, wie "high-level" eine Programmiersprache ist.

In den 1960er Jahren wurden höhere Programmiersprachen, die einen Compiler verwenden , allgemein als Autocodes bezeichnet . Beispiele für Autocodes sind COBOL und Fortran .

Die erste für Computer entwickelte höhere Programmiersprache war Plankalkül von Konrad Zuse . Es wurde jedoch zu seiner Zeit nicht umgesetzt, und seine ursprünglichen Beiträge waren aufgrund des Zweiten Weltkriegs von anderen Entwicklungen weitgehend isoliert , abgesehen vom Einfluss der Sprache auf die "Superplan"-Sprache von Heinz Rutishauser und teilweise auch Algol . Die erste signifikant verbreitete Hochsprache war Fortran , eine maschinenunabhängige Weiterentwicklung der früheren Autocode- Systeme von IBM . Die Algol- Familie, wobei Algol 58 1958 und Algol 60 1960 von Komitees europäischer und amerikanischer Informatiker definiert wurden, führte Rekursion sowie verschachtelte Funktionen unter lexikalischem Geltungsbereich ein . Algol 60 war auch die erste Sprache mit einer klaren Unterscheidung zwischen Wert- und Namensparametern und ihrer entsprechenden Semantik . Algol führte auch mehrere strukturierte Programmierkonzepte ein , wie das while-do- und if-then-else- Konstrukt, und seine Syntax wurde als erstes in formaler Notation beschrieben – „ Backus-Naur-Form “ (BNF). Während etwa die gleiche Zeit, Cobol eingeführt Aufzeichnungen (auch structs genannt) und Lisp eingeführt , um eine vollständig allgemeine Lambda - Abstraktion in einer Programmiersprache zum ersten Mal.

Merkmale

"Hochsprache" bezieht sich auf die höhere Abstraktionsebene von der Maschinensprache . Anstatt sich mit Registern, Speicheradressen und Aufrufstapeln zu befassen, befassen sich Hochsprachen mit Variablen, Arrays, Objekten , komplexen arithmetischen oder booleschen Ausdrücken, Unterprogrammen und Funktionen, Schleifen, Threads , Sperren und anderen abstrakten Informatikkonzepten Konzentrieren Sie sich auf die Benutzerfreundlichkeit über die optimale Programmeffizienz. Im Gegensatz zu Low-Level- Assemblersprachen haben High-Level-Sprachen wenige, wenn überhaupt, Sprachelemente, die direkt in die nativen Opcodes einer Maschine übersetzt werden können . Andere Merkmale, wie beispielsweise String-Handhabungsroutinen, objektorientierte Sprachmerkmale und Dateieingabe/-ausgabe, können ebenfalls vorhanden sein. Bei höheren Programmiersprachen ist zu beachten, dass diese Sprachen es ermöglichen, den Programmierer von der Maschine zu trennen und zu trennen. Das heißt, im Gegensatz zu Low-Level-Sprachen wie Assembler oder Maschinensprache kann High-Level-Programmierung die Anweisungen des Programmierers verstärken und ohne dessen Wissen viele Datenbewegungen im Hintergrund auslösen. Die Verantwortung und Befugnis zur Ausführung von Anweisungen wurden vom Programmierer an die Maschine übergeben.

Abstraktionsstrafe

Hochsprachen beabsichtigen, Funktionen bereitzustellen, die allgemeine Aufgaben standardisieren, umfangreiches Debugging ermöglichen und Architektur-Agnostizismus beibehalten; während Low-Level-Sprachen oft effizienteren Code durch Optimierung für eine bestimmte Systemarchitektur erzeugen . Abstraktionsstrafen sind die Kosten, die High-Level-Programmiertechniken dafür zahlen, dass sie nicht in der Lage sind, die Leistung zu optimieren oder bestimmte Hardware zu verwenden, weil sie bestimmte Low-Level-Architekturressourcen nicht nutzen. High-Level-Programmierung bietet Funktionen wie allgemeinere Datenstrukturen und Operationen, Laufzeitinterpretation und Zwischencodedateien; die oft zur Ausführung von weit mehr Operationen als nötig, höherem Speicherverbrauch und größerer Binärprogrammgröße führen. Aus diesem Grund kann Code, der besonders schnell und effizient laufen soll, den Einsatz einer niedrigeren Sprache erfordern, auch wenn eine höhere Sprache die Codierung erleichtern würde. In vielen Fällen können kritische Teile eines Programms, meist in einer Hochsprache, von Hand in Assembler codiert werden , was zu einem viel schnelleren, effizienteren oder einfach zuverlässiger funktionierenden optimierten Programm führt .

Mit der zunehmenden Komplexität moderner Mikroprozessorarchitekturen erzeugen jedoch gut konzipierte Compiler für höhere Sprachen häufig Code, der in seiner Effizienz mit dem vergleichbar ist, was die meisten Programmierer auf niedriger Ebene von Hand erstellen können, und die höhere Abstraktion kann leistungsfähigere Techniken ermöglichen, die bessere Ergebnisse liefern Gesamtergebnisse als ihre Gegenstücke auf niedriger Ebene in bestimmten Einstellungen. Hochsprachen werden unabhängig von einer spezifischen Computersystemarchitektur entworfen. Dies erleichtert die Ausführung eines in einer solchen Sprache geschriebenen Programms auf einem beliebigen Computersystem mit kompatibler Unterstützung für das interpretierte oder JIT- Programm. Hochsprachen können verbessert werden, wenn ihre Designer Verbesserungen entwickeln. In anderen Fällen entwickeln sich neue Hochsprachen aus einer oder mehreren anderen mit dem Ziel, die beliebtesten Konstrukte mit neuen oder verbesserten Funktionen zu aggregieren. Ein Beispiel dafür ist Scala, das die Abwärtskompatibilität zu Java aufrechterhält, was bedeutet, dass in Java geschriebene Programme und Bibliotheken auch dann weiter verwendbar sind, wenn ein Programmiershop auf Scala umsteigt; Dies macht den Übergang einfacher und die Lebensdauer einer solchen High-Level-Codierung unbegrenzt. Im Gegensatz dazu überleben Low-Level-Programme selten ohne größere Überarbeitung über die Systemarchitektur hinaus, für die sie geschrieben wurden. Dies ist der technische „Trade-off“ für die „Abstraktionsstrafe“.

Relative Bedeutung

Beispiele für High-Level-Programmiersprachen, die heute aktiv verwendet werden, sind Python , Visual Basic , Delphi , Perl , PHP , ECMAScript , Ruby , C# , Java und viele andere.

Die Begriffe High-Level und Low-Level sind von Natur aus relativ. Vor einigen Jahrzehnten wurden die Sprache C und ähnliche Sprachen am häufigsten als "High-Level" angesehen, da sie Konzepte wie Ausdrucksauswertung, parametrisierte rekursive Funktionen und Datentypen und -strukturen unterstützte, während Assembler als "Low-Level" galt ". Heutzutage bezeichnen viele Programmierer C als Low-Level, da es kein großes Laufzeitsystem (keine Garbage Collection usw.) hat, im Grunde nur skalare Operationen unterstützt und eine direkte Speicheradressierung bietet. Es fügt sich daher problemlos in die Assemblersprache und die Maschinenebene von CPUs und Mikrocontrollern ein .

Die Assemblersprache kann selbst als eine höhere (aber oft immer noch eins zu eins, wenn sie ohne Makros verwendet wird ) Darstellung von Maschinencode angesehen werden , da sie Konzepte wie Konstanten und (begrenzte) Ausdrücke, manchmal sogar Variablen, Prozeduren und Daten unterstützt Strukturen . Maschinencode wiederum befindet sich inhärent auf einem etwas höheren Niveau als der Mikrocode oder die Mikrooperationen, die intern in vielen Prozessoren verwendet werden.

Ausführungsmodi

Es gibt drei allgemeine Ausführungsmodi für moderne Hochsprachen:

Interpretiert
Wenn in einer Sprache geschriebener Code interpretiert wird , wird seine Syntax gelesen und dann direkt ohne Kompilierungsstufe ausgeführt. Ein als Interpreter bezeichnetes Programm liest jede Programmanweisung, folgt dem Programmfluss, entscheidet dann, was zu tun ist, und führt es aus. Eine Mischung aus einem Interpreter und einem Compiler kompiliert die Anweisung in Maschinencode und führt ihn aus; der Maschinencode wird dann verworfen, um bei erneuter Ausführung der Zeile neu interpretiert zu werden. Interpreter sind im Allgemeinen die einfachsten Implementierungen des Verhaltens einer Sprache, verglichen mit den anderen beiden hier aufgeführten Varianten.
Zusammengestellt
Wenn in einer Sprache geschriebener Code kompiliert wird , wird seine Syntax vor der Ausführung in eine ausführbare Form umgewandelt. Es gibt zwei Arten der Zusammenstellung:
Maschinencode-Generierung
Einige Compiler kompilieren Quellcode direkt in Maschinencode . Dies ist der ursprüngliche Kompilierungsmodus, und Sprachen, die auf diese Weise direkt und vollständig in maschinennativen Code umgewandelt werden, können als wirklich kompilierte Sprachen bezeichnet werden. Siehe Assemblersprache .
Zwischenvertretungen
Wenn in einer Sprache geschriebener Code zu einer Zwischendarstellung kompiliert wird, kann diese Darstellung optimiert oder für eine spätere Ausführung gespeichert werden, ohne dass die Quelldatei erneut gelesen werden muss. Wenn die Zwischendarstellung gespeichert wird, kann sie in einer Form wie Bytecode vorliegen . Die Zwischendarstellung muss dann interpretiert oder weiter kompiliert werden, um sie auszuführen. Virtuelle Maschinen , die Bytecode direkt ausführen oder weiter in Maschinencode umwandeln, haben die einst klare Unterscheidung zwischen Zwischendarstellungen und wirklich kompilierten Sprachen verwischt.
Von Quelle zu Quelle übersetzt oder transkompiliert
In einer Sprache geschriebener Code kann in Begriffe einer niedrigeren Sprache übersetzt werden, für die native Code-Compiler bereits üblich sind. JavaScript und die Sprache C sind häufige Ziele für solche Übersetzer. Siehe CoffeeScript , Chicken Scheme und Eiffel als Beispiele. Insbesondere kann der generierte C- und C++-Code (wie aus der Eiffel-Sprache generiert, wenn die EiffelStudio- IDE verwendet wird) im EIFGENs-Verzeichnis jedes kompilierten Eiffel-Projekts angezeigt werden. In Eiffel wird der übersetzte Prozess als Transkompilieren oder Transkompiliert bezeichnet und der Eiffel-Compiler als Transcompiler oder Source-to-Source-Compiler .

Beachten Sie, dass Sprachen keine streng interpretierten Sprachen oder kompilierte Sprachen sind. Stattdessen verwenden Implementierungen des Sprachverhaltens Interpretieren oder Kompilieren. Zum Beispiel wurden ALGOL 60 und Fortran beide interpretiert (obwohl sie eher kompiliert wurden). In ähnlicher Weise zeigt Java die Schwierigkeit, diese Labels auf Sprachen und nicht auf Implementierungen anzuwenden; Java wird in Bytecode kompiliert, der dann entweder durch Interpretieren (in einer Java Virtual Machine (JVM)) oder Kompilieren (typischerweise mit einem Just-in-Time-Compiler wie HotSpot , wiederum in einer JVM) ausgeführt wird. Darüber hinaus ist das Kompilieren, Transkompilieren und Interpretieren nicht streng auf eine Beschreibung des Compiler-Artefakts (binäre ausführbare Datei oder IL-Assembly) beschränkt.

Hochsprachen-Computerarchitektur

Alternativ ist es möglich, dass eine Hochsprache direkt von einem Computer implementiert wird – der Computer führt den HLL-Code direkt aus. Dies wird als Hochsprachen-Computerarchitektur bezeichnet – die Computerarchitektur selbst ist so konzipiert, dass sie von einer bestimmten Hochsprache angesprochen wird. Die Großanlagen von Burroughs waren beispielsweise Zielmaschinen für ALGOL 60 .

Siehe auch

Anmerkungen

Verweise

Externe Links