Übung 1: Entwicklungsumgebung

In dieser Übung zeigen wir, wie man eine Programmierumgebung in VSCode einrichtet. Außerdem zeigen wir, wie die IDE dir beim Kompilieren, Ausführen und Debuggen deines Codes unterstützen kann.

Diese Anleitung ist für alle gedacht, die noch keine fertige Programmierumgebung haben oder mit ihrer einfach nicht zufrieden sind und etwas Neues ausprobieren möchten. Fühle dich frei, etwas anderes zu tun, sei es eine andere IDE wie CLion oder einen einfachen Texteditor zu verwenden. Sei dir aber bewusst, dass wir dir dann vielleicht nicht so gut helfen können. Versuche auf jeden Fall sicherzustellen, dass du einen Debugger verwenden kannst.

VSCode und Extensions

If you didn’t already, get VS Code: Hole dir VSCode, falls du es noch nicht getan hast:

https://code.visualstudio.com/

Konkrete Schritte könnten von deinem Betriebssystem abhängen.

Falls du mit Windows arbeitest, wirst du dir vielleicht das Windows Subsystem für Linux (WSL) besorgen wollen, mit dem du eine Linux-Shell von Windows aus starten kannst:

https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-vscode

Ich persönlich finde die Arbeit mit einer Unix-Shell viel angenehmer, und viele Open-Source-Projekte sind von vornherein für Linux entwickelt worden. Davon abgesehen, solltest du auch mit einer reinen Windows-Umgebung gut zurechtkommen. Die Entscheidung ist also allein dir überlassen.

VSCode hat keine eingebauten C-Tools. Mit der “C/C++ Extension Pack”-Erweiterung erhaltest du alle Funktionen, die wir benötigen werden.

TODO insert pictures

Code Schreiben

Öffne nun einen leeren Ordern in VSCode.

TODO insert picture

Erstelle eine Datei und nenne sie “hallo.c”.

TODO insert picture

…und füge die folgenden Codezeilen ein:

#include <stdio.h>

int main(){
    printf("Hello World.\n");
}

Code “Bauen”

Zu den Erweiterungen, die wir in den vorherigen Schritten installiert haben, gehört auch CMake. Wir werden die CMake-Tools von VSCode verwenden, um unsere Projekte zu kompilieren. Im Folgenden findest du eine kurze Zusammenfassung dessen, was CMake genau nutzt.

Wie du vielleicht schon weisst, ist eine Quellcodedatei dazu gedacht, für Menschen lesbar zu sein, nicht für Maschinen. Wenn wir versuchen würden, C-Code direkt als Programm auszuführen, wäre der Inhalt der Datei für die CPU nur ein Haufen Unsinn. C-Quellcode muss daher in ein anderes Programm, einen Compiler, eingespeist werden, dessen Aufgabe es ist, korrekten C-Code in Maschinencode zu übersetzen, d.h. zu kompilieren.

Der einfachste Weg, um diesen Code zu kompilieren, ist dieser Befehl (zumindest auf Linux):

gcc hello.c 

Solange wir nur mit ein paar Dateien arbeiten und unser Projekt klein bleibt, ist dies eine völlig akzeptable Methode zum Kompilieren von Code. Die meisten Projekte sind jedoch komplexer als das. Es kann vorkommen, dass man eine große Anzahl von Quellcodedateien hat, von denen einige vielleicht für ganz verschiedene Zwecke wie Tests oder eine andere Plattform gedacht sind. Das korrekte Kompilieren kann schnell komplexer werden als das Schreiben des Codes selbst.

Für diesen Zweck gibt es das Werkzeug make. Dies ist weder der richtige Zeitpunkt, noch der richtige Ort, um eine ausführliche Diskussion über make zu führen. Im Wesentlichen stützt sich make auf Makefiles, das sind Dateien, in denen ein Entwickler beschreiben kann, welcher Compiler-Befehl ausgeführt werden muss, um den Code wie gewünscht zu kompilieren. Ironischerweise kann ein Makefile auch ziemlich komplex werden, und genau hier kommt CMake ins Spiel. CMake kann verwendet werden, um automatisch Makefiles zu erzeugen.

C-Compiler, Make und CMake sind allesamt ein ganz eigenes Metier. Indem man sich mit ihnen beschäftigt und sie versteht, kann man eigentlich nur ein besserer C-Entwickler werden. Für diese Woche ist jedoch geplant, CMake einzurichten, sodass wir unsere Projekte einfach per Knopfdruck in unserer IDE “builden” können.

Lade dafür die Datei CMakeLists.txt herunter und füge sie deinem Projektordner hinzu.

TODO add CMakeLists.txt Download button

Diese Datei enthält das absolute Minimum, damit dein Projekt kompiliert werden kann. Benutze nun den “Build”-Button unten links in der IDE. Dies sollte den Code kompilieren.

TODO insert picture

Solltest du den Code ändern, muss der “Build”-Knopf erneut gedrückt werden, sodass keine veraltete Version des Programms verwendet wird.

Die CMakeLists.txt enthält ein paar Hinweise, wodurch man das Projekt leicht um weitere Quelldateien erweitern kann. Werfen darauf einen Blick und spiele ein bisschen damit herum.

Wenn du mehr über CMake wissen willst, und wie man eine CMakeLists.txt schreibt, die deine Bedürfnissen am besten umsetzt, schaue dir diese Links an:

https://cmake.org/cmake/help/latest/guide/tutorial/index.html https://cliutils.gitlab.io/modern-cmake/ https://github.com/microsoft/vscode-cmake-tools/blob/main/docs/README.md https://www.youtube.com/watch?v=_yFPO1ofyF0&list=PLK6MXr8gasrGmIiSuVQXpfFuE1uPT615s

Ausführen und Debuggen

Im letzten Schritt haben wir eine ausführbare Binärdatei für unser kleines Projekt erstellt. Wir schauen uns nun an, wie wir unser Programm von VSCode aus ausführen und debuggen können.

Wähle “Ausführen und Debuggen” im linken Panel.

TODO insert picture

Wähle dann “create a launch.json file”.

TODO insert picture

Füge die folgende Konfiguration ein:

{
    "name": "hello debug",
    "type": "cppdbg",
    "request": "launch",
    "program": "${workspaceFolder}/build/Hello",
    "args": [],
    "stopAtEntry": false,
    "cwd": "${fileDirname}",
    "environment": [],
    "externalConsole": false,
    "MIMode": "gdb",
    "setupCommands": [
        {
            "description": "Enable pretty-printing for gdb",
            "text": "-enable-pretty-printing",
            "ignoreFailures": true
        }
    ]

}

Du solltest nun in der Lage sein, “hello debug” aus dem “run and debug” Dropdown-Menü auszuwählen. Starte das Programm.

TODO insert picture

Wer hätte es gedacht: das Programm gibt “Hello World” aus!

Zu guter Letzt wollen wir noch einen kurzen Blick auf den Debugger werfen. Öffne die Datei hello.c und setze einen Breakpoint in der Zeile mit der printf-Anweisung.

TODO insert picture

Wenn wir das Programm nun erneut ausführen, wird es vor der Ausführung der Codezeile, in der sich der Breakpoint befindet, pausieren.

Ein Debugger ist ein unglaublich mächtiges Entwicklungswerkzeug. Wir werden hier nur das Notwendigste zu seiner Verwendung überfliegen. Wir empfehlen dir zwar, mehr über das Debugging zu lesen, aber dies ist bereits eine große Hilfe, die dir unglaublich viel Zeit sparen wird.

Auf der linken Seite ist diese (etwas leere) Box:

TODO insert picture

Im Moment haben wir noch keine Variablen. Sollten wir unser Programm so ändern, dass es Variablen verwendet, werden wir eine Übersicht über unsere Variablen und deren Inhalt sehen können.

Außerdem wird die IDE während der Ausführung dieses kleine Fenster einblenden:

TODO insert picture

Die wichtigste Taste für dich ist die “Step Over” Taste, mit der du dein Programm Schritt für Schritt ausführen kannst. Wenn du ihn drückst, wirst du sehen, dass die printf-Anweisung ausgeführt wird und das Programm beendet wird.

Lese hier mehr über Run Konfigurationen und den Debugger:

https://code.visualstudio.com/docs/editor/debugging https://code.visualstudio.com/docs/cpp/launch-json-reference