🤪 Kapitel 1.03 - Begriffe - Alles Compiler oder was?

Gefunden auf X - User: @levanthanh
Zum Anfang eine kleine Erklärung einiger Begriffe:
-
Maschinensprache / Assembler:
Die einzige Sprache, die der Computer direkt versteht ist ↗ Maschinensprache, diese besteht nur aus sehr rudimentären Befehlen ohne direkte Verwaltung der Ressourcen wie Speicherbelegung oder Zugriffe auf Massenspeicher. Die nächste abstraktionsebene ist ↗ Assembler - Damit wird der Binärcode (Maschinensprache) in eine für den Menschen lesbare Form gebracht die verändert werden kann und dann wieder in Maschinensprache umgewandelt werden muss. Dies wird mit einen Programm erledigt, welches Assembler heisst.
Also der Quellcode in Assembler wird durch einen Assembler in Maschinensprache übersetzt.
Beispiel für die ↗ 6502 ↗ CPU:Adresse: Binärcode: Menschlich lesbarer Befehl:
$c1aa 20 FD AE JSR $AEFD
$c1ad 20 EB B7 JSR $B7EB
$c1b0 8A TXA
$c1b1 A8 TAY
$c1b2 A6 15 LDX $15
$c1b4 C0 C8 CPY #$C8
$c1b6 B0 EF BCS $C1A7
$c1b8 A5 14 LDA $14
$c1ba E0 01 CPX #$01
$c1bc 90 06 BCC $C1C4
$c1be D0 E7 BNE $C1A7
$c1c0 C9 40 CMP #$40
$c1c2 B0 E3 BCS $C1A7
$c1c4 8C 19 C0 STY $C019
$c1c7 8D 17 C0 STA $C017
$c1ca 8E 18 C0 STX $C018
Das Problem ist aber, jede ↗ CPU hat ihren eigenen “Dialekt” - Also der Maschinencode für die ↗ CPU 6502 (Von ↗ MOS) ist für die ↗ CPU MC68000 (Von ↗ Motorola) unbrauchbar und umgekehrt.
Für jede CPU muss ein eigenes, angepasstes Programm erstellt werden, was es praktisch Zeitlich Unmöglich macht, grössere Programme für mehrere Systeme zur Verfügung zu stellen.
Deshalb wurden schon sehr früh sogenannte ↗ Hochsprachen entwickelt, welche zum einen für den Menschen lesbar und besser verständlich sind. Der eigentliche Vorteil ist aber der, das Hochsprachen portable sind. Also zwischen Computers ausgetauscht werden können, die über unterschiedliche Architekturen verfügen.
-
Interpreter:
Eine ↗ interpretierte Programmiersprache wird nicht direkt in Maschinensprache umgewandelt. Der geschriebenen Quellcode wird Befehl für Befehl zur ↗ Laufzeit des Programms ausgewertet und dann ausgeführt. Das ist natürlich sehr Zeitaufwendig, hat aber den Vorteil daß das Programm sehr schnell geändert oder korrigiert werden kann.
Bekannte Beispiele sind ↗ BASIC, ↗ Python und ↗ Skriptsprachen.
Beispiel für BASIC:
(Für 80 Zeichen, ↗ ASCII Terminal)READY.
10 FOR Y=-12 TO 12
20 FOR X=-39 TO 39
30 CA=X*0.0458
40 CB=Y*0.08333
50 A=CA
60 B=CB
70 FOR I=0 TO 15
80 T=A*A-B*B+CA
90 B=2*A*B+CB
100 A=T
110 IF (A*A+B*B) >4 THEN GOTO 200
120 NEXT I
130 PRINT" ";
140 GOTO 210
200 IF I>9 THEN I=I+7
205 PRINT CHR$ (48+I);
210 NEXT X
220 PRINT
230 NEXT Y
RUN
-
Kompilierte Sprachen:
Ein ↗ Compiler übersetzt einen von einem Menschen geschrieben Quelltext in Maschinensprache und der Compiler muss für jedes ↗ Computersystem angepasst werden. Somit ist es möglich, ein einmal geschriebenen Quelltext in einer ↗ Hochsprache, auf verschiedenen Computersystemen zu nutzen, ohne diesen zu ändern. Diese Aussage stimmt aber nicht zu 100%, sobald sehr Systemnahe Funktionen wie zum Beispiel die direkte Kommunikation mit der Hardware genutzt werden, müssen diese ebenfalls speziell für das genutzte System angepasst werden.
Ein Compiler ist kein eigenes Programm, sondern ein Zusammenschluss von mehreren Programmen, die Hand-in-Hand zusammenarbeiten. Als Beispiel ist der C/C++ Compiler genannt, welche Programme, in welcher Reihenfolge aufgerufen werden.-
Präprozessor:
Der ↗ Präprozessor analysiert eine Quellcode Datei und löst so genannte Metakommandos zum Beispiel wie #include oder #define auf. Genauso kann auch die Abarbeitung durch den Compiler gesteuert werden, die sogenannte Bedingte Kompilierung durch beispielsweise #if oder #ifdef. -
Compiler:
Der Compiler erstellt jetzt aus dem "Mundfertigen" Quellcode den speziell für das angegebene System angepasste Maschinencode - Aber immer noch als ↗ Assembler-Quelltext. -
Assembler:
Der ↗ Assembler übersetzt dann schliesslich den Assembler-Quellcode in echte Maschinensprache und speichert diesen als so genannten ↗ Objektcode. Dieser ist noch nicht direkt lauffähig. -
Linker:
Der ↗ Linker ist das letzte Programm in der Kette, er verbindet alle Objektdateien zu einer einzigen Ausführbare Datei. - In moderen ↗ Entwicklungsumgebungen (IDE) ist dieser Prozess meist "unter der Haube" versteckt. Es ist trotzdem sinnvoll zu verstehen, "wie" genau dieser Prozess der Compilierung abläuft.
-
Präprozessor:
-
Zwischensprachen (Bytecode):
Bei einer Zwischensprache in ↗ Bytecode - Bekannte Beispiele sind ↗ Java und ↗ C# - wird der Quellcode für eine “Virtuelle” ↗ CPU compiliert. Erst wenn das Programm auf dem Zielsystem gestartet wird, wird von einem ↗ AOT-Compiler (Ahead of time) der echte Maschinencode, angepasst für die aktuell genutzte ↗ CPU erstellt. Dadurch ist es ebenfalls möglich, Programme auf unterschiedlichen Systemen auszuführen. Auch hier ist das Problem, das eine Interaktion mit hardwarenahen Komponenten schwierig ist und für diese speziellen Zwecke wieder ein nativ geschriebener Programmteil nötig ist.
