Programmiersprache mit niedriger Ebene
A Programmiersprache mit niedriger Ebene ist ein Programmiersprache das liefert wenig oder nein Abstraktion von einem Computer Anweisungsset Architektur- Befehle oder Funktionen in der Sprachkarte, die den Anweisungen des Prozessors strukturell ähnlich sind. Im Allgemeinen bezieht sich dies auf beide Maschinensprache oder Montagesprache. Aufgrund der niedrigen (daher das Wort) Abstraktion zwischen Sprache und Maschinensprache werden Sprachen mit niedriger Ebene manchmal als "nahe der Hardware" beschrieben. Programme, die in Sprachen auf niedriger Ebene geschrieben wurden nicht portierbar, aufgrund der Optimierung für eine bestimmte Art von Systemarchitektur.
Sprachen mit niedriger Ebene können ohne a in den Maschinencode konvertieren Compiler oder Dolmetscher – Programmiersprachen der zweiten Generation Verwenden Sie einen einfacheren Prozessor, der als als bezeichnet wird Assembler - und der resultierende Code wird direkt auf dem Prozessor ausgeführt. Ein Programm, das in einer Sprache auf niedriger Ebene geschrieben wurde Speicherpfunddruck. Ein äquivalentes Programm in a hochrangige Sprache Kann weniger effizient sein und mehr Speicher verwenden. Low-Level-Sprachen sind einfach, aber aufgrund zahlreicher technischer Details, an die sich der Programmierer erinnern muss, als schwierig angesehen. Im Vergleich dazu, a Programmiersprache auf hoher Ebene Isoliert die Ausführungssemantik einer Computerarchitektur aus der Spezifikation des Programms, was die Entwicklung vereinfacht.
Maschinensprache

Maschinensprache Ist die einzige Sprache, die ein Computer direkt ohne vorherige Transformation verarbeiten kann. Derzeit schreiben Programmierer fast nie Programme direkt in den Maschinencode, da sie auf zahlreiche Details aufmerksam werden müssen, die eine Sprache auf hoher Ebene automatisch verarbeitet. Darüber hinaus erfordert es für jede Anweisung merken oder nachschlagen, und ist äußerst schwierig zu ändern.
WAHR Maschinensprache ist normalerweise ein Rohstrahl, normalerweise binär, Daten. Eine Programmierercodierung in "Maschinencode" codiert normalerweise Anweisungen und Daten in einer lesbaren Form wie z. Dezimal, Oktal, oder hexadezimal das von einem Programm namens a in internes Format übersetzt wird Lader oder in den Speicher des Computers von a umgeschaltet Frontblende.
Obwohl nur wenige Programme in Maschinensprachen geschrieben sind, können Programmierer häufig geschickt darin, es durch die Arbeit mit dem Arbeiten zu lesen Kernpolster oder debuggen von der Frontplatte.
Beispiel: Eine Funktion in der hexadezimalen Darstellung von 32-Bit x86 Maschinencode, um die zu berechnen nth Fibonacci -Nummer:
8B542408 83FA0077 06B80000 0000C383 FA027706 B8010000 00C353BB 01000000 B9010000 008D0419 83FA0376 078BD989 C14AEBF1 5BC3FC3FA0376
Montagesprache
Sprachen der zweiten Generation bieten eine Abstraktionsebene über dem Maschinencode. In den frühen Tagen der Codierung auf Computern wie TX-0 und PDP-1Das erste, was MIT -Hacker taten, war, Assembler zu schreiben.[1] Montagesprache hat wenig Semantik oder formale Spezifikation, nur eine Zuordnung von menschlich-lesbaren Symbolen, einschließlich symbolischer Adressen, an Opcodes, Adressen, numerische Konstanten, Saiten usw. Typischerweise einer Maschinenanweisung wird als eine Zeile von Montagecode dargestellt. Abbauler produzieren Objektdateien das kann Verknüpfung mit anderen Objektdateien oder sein geladen alleine.
Die meisten Abgeordneten bieten Makros Um gemeinsame Anweisungen zu erzeugen.
Beispiel: Das gleiche Fibonacci -Nummer Taschenrechner wie oben, jedoch in x86-64 Montagesprache mit Verwendung AT & T -Syntax:
_Flunkerei: Movl $ 1, %EAX xorl %EBX, %EBX .fib_loop: CMPL $ 1, %EDI JBE .fib_done Movl %EAX, %ECX Addl %EBX, %EAX Movl %ECX, %EBX Subl $ 1, %EDI JMP .fib_loop .fib_done: ret
In diesem Code-Beispiel die Hardwarefunktionen des X86-64-Prozessors (ITS) Register) werden direkt benannt und manipuliert. Die Funktion lädt ihre Eingabe aus %EDI entsprechend dem System v Abi und führt seine Berechnung durch, indem sie Werte in der manipulieren Eax, Ebx, und ECX Register, bis es beendet ist und zurückkommt. Beachten Sie, dass in dieser Montagesprache kein Konzept der Rückgabe eines Wertes gibt. Das Ergebnis wurde in der gespeichert Eax Register, die Ret Der Befehl verschiebt einfach die Codeverarbeitung in den Codespeicherort, der auf dem Stapel gespeichert ist (normalerweise die Anweisung unmittelbar nach dem, der diese Funktion nannte), und es liegt an dem Autor des aufrufenden Codes, um zu wissen, dass diese Funktion ihr Ergebnis speichert Eax und es von dort abzurufen. X86-64 Assemblersprache enthält keinen Standard für die Rückgabe von Werten aus einer Funktion (und tatsächlich hat kein Konzept einer Funktion); Es liegt an dem aufrufenden Code, den Status nach Rückgabe des Verfahrens zu prüfen, wenn er einen Wert extrahieren muss.
Vergleichen Sie dies mit der gleichen Funktion in C, a hochrangige Sprache:
ohne Vorzeichen int Flunkerei(ohne Vorzeichen int n) { wenn (!n) Rückkehr 0; anders wenn (n <= 2) Rückkehr 1; anders { ohne Vorzeichen int a, c; zum (a = c = 1; ; --n) { c += a; wenn (n <= 2) Rückkehr c; a = c - a; } } }
Dieser Code ist in der Struktur des Beispiels für die Assemblersprache sehr ähnlich, aber es gibt signifikante Unterschiede in Bezug auf die Abstraktion:
- Die Eingabe (Parameter n) ist eine Abstraktion, die keinen Speicherort für die Hardware angibt. In der Praxis folgt der C -Compiler einem von vielen möglich Konventionen anrufen So bestimmen Sie einen Speicherort für die Eingabe.
- Die Montagesprachversion lädt den Eingabeparameter aus dem Stapel in ein Register und in jeder Iteration der Schleife verringert den Wert im Register und ändert den Wert im Speicherort auf dem Stapel niemals. Der C -Compiler könnte den Parameter in ein Register laden und dasselbe tun oder den Wert überall dort aktualisieren, wo er gespeichert wird. Welches es ist eine Implementierungsentscheidung, die dem Code -Autor vollständig versteckt ist (und eine ohne Nr. Nebenwirkungendank C -Sprachstandards).
- Die lokalen Variablen A, B und C sind Abstraktionen, die keinen bestimmten Speicherort für die Hardware angeben. Der C -Compiler entscheidet, wie man sie tatsächlich für die Zielarchitektur speichert.
- Die Rückgabefunktion gibt den Wert der Rückgabe an, diktiert jedoch nicht wie es wird zurückgegeben.Der C -Compiler für eine bestimmte Architektur implementiert a Standard Mechanismus zur Rückgabe des Wertes.Compiler für die x86 -Architektur verwenden normalerweise (aber nicht immer) das EAX -Register, um einen Wert zurückzugeben, wie im Beispiel des Versammlungssprachens (der Autor des Beispiels der Versammlungssprache hat gewählt Um die C -Konvention zu kopieren, aber die Assemblersprache erfordert dies nicht).
Diese Abstraktionen machen den C -Code ohne Änderung einer Architektur kompiliert, für die ein C -Compiler geschrieben wurde.Der X86 -Assembler -Sprachcode ist spezifisch für die X86 -Architektur.
Programmierung auf niedriger Ebene in hochrangigen Sprachen
In den späten 1960er Jahren, hochrangige Sprachen wie zum Beispiel Pl/s, WONNE, BCPL, erweitert Algol (zum Burroughs große Systeme) und C beinhaltete einen gewissen Grad an Zugang zu Programmierfunktionen auf niedriger Ebene.Eine Methode dafür ist Inline -Baugruppe, in welchem Assembly-Code in eine hochrangige Sprache eingebettet ist, die diese Funktion unterstützt.Einige dieser Sprachen ermöglichen auch eine architekturabhängige Compiler -Optimierungsrichtlinien Um die Art und Weise anzupassen, wie ein Compiler die Zielprozessorarchitektur verwendet.
Verweise
- ^ Levy, Stephen (1994). Hacker: Helden der Computerrevolution. Penguin -Bücher. p. 32. ISBN 0-14-100051-1.