Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Initial commit

  • Loading branch information...
commit cd3dcd3feb19284c425658a0249d0c4e8310e5dd 1 parent 0837585
Hannes Feldt authored
View
88 1 - Compiler/README.md
@@ -0,0 +1,88 @@
+Der Compiler
+============
+
+Der GCC-Compiler besteht aus mehreren einzel Programmen, die zusammen das programm erstellen.
+
+Im groben sind dies:
+
+* Präprozessor
+* Compiler
+* Assembler
+* Linker
+
+Präprozessor
+------------
+
+Der Präprozessor ist ein relativ einfacher teil. Er erstezt genau genommen alle Zeilen im Quellcode, die mir einem # anfangen.
+
+Es gibt 3 Wichtige Präprozessor befehle.
+
+### #include
+
+Das wohl wichtigste ist #include. Mit diesem Befehl können Header-Datein in eine Quelcode-Datei eingebunden werden.
+
+### #define
+
+Mit #define können Kostanten und Makros definiert werden.
+
+### #pragma
+
+#pragma ist ein relativ selten genutzter Befehl, der sehr Compiler abhängig ist. Es gibt dem Compiler spezielle Anweisungen.
+
+### Linker Ausgabe
+
+Der GCC bietet die Möglichkeit sich das Ergebniss des Präprozessors auszugeben.
+
+```shell
+gcc -E main.c -o main.i
+```
+
+Schaut man sich nun die Datei main.i an, findet man oben die eingebundene Datei (stdio.h) und ganz am ende den erstellten Code. Kommentare, Konstanten und Makros sind auch aufgelöst.
+
+Compiler
+--------
+
+Der GCC Compiliert intern der C-Quellcode in Assembler um.
+Gibt man in der Konsole folgendes ein:
+
+```shell
+gcc -S main.c -o main.S
+```
+
+Kann man sich in der Datei main.S den erstellten Assembler-Code anschauen.
+
+Assembler
+---------
+
+Der Assembler wandelt den generierten Assembler-Code in Maschinensprache um.
+
+```shell
+gcc -c main.S -o main.o
+```
+
+Die Datei main.o enthält nun Theoretisch das ausführbare Programm, das Betriebsystem kann damit aber noch nichts anfangen.
+
+Linker
+------
+
+Der Linker "verbindet" nun einzelne Object-Datein und fügt Libraries dem Programm hinzu. Erst hier entsteht das lauffähige Programm.
+
+```shell
+gcc main.o -o main
+```
+
+Abkürzung
+=========
+
+Mittels
+
+```shell
+gcc main.c -o main
+```
+
+können alle Befehle zusammen gefasst werden.
+
+Am Ende kann man das Programm ausführen
+```shell
+./main
+```
View
9 1 - Compiler/src/main.c
@@ -0,0 +1,9 @@
+#include <stdio.h> // Wird benötigt für printf
+#define MESSAGE "Hello World\n" // Eine Konstante
+#define PRINT(M) printf(M) // Ein Makro
+
+int main(int argc, const char* argv[])
+{
+ // Das Makro erstellt: printf("Hello World\n")
+ PRINT(MESSAGE);
+}
View
48 2 - Modularisierung/README.md
@@ -0,0 +1,48 @@
+Hilfe ich habe zuviel Code in einer Datei!
+==========================================
+
+Um Programme übersichtlicher und Programmteile wieder verwendbar zu machen gibt es in C die Möglichkeit der Modulariesierung.
+
+Dabei werden einzelne Programmteile in verschiedene Datein aufgeteilt.
+
+In meinem Beispiel gibt es nun die Datei main.c, module.h und module.c
+
+module.h
+--------
+Enthält die Definition der Funktionen im Modul.
+
+module.c
+--------
+Enthält die eigentliche Implementierung der Funktionen im Modul.
+
+main.c
+------
+Enthält den Einstiegspunkt des Programms und ruft die Funktion aus dem Modul auf.
+
+In main.c wird die Datei module.h Inkludiert, um die Funtkion addiere dem Kompiler bekannt zu machen und benutzen zu können.
+
+Kompilieren
+===========
+
+Kompilieren wir nun das Programm.
+
+```shell
+gcc main.c -o main
+```
+
+Der Kompiler gibt nun ein Fehler aus. warum?
+
+```shell
+main.c:(.text+0x29): undefined reference to `addiere'
+collect2: ld returned 1 exit status
+```
+
+Wir haben dem GCC gesagt, dass er die Datei main.c Kompilieren soll. Die Datei main.c enthält das Inklude zum Modul, dadruch weis der Kompiler, dass es eine Funktion mit dem Namen addiere gibt.
+Wenn der Linker nun die Object-Datei in ein ausführbares Programm umwandeln will, sucht er nach der Implementierung von addiere, und stellt dabei fest, dass diese garnicht existiert.
+
+Geben wir nun
+```shell
+gcc main.c module.c -o main
+```
+ein, wird auch das Modul kompieliert und der Linker findet die Implementierung von addiere.
+
View
11 2 - Modularisierung/src/main.c
@@ -0,0 +1,11 @@
+#include <stdio.h> // Include mit <> bei externen Datein aus anderen Bibliotheken
+#include "module.h" // Include mit "" bei lokalen Datein im Projekt
+
+int main(int argc, const char* argv[])
+{
+ int zahl1 = 5;
+ int zahl2 = 3;
+
+ int ergebniss = addiere(zahl1, zahl2); // Funktion aufrufen
+ printf("%d + %d = %d\n", zahl1, zahl2, ergebniss); //Ergebniss ausgeben
+}
View
7 2 - Modularisierung/src/module.c
@@ -0,0 +1,7 @@
+
+
+// EIne Funktion die Zwei Zahlen addiert
+int addiere(int a, int b)
+{
+ return a+b;
+}
View
7 2 - Modularisierung/src/module.h
@@ -0,0 +1,7 @@
+#ifndef __MODULE_H__
+#define __MODULE_H__
+
+// Prototyp der Funktion die zwei Zahlen addiert
+int addiere(int a, int b);
+
+#endif
Please sign in to comment.
Something went wrong with that request. Please try again.