News Ticker

C 4: Mehr über’s Kompilieren

Der letzte Artikel beschrieb wie das erste Programm geschrieben wird. In einem längeren Artikel ist beschrieben worden, welchen Zweck jede Zeile erfüllt und am Ende auch noch schnell wie man kompiliert und das Programm ausführt. Dieser Artikel soll sich weiterhin mit dem "Hallo Welt"-Programm beschäftigen. Es geht jedoch nicht mehr um das Schreiben sondern um das eigentliche Kompilieren. Das ist nicht das wichtigste Thema wenn man C lernen will, jedoch Basiswissen eines jeden guten C-Programmierers.

Wie in der Einleitung beschrieben, soll dies ein eher theoretischer Text werden. Jedoch gehört dieses Wissen dazu, um zu verstehen wie C funktioniert. Nur wenn man etwas wirklich versteht und nicht nur auswendig lernt, kann man es auch anwenden. Also nichts wie ‚ran an die Arbeit.

Jedes C-Programm wird als C-Code in einer Text-Datei gespeichert. Diese Textdatei wird dann vom C-Präprozessor bearbeitet. Wie ihr bereits wisst, werden z.B. #include-Befehle mit der inkludierten Datei ersetzt.

Erst jetzt greift der C-Compiler ein. Dieser kompiliert oder übersetzt den präprozessierten Code in Assembler-Code. Assembler/ASM ist auch eine Programmiersprache, nur sehr viel simpler and hardware-näher als C. Jedes C-Programm wird also automatisch in eine andere Programmiersprache übersetzt – deswegen auch Übersetzer oder Compiler.

Diese ASM-Datei wird jetzt vom Assembler zu Objekt-Code konvertiert. Dies ist jetzt kein für den Menschen lesbarer Code mehr. Öffnet man eine solche Datei in einem Texteditor werden viele lustige Zeichen ausgegeben, die aber in diesem Kontext keinen Sinn ergeben werden.

Diese Objekt-Datei wird von dem Linker mit entsprechend gelinkten Bibliotheken und anderen Objekt-Dateien verlinkt. Dies ist momentan noch nicht so wichtig, aber bei etwas größeren Projekten (ab zwei Dateien) alltäglich.

Dies ist dann die fertige ausführbare Datei, welche vom Betriebssystem-Loader bei Bedarf in den Speicher geladen und ausgeführt werden kann.

Ein Blick in die Manualseite von gcc verrät uns wie man das praktisch testen kann:

  • normal: Präprozessor, Compiler, Assembler, Linker
  • -c: Präprozessor, Compiler, Assembler
  • -E: Nur Präprozessor
  • -S: Präprozessor, Compiler

Wer also den Assembler-Code für unser „Hallo Welt-„Progamm sehen möchte, gibt folgendes in der Konsole ein:

tcr@triton ~ $ gcc -S hallo.c
tcr@triton ~ $ ls
hallo.c  hallo.s
tcr@triton ~ $ cat hallo.s
        .file   "hallo.c"
        .section        .rodata
.LC0:
        .string "Hallo Welt!"
        .text
.globl main
        .type   main, @function
main:
[...]
Noch viele weiter Zeilen...
[...]