printf() wird benötigt, bereitgestellt durch libc
â Bibliotheken, die einen Baukasten von Funktionen anbieten
GNU C Compiler (GCC)
Microsoft Visual C++
Clang (C Language)
Zwischen Frontend und Backend gibt es oft noch eine weitere Schicht: Middle-End
AST wird in eine interne, einheitliche Programmiersprache ĂŒbersetzt
â Intermediate Representation
Grund: Erleichtert Arbeit
for und while) separat im AST behandelnWeiterer Vorteil: ASTs mĂŒssen ânurâ zu IR ĂŒbersetzt werden
Backend ist losgelöst von der Sprache
Einfaches HinzufĂŒgen neuer Programmiersprachen â Erzeugung von AST aus neuer Programmiersprache
SahnehÀubchen: Performance hauptsÀchlich abhÀngig vom Backend
â automatisch gut optimierte Programme fĂŒr alle Sprachen
clang -S -emit-llvm foo.cgcc -fdump-tree-gimple foo.cBeispiel: LLVM-IR
â Ergebnis: Reihe von Object Files (Dateiendung: .o)
printfAlle Bibliotheke mĂŒssen ggf. nach Namenssymbolen durchsucht werden (viele Dateioperationen)
Etwas langsamer durch vieles Hin- und Herspringen
Alle benötigten Bibliotheken mĂŒssen vorhanden sein
â Aufgabe des OS bzw. des Programmierers
Beispiel fĂŒr die Liste an dynamisch-geladenen Bibliotheken:
al@ganymed:~/coding$ ldd dyn.elf
linux-vdso.so.1 (0x00007f50f06a2000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f50f0400000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f50f020a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f50f0124000)
/lib64/ld-linux-x86-64.so.2 (0x00007f50f06a4000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f50f00f7000)main()-Funktion im Programmmain() steht in der Datei main.c, wird aber nicht mit angegeben| Datei | GröĂe (Bytes) | GröĂe (k/M Bytes) |
|---|---|---|
dyn.elf |
16568 | ~16kBytes |
static.elf |
785424 | ~785 KBytes |
static.lto |
706576 | ~707 KBytes |
gcc -Wall -o dyn.elf hello.c main.cgcc -Wall -static -o static.elf hello.c main.cgcc hello.c -o static-lto -static -O2 -flto -s hello.c main.câ Die Lösung dafĂŒr sind Build-Systeme
make (seit ca. 1976)GNU makemake <target-name>
make -j8Build-Systeme speziell fĂŒr C/C++ sind etwas problematisch:
Aufgrund des Alters der Sprachen und zeitweise fehlender FunktionalitÀt gibt es eine Reihe von verschiedenen Lösungen
Unter anderem: make, CMake, Conan
Keine davon ist wirklich perfekt (besonders im Vergleich zu anderen Programmiersprachen)
Bekannte Probleme: komplizierte Konfiguration, sehr komplex, externe Pakete (Bibliotheken, Programme) können nicht automatisch installiert werden
Leider gibt es hier keine gute Lösung đ
gcc -O:
gcc -O0: Standard, keine Optimierungengcc -O1: Einige Optimierungengcc -O2: Sehr viele Optimierungen (beinhaltet O1)gcc -O3: Sehr aggressive Optimierungen (können ggf. das Programm auch langsamer machen)(Sehr gutes Online-Tool fĂŒr anschaulichen Vergleich ist Compiler Explorer)