C/C++ Compiler

Übersetzung von Quelltext in Maschinensprache

Ein Compiler ist ein Programm zur Übersetzung von lesbarem Quelltext (Source Code) in binäre Maschinensprache. Hier wird die Arbeitsweise typischer Compiler vorgestellt, sowie einige praktische Beispiele für Linux und Windows.
C/C++ Klassiker der modernen Programmiersprachen
Compiler Übersicht der Arbeitsweise
C/C++ Compiler Praktische Beispiele für Linux und Windows
IDE Integrierte Entwicklungs-Umgebung für C/C++
Verwandte Themen GNU GCC- und MinGW-Compiler, Code::Blocks IDE, Eclipse IDE, Notepad++ (Editor)

Compiler

Das Diagramm zeigt die typische Herstellung eines Programms aus C/C++ Quelltext (SourceCode). Linux und Windows sind hier lediglich stellvertretend für beliebige Betriebssysteme genannt. Man kann den geschriebenen (programmierten) Quelltext nicht direkt ausführen, sondern muss den Text zuerst in ein ausführbares Programm übersetzen (compilieren).
Der Quelltext - missverständlich auch oft 'Programm' genannt besteht aus Anweisungen in der Programmiersprache → C/C++. Er ist in einer einfachen unformatierten Text-Datei enthalten, meist mit Namen *.c oder *.cpp, z.B. muster.c
Der Quelltext ist portabel: Man kann ihn ohne Änderung auf jedem Betriebssystem verwenden.
Beispiel für den Inhalt einer Quelltext-Datei muster.c
#include <stdio.h>
int main() {
printf("Programmiert in C\n");
return 0;
}
Ein wichtiger Teil des Quelltextes ist die Anforderung von Bibliotheken, hier mit der Anweisung
#include <stdio.h>
Es gibt für C/C++ mehrere standardisierte Bibliotheken, in denen wiederverwendbare Programm-Teile (Funktionen) für viele unterschiedliche Aufgaben enthalten sind.
In diesem Beispiel wird die 'Standard Input-Output' Bibliothek angefordert. Sie enthält u.a. die Funktion printf(), mit welcher das Programm eine Text-Zeile ausgibt.
Die Funktion ist im Quelltext einfach anwendbar und sie entlastet die Entwicklungs-Arbeit von den zur Ausführung notwendigen (relativ komplexen) Arbeiten.
Ein Compiler ist ein Programm, welches Quelltext in 'Maschinensprache' übersetzt: Ein Prozessor-Chip erhält seine Anweisungen in Form bestimmter Bitmuster, die in seine Befehls-Register geladen werden.
Der Compiler verarbeitet als Eingabe eine oder mehrere Quelltext-Dateien und erzeugt als Ausgabe eine ObjektCode-Datei, deren binäre Daten für Menschen nicht lesbar sind.

Der Compiler ist ein ausführbares Programm, so wie ein Browser- oder Grafik-Programm. Er braucht zur Verwendung ein Betriebssystem und ist daher nicht portabel: Man braucht für jedes Betriebssystem eine eigene Version des (C/C++)-Compilers.
Der ObjektCode enthält die Liste der vom Compiler-Programm erzeugten Prozessor-Befehle in Maschinensprache. Für diese Dateien werden typisch Namen wie *.o oder *.obj verwendet, z.B. muster.o Der ObjektCode ist nicht ausführbar, weil die darin enthaltenen Verweise auf Bibliotheken noch nicht aufgelöst sind. Die Objekt-Dateien sind Zwischenprodukte des gesamten Übersetzungs-Vorgangs.
Die Bibliotheken enthalten die zahlreichen C/C++ Funktionen und sind bereits in Maschinensprache übersetzt. Viele der Funktionen stützen sich auf das Betriebssystem, daher sind die Bibliotheken nicht portabel. Sie werden normalerweise zusammen mit dem Compiler-Programm installiert, man kann sie jedoch mit zusätzlichen Bibliotheken für spezielle Zwecke ergänzen (z.B. Zugriff auf eine Datenbank).
Die Bibliotheken sind im Diagramm mit den symbolischen (!) Namen linux-lib.o, windows-lib.o dargestellt. In der Realität handelt es sich um mehrere Dateien mit unterschiedlichen Namen.
Das Linker-Programm verknüpft den vom Compiler-Programm erzeugten ObjektCode mit den angeforderten Bibliotheken, die selbst bereits in ObjektCode vorliegen.

Der Linker erhält als Eingabe die ObjektCode-Datei sowie alle angeforderten Bibliotheken und erzeugt als Ausgabe eine Programm-Datei.
Er ist wie der Compiler ein ausführbares Programm, braucht das Betriebssystem und ist daher nicht portabel.
Es ist wichtig, dass alle verwendeten Bibliotheken in das fertige Programm aufgenommen werden. In manchen Versionen (z.B. → MinGW) muss man das ausdrücklich mit 'Linker-Optionen' angeben.

Für das Linker-Programm ist kein Datei-Name angegeben, weil die Linker-Aufgaben oft in den Compiler integriert sind. Compiler und Linker müssen in jedem Fall eng zusammenarbeiten und werden immer gemeinsam installiert und angewendet.
Das Ergebnis der gesamten Arbeit ist ein ausführbares Programm. Vom Linker wurden die Prozessor-Befehle des übersetzten Quelltextes mit jenen der angeforderten Bibliotheks-Funktionen ergänzt. Sie sind nun vollständig und können vom Prozessor ausgeführt werden.

Linux-Programme brauchen keine besondere Datei-Endung. Hier wird *.bin verwendet, um zu signalisieren, dass es sich um ein Programm (Binary) handelt, so wie analog auf Windows ein Programm *.exe
Das fertige Programm stützt sich auf das jeweilige Betriebssystem und ist daher nicht portabel.

Der Vorteil von C/C++ ist die große Geschwindigkeit. Sie ist das Ergebnis fast perfekter Optimierung der Prozessor-Befehle. Die Bibliotheken sind zu diesem Zweck eng an die Funktionen des Betriebssystems gebunden.

Daher muss man in Kauf nehmen, nicht nur für Betriebssystem-Familien sondern oft auch für einzelne -Versionen eigene Varianten des ausführbaren Programms herzustellen.
Der gesamte Weg vom eigenen QuellText zum fertigen ausführbaren Programm sieht auf den ersten Blick kompliziert aus. Tatsächlich sind dabei viele einzelne Aufgaben zu erledigen, die teilweise recht komplex und das Ergebnis von Jahrzehnten intensiver Entwicklung sind. Moderne ↓ Entwicklungs-Umgebungen übernehmen jedoch die Organisation aller Teil-Aufgaben und bieten auch für AnfängerInnen die Möglichkeit, mit C/C++ einfach und übersichtlich zu programmieren.

C/C++ Compiler

Compiler

Ein C/C++ Compiler ist ein Programm, welches Quelltext (Source-Code) in ausführbare Programme übersetzt.
Ein Compiler ist die minimale Voraussetzung für die Entwicklung eigener C/C++ Programme.

Compiler sind selbst ausführbare Programme (natürlich in C/C++ programmiert) und laufen daher nur auf jenem Betriebssystem, für welches sie hergestellt wurden.
Auch die mit dem Compiler hergestellten Programme (Linux-Binary z.B. *.bin, Windows *.exe) laufen nur auf den jeweiligen Betriebssystemen, da sie sich für viele Arbeiten auf interne Funktionen des jeweiligen Systems stützen.

Alle gängigen Compiler sind → Konsolen-Programme. Sie werden z.B. in einer Linux → Shell-Konsole (Terminal) oder Windows → Eingabeaufforderung (cmd.exe) ausgeführt, durch Eingabe ihres Programm-Namens gestartet und mit Anweisungen aus 'eingetipptem' Text gesteuert. Das ist für AnfängerInnen eine gewisse Hürde, da die Konsole von heutigen AnwenderInnen kaum mehr verwendet wird.

Entwicklungs-Umgebung

In der Entwicklungs-Praxis bedient man den Compiler nur selten direkt an der Konsole. Eine Entwicklungs-Umgebung (Integrated Development Environment IDE) bietet eine bequeme grafische Oberfläche. Alle internen Arbeiten (z.B. die Bedienung des Compilers) werden den EntwicklerInnen abgenommen.
Praktische IDE-Beispiele

Die Entwicklung mit einem modernen → IDE ist auch für AnfängerInnen leicht zu erlernen.

Fortgeschrittenen EntwicklerInnen bleibt es jedoch nicht erspart, sich mit tiefer liegenden (LowLevel)-Schichten zu befassen, von der Konsole bis hinunter auf die Ebene des Prozessors und anderer Chips.

Erzeugte Programme

Die mit C/C++ erzeugten Programme unterscheiden sich meistens vom dem, was heutige PC-AnwenderInnen darunter verstehen:
Die Mehrzahl aller C/C++ Programme arbeitet unsichtbar, z.B. in Hintergrund-Programmen, die durchschnittliche AnwenderInnen nie zu sehen bekommen.

Das gewohnte grafische User-Interface mit Fenstern und Maus-Bedienung erfordert - verglichen mit den damit auszuführenden Arbeiten - einen sehr großen Aufwand an Programmierung, und ist darüber hinaus nicht portabel.

Die besondere Stärke von C/C++ ist die große Geschwindigkeit der Ausführung. Man programmiert damit vorzugsweise die kritischen Teile eines Programms. Für das grafische User-Interface verwendet man meist andere, einfacher zu bedienende Programmiersprachen, deren Code nach Möglichkeit auch portabel ist (z.B. Java).

Ein typisches Beispiel ist das Betriebssystem Linux: Es umfasst eine große Anzahl einzelner Dateien, von denen die kritischen (die gesamte Performance bestimmenden) Teile in C/C++ programmiert sind. Diese Dateien arbeiten unsichtbar und sind für AnwenderInnen - wenn überhaupt - nur an der Konsole bedienbar.

AnfängerInnen der C/C++ Entwicklung programmieren ausnahmslos nur Konsolen-Programme, weil in diesem Fall die aufwändige Programmierung des grafischen User-Interface wegfällt. Das ist zwar relativ einfach, auf längere Sicht jedoch unbefriedigend, weil man mit viel Mühe Produkte herstellt, die für durchschnittliche AnwenderInnen kaum verwendbar sind.

Ein Kompromiss sind Programme zur Herstellung von 'intelligenten Produkten', z.B. von Webseiten, Objekt-Grafik oder XML-Daten: Derartige Programme sind zwar als einfache Konsolen-Programme herzustellen, die fertigen Produkte sind jedoch mit jedem Browser zu verwenden und durchaus herzeigbar.

Fortgeschrittene können mit C/C++ auch ein modernes grafisches User-Interface herstellen. Der dazu notwendige Aufwand ist jedoch relativ groß.

Die Programmierung von Mikroprozessoren ist ein Spezialgebiet. Hier läuft normalerweise kein Betriebssystem. Die Programme werden typisch auf einem normalen PC mit C/C++ oder Assembler erzeugt und nur der fertige binäre Code auf den Mikroprozessor portiert. In diesem Fall verzichtet man auf jedes User-Interface, das Programm läuft automatisch ab oder wird ferngesteuert.

Linux

UNIX und Linux Betriebssysteme sind selbst fast ausschließlich in C/C++ programmiert und bieten optimale Voraussetzungen für die Entwicklung mit C/C++
In allen professionellen Linux Versionen ist ein C-Compiler installiert.

Einige neuere Desktop Distributionen sind ausschließlich für durchschnittliche AnwenderInnen optimiert und enthalten erstmals keinen C-Compiler. Dieser ist jedoch auf der Distributions-DVD, mindestens jedoch im Software-Pool der Distribution (Repository) enthalten und lässt sich mit Mausklick installieren.

Auf Linux ist normalerweise der kostenfreie → GNU GCC-Compiler installiert. Andere Compiler werden fallweise zusätzlich verwendet. Ein Compiler ist auf Linux so einfach und selbstverständlich, dass sich fortgeschrittene AnwenderInnen damit maßgeschneiderte Programme oder sogar das ganze Betriebssystem aus dem Quelltext selbst herstellen.

In diesem Web wird für alle Beispiele der → GNU-Compiler verwendet, der einen Quasi-Standard der C/C++ Entwicklung darstellt. Dieser Compiler ist für alle gängigen Betriebssysteme kostenfrei verfügbar, und alle guten → Entwicklungs-Umgebungen arbeiten damit problemos zusammen.

Details zum GNU GCC-Compiler, Installation, Konfiguration und Anwendung auf Linux und Windows

Windows

Auf Windows Systemen sind keinerlei Compiler installiert. Man muss sie selbst besorgen, installieren und konfigurieren.

MinGW

In diesem Web wird für alle Beispiele der → GNU-Compiler verwendet, den es kostenfrei fär alle gängigen Betriebssysteme gibt. Dieser Compiler wurde unter der Bezeichnung → MinGW (Minimalist GNU for Windows) auf Windows portiert.

AnfängerInnen installieren am einfachsten die Entwicklungs-Umgebung → Code::Blocks in der größeren Version mit dem integrierten MinGW-Compiler.

Fortgeschrittene EntwicklerInnen sollten zuerst den → MinGW Compiler installieren, konfigurieren und testen, und erst danach eine oder mehrere Entwicklungs-Umgebungen (IDE-Programme), die sich dann auf den bereits funktionierenden Compiler stützen.

Eine heute nur mehr selten verwendete Variante ist die Installation des GNU-Compilers in einem → Cygwin-Projekt.

Der Borland C++ Builder erfreut sich auf Windows großer Beliebtheit, vor allem weil er vor der Portierung des GNU-Compilers nahezu exklusiv verwendet wurde. Die Konsolen-Version kann man von zahlreichen Internet-Seiten kostenlos laden.

Visual C/C++

Von Microsoft wird die eigene Entwicklungs-Umgebung Visual Studio bevorzugt, die u.a. auch einen C/C++ Compiler enthält.
Das kommerzielle Vollprodukt ist relativ teuer. In letzter Zeit bietet Microsoft jedoch abgemagerte Versionen mit dem Zusatz-Namen Express kostenfrei an.
Diese Entwicklungs-Umgebung funktioniert einwandfrei, ist jedoch stark an Windows und anderen Produkten des Herstellers orientiert, um deren Verwendung zu fördern. Es erfordert fortgeschrittene Kenntnisse, um damit portablen C/C++ Quelltext zu erzeugen.

C#

C-Sharp ist eine eigene, von Microsoft entwickelte Programmiersprache, die zwar Elemente von C enthält, jedoch weder mit C noch mit C++ kompatibel ist. C# ist zwar standardisiert, jedoch so stark an MS-Produkten orientiert, dass weder Quelltext noch Programme portabel sind.

C/C++ Entwicklungs-Umgebung (IDE)

Integrierte Entwicklungs-Umgebung

Compiler sind als ↑ Konsolen-Programme nicht einfach zu bedienen. Daher verwendet man in der Praxis der heutigen Entwicklung komfortable Programme mit grafischem User-Interface.

Ein Entwicklungs-Umgebung (Integrated Development Environment IDE) unterstützt die Programmierung in jeder Hinsicht, z.B. bei der Erstellung von Quelltext, der Bedienung des Compilers und beim Debuggen.
Professionelle IDEs helfen darüber hinaus bei der Zusammenarbeit mehrerer EntwicklerInnen und bei der Verwaltung komplexer Projekte.

Code::Blocks

ist eine kostenfreie C/C++ Entwicklungs-Umgebung für Windows oder Linux.
Dieses IDE eignet sich besonders gut für wenig erfahrene EntwicklerInnen.
Details zu Code::Blocks (Installation, Konfiguration, Anwendung)

Eclipse

ist eine professionelle modulare Entwicklungs-Umgebung. Die Eclipse-Module zur C/C++ Entwicklung sind für alle gängigen Betriebssysteme kostenfrei.

Dieses IDE eignet sich für erfahrene EntwicklerInnen, insbesondere auch für Entwicklungs-Gruppen und komplexe Projekte.
Details zu Eclipse

Editor-Programme

verwendet man zur Herstellung und Bearbeitung einfacher Texte ohne Formatierung. Der Quelltext aller Programmiersprachen besteht grundsätzlich nur aus einfachem Text (ASCII). Daher ist es naheliegend, Editor-Programme auch zur Programmierung zu verwenden.
Alle besseren Editor-Programme bieten Optionen zur Unterstützung der Programmierung an.

Textverarbeitungs-Programme (LibreOffice-Writer, MS-Word, ...) sind zur Erstellung und Bearbeitung von Quelltext nicht geeignet !

Das Programm Notepad++ ist für Windows kostenfrei und bietet gute Verbindungen zu einem (bereits vorher installierten) Compiler. UltraEdit bietet ähnliche Funktionalität, die neueren Versionen sind jedoch kostenpflichtig.

Dieses IDE eignet sich für erfahrene EntwicklerInnen und erlaubt die schnelle Programmierung kleiner Projekte.

Details zur C/C++ Programmierung mit Notepad++