Programmieren lernen – Teil 10 (Hallo Welt!)

In diesem Artikel werden wir endlich unser erstes Programm mit Java erstellen, übersetzen und ausführen.

“Hallo Welt!” auf der grünen Wiese

Wir wenden uns wieder dem Vergleich mit der grünen Wiese zu. Wir wollen ein ganz neues Programmier-Projekt starten, das “Hallo Welt!”-Projekt. Wir stehen also hier auf der Wiese, nichts ist weit und breit zu sehen. Das bedeutet, dass wir einen neuen, leeren Unterordner in unserem bereits angelegten “Projekte”-Ordner anlegen. Dieses neue Verzeichnis nennen wir beispielsweise “Hallo_Welt”. Dann stellen wir den Zaun auf, in den nur wir als Programmierer hinein dürfen. Hiermit ist gemeint, dass wir in unserem bisher leeren Verzeichnis eine neue Textdatei anlegen. Das machen wir, indem wir einen Editor öffnen und von da aus die “Speichern”-Funktion ausführen. Diese neue Datei soll “HalloWelt.java” heißen. “HalloWelt” beschreibt, worum es in dieser Datei geht, und “.java” macht klar, dass es sich hierbei um Befehle in der Programmiersprache Java handelt.

Output mit Schreibmaschine und Greifarm

Was hat es mit dem “Hallo Welt!”-Programm auf sich? Um bei unserem Vergleich zu bleiben, ist “Hallo Welt!” folgendermaßen zu verstehen: Wir bauen uns innerhalb des Zauns eine Konstruktion zurecht, die, vielleicht mit einem Roboter an einer Schreibmaschine, “Hallo Welt!” auf ein Stück Papier tippt. Ein Greifarm nimmt dann das Papier von der Schreibmaschine und legt es auf das Output-Förderband, das Dinge durch eine der beiden Lücken im Zaun nach draußen transportiert. Diese Aufgabe (Papier beschriften und auf das Förderband legen) wird genau dann ausgeführt, wenn der Benutzer außen den roten Knopf betätigt.

Aus Sicht des Benutzers ist dies ja alles in allem schon eine recht interessante Maschine: Er drückt auf den Knopf, und ein Stück “Hallo Welt!”-beschriftetes Papier kommt heraus. Man könnte also sagen, das Programm begrüßt die Welt auf Knopfdruck. Der Benutzer kann so oft auf den Knopf drücken, wie er möchte. Da es Zauberpapier ist, wird es nie ausgehen, und auch der Roboter wird nie des Tippens müde. Es wird immer wieder ein Stück “Hallo Welt!”-Papier herauskommen.

Java-Befehle schreiben

Hier kommen wir nun also zu den ersten Java-Befehlen (die Zeilennummern gehören nicht dazu, nur der Text):

1
2
3
4
5
public class HalloWelt {
    public static void main(String[] args) {
         System.out.println("Hallo Welt!");
    }
}

Wie versprochen werde ich alle Details des Programmierens, also auch diese ersten fünf Zeilen Java-Befehle, Zeichen für Zeichen, Wort für Wort, ganz genau und in allen Einzelheiten erklären. Es ist ganz normal, dass das wie verrücktes Kauderwelsch aussieht, wenn man der Sprache Java noch nie begegnet ist. Aber im Laufe der nächsten Artikel wird das alles klar und absolut verständlich werden. Versprochen!

Fürs Erste müssen wir diese fünf Zeilen Java-Befehle allerdings ohne Kenntnis deren genauer Bedeutung mit dem Editor in die Textdatei “HalloWelt.java” schreiben und speichern die Datei ab.

Die Java-Befehle übersetzen

Wir wollen nun diese Java-Befehle, bzw. die Datei, in der sie abgespeichert sind, übersetzen, und zwar in die Java-Zwischensprache.
Für den Anfang gibt es hierfür eine einfache Möglichkeit. Und zwar haben wir ja das JDK installiert, bei dem Werkzeuge dabei sind, die ein Programmierer für seine tägliche Arbeit braucht. Eines dieser Werkzeuge ist genau für die Arbeit gedacht, die wir gerade vor uns haben, und zwar ein Java-Übersetzungs-Programm. Dieses Programm, das man “Übersetzer” oder “Compiler” nennt, ist ein Kommandozeilen-Programm. Es wurde mit dem JDK auf dem Computer installiert und wird deshalb nicht Kommando genannt, weil es nicht von Anfang an in der Kommandozeile verfügbar war.

Um unsere Java-Datei zu übersetzen, müssen wir zuerst mit dem Kommando “cd” in das Verzeichnis unseres Projektes navigieren. Die Kommandos, die man jetzt ausführen muss, sind natürlich immer unterschiedlich, je nach dem wo man gerade in der Konsole “steht” (welches das aktuelle Arbeitsverzeichnis in der Konsole ist) und wo wir das Projekte-Verzeichnis angelegt haben.

Windows Gehen wir davon aus, dass in Windows das aktuelle Arbeitsverzeichnis in der Kommandozeile gerade folgendes ist (ausgehend davon, dass der angemeldete Windows-Benutzer “Stefan” heißt):

C:\Dokumente und Einstellungen\Stefan

Dann würde man mit den folgenden Kommandos zu unserem “Hallo Welt!”-Projektordner gelangen, vorausgesetzt natürlich, dieser wurde schon angelegt, und zwar in “Eigene Dateien” (z. B. mit dem Windows-Explorer):

cd Eigene Dateien
cd Projekte
cd Hallo_Welt
Linux, MacOS Unter Linux und MacOS gehen wir davon aus, dass das aktuelle Arbeitsverzeichnis das Home-Verzeichnis ist. Ein “pwd”-Kommando würde dann folgendes ausspucken (ausgehend davon, dass der angemeldete Benutzer gerade “Stefan” heißt):

/home/Stefan

Dann würde man mit den folgenden Kommandos zu unserem “Hallo Welt!”-Projektordner gelangen, vorausgesetzt natürlich, dieser wurde schon angelegt, und zwar im Home-Verzeichnis (z. B. mit einem Datei-Manager wie Nautilus in Linux mit Gnome, dem Konquerer unter Linux mit KDE oder Finder unter MacOS):

cd Projekte
cd Hallo_Welt

Wenn wir jetzt in dem “Hallo_Welt”-Ordner stehen, dann müsste ein “dir” bzw. ein “ls” uns genau eine Datei anzeigen, und zwar “HalloWelt.java”. Diese hatten wir zuvor mit dem Editor hier abgespeichert.

Jetzt ist nur noch eine weitere Eingabe nötig, um die Übersetzung vorzunehmen:

javac HalloWelt.java

Erklärung: “javac” ist das Java-Übersetzungs-Programm, von dem weiter oben die Rede war. “javac” steht für “java compiler” (“Java Übersetzer”). Nach einem Leerzeichen muss der volle Name der Datei angegeben werden, die wir übersetzen wollen (“HalloWelt.java”). Hat dies ohne Fehlermeldung funktioniert, sehen wir nach einem “dir” bzw. “ls”, dass plötzlich eine zweite Datei zu der von uns erstellen Datei “HalloWelt.java” hinzu gekommen ist. Diese Datei heißt “HalloWelt.class”. Sie wurde vom Compiler “javac” angelegt. Unsere Ursprungs-Datei “HalloWelt.java” wurde vom Compiler nicht verändert und liegt nach wie vor an der Stelle, an der wir sie angelegt haben.
Übrigens kann dieser Übersetzungs-Schritt beliebig oft durchgeführt werden. Die .class-Datei wird dann dabei immer wieder überschrieben.

Die Zwischensprache

Die neue Datei “HalloWelt.class” ist die übersetzte Variante von “HalloWelt.java”. Spaßeshalber können wir die neu angelegte .class-Datei einmal mit dem Editor öffnen. Wie bereits gelernt, arbeitet man bei Java so, dass die Java-Befehle erst in eine Zwischensprache und dann in Maschinensprache übersetzt werden. Dieser soeben getätigte Schritt mit dem Compiler war der Übersetzungs-Vorgang von Java nach Zwischensprache. Im Editor sehen wir, dass wir nichts sehen. Unschwer ist zu erkennen, dass schon diese Zwischensprache nichts mehr ist, was ein Mensch verstehen können soll oder muss. Mit den vielen Sonderzeichen und unleserlichen Blöcken ähnelt die Zwischensprache viel mehr der Maschinensprache als unseren Java-Befehlen.

Das Programm ausführen

Nun also ist jetzt noch das zu tun, worauf wir die ganze Zeit schon gewartet haben. Wir wollen uns in die Rolle eines Benutzers begeben und bei unserer “Hallo Welt!”-Konstruktion auf den roten Knopf drücken. Dies geschieht, wenn wir folgendes in der Kommandozeile eingeben:

java HalloWelt

Achtung: Diesmal lautet das Programm, dass wir starten nicht “javac”, sondern “java”. Und wir schreiben nach “java” genau “HalloWelt”, nicht etwa “HalloWelt.java”, oder HalloWelt.class”. Wenn wir bis zu dieser Stelle alles richtig gemacht haben, sollte nach unserer Eingabe von gerade eben genau folgendes in die Kommandozeile geschrieben werden:

Hallo Welt!

Danach müsste in der Konsole der blinkende Cursor wieder auf neue Eingaben warten. Ein kleiner Schritt für einen Benutzer, aber ein großer Schritt für die Programmierer-Menschheit!

Was ist hier geschehen? Das zweite Programm, das wir gerade aus dem JDK kennen gelernt haben, heißt “java”. Wie der Name vielleicht schon vermuten lässt, ist dies das zentralste und wichtigste aller Programme aus dem Java-Umfeld. Damit lassen sich Programme, die in der Java-Zwischensprache vorliegen, in einem einzigen Schritt in Maschinensprache übersetzen und sofort ausführen. Dieses Programm ist übrigens genau so auch in der JRE vorhanden, weil es auch von Benutzern gebraucht wird, die Programme lediglich ausführen wollen und deshalb kein JDK brauchen.

Benutzer und die Kommandozeile

Vielleicht ist bereits die Frage aufgetaucht, ob sich ein Benutzer zum Starten eines Java-Programms immer in die Kommandozeile begeben muss, um Dinge wie

java HalloWelt

einzugeben, um ein Programm zu starten. Diese Befürchtung liegt nahe, weil wir das ja gerade auch getan haben, und wir waren ja eben in der “Benutzer-Rolle”. Die Antwort: Nein, ein Benutzer wird das nicht tun müssen. Unser kleines Programm liegt allerdings gerade in der “Roh-Fassung” vor und lässt sich zum jetzigen Zeitpunkt nur so starten. Später allerdings, wenn es fertiggestellt ist, kann es auf einem anderen Computer installiert werden und ist dann beispielsweise über ein Anwendungs-Menü aufzurufen, wie jedes andere Programm auch.

Hallo schöne Java-Welt!

Gegen Ende dieses Artikels, bzw. nachdem das Wichtigste in diesem Artikel schon besprochen wurde, nämlich das “Hallo Welt!”-Programm, möchte ich die Gelegenheit nutzen, um zwei Kleinigkeiten zu demonstrieren, die die Punkte, die wir durchlaufen haben, vertiefen bzw. verdeutlichen sollen.

Erstens werden wir eine kleine Änderung in unserer .java-Datei vornehmen. Wir haben der Tradition zuliebe das ehrwürdige “Hallo Welt!”-Programm geschrieben und der Pflicht damit genüge getan. Jetzt aber sind wir damit fertig und verändern das Programm.

Bei genauerer Betrachtung von Zeile 3 erkennen wir die Worte “Hallo Welt!”. Es sind exakt die Worte, die beim Starten des Programms in die Kommandozeile geschrieben wurden:

1
2
3
4
5
public class HalloWelt {
    public static void main(String[] args) {
         System.out.println("Hallo Welt!");
    }
}

Wir verändern diese Zeile jetzt so, dass danach “Hallo schöne Java-Welt!” steht. Das sollte dann so aussehen:

1
2
3
4
5
public class HalloWelt {
    public static void main(String[] args) {
         System.out.println("Hallo schöne Java-Welt!");
    }
}

Was in den anderen Zeilen, bzw. vor oder nach “Hallo schöne Java-Welt!” steht, lassen wir unverändert. Dann übersetzen wir erneut mit folgender Eingabe:

javac HalloWelt.java

Und dann starten wir das Programm nochmal mit:

java HalloWelt

Das waren genau die selben Eingaben, die wir bereits getätigt haben. Jetzt sollte

Hallo schöne Java-Welt!

in die Kommandozeile geschrieben werden. Damit möchte ich wiederholt verdeutlichen, dass wir mit allem, was wir mit diesen und weiteren Java-Befehlen formulieren, bestimmen können, was unser Programm tut.

Zweitens möchte ich an dieser Stelle noch einmal den Unterschied von Programmierer und Benutzer, diesmal aber von technischer Seite her überdeutlich klarstellen. Dazu machen wir in der Kommandozeile nochmals folgende Eingabe:

java HalloWelt

Diese Eingabe machen wir in der Rolle des Benutzers, und wir sollten wieder unsere Konsolen-Ausgabe sehen. Jetzt löschen wir die Datei “HalloWelt.class”, die vom “javac”-Programm erzeugt wurde, und machen erneut folgende Eingabe:

java HalloWelt

Die exakt gleiche Eingabe erzeugt nun im Normalfall so eine Fehlermeldung:

Exception in thread "main" java.lang.NoClassDefFoundError: HalloWelt
Caused by: java.lang.ClassNotFoundException: HalloWelt
	at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
	at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301)
	at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
Could not find the main class: HalloWelt.  Program will exit.

Es wird deutlich: Ist die .class-Datei weg, kann das Programm nicht mehr wie zuvor gestartet werden, weil das Programm nicht übersetzt vorliegt.
Deswegen übersetzen wir das Programm jetzt wieder, in der Rolle des Programmierers:

javac HalloWelt.java

Die .class-Datei ist wieder da, jetzt kann ein Benutzer das Programm auch wieder mit

java HalloWelt

starten. Um das ganze noch ins Extrem zu treiben, löschen wir zu Testzwecken jetzt auch einmal die Datei “HalloWelt.java”, also unsere Java-Befehle. Normalerweise würden wir das nicht tun. In die Java-Befehle ist unsere kreative Arbeit geflossen (unsere Konstruktion!), und die ist nach dem Löschen von .java-Dateien üblicherweise verloren. Jetzt sind es allerdings nur 5 Zeilen, die in diesem Artikel ja noch einfach nachzulesen sind. Das Übersetzen mit folgender Eingabe:

javac HalloWelt.java

ist jetzt verständlicherweise nicht mehr möglich. Wir bitten das Programm “javac” uns die Datei “HalloWelt.java” zu übersetzen, diese ist aber gar nicht da: das kann nicht funktionieren. Die Fehlermeldung:

javac: file not found: HalloWelt.java
Usage: javac <options> <source files>
use -help for a list of possible options

An dieser Stelle ist aber interessant und äußerst wichtig zu wissen: In unserer Benutzer-Rolle können wir trotzdem noch das Programm starten. Die Eingabe:

java HalloWelt

sollte uns die gleiche Ausgabe wie vorher bescheren:

Hallo schöne Java-Welt!

Hier wird also klar, dass der Benutzer zum Starten des Programms lediglich die .class-Datei, also das Programm in der Zwischensprache benötigt, nicht aber die .java-Datei, unsere Java-Befehle. Eine Rückwärts-Übersetzung von Zwischensprache nach normale Java-Befehle ist übrigens nur unter äußersten Umständen und in begrenztem Umfang möglich. In vielen Fällen ist dies gar nicht gewünscht und kann deshalb auch gezielt verhindert werden.

Fazit

In diesem Artikel haben wir das “Hallo Welt!”-Programm kennen gelernt. Wir haben dazu die Java-Befehle in eine Datei geschrieben. Diese haben wir mit dem Programm “javac” übersetzt, wo wir in diesem Schritt die Java-Zwischensprache in Form einer .class-Datei erhalten haben. Mit dieser und mit dem Programm “java” konnten wir das Programm so als Benutzer starten.
Auch haben wir das Programm schon einmal verändert und neu übersetzt und ausgeführt. Des Weiteren wurde erklärt, dass ein Benutzer nur die .class-Datei braucht, um das Programm zu starten. Diese Datei kann aber nur von einem Programmierer mit “javac” aus dem JDK erzeugt werden, da nur der Programmierer die Java-Befehle in Form einer .java-Datei besitzt, und nur er das JDK installiert hat.

This entry was posted in Programmieren lernen. Bookmark the permalink.

Hinterlasse eine Antwort

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Du kannst folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="" highlight="">