Compilerbau Organisatorisches C-Programmierung Make
Verantwortliche Lukas Dölle doelle@informatik.hu-berlin.de Büro: RUD 25, 4.204 Tel.: 2093-3927 Martin Kost kost@informatik.hu-berlin.de Büro: RUD 25, 4.208 Tel.: 2093-3025 Dr. Andreas Kunert kunert@informatik.hu-berlin.de Mathias Peters Mathias.peters@informatik.hu-berlin.de Büro: RUD 25, 4.222 Tel.: 2093-5466 Compilerbau 2
Gliederung 1. Organisatorisches a) Praktikumsaufgaben b) Praktikumsschein 2. Tar 3. C-Programmierung a) Komponenten eines C-Systems b) GCC c) Präprozessor d) Include-Guards e) Strings f) Zeiger 4. Make 5. C-Programmierung mit Eclipse 6. Beispielprogramme Compilerbau 3
Praktikumsseite Alle wichtigen Informationen Ablauf Folien Aufgaben Klausurplanung, Klausurergebnisse Links Adresse http://www.dbis.informatik.hu- berlin.de/lehre/semesteruebersicht/sommersemester- 2011/praktikum-compilerbau.html Compilerbau 4
Praktikumsaufgaben (1) Ausgabe Montags, 14-tägig, Übersicht auf Webseite Über die Praktikumswebseite und Goya Aufgabenblätter sind Hausaufgabe Insg. 4 Aufgabenblätter (5 für Diplomstudenten) Erstes Blatt: Montag, 25.04.2011 Abgabe Sonntagabend (23:59 Uhr) jeweils 2 Wochen später Abgabe per Goya Bei Problemen: SOFORT E-Mail schicken Genaue Vorgabe in der Aufgabenstellung einhalten Abgabe als gzip-tes tar-archiv Erstes Blatt: Sonntag, 08.05.2011 Compilerbau 5
Praktikumsaufgaben (2) Gruppenbildung Aufgaben werden in Zweier- oder Dreiergruppen bearbeitet Gruppenmitglieder können an verschiedenen Praktikumsterminen teilnehmen Aber keine gemischten (Bachelor- + Diplomstudenten) Gruppen Gruppenbildung per Goya https://goya3.informatik.hu-berlin.de/goyacs Mailingliste Über Goya Compilerbau 6
Praktikumsschein = Zulassungskriterium zur Prüfung Mind. 70 % der Gesamtpunktzahl Jedes Aufgabenblatt muss bearbeitet und mit mind. einem Punkten bewerten worden sein Erfolgreiches Bestehen von zwei Befragungen (jeweils ca. 15 min) zu einem Aufgabenblatt (komplette Gruppe) Zeitpunkt wird mit Gruppe vereinbart Nichterscheinen = durchgefallen (Max.) Zweimal durchgefallen: Kein Praktikumsschein Kopieren von Lösungen = 0 Punkte Kein Praktikumsschein Gilt für alle Beteiligten Gruppe, die abgeschrieben hat Gruppe, die abschreiben lassen hat Compilerbau 7
Bewertung Programme müssen auf den Rechner des SUN- Pools (rabe oder star) unter Solaris laufen sonst keine Punkte 0 Punkte bei Verspätete Abgabe Falsche Dateien, falsche Verzeichnisstruktur Zu wenige/viele Dateien Archiv nicht entpackbar Nicht kompilierbar Warnungen beim Kompilieren geben Abzug Vorgegebene Testumgebung läuft nicht Kopieren der Lösung Compilerbau 8
Gliederung 1. Organisatorisches a) Praktikumsaufgaben b) Praktikumsschein 2. Tar 3. C-Programmierung a) Komponenten eines C-Systems b) GCC c) Präprozessor d) Include-Guards e) Strings f) Zeiger 4. Make 5. C-Programmierung mit Eclipse 6. Beispielprogramme Compilerbau 10
Tar Tool zum Archivieren von Dateien Optionen c Archiv erstellen (create) x Archiv entpacken (extract) t Inhalt ausgeben (table of content) f Angabe des Dateinamens (file name) z komprimieren mittels gzip (ggf. gtar benutzen) Beispiele Packen eines Archivs tar cfzv <archivname>.tar.gz <dateien/verzeichnis> Entpacken tar xfzv <archivname>.tar.gz Verifikation (Liste der Dateien im Archiv) tar tfz <archivname>.tar.gz Hilfe Man-Pages oder tar --help Compilerbau 11
Komponenten eines C-Systems Präprozessor: Vorbereitung des Quelltextes für nachfolgende Kompilation Kommentare, Zeilenumbrüche mit Backschlash entfernen Symbolische Konstanten (#define) ersetzen Header-Quelldateien (#include) in Quelltext kopieren Direktiven (#ifdef) auswerten Compiler: Analyse und Übersetzung des Quelltextes in Maschinencode Ergebnis: Objektdatei Linker: Bindung mehrerer Objektdateien zu einem Programm und Auflösung externer Referenzen Programm kann aus mehreren Übersetzungseinheiten (translation unit) bestehen Einbindung der Laufzeitbibliothek in das fertige Programm Compilerbau 12
Schema der Programmerstellung prog.c *.h Compiler prog.o *.o *.lib Linker prog Compilerbau 13
GCC C-Programme erstellen Erzeugen einer Objektdatei gcc -c <Quelldatei(en)> Linken (Binden) zu einem ausführbaren Programm gcc -o <Programmname> <Objektdateien> Weitere Optionen -Wall: -pedantic: -g: Beispiel 1 gcc -c prog.c gcc -o prog prog.o Beispiel 2 (Compiler + Linker) gcc -o prog prog.c Ausgabe aller Warnungen (W all) Warnung bei nicht standardkonformen Erweiterungen Übersetzung mit Debug-Informationen Compilerbau 14
Präprozessor Makros Präprozessor ist ein dummes, aber mächtiges Ersetzungstool Syntax #define <macro> <replacement name> Konstante #define NULL 0 #define BEGIN { Inline-Code #define CHECK_HANDLE(s, msg) if (s == 0) { } Vorteil: effizient, da kein zusätzlicher Funktions(stack)aufruf Bei Verwendung von Parametern (hier nicht näher erläutert) klammern, was das Zeug hält Über mehrere Zeilen durch Escape des Zeilenendes \<kein weiteres Zeichen> Compilerbau 15
Präprozessor Direktiven Konfigurationsmittel für Quellcode Beispiel (praepro.c) int i = 10; #ifdef INIT i = 20; #endif gcc praepro.c -o praepro i hat Wert 10 gcc -DINIT praepro.c -o praepro Dmakro: Definiert makro mit 1 i hat Wert 20 Compilerbau 16
Präprozessor Headerdateien include Präprozessor kopiert Inhalt der zu inkludierenden Datei an die Stelle, wo das #include steht #include <stdio.h> Suche im Include-Verzeichnis des Compilers #include "header.h" Suche im aktuellen Verzeichnis Compilerbau 17
Include-Guards Problem int nr; data.h algo.h include "data.h" int nr; include "data.h" data.c proggi.c #include "data.h" #include "algo.h" algo.c include "algo.h" Präprozessor ersetzt: int nr; int nr; Doppelt definierte Variable nr in proggi.c data.h: error: redefinition of 'nr' data.h: error: previous declaration of 'nr' was here Compilerbau 18
Include-Guards Headerdateien sollten nicht mehrmals inkludiert werden Headerdateien sichern mittels Include-Guards #ifndef dieseheaderdatei_h #define dieseheaderdatei_h // Deklarationen... #endif /* dieseheaderdatei_h */ Beispiel #ifndef DATA_H #define DATA_H int nr; #endif /* DATA_H */ Compilerbau 19
Strings In C definiert als Array von char Stringendezeichen '\0' nicht vergessen Beispiele char s1[] = "hallo"; char s2[5] = "hallo"; char s3[10] = "hallo"; s1 h a l l o \0 s2 h a l l o s3 h a l l o \0 \0 char s4[3] = "hallo"; char s5[5]; char s6[]; 10 s4 h a l warning s5????? error: array size missing in 's6' (In Java geht das) Compilerbau 22
Zeiger Ein Zeiger ist eine Variable, die eine Adresse einer anderen Variable (als Wert) speichert Deklaration int *intpointer; float *floatpointer; Zeiger auf einen Integer- bzw. Floatwert Adressoperator: & Gibt Adresse einer Variablen zurück Dereferenzierungsoperator: * Gibt Wert eines Objekts zurück, auf den Zeiger zeigt Compilerbau 23
Zeiger Beispiel 1. int x = 1, y = 2; int *p, **q; 2. p = &x; q = &p; 3. y = *p; 4. *p = 4; 5. *q = &y 6. **q = 5; x 1 y 2 p? q? Adresse 100 200 1000 2000 x 1 y 2 p 100 q 1000 Adresse 100 200 1000 2000 x 1 y 1 p 100 q 1000 Adresse 100 200 1000 2000 x 4 y 1 p 100 q 1000 Adresse 100 200 1000 2000 x 4 y 1 p 200 q 1000 Adresse 100 200 1000 2000 x 4 y 5 p 200 q 1000 Adresse 100 200 1000 2000 Compilerbau 24
Strings und Zeiger Beispiele char *s1 = "hallo"; char c1 = *s1; char c2 = s1[0]; char c3 = s1[4]; s1[0] = 'H'; char s2[] = "hallo"; s2[0] = 'H'; s1 h h o h a l l o \0 Fehler, da Stringliteral "hallo" konstant ist. s2 h a l l o \0 s2 H a l l o \0 Speicherbereich Compilerbau 25
Make Make ist ein Programm für die automatische Erstellung von Programm-Systemen Ermöglicht das Ausführen von Befehlen unter Beachtung von Zeitstempeln von Dateien Abhängigkeiten zwischen Dateien Aufruf: make [<Ziel>] [<Optionen>] Liest Input aus Datei GNUmakefile, makefile oder Makefile (in dieser Reihenfolge) Alternativ: make [<Ziel>] -f <Makefile> make f my_make_file.txt Compilerbau 28
Makefile Teilt dem Programm make mittels Regeln mit, was es tun soll ( Ziel ), und wie es das tun soll ( Anweisung ) Zu jedem Ziel (target) kann angeben werden, von welchen anderen Zielen (z. B. Dateien) dieses abhängt Beispiel Shell gcc -c prog.c gcc -o prog prog.o Makefile Ziele prog: prog.o gcc -o prog prog.o prog.o: prog.c gcc c prog.c Abhängigkeiten Anweisungen Regeln Compilerbau 29
Makefile Regeln (1) Beschreiben Abhängigkeiten der Ziele und welche Kommandos für die Ziele auszuführen sind, wenn die Ziele älter sind als die Abhängigkeiten Syntax <Ziel> : <Abhängigkeiten> <TAB> <Anweisungen> Beispiel prog: prog.o gcc -o prog prog.o prog.o: prog.c gcc c prog.c Compilerbau 30
Makefile Regeln (2) Beispiel prog.o: prog.c gcc c prog.c prog.c ist gleichzeitig Name für Datei und für Ziel Make macht darin keinen Unterschied Ziel ohne Abhängigkeiten und Anweisungen Immer aktuell Falls prog.c nicht existiert make: *** No rule to make target `prog.c'. Stop. Erweiterung Syntax Bei mehrzeiligen Abhängigkeiten oder Anweisungen steht ein \ am Zeilenende Compilerbau 31
Makefile Variablen Syntax <Name> = <Wert> Zugriff $(<Name>) Gebräuchliche Variablen CC Der Compiler CFLAGS Compiler-Optionen LDFLAGS Linker-Optionen Beispiel CC = gcc CFLAGS = -Wall pedantic c g LDFLAGS = -L $(LIBDIR) # Pfad zur Codebibliothek $(CC) $(CFLAGS) prog.c Compilerbau 32
Makefile Beispiel Beispiel # Ich bin ein Kommentar CC = gcc all: prog prog: prog.o $(CC) -o prog prog.o prog.o: prog.c $(CC) -c prog.c clean: rm -rf *.o -f: ignoriert nicht existierende Dateien -r: löscht Verzeichnisse rekursiv Aufrufe make (erstes Ziel: all), make all, make clean make prog, make prog.o Compilerbau 33
Makefile Spezielle Variablen Variablen mit spezieller Bedeutung $@ Regelziel $< erste Abhängigkeit $^ alle Abhängigkeiten Beispiel x: a b c $@ = x $< = a $^ = a b c Compilerbau 34
Makefile Pattern in Regeln Bei Programmen mit vielen Dateien und Abhängigkeiten, müsste für jede einzelne Objekt-Datei eine neue Regel erstellt werden unpraktikabel Regeldefinition durch Wildcard-Pattern Beispiel Alt Neu prog.o: prog.c $(CC) $(CFLAGS) prog.c %.o: %.c $(CC) $(CFLAGS) $< Jede.o-Datei hängt von der entsprechenden.c-datei ab Compilerbau 35
C-Programmierung C-Compiler GCC GNU Compiler Collection Betriebssystem: Linux, Solaris Inkl. C-Compiler Vorinstalliert auf den Rechnern der RBG Cygwin (inkl. GCC) für Windows Betriebssystem: Windows Portierung von Unix-Programmen auf Windows http://www.cygwin.com MinGW Minimalist GNU for Windows Betriebssystem: Windows Portierung u. a. von GCC + Debugger auf Windows http://sourceforge.net/projects/mingw Entwicklungsumgebungen Eclipse Betriebssystem: Windows, Linux, Mac In den Poolräumen installiert Benötigt CDT-Plugin http://www.eclipse.org Compilerbau 39
C-Compiler für Windows MinGW oder Cygwin MinGW Installer runterladen und installieren http://sourceforge.net/projects/mingw Auch installieren GNU Source-Level Debugger MSYS: Base System Damit auch make, rm, tar funktionieren Cygwin setup.exe runterladen und installieren http://www.cygwin.com Wichtig: evtl. Umgebungsvariablen in Windows anpassen PATH-Variable Für MinGW C:\MinGW\bin C:\MinGW\MSYS\1.0\bin Für Cygwin C:\Cygwin\bin Compilerbau 40
C-Programmierung mit Eclipse Installation 1. Download Eclipse IDE for C/C++ Developers (87 MB) http://www.eclipse.org/downloads Oder eine beliebige andere Version + CDT-Plugin http://www.eclipse.org/cdt 2. Eclipse-Zip-Datei entpacken + starten Beliebiges Workspace-Verzeichnis festlegen (Verzeichnis für Eclipse-Projekte) 3. CDT-Plugin installieren (falls andere Eclipse-Version gewählt) Help Install New Software Add Name: CDT Location: http://download.eclipse.org/tools/cdt/releases/helios OK Compilerbau 41
C-Programmierung mit Eclipse C-Projekt erstellen Folgende Beschreibung basiert auf Eclipse 3.6 Helios + CDT 7.0.2 1. Projekt erstellen File New C Project Namen eingeben Makefile project Empty Project Toolchains: MinGW/Cygwin/Solaris GCC Finish 2. Dateien erstellen File New Source File/Header File Namen eingeben Finish 3. Programm schreiben 4. Make Target erstellen Rechtsklick auf das Makefile: Make Targets Create Falls nur MinGW ohne MSYS: bei Build Command mingw32-make eintragen 5. Kompilieren Rechtsklick aufs Target Build Target 6. Ausführen Rechtklick aufs Binary Run As Local C/C++ Application Compilerbau 42
C-Programmierung mit Eclipse Make Target erstellen Compilerbau 43
C-Programmierung mit Eclipse Eclipse/CDT-Einstellungen Compilerbau 44
Zugang zum SUN-Pool von außerhalb Unsere Testumgebung: SUN-Pool (z. B. rabe, star) Daten zum SUN-Pool übertragen Mittels SCP, z. B. WinSCP Download: http://winscp.net/eng/docs/lang:de Rechnername: rabe.informatik.hu-berlin.de Benutzername + Kennwort (RBG-Account) Verbindung mit SUN-Pool herstellen Mittels SSH-Client, z. B. Putty Download: http://www.chiark.greenend.org.uk/~sgtatham/putty Session Host Name rabe.informatik.hu-berlin.de Session Connection type SSH Open Einloggen: Benutzername + Kennwort (RBG-Account) Optional: für grafische Programmausgaben (unter Windows) X-Server starten, z. B. Xming Download: http://www.straightrunning.com/xmingnotes Mit Option multiwindow starten: xming.exe -multiwindow Beim SSH-Client Portforwarding aktivieren Putty: Connection SSH X11 Enable X11 forwarding aktivieren Programme starten, z. B. eclipse, xterm, firefox, konqueror, Compilerbau 45
Beispielprogramme Header Unterschied zwischen Header- und Sourcedateien Telefon Ein kleines Programm, welches Name und Telefonnummer einliest, speichert und wieder ausgibt Telefon2 objektorientiertes Telefonbuch Include-Guards Programm zum Beispiel mit Include-Guards Praepro Präprozessoranweisungen String Einige Stringdefinitionen Treesort Sortieralgorithmus mit Zeigern auf Zeigern Compilerbau 46