Mein Werkzeugkasten: Editor, Compiler und mehr

Editor, Konsole und Dateiverwaltung Abb.: Editor (links oben), Dateiverwaltung (rechts oben) und Konsole (unten).

Editor, Konsole, Dateiverwaltung, Datensicherung

Ein Editor ist ein Programm zum Bearbeiten von Textdateien, kein Textverarbeitungsprogramm. Auf Windows-Maschinen1 eignet sich Notepad++ gut , um Quelltexte zu bearbeiten. Als Grundeinstellung für neue Dateien wird UTF-8-Kodierung2 genutzt. Achte dazu auf den Hinweis am rechten unteren Rand des Editorfensters (siehe Bild oben, links). C++-Quelltextdateien erkennt Notepad++ an der Dateiendung *.cpp. Textteile werden farblich hervorgehoben (syntax highlighting). Das hilft, einige Tippfehler, etwa vergessene Anführungszeichen, schon beim Schreiben zu erkennen.

Dateiverwaltung mit Zweifenstertechnik ermöglicht das Programm FreeCommander. Anlegen, Verschieben, Umbenennen und Löschen von Verzeichnissen und Dateien wird mit wenigen Tastendrücken erledigt, ohne die Computermaus zu Hilfe zu nehmen. Dies beugt Handschmerzen3 vor. Die Maus lasse ich buchstäblich links liegen und bediene sie, wenn nötig, auch mit der linken Hand. Das geht mit etwas Übung auch ohne Systemumstellung (linker Ringfinger statt rechter Zeigefinger für die linke Maustaste). Die rechte Hand hat mit der Enter-Taste genug zu tun.

Notepad++ lässt sich im FreeCommander als bevorzugter Editor konfigurieren. Außerdem gelangt man aus dem FreeCommander mit der Tastenkombination Strg+D direkt in eine Konsole im aktuellen Verzeichnis., üblicherweise ein langweilig schwarzes Fenster mit heller Schrift.

Im Konsolenfenster schreibe ich per Tastatur Kommandozeilenbefehle (dir, md, cd, del) und Befehle zum Übersetzen und Ausführen von Programmen. Hier lese ich auch die Ausschriften der Programme. Das Lesen und Verstehen der Meldungen ist wichtig. Mit der Beschwerde „Es geht nicht.“ kommt man nicht weit. Weiß man alleine nicht mehr weiter, sollte man andere Menschen zu Hilfe holen. Diese wollen zumindest wissen, was nicht geht, ehe sie wirklich helfen können.

Konsole und Editor bleiben offen und werden im Wechsel (über Alt+Tab) bedient, anders als im Bild meist mit maximaler Fenstergröße. Markieren (Shift+Pfeiltasten), Kopieren (Strg+Einfg) oder Ausschneiden (Strg+Entf) und Einfügen (Shift+Einfg) von Text läuft exakter und flüssiger als mit daneben gehenden Mausklicks, sobald man die erforderlichen Tastenkombinationen kennt.

Datensicherheit ist wichtig. Mühsam erarbeitete Dateien sollten nicht verloren gehen.4 Eigene Dateien gehören nicht auf die Betriebssystempartition (Laufwerk C:), nicht in den Ordner C:\Users\Username\Dokumente, Eigene Dateien oder wie auch immer der heißt. Eigene Dateien sollten auf anderen Laufwerken liegen. Bei mir ist dies Laufwerk D:, welches zudem täglich automatisch auf einen Netzwerkspeicher gesichert wird.

Aufgaben

  1. Finde geeignete Werkzeuge (einen Editor) zum Bearbeiten von Dateien.
  2. Wie kannst du Dateien finden, öffnen, bearbeiten, speichern?
  3. Mache dich mit der Navigation in Verzeichnissen auf Konsole vertraut.

Hallo, Welt: ein Compilertest

Mit einem ersten Quelltext prüfen wir, ob der Compiler korrekt arbeitet. Dieser Test soll lediglich eine Meldung im Konsolenfenster ausgeben:

//> intro/hello_modular.cpp
import std;
 
int main()
{
	std::println("Hallo, modulares C++{}!", 23);
}

Allerdings können nicht alle Compiler diesen in modernem, modularem C++ geschriebenen Quelltext übersetzen. Die Sprache C++ wird weiterentwickelt. Die Compiler haben manchmal Mühe, Schritt zu halten. Es gelingt mit GCC ab Version 15 (aus dem Jahr 2025), kurz g++15. Den folgenden Quelltext übersetzt auch schon g++14 im Modus für den Sprachstandard C++23 oder höher:

//> intro/hello23_ohne_module.cpp
#include <print>
 
int main()
{
	std::println("Hallo, C++{} ohne Module!", 23);
}

Alle Compiler akzeptieren klassisches C++ nach dem Sprachstandard C++98:

//> intro/hello98.cpp
#include <iostream>
 
int main()
{
	std::cout << "Hallo, C++" << 98 << "!\n";
}

Schauen wir uns die verschiedenen Varianten an. Wir können dabei einiges über in C++ geschriebene Programme erfahren:

  • Die erste Zeile, beginnend mit doppelten Schrägstrichen //, enthält einen Kommentar, der vom Compiler ignoriert wird. Sie muss also nicht eingetippt werden. Ich gebe hier nur an, unter welchem Namen die Datei zu finden sein soll. Dies werde ich im folgenden immer so tun.
  • Die Anweisungen import ... beziehungsweise #include ... bringen den Compiler dazu, notwendige Bibliotheken einzubinden.
  • Jedes ausführbare Programm besitzt genau eine Funktion main(), auch Hauptprogramm genannt. Sie liefert einen ganzzahligen Wert (engl. integer) an das aufrufende Programm zurück. Üblich auf den heute verbreiteten Betriebssystemen ist der Rückgabewert 0 bei fehlerfreier Ausführung. Andere Werte können als Fehlercode interpretiert werden.
  • Die im Hauptprogramm auszuführenden Anweisungen werden von geschweiften Klammern {} eingeschlossen, die als Beginn und Ende gelesen werden können.
  • Die Funktion println() soll etwas ausgeben und danach auf eine neue Zeile gehen. Die Bezeichnung „print line“ stammt aus der Zeit, als Computer ganze Schrankwände füllten. Ein- und Ausgaben erfolgten über Fernschreiber, eine Art ferngesteuerte elektrische Schreibmaschine. Die in dem von println() auszugebenden Text stehenden geschweiften Klammern sind Platzhalter. Dort wird die dahinter stehende Zahl 23 eingefügt. C++ erhielt die Funktion println() erst mit dem Sprachstandard C++23.
  • Ältere Programme nutzen für Ausgaben cout („console output“). Die Zeichenkombination \n steht für „new line“ und bewirkt den Zeilenvorschub. Auch das ist ein Begriff aus dem Schreibmaschinenzeitalter. Heute sagen wir Zeilenumbruch.
  • Sowohl println() als auch cout gehören zum Namensraum std (lies: „standard“). Namensräume sorgen dafür, dass es zwischen gleichnamigen Dingen aus verschiedenen Bereichen nicht zu Namenskonflikten kommt.

Zeilenumbrüche, Einrückungen (Tabs) und Leerzeichen im Quelltext, außer dem zwischen Wörtern wie int und main dienen der schöneren, besser lesbaren optischen Form für den menschlichen Leser. Es gibt viele unterschiedliche Stile, den Quelltext zu formatieren und Programme wie clang-format, die Quellcode in ein angenehm lesbares Format bringen.

Das kleinste, fehlerfrei übersetzbare C++-Programm wäre dieses:

int main(){}

Es ist völlig sinnfrei, da es nichts tut. Es erzeugt nicht einmal eine Ausschrift und deshalb für einen Compilertest ungeeignet.

Compiler: Quelltext übersetzen

Ein Compiler übersetzt den vom Menschen geschriebenen Quelltext in ein vom Computer ausführbares Programm. Er fügt die dazu notwendigen Maschinenbefehle zusammen. Der Eingabe

g++ hello98.cpp -o hello98

in der Konsole ruft den Compiler auf. Hinter -o (für „output“) steht der Name des zu erzeugenden Programms. Lässt man -o ... weg, nennt der Compiler das Programm a.exe. Wird keine Fehlermeldung ausgegeben, sollte nun eine Datei hello98.exe mit dem ausführbares Programm entstanden sein. Dieses kann durch die Eingabe

hello98

aufgerufen werden und antwortet

Hallo, C++98!

Glückwunsch! Der Compiler ist ansprechbar. Das erste Programm wurde fehlerfrei übersetzt, ist ausführbar und arbeitet fehlerfrei. Andernfalls begeben wir uns auf Fehlersuche. Programmfehler bezeichnet man als bug. Debuggen ist das Beseitigen von Fehlern im Programm. [

War das Programm auf Anhieb fehlerfrei, ist es eine gute Übung, absichtlich ein paar Fehler in den Quelltext des Hallo-Welt-Programms einzubauen, um den Umgang mit Fehlermeldungen zu erlernen: Quelldatei bearbeiten, speichern, übersetzen, wieder ändern, speichern, übersetzen bis ohne Übersetzungsfehler, Programm starten. Erzeugt das Programm nicht die gewünschte Ausschrift, wieder ändern und so weiter. Wir nennen dies den Edit-Compile-Run-Zyklus.5

stateDiagram
Edit --> Compile
Compile --> Edit: Syntaxfehler
Compile --> Run: erfolgreich
Run --> Edit: anderes Programmverhalten?

Gab es Fehlermeldungen? Lies diese. Was ist schiefgegangen?

  • Der Compiler g++ konnte nicht gefunden werden? Dann überprüfe die Installation des Compilers.
  • Welche Version des Compilers ist auf dem Rechner installiert? Finde es mit dem Befehl g++ --version heraus.
  • Wurde der Quelltext nicht gefunden? In welchem Verzeichnis steht er?
  • g++ startete, gab aber viele, kryptische Meldungen aus? Versuche die Fehlermeldung zu lesen und zu verstehen. Überprüfe den Quelltext im Editor. Die Fehlermeldungen des Compilers melden die Zeile, in welcher der Fehler bemerkt wurde. Vielleicht ist nur ein einzelnes Zeichen vertippt. Finde es. Im besten Falle zeigt er sogar das entsprechende Zeichen an und macht Änderungsvorschläge. Allerdings kann der Fehler in Zeilen auch oberhalb der Fundstelle liegen. Eventuell sogar in einer anderen Datei, die per #include … eingebunden wurde.

Selbst bei korrektem Quelltext kann kein ausführbares Programm erstellt werden, wenn eine Bibliothek nicht vorhanden ist. Erkennbar sind solche Fehler als linker error. Der Befehl println() kann in g++14 und g++15 nur in Verbindung mit der „experimentellen“ Bibliothek libstdc++exp aufgerufen werden:

g++ -std=c++23 hello23_ohne_module.cpp -lstdc++exp -o hello23_ohne_module

Dazu ist der Sprachstandard C++23 anzugeben. Ohne diese Angabe nutzt g++15 den Sprachstandard C++17.

Um modulares C++ mit g++15 zu übersetzen, sind zwei Befehle notwendig.

g++ -std=c++23 -fmodules -fsearch-include-path -fmodule-only -c bits/std.cc
g++ -std=c++23 -fmodules hello_modular.cpp -lstdc++exp -o hello_modular

Der erste Befehl dauert ein wenig, muss aber nur einmal ausgeführt werden. Er legt für den Compiler lesbare Informationen über das Modul std in einem Ordner gcm.cache ab. Dafür läuft der zweite Befehl dann schneller. Beide Befehle müssen die gleiche Sprachversion (Sprachstandard C++23 oder höher) nutzen.

Mit g++16 lassen sich beide Schritte in einem Zug erledigen:

g++ -std=c++23 -fmodules --compile-std-module hello_modular -o hello_modular.cpp

Unter Linux kann auf die Angabe -lstc++expverzichtet werden.

Aufgaben

  1. Ist auf deinem System ein C++-Compiler vorhanden?
  2. Andernfalls informiere dich, wie du einen C++-Compiler installieren kannst.
  3. Teste ihn.

Entwicklungsumgebung, Build-Werkzeug oder CMake?

Die Kommandozeilenbefehle für modernes C++ sehen kompliziert aus. Geht es einfacher?

Eine Integrierte Entwicklungsumgebung (IDE) kann ebenfalls zum Entwickeln genutzt werden. Das hat Vorteile, bindet aber an eine bestimmte Plattform und erfordert aber einen erheblichen Aufwand zur Einarbeitung. Dieser Weg wird hier nicht verfolgt.

Für kleine Programme, die nur aus einer Quelldatei programm.cpp bestehen, genügt zum Erstellen der Kommandozeilenbefehl make programm. Für komplexere Aufgaben braucht es dann ein Skript oder ein Makefile. Deren Inhalte sind aber je nach Betriebssystem und Compiler unterschiedlich. Der Build-Generator CMake erzeugt aus Steuerdateien namens CMakeLists.txt passende Makefile-Dateien für das Build-Werkzeug make, Steuerdateien für ninja oder Projektdateien für gängige Compiler. Entscheide selbst, wann es Zeit ist, dieses Werkzeug zu nutzen.

Zeitreisen mit Git

Stelle dir folgende Situation vor: Ein Programm lief erfolgreich und korrekt. Nun soll eine Neuerung eingebaut werden. Leider ist das schwieriger als gedacht. Im Quelltext wurde viel geändert. Das Programm wird nun nicht mehr übersetzt oder zeigt fehlerhaftes Verhalten. Es gelingt auch nicht, die Änderungen zurückzunehmen. Wäre jetzt nur eine ältere Dateiversion vorhanden!

Das ist eine typische Aufgabe für ein Versionskontrollsystem wie git. Entwicklungsstände werden gespeichert und können jederzeit zurückgeholt werden. Es ist sogar möglich, mehrere Versionen desselben Programms zu verwalten und Fehlerbehebungen in diese Versionen einzupflegen.

Zudem können mehrere Entwickler parallel auf verschiedenen Rechnern an einem Projekt zusammen arbeiten, wenn sie Zugriff auf ein verteiltes Versionskontrollsystem im Netz haben.

Backup

Ein Versionskontrollsystem ist noch kein Backup. Sicherungskopien schützen vor Datenverlust durch Hardwarefehler, Softwarefehler und menschliche Irrtümer. Wer mit Computern arbeitet, sollte eine Sicherungsstrategie haben. Das gilt nicht nur für Programmierer. Die Grundregel lautet: Sichere nie im selben Bombentrichter. Also nicht auf derselben Festplatte, im selben Computer, im selben Haus, … Der Sicherungsaufwand sollte der Wichtigkeit der Daten und dem Wiederherstellungsaufwand angemessen sein. Wie groß ist der Bombentrichter?

Aufgaben

  1. Wo ist ein geeigneter Speicherort für deine Dateien?
  2. Finde Werkzeuge zur automatischen (täglichen, wöchentlichen, …) Datensicherung.

Anmerkungen

  1. Die überwiegende Zahl von Computern läuft unter diesem System. Daher ist anzunehmen, dass viele Neulinge damit arbeiten.

  2. UTF-8-Kodierung erlaubt das Schreiben von Zeichen vieler (fast aller?) Sprachen, während sonst übliche Zeichensätze (Windows: ANSI, Linux: ISO-Latin-1) nur 256 verschiedene Zeichen erlauben.

  3. Repetitive-Strain-Injury-Syndrom, „Mausarm“

  4. Die Katze hat meine Dateien gelöscht.

  5. Ingenieure würden die Programmiertätigkeit so beschreiben: Nimm einen leeren Quelltext und beginne zu debuggen.