Zum Inhalt springen
Topos Uranos

Zusammenfassung

Diese Lektion legt die Arbeitsweise fest, der der Kurs bis zum Ende folgen wird. Sie beschreibt den Zyklus aus Bearbeiten, Speichern, Kompilieren, Ausführen und Lesen und erklärt, warum es sich lohnt, einen Fehler in der frühestmöglichen Phase zu entdecken; sie stellt den Kompilierbefehl vor, den der Kurs empfiehlt, und was jede seiner Optionen bewirkt; sie zeigt, wie man den Zyklus im Terminal durchläuft und wie man Visual Studio Code so konfiguriert, dass es mit denselben Optionen kompiliert; sie lehrt, in der Ausgabe des Compilers einen Fehler von einer Warnung zu unterscheiden und die Zeile zu finden, auf die sie sich beziehen; sie stellt die Sanitizer vor, die das Programm anhalten, wenn es in bestimmte Fälle undefinierten Verhaltens gerät, und die Zeile angeben; und sie bereitet die Konsole darauf vor, Akzente und das ñ anzuzeigen.

Lernziele

  1. Ein Programm im Terminal mit den Kursoptionen (-std=c++23 -Wall -Wextra und den übrigen) kompilieren, die ausführbare Datei mit -o benennen und sie ausführen.
  2. Visual Studio Code so konfigurieren, dass es mit denselben Optionen wie das Terminal kompiliert und die Warnungen in seinem Bereich „Probleme“ anzeigt.
  3. In der Ausgabe des Compilers einen Fehler von einer Warnung unterscheiden, die Option nennen, die jede Warnung erzeugt hat, und die Zeile finden, auf die sie sich bezieht.
  4. Die Sanitizer für Speicherfehler und für undefiniertes Verhalten aktivieren und in ihrem Bericht die Art des Fehlers und die Zeile erkennen, in der er auftrat.
  5. Diagnostizieren, warum eine Ausgabe seltsame Symbole statt Akzenten und ñ zeigt, und den Editor und die Konsole so konfigurieren, dass diese richtig erscheinen.

Der Arbeitszyklus

Ein Programm zu schreiben ist kein einmaliger Akt, sondern ein Zyklus, der sich in einer einzigen Sitzung dutzende Male wiederholt. Er hat fünf Zeitpunkte: Der Quellcode wird bearbeitet; die Datei wird gespeichert, denn der Compiler liest die Festplatte und nicht den Bildschirm des Editors; es wird kompiliert, das heißt, der Compiler wird gebeten, die Datei in eine ausführbare Datei zu übersetzen; das Ergebnis wird ausgeführt; und alles, was der Compiler und das Programm geschrieben haben, wird aufmerksam gelesen. Das Gelesene führt zu einer neuen Bearbeitung, und der Zyklus beginnt von vorn.

Der letzte Zeitpunkt ist der am meisten vernachlässigte und der wichtigste. Die Prämisse ist einfach: Ein Defekt ist umso teurer zu beheben, je später er entdeckt wird. Zeigt ihn der Compiler an, weiß man, in welcher Zeile und fast immer, warum; zeigt er sich bei der Ausführung, weiß man nur, dass etwas schiefgegangen ist; zeigt er sich Wochen später mit anderen Daten, erfährt vielleicht niemand je die Ursache. Daraus folgt, dass man Defekte so früh wie möglich entdecken sollte und dass der Compiler als erster Prüfer des Programms zu behandeln ist: ein unermüdlicher Leser, der, gut konfiguriert, vor viel mehr warnt als vor Tippfehlern.

Diese Lektion konfiguriert diesen Prüfer auf drei Ebenen: die Fehler, die verhindern, dass die ausführbare Datei entsteht; die Compilerwarnungen, die sie entstehen lassen, aber verdächtigen Code anzeigen; und die Sanitizer, die das Programm während der Ausführung überwachen. Sie setzt voraus, dass Compiler und Editor installiert sind (Lektion 1.3). Die Beispiele verwenden Variablen und if-Anweisungen, die in den Lektionen 2.1 und 4.1 erklärt werden; hier genügt es, sie zu lesen.