D-Programmierung: Das erste Programm

Das erste Programm Bearbeiten

Zu Beginn stelle ich Ihnen ein sehr einfaches Programm vor: Das berühmte Hello-World-Programm. Bekannt wurde es das erste Mal durch das Buch „The C Programming Language“ von Kernighan und Ritchie. Seit dem wurde es in tausenden von Programmierbüchern, als das erste Programm vorgestellt und wahrscheinlich schon von Millionen von angehenden Programmierern geschrieben. Auch ich möchte diese Tradition nicht brechen, oder gar Ihnen dieses Stück Geschichte vorenthalten.

Das Programm ist einzig und allein dafür da in die Konsole den Text: Hello, World! zu schreiben. Worauf Sie im Allgemeinen achten sollten, ist dass die Sprache D zwischen Groß- und Kleinschreibung unterscheidet. Das ist keine Selbstverständlichkeit, es gibt Sprachen wie z.B. BASIC oder Pascal, wo es egal ist, wie man schreibt.

Öffnen Sie jetzt Ihren Editor/IDE (oder was Sie verwenden um Text-Dateien zu erstellen) und fangen Sie an, Zeile für Zeile, den Quelltext einzutippen:

Mit Phobos:

 import std.stdio;
 
 void main()
 {
    writefln("Hello, World!");
 }

Mit Tango:

 import tango.io.Console;

 void main()
 {
   Cout("Hello, World!").newline;
 }

Speichern Sie jetzt die Datei irgendwo unter dem Namen hello.d Öffnen Sie die Konsole in diesem Verzeichnis. Wenn Du den D-Compiler richtig installiert hast, dann gib dort folgende Zeile ein:

dmd hello.d

Dadurch versucht der Compiler die Quelltext-Datei zu kompilieren und gleichzeitig zu linken.Sollten hier Fehlermeldungen erscheinen, so haben Sie etwas im Quelltext falsch eingegeben.

Wenn Sie aber alles richtig gemacht haben, so sollte jetzt im selben Verzeichnis, in dem sich auch hello.d befindet eine ausführbare Datei mit dem Namen hello.exe liegen. Alle anderen Dateien, die dabei auch erzeugt wurden, können Sie getrost löschen.

Wenn Sie das Programm direkt vom Windows ausführst lassen, werden Sie das Programm wahrscheinlich gar nicht wahrnehmen, dass überhaupt etwas geschehen ist, weil das Programm am Ende beendet und das Fenster sehr schnell geschlossen wird. Damit Sie die Auswirkungen Ihres Schaffens mitbekommen, starten Sie die Konsole. Wechseln Sie in das entsprechende Verzeichnis und geben Sie in die Konsole folgendes ein:

hello

Als Ausgabe sollten Sie, wie erwartet, folgendes sehen:

Hello, World!

Da Sie jetzt wahrscheinlich wissen wollen, was all die Wörter und Zeichen bedeuten, die Sie eingetippt haben, folgt hier die Erklärung.

 import std.stdio;
 import tango.io.Console;

import weist darauf hin, dass eine Bibliothek importiert werden soll. Danach folgt der Name der Bibliothek. Da bei diesem Programm die Ausgabe in der Konsole gebraucht wird, muss eine entsprechende Funktion gefunden werden. Sie befindet sich in der Bibliothek namens std.stdio bzw. tango.io.Console.

 void main()

Das ist die Funktion, die beim Programmstart aufgerufen wird. Sie sollte bei jedem Programm vorhanden sein.

 {

Mit einer geschweiften Klammer beginnt der Funktionskörper. Er enthält zwischen den geschweiften Klammern Befehle, die ausgeführt werden müssen. Am Schluss steht natürlich die Schlussklammer }.

 writefln("Hello World!");

Hier wird die Funktion mit dem Namen writefln() aufgerufen. Sie gibt einen Text in der Konsole aus. Innerhalb der runden Klammern sind die Parameter, die an die Funktion übergeben werden. Hier wird nur ein Text ausgegeben. Text wird in Programmierer-Sprache Zeichenkette genannt oder String auf Englisch. Eine Zeichenkette muss immer innerhalb von "-Zeichen stehen.

oder

 Cout("Hello, World!").newline;

In Tango ist die Ausgabe etwas komplizierter, die Ausgabe von "Hello, World!" ist äquivalent zu der Phobos Variante. Bei Tango kann man Ausgaben hintereinander hängen in diesem Fall wird per .newline noch eine Leerzeile eingefügt. Bei Phobos passiert das automatisch, das ln in writefln steht für Line und heißt, dass diese Funktion automatisch eine Leerzeile anhängt.


Nach der geschlossenen Klammer folgt ein Semikolon. Das ist immer erforderlich um einen Befehl abzuschließen. Das hat aber auch den Vorteil, dass man einen Befehl nicht unbedingt in einer Zeile schreiben muss.

Vertiefung und Aufgaben Bearbeiten

Die Übungsaufgaben sind am Anfang nicht besonders anspruchsvoll. Aber so lernst Du welche Änderungen was bewirken. Als Grundlage für die Aufgaben dient der Quelltext von hello.d.

Formatierung Bearbeiten

Leerzeichen (auch Tabulatoren und Zeilenumbrüche) werden ignoriert, solange sie ein Wort nicht in zwei oder mehr Wörter aufteilen. Die Formatierung, die ich verwende ist nicht zwingend notwendig. Aber es ist besser sich irgendeine anzugewöhnen. Zum Beispiel ist es lesbarer jede Anweisung in eine eigene Zeile zu schreiben. Außerdem sollte der Quelltext innerhalb der geschweiften Klammern, auch Anweisungsblock genannt, eingerückt werden.

Deswegen besteht die erste Aufgabe darin, an möglichen (und unmöglichen) Stellen Leerzeichen und Umbrüche einzufügen und die Auswirkungen davon zu beobachten.

Hier noch ein funktionsfähiges Beispiel zur Inspiration:

 import 
 std.stdio;
 
 void 
 main
 (
 ){
 writef
 (
 "Hello world!"
 )
 ;}

Du könntest z.B. einzelne Wörter (die Zeichenkette auch) voneinander trennen und was passiert.

Mehr als nur ein Befehl Bearbeiten

Verändere den Quelltext von hello.d, so dass writefln() einen anderen Text ausgibt. Versuche dabei mehrere writef()-Aufrufe zu schreiben, auch mit verschiedenen Texten.

Was fällt dir auf, wenn du versuchst mehrzeiligen Text zu schreiben, oder Anführungsstriche auszugeben?

Mehrzeiligen Text ausgeben Bearbeiten

Wie Du in der vorherige Aufgabe festgestellt hast, ist es nicht möglich "-Zeichen in die Konsole zu schreiben. Denn wenn Du es auf diese Weise schreibst: "Und er sprach: "Es werde Licht".", merkst Du (spätestens beim Kompilieren), dass da was falsch ist.

Damit es aber trotzdem machbar ist, gibt es in D mehrere Alternativen. Um am Anfang nicht den Überblick über die scheinbar endlosen Befehle und Regeln zu verlieren, werde ich Dir vorerst nur eine Regel beibringen, die in den meisten Fällen ausreichend ist. Viele Sprachen haben auch nur diese eine, die anderen kannst du selbst dann in der Dokumentation nachlesen.

Die Lösung des Problems heißen Escape-Sequenzen. Sie werden mit einem \-Zeichen eingeleitet. Was danach folgt, wird auf besondere Weise behandelt. Das heißt, wenn Du die zwei inneren Anführungsstriche durch \" ersetzt, so wird der Quelltext als fehlerlos akzeptiert. Die \-Zeichen werden natürlich nicht angezeigt. Was ist, wenn Du aber genau das \-Zeichen anzeigen lassen willst? Glücklicherweise gibt es noch mehr solcher Escape-Sequenzen:

Sequenz Bedeutung
\' Stellt ein ' dar. Innerhalb von "" kannst Du das Apostroph auch normal einfügen.
\" "
\\ \
\n Zeilenvorschub
\r Carriage-Return. Das heißt, nach diesem Zeichen werden alle darauf folgenden, wieder am Anfang der Zeile geschrieben. Beispiel: "hello\rworld" ergibt als Ausgabe: world

Anmerkung: Unter Windows werden Zeilenumbrüche durch \r\n Zeichen dargestellt. Die meisten anderen Betriebssysteme begnügen sich nur mit einem \n.

Zur Veranschaulichung: Mit \r wird der Cursor an den Anfang der Zeile verschoben. Der Text der danach kommt überschreibt den vorhergehenden.

Um ein konkretes Beispiel zu geben, öffne einen Editor, schreibe einen x-beliebigen Text. Setze den Cursor an den Anfang der Zeile und drücke die [Einf]-Taste. Gebe schließlich erneut irgendeinen Text ein. Der vorherige wird nun überschrieben.

Um bei dieser Analogie zu bleiben: \n bewegt den Cursor eine Zeile nach unten.

\b Löscht das vorherige Zeichen. (Nur eins)
\? Stellt das Zeichen ? dar. Dazu ist aber zu sagen, dass dies auch ohne \ funktioniert.
\t Tabulator

Es gibt noch viele Befehle mehr, aber manche haben unter Windows keine Auswirkungen. Um andere zu erklären, muss ich noch weiter in die Theorie über Zeichenketten und ihre Darstellung im Speicher einsteigen. Dazu werde ich zu einem späteren Zeitpunkt kommen.