Mandalex

Es gibt viele verschiedene Arten von Programmiersprachen. Man kann sie, obschon manche Sprachen auch Mischformen sind, folgendermassen unterteilen:

Prozessorangepasste Programmiersprachen

Diese Sprachen können vom Prozessor nach einer simplen Umwandlung in binäre Zahlen direkt verstanden werden. Dazu gehören sicher der Assembler (genaugenommen muss Assembler ebenfalls erst compiliert werden, siehe dort). Es gab aber auch beispielsweise BASIC-Prozessoren, die aber eigens für diese Sprache konstruiert werden mussten. Diese Sprachen haben den Vorteil, dass sie sehr schnell, sehr kompakt und absolut omnipotent sind. Die Nachteile sieht man, wenn man anfängt zu Programmieren: kompliziert, komplex, schwer zu lesen, nur bedingt kompatibel, nicht portierbar, mühsam, extrem fehleranfällig. Diese Sprachen sind die einzigen Sprachen, die nicht zu den Hochsprachen zählen.

Interpretersprachen

Diese Sprachen haben sich lange Zeit gehalten. Das prominenteste Beispiel ist nach wie vor BASIC, mittlerweile sind aber auch Java und eine Interpretersprache in .NET darauf aufbauend. Bei diesen Sprachen wird jeder Befehl während der Laufzeit von einem Interpreter in ein entsprechendes Kompilat übersetzt und dann ausgeführt. Der Nachteil dieser Sprachen ist ihre Langsamkeit. Ein Vorteil dafür sehr hohe Sicherheit, es treten kaum Abstürze auf.

Compilersprachen

Diese Sprachen sind heutzutags am verbreitesten, Beispiele dafür sind C, Pascal. Der Programmtext, der in diesen Sprachen geschrieben ist, muss vor der Ausführung mittels eines Compilers in Maschinensprache übersetzt werden. Vorteile dieser Sprachen sind Portierbarkeit, meistens gute Lesbarkeit, Komfortabilität, gute Geschwindigkeit. Die Nachteile sind: nicht mehr ganz omnipotent, Kompilat nicht unbedingt optimal, Sprachen nicht universell festgelegt; es gibt viele Dialekte.

Da die Interpretersprachen genauso wie die Compilersprachen irgendwann einmal ihren Quellcode übersetzen müssen, hier die Übersetzungsschritte, die ein Interpreter, bzw Compiler durchführen muss:

Precompiling

Unter Precompiling versteht man nichts anderes als das Ersetzen von Konstanten mit den entsprechenden Werden, das Einfügen von Makros und das Einbinden von anderen Dateien. Ausserdem werden alle Kommentare entfernt. Erst nach diesem Schritt kann das Programm analysiert werden.

Zuerst muss der Quelltext geparst werden, die folgenden drei Analysen werden dabei gleichzeitig oder nacheinander durchlaufen:

Lexikalische Analyse:

Dies ist ein Teil des Parsens, dazu gehört Erkennung von Variablen, Labels, Funktionsnamen, ... und die Übersetzung in einen intern festgelegten Identifikator.

Syntaktische Analyse:

Dies ist ein weiterer Teil des Parsers: Hier wird der Quellcode nach Schreibfehlern überprüft. Sind Befehle richtig geschrieben, sind alle Klammern geschlossen, hat es nirgendwo ein Zeichen, dass dort nicht hingehört, ...

Semantische Analyse:

Hier wird der Parser herausfinden, was genau mit dem Quellcode gemeint war und das Ergebnis intern in einem Baum so abspeichern, dass es für die spätere Übersetzung direkt übernommen werden kann.

Was ebenfalls zum Parsen gehört, ist die Überprüfung, ob alle Funktionsaufrufe korrekt sind, keine Doppeldefinitionen auftreten, ...

Code erstellen

Hier wird der intern gespeicherte Ablaufbaum in ein erstes Assembler-Compilat "übersetzt".

Optimieren

Das entstandene Programm wird nun soweit es geht optimiert.

Assemblieren

Der nun optimierte Assembler-Code wird nun noch in Maschinensprache übersetzt, es werden also Bits und Bytes hergestellt, die vom Prozessor auch verstanden werden können.

Linken

Mit Linken ist das korrekte Einbinden von externen Funktionen gemeint. Dadurch ist es möglich, ein ganzes Programm in mehrere kleine Teilprogramme zu unterteilen, welche separat Compiliert werden können und erst in der letzten Phase zusammengelinkt werden.

Soweit ist ein Programm bereit, um ausgeführt zu werden. Was genau dann passieren soll, muss das System entscheiden. Bei einigen Programmen müssen vielleicht dynamische Bibliotheken erstellt werden, oder neue Threads, ...

Eine Programmiersprache kann case-Sensitive oder auch nicht sein.

Case-Sensitive bedeutet, dass es sehr wohl darauf ankommt, ob Buchstaben gross oder Klein geschrieben sind. Das bedeutet, dass die Variable Wert nicht die gleiche Variable ist, wie wert oder WERT. C ist beispielsweise eine Case-Sensitive Sprache, BASIC ist keine.