Jan 27

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.

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

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.

Posted in Programmieren lernen | Leave a comment
Jan 01

Programmieren lernen – Teil 9 (Der Editor)

In diesem Artikel geht es darum, was ein Editor ist und welche Editoren es gibt. Es wird erklärt, wozu man einen Editor braucht und wie man ihn benutzt.

Der Editor

Ein Editor ist vergleichbar mit einem Textverarbeitungsprogramm (Microsoft Word, OpenOffice Writer, LibreOffice Writer). Man kann darin Text schreiben (editieren) und in Dateien abspeichern. Der Text in einem Editor ist nicht dazu gedacht, ausgedruckt zu werden. Deshalb gibt es keinen Seitenumbruch, sondern es kann beliebig weit nach unten geschrieben werden. Es ist, als wäre die Seite, auf die man schreibt, unendlich lang. Und auch in die Zeilenbreite, also nach rechts, gibt es keine Begrenzung.

Was man in einem Editor nicht macht, ist den Text zu formatieren, also etwa Schriftarten, Schriftgrößen oder Farben zu ändern. Daran erkennt man schon, dass es in einem Editor nicht um Design und Gestaltung geht, sondern rein um den Inhalt des Textes. Man nennt sie deshalb auch Texteditoren.

Meistens ist in einem Texteditor eine so genannte “nichtproportionale” Schriftart eingestellt, z. B. “Courier New”. Das bedeutet, der Buchstabe “i” ist genau so breit wie ein “m”, anders als dies bei einer “proportionalen” Schriftart der Fall ist. Der Grund hierfür ist die größere Übersichtlichkeit im Programmiersprachen-Text.

Befehle formulieren

Wir haben bereits gelernt, dass programmieren bedeutet, Befehle in einer Programmiersprache zu formulieren. Diese Befehle sagen genau aus, was der Zweck des Programms ist, was das Programm machen soll. Bisher war jedoch nicht klar, wie das genau geht: Wir müssen Befehle in der Programmiersprache Java als Text formulieren und in einem Texteditor niederschreiben. Diesen Text speichern wir dann in eine Datei ab. So können wir den Text jederzeit wieder verändern, wenn wir später eine Änderung am Programm vornehmen wollen. Genau dieser Text ist es, bzw. die Datei, in der dieser Text abgespeichert wurde, der dann in Maschinensprache, bzw. bei Java erst in eine Zwischensprache, dann in Maschinensprache, übersetzt wird.

Von Java-Befehlen zum ausführbaren Programm

So wird der Arbeitsvorgang langsam klarer: Der Programmierer schreibt Java-Befehle in einem Texteditor, speichert diese in eine Datei ab, die Datei wird in eine Zwischensprache übersetzt, an den Benutzer gegeben, der Benutzer übersetzt die Zwischensprache beim Starten des Programms automatisch in Maschinensprache, das Programm kann so ausgeführt werden.

Verschiedene Editoren

Es gibt viele verschiedene Texteditoren. Auf jedem Betriebssystem (Windows, Linux, MacOS, etc.) ist bereits mindestens ein Texteditor vorhanden, den wir für den Anfang auf jeden Fall verwenden können.

Unter Windows ist dies schlicht der “Editor”, und liegt im Programm-Menü unter “Zubehör”.
Unter Linux kommt es darauf an, welche Variante von Linux (Ubuntu, Debian, openSUSE, Fedora, etc.) und welchen Fenster-Manager (Gnome, KDE, xfce, etc.) man verwendet. Je nach dem sind dann bestimmte Editoren vorinstalliert. Unter Gnome sind dies oft “gedit”, unter KDE beispielsweise “kate”. Diese liegen zumeist in einem “Zubehör”-Menü. Es können aber unzählige weitere Editoren beispielsweise über die entsprechende Paketverwaltung nachinstalliert werden.
In MacOS kann man “TextEdit” verwenden.

Ein Beispiel-Befehl

An dieser Stelle öffnen wir zum ersten Mal einen Editor. Es ist meistens ein Fenster mit einem weißen Textbereich, der den größten Teil des Fensters einnimmt. Oben gibt es fast immer ein Menü mit Einträgen wie “Datei”, “Bearbeiten”, “Ansicht” usw…
Wie in einem Textverarbeitungsprogramm kann man auch in einem Texteditor schreiben was man möchte. Ein Editor ist nämlich nicht speziell ein Programmier-Werkzeug. Es kann auch für die Einkaufsliste, ein Tagebuch oder beliebige andere Informationen in Textform verwendet werden. Auch viele Dateien, mit denen man ein Betriebssystem verwalten kann, werden üblicherweise mit Texteditoren bearbeitet.

Tippen wir doch einfach mal einen Befehl in den Editor ein:

Computer, ich befehle Dir, addiere die Zahlen 3 und 5,
und schreibe das Ergebnis in die Kommandozeile.

Diesen Befehl haben wir nun in “Deutsch”, nicht in “Java” formuliert. Das folgt erst im nächsten Schritt. Aber immerhin steht schon ein Befehl im Editor. Und diesen wollen wir jetzt in eine Datei abspeichern. Dazu wählen wir oben im Menü den Punkt Datei > Speichern. Es öffnet sich ein “Speichern”-Fenster, weil der Editor wissen möchte, in welchem Ordner die Datei abgespeichert werden soll, und wie die Datei heißen soll.

Speicherort und Dateiname

Für jedes Programm, das wir entwickeln, sollten wir einen eigenen Ordner anlegen, weil jedes Programm auf seiner ganz eigenen grünen Wiese entwickelt wird. Alle Dateien, die mit dem Programm zu tun haben, werden in diesem Ordner abgelegt. Dazu gehören sowohl die Befehls-Dateien, die bei uns in der Programmiersprache Java geschrieben sind, als auch alle anderen Dokumente, die der Programmierer zur Erstellung des Programms benötigt. Das könnten Text- und Tabellen-Dokumente sein, die zur Planung des Programms verwendet werden. Aber es werden auch beispielsweise Grafiken und Musik-Dateien in diesem Ordner abgelegt, die dann direkt im Programm eingebaut werden, z. B. in einem Spiel.
Es gibt keine Vorgabe, wo auf dem Computer der Ordner erstellt werden muss. Ein “Projekte”-Ordner, der alle zukünftigen Programm-Projekte beinhaltet, ist eine gute Idee. Dieser könnte dann unter Windows in den “Eigenen Dateien” liegen (“Persönlicher Ordner” oder “Home” unter Linux, “Benutzerordner” unter MacOS). Also legen wir diesen “Projekte”-Ordner jetzt an. Darin legen wir noch einen Unterordner “ErstesProjekt” an. Leerzeichen in Ordnernamen, sowie auch in Dateinamen, sind zwar erlaubt, aber vor Allem bei der Arbeit mit der Kommandozeile ist dies hinderlich und schafft unnötige Probleme. Deshalb sollten wir aus Gründen der Leserlichkeit statt Leerzeichen an entsprechenden Stellen Unterstriche oder “camel case” verwenden. “Camel case” bedeutet, Wörter so zusammen zu setzen, dass innerhalb eines Wortes mit einem Großbuchstaben begonnen wird, wie bei “ErstesProjekt”.

Als Dateinamen wählen wir für unser obiges Beispiel “ZweiZahlenAddieren.deutsch” aus. “ZweiZahlenAddieren” drückt ganz einfach den Zweck des Programms mit “camel case” aus, gefolgt von “.deutsch”. Dies wird “Dateiendung” oder “Dateinamens-Erweiterung” genannt. Allgemein ist eine Dateiendung dazu gedacht, zu beschreiben, um was für eine Datei es sich handelt, ohne dass man sich den Inhalt der Datei anschauen muss. Beispiele: Einfache Text-Dateien haben oft die Dateiendung “.txt”, also z. B. “Tagebuch.txt”. Microsoft Word-Dokumente heißen fast immer “.doc”, es gibt Videos, die mit “.mov”, für “Movie”, enden. Bei Dateien, die Programmiersprachen-Befehle enthalten, hat es sich eingebürgert, dass die Datenendung die Sprache bezeichnet, die die Datei enthält. Wir werden also viel mit “.java”-Dateien zu tun haben. Die Programmiersprache “C” ist immer in “.c”-Dateien zu finden, Pascal wird in “.pas”-Dateien abgespeichert. Um diese Konvention konsequent zu verwenden, und dass wir uns jetzt schon einmal daran gewöhnen, heißt unsere Beispiel-Datei “ZweiZahlenAddieren.deutsch”, weil der Befehl in Deutsch geschrieben ist.

Dateinamens-Erweiterung in Windows anzeigen

Eine Dateiendung gehört vollständig zum Datennamen dazu. Auf Windows-Computern wird diese Dateiendung aber zum Teil ausgeblendet, d. h. sie ist u. U. im Dateibrowser “Windows Explorer” nicht zu sehen. Von unserem kompletten Dateinamen “ZweiZahlenAddieren.deutsch” wäre dann nur “ZweiZahlenAddieren” sichtbar, “.deutsch” wäre unsichtbar. Dieses irreführende Verhalten des Windows Explorers wollen wir als Programmierer nicht haben. Gut, dass es sich abschalten lässt. Zu finden ist diese Funktion in den “Ordneroptionen”, sie heißt “Erweiterungen bei bekannten Dateitypen ausblenden”. Falls der Haken aktiviert sein sollte, muss man diesen einfach wegklicken und schon werden auch unter Windows korrekterweise bei allen Dateien die Endungen dargestellt.

Fazit

Wir wissen nun, was ein Editor, bzw. ein Texteditor ist, und wozu man ihn braucht. Wir haben sogar schon eine erste Datei damit angelegt, die einen Programmiersprachen-Befehl enthält, allerdings in Deutsch, nicht in Java.

Posted in Programmieren lernen | Leave a comment
Dez 19

Programmieren lernen – Teil 8 (Die Kommandozeile)

In diesem Artikel geht es darum, was die Kommandozeile ist, wozu man sie braucht und wie man sie benutzt.

Die Kommandozeile

Jetzt endlich ist es an der Zeit, die Kommandozeile kennen zu lernen. Diese wird oft auch “Terminal” oder “Konsole” genannt, also falls diese Begriffe in Zukunft auftauchen, ist damit immer die Kommandozeile gemeint. Mit Hilfe der Kommandozeile können ganz bestimmte Programme, nämlich Kommandozeilen-Programme gestartet und bedient werden. Beispiel: Unser erstes Programm, das “Hallo Welt!”-Programm ist ein Kommandozeilen-Programm und wird deshalb im Rahmen einer Kommandozeile laufen. Rein prinzipiell könnte man ein Kommandozeilen-Programm auch außerhalb einer Kommandozeile ausführen. Nur dann wäre es dem Benutzer nicht möglich das Programm zu bedienen. Genau für diesen Zweck wird nämlich die Kommandozeile gebraucht: als Umgebung, um mit den Programmen, die in ihr laufen, Input und Output auszutauschen. Der Vollständigkeit halber möchte ich erwähnen, dass es eine Gattung von Programmen gibt, die tatsächlich ohne Dateneingabe und -ausgabe ihre Arbeit verrichten, so genannte Dienstprogramme. Das sind zumeist Betriebssystem-Programme, die im Hintergrund laufen und z. B. die Computer-Hardware überwachen. Solche Dienstprogramme sind in der Tat Kommandozeilen-Programme, die nicht in einer Kommandozeile laufen, sie sind aber eine Ausnahme.

Eine Kommandozeile öffnen

Wir werden jetzt einfach eine Kommandozeile starten. Auf jedem Betriebssystem hat sie einen anderen anderen Namen und ist an einer anderen Stelle in den Menüs zu finden.
Unter Windows heißt sie “Eingabeaufforderung” und liegt im Programm-Menü unter “Zubehör”.
Unter Linux gibt es verschiedene Kommandozeilen, meistens mit dem Namen “Terminal”.
In MacOS heißt die Kommandozeile “Terminal” und ist in den “Dienstprogrammen” zu finden.

Die Kommandozeile ist zumeist ein Fenster mit dunklem/schwarzem Hintergrund und heller/weißer Schrift. Irgendwo sollte ein Cursor blinken, dann ist die Kommandozeile (das Terminal) bereit, Benutzereingaben aufzunehmen.

Das erste Programm starten

Um ein beliebiges Programm im Rahmen des soeben geöffneten Terminals zu starten, gibt man einfach über die Tastatur den Namen eines Programms ein, gefolgt von einem Betätigen der Enter-Taste. Da wir selbst noch kein Programm erstellt haben, werden wir jetzt zu Anschauungs-Zwecken ein bereits existierendes Programm starten, das bei der Installation des Betriebssystems mitgeliefert wurde. Wir geben also mit der Tastatur folgendes ein:

help

Nach dieser Eingabe betätigen wir die Enter-Taste. Das Programm “help” spuckt einen ganzen Schwung an Text aus. Darunter (nach dem Text) sollte wieder der Cursor blinken.

Was ist hier passiert? Wir haben mit unserer Eingabe von “help” und der Enter-Taste sinnbildlich auf den roten Knopf des existierenden Programms “help” gedrückt. Dieses hat uns eine ganze Menge Text auf das Output-Förderband gelegt, den wir über die Kommandozeile angezeigt bekommen haben. Input hat “help” von uns nicht erhalten. Da der angezeigte Output der einzige Zweck, die einzige Funktion, von “help” ist, hat sich das Programm danach wieder beendet. Das sehen wir daran, dass in der Kommandozeile wieder der Cursor blinkt, was bedeutet, dass wir wieder etwas eingeben können. Zum Beispiel könnten wir “help” noch einmal starten. Es wird wieder der genau gleiche Output dargestellt werden, das ließe sich beliebig wiederholen. Immer wieder könnten wir “help” von Neuem ausführen, es würde einige Zeilen Output in die Kommandozeile schreiben, sofort danach ist help wieder beendet. Jedes erneute Aufrufen von “help” entspricht in unserem Vergleich der grünen Wiese einem neuen Drücken auf den roten Knopf.

Kommandos

Es gibt Programme, wie auch das Programm “help”, die gehören von Anfang an fest zu einer Kommandozeile dazu. Sie sind immer verfügbar, weil sie sozusagen mitgeliefert wurden. Diese Programme nennt man “Kommandos”. Technisch gesehen besteht kein Unterschied zwischen einem Programm und einem Kommando. Kommandos wurden genau wie Programme “programmiert”. Sie tragen nur den Namen “Kommando”, damit man gleich weiß, dass es Programme sind, die zur Kommandozeile gehören, sie sind fest eingebaut.
Manche dieser Kommandos ähneln sich unter Windows, Linux oder MacOS sehr stark, und manche sind in den Kommandozeilen der verschiedenen Betriebssysteme total unterschiedlich. Dabei ist noch zu erwähnen, dass die Kommandos, die wir in dieser Artikel-Serie verwenden, in Linux und MacOS genau gleich sind. Das hat den Grund, dass Linux und MacOS in ihrem Kern verwandte Betriebssysteme sind.
Unsere eigenen Programme, sowohl das “Hallo Welt!”-Programm, das wir zuerst entwickeln, als auch unser Spiel, werden nicht Kommandos genannt. Diese Programme laufen zwar in die Kommandozeile ab, sind aber kein fester Bestandteil dieser.

In der Kommandozeile navigieren

Schauen wir uns einmal den Windows-Explorer, oder auch jeden anderen Datei-Browser wie Nautilus in Linux mit Gnome, den Konquerer unter Linux mit KDE oder beispielsweise Finder unter MacOS, an. Wir sehen, dass man bei der Benutzung immer an einer bestimmten Stelle, an einem bestimmten Ort “steht”. Man nennt dies das “aktuelle Arbeitsverzeichnis”. Es ist der Ordner, den man sich gerade ansieht, also alle Dateien und Unterverzeichnisse, die sich darin befinden. Durch einen Doppelklick auf einen Unterordner “springt” man dorthin, das aktuelle Arbeitsverzeichnis hat sich geändert und ist nun dieser Unterordner. Und meistens gibt es einen “Zurück”-Knopf, mit dem man zum letzten besuchten Verzeichnis zurückkehren kann. Auf diese Weise kann man zu allen Verzeichnissen auf dem Computer navigieren und mit den Dateien arbeiten.

Und genau so gibt es auch in der Kommandozeile dieses “aktuelle Arbeitsverzeichnis”. Meistens wird es vor dem blinkenden Cursor angezeigt. Man kann es sich aber auch mit einem Programm (einem Kommando) anzeigen lassen.

Unter Windows heißt das Kommando “cd”, für “current directory” (aktuelles Verzeichnis):

cd

Unter Linux und MacOS heißt das Kommando “pwd”, für “print working directory” (drucke Arbeitsverzeichnis):

pwd

Genau wie das Kommando “help” schreibt uns “cd” bzw. “pwd” auch etwas in die Kommandozeile, nämlich in welchem Verzeichnis wir uns gerade befinden.
Achtung: Die Verzeichnisse werden unter Windows mit einem rückwärtigen Schrägstrich “\” voneinander getrennt, in Linux und MacOS ist es ein normaler Schrägstrich “/”.

Jetzt kennen wir aber noch nicht den Inhalt dieses aktuellen Arbeitsverzeichnisses. Anders als in einem herkömmlichen Datei-Browser müssen wir es nämlich explizit von dem Kommandozeile anfordern, wenn wir wissen wollen, wie es in dem Verzeichnis aussieht, in dem wir uns gerade befinden. Dafür gibt es ein weiteres Kommando.

Unter Windows heißt das Kommando “dir”, für “directory” (Verzeichnis):

dir

Unter Linux und MacOS heißt das Kommando “ls”, für “list” (Auflistung):

ls

Nach Eingabe von “dir” bzw. “ls” erscheinen die Dateien und Unterordner des aktuellen Verzeichnisses. Was ein Unterverzeichnis und was eine Daten ist, erkennt man in der Windows-Kommandozeile an dem “<DIR>”. Das steht für “directory” (Verzeichnis). Unter Linux/MacOS kann man es entweder an der Farbe erkennen, manchmal sind Verzeichnisse aber auch durch ein “d” (directory) gekennzeichnet.
Das Kommandos “dir” bzw. “ls” ist sozusagen unser Auge in der Kommandozeile.

Jetzt müssen wir noch wissen, wie wir das aktuelle Arbeitsverzeichnis in der Kommandozeile ändern, d. h. wie wir zu einem anderen Verzeichnis, z. B. einem Unterordner wechseln können.

Unter Windows benutzt man dazu das selbe Kommando, wie zum Anzeigen des aktuellen Arbeitsverzeichnisses, nämlich “cd”, allerdings mit einer Erweiterung. Und zwar gibt man nach dem “cd” und einem Leerzeichen den Namen eines Unterordners an:

cd Bilder

Dieses Kommando macht nur Sinn, wenn man mit der Kommandozeile an einem aktuellen Arbeitsverzeichnis steht, an dem es auch einen Unterordner “Bilder” gibt. In diesem Fall wird dorthin gewechselt. Falls es keinen Unterordner mit dem Namen “Bilder” geben sollte, wird eine Fehlermeldung ausgegeben und man bleibt am aktuellen Ort stehen. Zur Überprüfung, ob die Navigation geklappt hat, gibt man unter Windows einfach wieder “cd” ein, und lässt sich so das jetzt hoffentlich geänderte Arbeitsverzeichnis ausgeben.

Unter Linux und MacOS heißt das Kommando zum wechseln des aktuellen Arbeitsverzeichnisses auch “cd”. Und es funktioniert auch genau so wie unter Windows:

cd Bilder

Um hier allerdings zu überprüfen, ob die Navigation geklappt hat, gibt man unter Linux und MacOS “pwd” ein, und lässt sich mit diesem Kommando das jetzt hoffentlich geänderte Arbeitsverzeichnis ausgeben.

Wir sind gerade in ein Unterverzeichnis “hineingewechselt”. Um wieder ein Verzeichnis zurück zu wechseln, also eine Verzeichnis-Ebene nach oben, kann man sowohl unter Windows, als auch unter Linux und MacOS folgendes Kommando benutzen:

cd ..

Die zwei Zeichen “..” bezeichnen in der Kommando-Zeile allgemein immer das übergeordnete Verzeichnis, egal wo man gerade steht. Wir werden später auch noch mit anderen Kommandos auf “..” stoßen. Jedenfalls müssten wir mit “cd ..” wieder genau da landen, wo wir vorher waren.

Mit diesen gerade gelernten Kommandos kann man genau wie in einem Datei-Browser durch alle Verzeichnisse auf dem Computer navigieren: Wir können in Verzeichnisse hinein- und wieder zurückwechseln und uns an den Orten, wo wir gerade stehen, den Inhalt anzeigen lassen.

Fazit

In diesem Artikel haben wir gelernt, dass eine Kommandozeile eine Umgebung ist, in der man Kommandozeilen-Programme starten und mit ihnen Input und Output austauschen kann. Wir haben zum Ausprobieren das Programm “help” gestartet und Output erhalten.
Wir wissen auch, dass Programme, die direkt mit der Kommandozeile zu tun haben “Kommandos” heißen, und wir haben ein paar dieser Kommandos kennen gelernt, um in der Konsole navigieren zu können.

Posted in Programmieren lernen | Leave a comment
Dez 19

Programmieren lernen – Teil 7 (Java)

In diesem Artikel wird erklärt, was wir tun müssen, um mit der Programmiersprache Java arbeiten zu können und wie ein Benutzer unsere erstellen Programme verwenden kann.

Java

Wie bereits erklärt, kann ein Computer im Grunde nur seine Ur-Sprache, die Maschinensprache, verstehen. Alle anderen Programmiersprachen können nur deshalb funktionieren, weil sie wieder in Maschinensprache übersetzt werden. Der Computer wird im Inneren also nie die Java sprechen können. Java dient uns Programmierern nur als Hilfsmittel, weil Java eine schöne und logisch aufgebaute Sprache ist. Die Maschinensprache wiederum ist komplex und unleserlich. Deshalb schreiben wir unsere Programme mit Java lassen diese dann in Maschinensprache übersetzten. So haben wir hinterher ein Programm, das der Computer verstehen kann, ohne dass wir Programmierer selbst die Maschinensprache verstehen müssen.

Auch haben wir gelernt, dass es bei der Erstellung eines Programms zwei Gruppen von Personen gibt. Die einen erstellen (programmieren) das Programm: die Entwickler. Die anderen benutzen das Programm: die Benutzer. Das Übersetzen eines Programms in Maschinensprache ist Aufgabe des Programmierers. Ein Benutzer kann mit dem Programm nur in bereits übersetzter Maschinensprachen-Form etwas anfangen, weil sein Computer nur diese Sprache spricht. Keine Angst, das Übersetzten muss nicht von Hand gemacht werden. Dafür bekommt der Programmierer alles Notwendige an die Hand, man denke an den Werkzeugkoffer auf der grünen Wiese. Das dauert bei kleineren Programmen nur wenige Sekunden. Diese Werkzeuge, um als Programmierer mit Java zu arbeiten, fehlen im Normalfall auf einem herkömmlichen Benutzer-Computer und müssen deshalb noch installiert werden. Darum geht es in diesem Artikel.

Die Übersetzung

Bei Java (wie auch bei anderen modernen Programmiersprachen) gibt es noch eine wichtige Besonderheit: Auch zum Starten von Programmen, die mit Java erstellt wurden, muss auf dem Computer noch etwas installiert werden, sofern das nicht schon getan wurde. Warum ist das so? Weiter oben habe ich erklärt, dass Programme in einer bestimmten Programmiersprache (bei uns Java) vom Programmierer in Maschinensprache übersetzt werden, und dass dieses übersetzte Programm von einem Benutzer, bzw. dessen Computer direkt verstanden werden kann, weil der Computer Maschinensprache versteht. Das ist auch richtig. Bei Programmiersprachen wie beispielsweise C, C++ und Pascal wird es genau so gemacht.

Tatsache ist aber, dass Java-Programme nicht auf direktem Weg in Maschinensprache übersetzt werden, sondern erst über einen Umweg in eine so genannte Zwischensprache. Das Programm wird in dieser Zwischensprache an den Benutzer gegeben. Dieser braucht dann wiederum auch ein Werkzeug, um den zweiten und letzten Übersetzungs-Schritt von der Zwischensprache zur Maschinensprache zu gehen. Das hört sich komplizierter an, als es tatsächlich ist. In der Realität bekommt der Benutzer von diesem zweiten Übersetzungs-Schritt überhaupt nichts mit. Wenn er ein Programm starten möchte, das mit Java erstellt wurde, geschieht das, wie bei jedem anderen Programm auch, vermutlich über den Doppelklick auf ein Icon auf dem Desktop oder aus einem Programm-Menü heraus. Für ihn unsichtbar wird nun die Übersetzung von Zwischensprache in Maschinensprache vollzogen.

Als kleinen Blick über unseren Java-Tellerrand möchte ich erklären, dass sich die Programmiersprachen in dieser Hinsicht so in drei Gruppen einteilen lassen. Erstens Sprachen wie C, C++, Pascal und viele weitere, die komplett fertig in Maschinensprache übersetzt an den Benutzer gegeben werden. Des Weiteren Sprachen wie Java und die .NET-Sprachen von Microsoft, die in Form einer Zwischensprache beim Benutzer ankommen und dort in einem zweiten Schritt in Maschinensprache übersetzt werden. Die dritte Gruppe von Programmiersprachen wurden bisher noch nicht erwähnt. Hierzu zählen beispielsweise BASIC, PHP und noch einige mehr. Diese Sprachen werden überhaupt nicht übersetzt, sondern landen unübersetzt beim Benutzer. Erst beim Starten des Programms auf dem Benutzer-Computer findet eine Übersetzung statt.
Jede dieser drei Gruppen hat durch ihre ganz einzigartige Technik Vor- und Nachteile, die sich im Laufe der Zeit als Programmierer noch herausstellen werden. Nur so viel sei gesagt: Java, sowie auch die .NET-Sprachen, geht mit dem Zwischenschritt der Übersetzung zu einer Zwischensprache einen gut ausbalancierten Mittelweg.

JRE oder JDK

Für diese beiden Anwendungsgebiete im Java-Umfeld, für Benutzer oder Programmierer, gibt es zwei unterschiedliche Pakete, die auf einem Computer installiert werden können: JRE oder JDK.

JRE steht ausgeschrieben für Java Runtime Environment (Java Laufzeitumgebung). Die Laufzeitumgebung ist banal ausgedrückt eine Umgebung, um Java-Programme laufen zu lassen, also zu verwenden. Genauer ausgedrückt kann die JRE Programme, die in der Java-Zwischensprache vorliegen, in die Maschinensprache übersetzen. Folglich ist die JRE das Modul für Benutzer.

JDK bedeutet Java Development Kit (Java Entwickler-Austattung). Wie der Name hier schon genau ausdrückt, ist das JDK die Austattung, die ein Java-Entwickler braucht. Es enthält die Funktion, Java-Programme in die Java-Zwischensprache zu übersetzen, die dann an Benutzer weiter gegeben werden kann.
Weil die Entwickler auch gleichzeitig die Benutzer ihrer eigenen Programme sind, ist es nur logisch und sinnvoll, dass die Entwickler-Austattung auch eine vollwertige Laufzeitumgebung enthält. Installiert man also ein JDK, ist eine JRE automatisch mit dabei.

JDK installieren

Sowohl die JRE, als auch das JDK, kann ganz einfach installiert werden. Die genaue Installations-Vorgehensweise ist allerdings von Betriebssystem zu Betriebssystem unterschiedlich.

Für Windows-Betriebssysteme gibt es einen JDK-Download (natürlich auch einen JRE-Download) auf der Oracle Internet-Seite im Bereich Java-Downloads. Java wird aktuell von der Firma Oracle verwaltet. Dieser Download muss lediglich auf dem Computer installiert werden. Danach ist der Computer für die Software-Entwicklung mit Java ausgestattet.

Auch für Linux-Betriebssysteme gibt es einen JDK-Download bei Oracle. Bei verbreiteten Linux-Varianten wie Ubuntu, Debian, openSUSE, Fedora und weiteren würde ich allerdings die Installation über eine Paketverwaltung empfehlen. Bei Ubuntu beispielsweise bietet sich hier das Software-Center oder für fortgeschrittene Benutzer “synaptic” oder “apt” an.

Ähnliches gilt für MacOS-Betriebssysteme, wo das JDK über die Funktion “Software Update” installiert werden kann.

Fazit

Wir haben Java auf unserem Computer installiert, und zwar die Variante von Java, mit der wir neue Programme erstellen können (JDK), nicht nur bereits bestehende Programme starten (JRE).

Posted in Programmieren lernen | Tagged , , , , , , , , | Leave a comment
Dez 18

Programmieren lernen – Teil 6 (Input und Output)

In diesem Artikel werden wir analysieren, wie ein Benutzer mit einem Programm arbeitet. Und wir werden lernen, dass es verschiedene Arten von Programmen gibt, die auch unterschiedlich bedient werden.

Input und Output

Ein Beispiel: In einem Internet-Browser gibt es oben eine Adresszeile, in die der Benutzer die Adresse einer Internet-Seite eingeben kann, zu der er gerne navigieren möchte. Diese Adress-Zeile ist ein Eingabe-Element, womit eine Information in das Programm “eingegeben” werden kann. Dieser Vorgang nennt sich “Input”. Mit diesem Input ruft der Benutzer eine Funktion des Internet-Browsers auf, und zwar die Navigation zu eben genau dieser Internet-Seite. Der Browser führt die Funktion aus und stellt dann die gewünschte Internet-Seite im großen Anzeigefeld dar, das die größte Fläche im Layout des Browsers einnimmt. Das wiederum nennt man “Output”.
Aus dieser Kombination von Input und Output ergibt sich, wie man das Programm bedient. Ein Benutzer gibt Daten in ein Programm ein und betätigt über Schaltflächen bestimmte Funktionen des Programms (Input). Das Programm führt intern seine Funktionen aus und stellt Daten und Ergebnisse dar (Output). Damit kann der Benutzer dann weiterarbeiten und ggf. neue Daten eingeben und andere Funktionen aufrufen, die wiederum Output erzeugen.

An dieser Stelle kehren wir wieder einmal kurz zum Vergleich der grünen Wiese zurück. Da war nämlich von zwei Lücken im Zaun die Rede. Durch jede dieser zwei Lücken ist ein Förderband angebracht. Eines ist so eingestellt, dass es Dinge nach außerhalb des Zauns transportiert, das andere läuft in die Richtung, dass es Dinge nach innen transportiert. Diese zwei Förderbänder stellen eine grundlegende Verbindung zwischen innerhalb und außerhalb des Zauns her.
Die Förderbänder stehen sinnbildlich für Input und Output. Ein Benutzer kann etwas auf das Input-Förderband legen und so Daten in das Programm “eingeben”. Das Programm wiederum kann durch das Output-Förderband Daten an den Benutzer “ausgeben”.

Fenster oder Text

Programme lassen sich aus der Sicht eines Benutzers grob in zwei Kategorien einteilen:

Die meisten Programme, die ein durchschnittlicher Benutzer Tag für Tag verwendet, sind Programme, die in einem Fenster ablaufen, also z. B. der Internet-Browser oder ein Taschenrechner-Programm. Programme im Fenster werden auch Programme mit einer “grafischen Benutzerschnittstelle” genannt. Das bedeutet, die “Schnittstelle”, also die Verbindung zwischen den Programm-Funktionen und dem Benutzer, der das Programm bedient, findet auf eine grafische Art und Weise statt. Mit “grafisch” sind hier keine Grafiken/Bilder gemeint, sondern dass das Fenster, in dem das Programm läuft, ein Layout besitzt: Bestimmte Ein- und Ausgabe-Elemente sind sinnvoll angeordnet, wie beispielsweise die Adress-Zeile oder das große Anzeigefeld im Internet-Browser. Diese Ein- und Ausgabe-Elemente sind interaktiv, sie lassen sich mit der Maus anklicken, Menüs können aufgeklappt werden, ein Anzeige-Text kann seine Farbe ändern und weitere Fenster können erscheinen (z. B. ein Fenster mit einer Fehlermeldung oder für Programm-Einstellungen).

Programme der zweiten Kategorie besitzen keine grafische Benutzerschnittstelle. Da es für fast alle Anwendungsgebiete eines normalen Computer-Benutzers Programme mit grafischer Benutzerschnittstelle gibt, führen Programme ohne grafische Benutzerschnittstelle im Leben eines Benutzers ein Schattendasein. Anders sieht dies allerdings für die Programmierung aus. Hier haben solche Programme, nämlich Kommandozeilen-Programme, eine größere Bedeutung. Die Besonderheit von Kommandozeilen-Programmen ist, dass die Dateneingabe durch den Benutzer und die Datenausgabe durch das Programm rein in Textform stattfindet. Was genau die “Kommandozeile” ist und wie sie funktioniert, wird im Folgenden noch genau erklärt.

An dieser Stelle ist wichtig: Grundlegend gibt es keinen Unterschied zwischen der Programmierung eines Programms mit grafischer Benutzerschnittstelle oder eines Kommandozeilen-Programms. Lediglich Stellen im Programm, in denen es um Input und Output, also Dateneingabe und -ausgabe geht, müssen entsprechend anders programmiert werden. Ein Programm besteht aber aus vielen weiteren Teilen. Sieht man von Input und Output ab, gestaltet sich die Programmierung eines Programms mit grafischer Benutzerschnittstelle und eines Kommandozeilen-Programms exakt gleich. Aufgrund dieser Tatsache kann auch nachträglich ein Kommandozeilen-Programm in ein Programm mit grafischer Benutzerschnittstelle “umprogrammiert” werden, ohne dass man das komplette Programm umschreiben muss. Lediglich die Teile, die Input und Output betreffen, müssen umgeschrieben werden.

Wir werden mit Kommandozeilen-Programmierung beginnen. Das ist verglichen mit einer grafischen Benutzerschnittstelle zwar etwas unspektakulär, dafür aber für den Anfang auch viel einfacher. Und wie bereits erwähnt, lässt sich dies später auch leicht umstellen.

Fazit

Wir haben gelernt, dass man Informationen mit einem Programm austauscht, während man es benutzt. Dies wird Input und Output genannt. Bei Kommandozeilen-Programmen findet Input und Output in reiner Textform statt. Bei Programmen, die in einem oder mehreren Fenstern ablaufen, spricht man von Programmen mit grafischer Benutzerschnittstelle.
Das “Hallo Welt!”-Programm ist ein Kommandozeilen-Programm.

Posted in Programmieren lernen | Tagged , , , , , , , , , | Leave a comment
Nov 15

Programmieren lernen – Teil 5 (Der rote Knopf)

Dieser Artikel beschreibt, wie man den Befehlen, die man in einer Programmiersprache formuliert hat, Leben einhaucht, also dafür sorgt, dass die Befehle ausgeführt werden.

Der rote Knopf

Bisher ist bekannt, dass wir sinnbildlich eine Konstruktion innerhalb des Zauns auf unserer Wiese errichten, also Java-Befehle formulieren müssen, um ein Programm zu erhalten. Hier ist es wichtig zu wissen: Wenn wir auf der Wiese eine Konstruktion erfinden und zusammen bauen, so verrichtet diese anfänglich ihre Arbeit erst einmal noch nicht. An der Außenseite des Zauns, ganz in der Nähe der zwei Lücken, die ich bereits erwähnt habe, ist ein roter Knopf angebracht. Die Konstruktion im inneren des Zauns erfüllt ihre Arbeit erst dann, wenn jemand von außen diesen Knopf betätigt. Erst diese Aktion haucht der Konstruktion Leben ein, versorgt sie mit Energie, wenn man so will.

Zuerst denkt sich der Programmierer innerhalb des Zauns eine Konstruktion aus. Diese Konstruktion tut aber noch nichts, der Programmierer konstruiert in der Hoffnung, dass sie später genau das erledigt, was sie soll. Danach muss außerhalb des Zauns auf den roten Knopf gedrückt werden, um die Konstruktion zu aktivieren. Üblicherweise wird auch diese Aufgabe vom Programmierer erledigt. Er begibt sich also nach draußen, drückt auf den roten Knopf und sieht zu, ob die Konstruktion genau das tut, wofür sie erfunden wurde. Wenn sie es tut, freut er sich und begibt sich wieder nach innen, um weiter zu bauen. Die Konstruktion soll ja mit der Zeit immer mehr können. Hat der Programmierer die Konstruktion für eine neue Aufgabe erweitert und angepasst, geht’s wieder nach draußen, um den roten Knopf zu drücken. Erfüllt die Konstruktion die neu hinzu gekommene Aufgabe? Erfüllt sie auch noch ihre bisherigen Aufgaben? Der Programmierer prüft, ob alles stimmt.

Jetzt ist es so, dass Konstruktionen mit der Zeit immer ausgefeilter und komplexer werden. Die Aufgaben, die sie erfüllen sollen, werden schwieriger und dauern länger, bis sie erledigt sind. Vielleicht muss ein Hamster erst einmal 5 Minuten im Laufrad laufen, um das Gummiband soweit aufzurollen, bis es…. usw.
Fehler können sich einschleichen und die Konstruktion macht etwas falsch. Dann begibt sich der Programmierer wieder innerhalb des Zauns und versucht den Fehler zu finden und zu korrigieren. Danach geht’s wieder nach draußen, um den roten Knopf zu drücken. Mit dem Finden von Fehlern und Einbauen neuer Komponenten verbringt der Programmierer seine Zeit. Er wechselt ständig von innerhalb des Zauns nach außerhalb und wieder zurück.

Irgendwann ist aber endlich der Zeitpunkt erreicht, an der die Konstruktion alle Aufgaben, für die sie vorgesehen ist, ohne Fehler ausführt. Dies ist der freudige Augenblick, an dem man einen Nicht-Programmierer, also einen Programm-Benutzer, an den Zaun einladen kann. Dieser soll nun auf den roten Knopf drücken und staunen, was die Konstruktion alles kann! Der Programmierer sieht dem Benutzer vielleicht noch eine Weile zu, irgendwann lässt er ihn dann aber allein am Zaun und legt er sich auf einen Liegestuhl in die Sonne. Sollten dann doch wieder Fehler auftauchen, muss der Programmierer wieder ran. Raus aus dem Liegestuhl und zurück zur Konstruktion! Denn wie bereits gehört, darf nur ein Programmierer innerhalb des Zauns, und nur er hat das nötige Werkzeug, um die Konstruktion zu reparieren.

Fazit

Mit diesem Artikel sollte verdeutlicht werden, dass sich innerhalb des Zauns der Programmierer befindet, und außerhalb des Zauns der Benutzer. Wenn ein Programm allerdings noch nicht fertig ist, wird der Software-Entwickler selbst zum Benutzer, in dem er nach außen geht und auf den roten Knopf drückt, um seine eigene Konstruktion, sein eigenes Programm, auszuprobieren. Somit ist der Programmierer immer der erste Benutzer eines Programms, vor Allem wenn es noch gar nicht fertig ist.

Posted in Programmieren lernen | Tagged , , , , | Leave a comment
Nov 15

Programmieren lernen – Teil 4 (Die grüne Wiese)

In folgendem Artikel versuche ich die Vorgehensweise beim Programmieren zu erklären, also wie man aus dem Nichts heraus etwas erschafft, und zwar ein Programm. Das versuche ich mit einem Vergleich zu erklären.

Die grüne Wiese

Mit Vergleichen ist das immer so eine Sache. Oft können sie ein Thema gut veranschaulichen, manchmal stehen Sie einem eher im Weg. Ich möchte an dieser Stelle einen Vergleich anwenden, bei dem hoffentlich überwiegend Ersteres zutrifft.

Stell dir vor, du stehst auf einer großen grünen Wiese. Mit Brettern zäunst einen Bereich ein, und dann stellst du dich innerhalb dieses Bereichs. Der nun eingezäunte Bereich dieser Wiese ist dein Programm. Nur du als Programmierer darfst hinein. Alle anderen müssen draußen bleiben. An zwei Stellen im Zaun machst du die Bretter nicht durchgängig, sondern lässt zwei kleine Lücken frei. Wozu diese Lücken gut sind, werde ich später noch näher erklären. Du hast eine Werkzeugkiste dabei, auf der ein Schriftzug aufgedruckt ist: “Java”. Mit allem, was in der Werkzeugkiste ist, kannst du dich jetzt innerhalb deines Bereichs austoben. Du kannst bauen und basteln…

Mit dem Vergleich der grünen Wiese möchte ich die Brücke zum Programmieren schlagen. Es soll anschaulich gemacht werden, was wir für die Programmierung unseres kleinen Spiels benötigen. Im Folgenden werde ich noch etwas ausführlicher:

Ich habe schon erklärt, dass man dem Computer Befehle geben muss, die ausdrücken, was genau in einem Programm geschehen soll. Diese Befehle müssen in einer Programmiersprache formuliert werden, die in unserem Falle “Java” heißt. Diesen Vorgang, die Formulierung von Befehlen in einer Programmiersprache, nennt man “programmieren”. Der Vergleich mit der Wiese und dem Zaun fordert an dieser Stelle ein klein wenig Vorstellungskraft. Es geht darum, wie die Java-Befehle aussehen würden, wenn man sie auf dieser Wiese mit Werkzeug baute. Ich stelle mir immer eine abenteuerliche Konstruktion aus Zahnrädern, Federn, Gummibändern und all solchen Sachen vor. Vielleicht gibt es roboter-artige Greifarme, Magneten, Sensoren und Hamster in Laufrädern.
All diese Komponenten, die sinnbildlich für unsere Java-Befehle stehen, spielen zusammen und ergeben ein Programm. Viele Einzelkomponenten werden gebraucht, damit das Programm eine komplexe Aufgabe erfüllen kann. Diese Komponenten sind miteinander verbunden und erledigen nur in Zusammenarbeit ihre Pflicht.

Fazit

In diesem Artikel ging es darum, dass man mit vielen kleinen Teilen, nämlich Befehlen in der Sprache Java, einen größeren Zweck erfüllen kann, wenn diese Teile sinnvoll zusammen arbeiten.

Posted in Programmieren lernen | Leave a comment
Nov 13

Apache und Glassfish mit “mod_jk” verbinden (Ubuntu)

1 Einleitung

In diesem Tutorial geht es darum, wie man Apache und einen Glassfish Server miteinander verbinden kann, so dass der Apache “vor” dem Glassfish Server sitzt und alle Anfragen an den Glassfish weiterleitet. Dies funktioniert mit dem Apache-Modul “mod_jk”.

2 Voraussetzungen

Für dieses Tutorial habe ich folgende Umgebung und Versionen verwendet:

  • Ubuntu 8.04.4 LTS
  • Apache 2.2.8
  • Glassfish 3.1.1
  • mod_jk 1.2.32

Aber das Tutorial dürfte sich leicht auf eine andere Umgebung übertragen lassen…

3 “mod_jk” kompilieren

Leider gab es für meine Umgebung kein vorkompiliertes “mod_jk”, das bedeutet also: selbst kompilieren! Auf http://tomcat.apache.org/download-connectors.cgi gibt es die Source Releases, bei mir war die aktuellste Version 1.2.32. Dann den Download auspacken, im Archiv gibt es eine BUILD.txt, die den Kompiliervorgang beschreibt. Auszug (kann man so noch nicht verwenden):

$> cd native
$> ./configure --with-apxs=/usr/sbin/apxs (or where ever the apxs/apxs2 is)
$> make
$> su -c 'make install'

Ich habe über apt (oder synaptic) das Paket “build-essential” installiert, mit dem fast alle Voraussetzugen für diesen Kompilier-Vorgang erfüllt sind. Lediglich apxs (bzw. apxs2) fehlt, was man offensichtlich für das “configure” benötigt, wie oben zu sehen. Hier habe ich in synaptic nach apxs gesucht und so zwei Apache-Pakete gefunden. Für eines von beiden muss man sich entscheiden, ich habe das “threaded”-Paket gewählt. Ob es mit dem anderen Paket auch funktioniert, habe ich nicht getestet (für Feedback bin ich dankbar!). Danach liegt apxs bei mir unter folgendem Pfad (ein “find” sollte die Datei ausfindig machen):

/usr/bin/apxs2

Damit können wir also den Kompilier-Vorgang folgendermaßen durchführen:

$> cd native
$> ./configure --with-apxs=/usr/bin/apxs2
$> make
$> su -c 'make install'

Das Kompilieren sollte nun ohne Fehler durchlaufen. Falls configure oder make doch noch etwas anmeckert, dann sind es oft Header-Dateien, die in den entsprechenden “dev”-Paketen enthalten sind, die man leicht mit synaptic finden und nachinstallieren kann.

4 “mod_jk” konfigurieren

Wenn “mod_jk” fertig kompiliert und installiert ist, muss es noch über zwei Konfigurations-Dateien konfiguriert werden.

Die erste ist die workers.properties. Also eine Datei workers.properties anlegen, egal wo, aber am besten unter /etc/apache2/ mit folgendem Inhalt:

worker.list=worker1
worker.worker1.type=ajp13
worker.worker1.host=localhost
worker.worker1.port=8009

Wir müssen diese Datei später noch erweitern, aber für den Anfang reicht es so.

Dann muss die Apache-Konfigurations-Datei /etc/apache2/httpd.conf angepasst werden (war bei mir anfangs leer). Einige Eigenschaften verweisen auf Pfade, die natürlich stimmen müssen, d. h. die mod_jk.so-Datei vorher mit “find” ausfindig machen und den richtigen Pfad hier einsetzen. Das gleiche gilt für die log-Dateien und ganz wichtig: die zuvor angelegte workers.properties:

LoadModule jk_module /usr/lib/apache2/modules/mod_jk.so
JkWorkersFile /etc/apache2/workers.properties
JkLogFile /etc/apache2/mod_jk.log
JkLogLevel debug
JkLogStampFormat "[%a %b %d %H:%M:%S %Y] "
JkOptions +ForwardKeySize +ForwardURICompat -ForwardDirectories
JkRequestLogFormat "%w %V %T"
JkMount /yourWebApp/* worker1
JkMountCopy All

Die vorletzte Zeile (JkMount) gibt an, dass alle Anfragen von /yourWebApp/* zu dem Alias “worker1″ aus der workers.properties-Konfigurations-Datei weitergeleitet werden. Von da geht es dann zu dem dort konfigurierten Host und Port (bei mir localhost:8009) weiter.

ACHTUNG: Wenn man für JkMount /yourWebApp/* konfiguriert, dann darf in der Anfrage das abschließende Slash (“/”) nicht fehlen. Darauf bei eventuellen Weiterleitungen achten! Folgende Anfrage würde funktionieren:

http://yourdomain.com/yourWebApp/

Folgende Anfrage würde NICHT funktionieren:

http://yourdomain.com/yourWebApp

Die letzte Zeile in workers.properties (JkMountCopy All) vererbt die JkMount-Konfiguration auf alle eventuellen VirtualHosts.

Mit JkLogLevel debug fallen sehr viel log-Daten an, ich fahre aktuell ganz gut mit JkLogLevel info.

5 Glassfish konfigurieren

Die Konfiguration des Glassfish erweist sich als denkbar einfach. Über zwei Kommandos muss der jk-connector des Glassfish aktiviert werden:

asadmin create-http-listener --listenerport 8009 --listeneraddress 0.0.0.0 --defaultvs server jk-connector
asadmin set configs.config.server-config.network-config.network-listeners.network-listener.jk-connector.jk-enabled=true

6 Glassfish-Bug beheben

An dieser Stelle kann nach einem Neustart von Apache und Glassfish ein erster Verbindungs-Test vorgenommen werden, d. h. einfach mit einem Browser folgende URL besuchen:

http://yourdomain.com/yourWebApp/

Ohne die soeben vorgenommenen Schritte hätten wir mit Sicherheit eine 404-Seite erhalten, jetzt würden wir aber die Startseite der WebApp erwarten. Dummerweise erschien bei mir nur eine weiße Seite. Immerhin kein 404, was bedeutet, dass Konfiguration zumindest ansatzweise gefruchtet hat. Nach einiger Log-File und Internet-Recherche bin ich auf folgenden Thread gestoßen, der einen Glassfish-Bug behandelt: http://forums.java.net/node/821526.
Der Fix besteht darin, eine Datei im Glassfish auszutauschen, und zwar

grizzly-utils.jar

Diese Datei kann man in dem Thread downloaden. Danach Glassfish neu starten und die Startseite der WebApp sollte erscheinen.

7 Verbindungsprobleme

Einfache WebApps sollten mit dieser Einstellung zumindest grundlegend laufen. Sobald aber ein wenig mehr Last anliegt, dürften bei dieser Konfiguration die ersten Verbindungsprobleme auftreten. Mit Firefox und zugehörigem Plugin “Firebug” kann man sehen, dass manchmal auf eine bestimmte Resource (Bilder, css oder JavaScript-Dateien, manchmal die Seite selbst) sehr lange gewartet wird. Irgendwann (nach ein paar Minuten) wird die Resource aber dann doch noch ausgeliefert. So lange wird ein User natürlich nicht warten.

Anfangs spekulierte ich auf einen Bug in mod_jk, nach einiger Recherche bin ich dann allerdings auf diese Website gestoßen: http://community.jboss.org/wiki/OptimalModjk12Configuration. Dort ist erklärt, dass die Standard-Konfiguration von Apache und mod_jk ungeeignet für den produktiven Betrieb sind. Hauptsächlich geht es um ungünstige Defaults von Timeouts, die entweder viel zu hoch angesetzt sind oder überhaupt nicht greifen.

Die Erklärung auf dieser Seite ist allerdings nicht für Glassfish, sondern für Tomcat. Man kann aber trotzdem einen Großteil der Vorschläge dort umsetzen. In Glassfish selbst ist es ohnehin nur eine Einstellung, und zwar die max-thread-pool-size, die man leicht mit folgendem Kommando auf 200 setzen kann (Default ist 5):

asadmin set configs.config.server-config.thread-pools.thread-pool.http-thread-pool.max-thread-pool-size=200

Die restlichen Konfigurationen für workers.properties und Apache bitte dem Link entnehmen.

Posted in Administration | Tagged , , , , , , , , , | 2 Comments
Nov 12

Programmieren lernen – Teil 3 (Die Programmiersprache)

In diesem Artikel geht es darum, was eine Programmiersprache ist. Wir werden erfahren, dass es mehr als eine Programmiersprache gibt, welche Beziehung die Programmiersprachen zueinander haben, und welche wir verwenden.

Was ist eine Programmiersprache?

Das Thema der Programmiersprache bedarf einer etwas ausführlicheren Erklärung:

Wenn wir uns die Sprache der Menschen ansehen, so wissen wir, dass sie sich erst über Jahrtausende hinweg entwickeln musste, bis wir so kommunizieren konnten, wie wir es heute tun. Als Steinzeitmenschen haben wir vielleicht auch schon kommuniziert. Aber vielmehr als “Mammut, happa happa!” wird es wohl nicht gewesen sein.

So ähnlich kann man sich auch die Entwicklung der Programmiersprachen vorstellen. Auch hier gibt es eine Art Ur-Sprache, auf der alle anderen Sprachen aufbauen. Diese Ur-Sprache wird Maschinensprache genannt. Die allerersten Programme überhaupt mussten mit dieser Maschinensprache erstellt werden, einfach aus dem Grund, weil es noch keine anderen Programmiersprachen gab. Auch heute noch gibt es einige Anwendungsgebiete, zu denen diese “urtümlichste” aller Sprachen eingesetzt wird. Im normalen Entwickler-Alltag ist sie aber nur noch äußerst selten anzutreffen.

Folgendes ist wissenswert: Die angesprochene Ur-Programmiersprache, die Maschinensprache, ist die einzige Sprache, die der Computer in seinem Inneren wirklich versteht. Das Herzstück eines jeden Computers, der Prozessor, spricht nur diese Sprache. Jetzt ist es so, dass es nur deswegen hunderte von weiteren Programmiersprachen geben kann, weil diese wieder zu Maschinensprache zurückübersetzt werden. Das kann man sich ungefähr so vorstellen, dass man im Restaurant beim Ober ein “Steak” bestellt, weil man “Hunger” hat. Egal in welcher Sprache man das zum Ausdruck bringt, im Inneren des Gehirns läuft trotzdem immer noch “Mammut, happa happa!” ab.

Welche Programmiersprache sollst du verwenden?

Die Wahl der Programmiersprache ist eine der ersten Hürden, die man als angehender Programmierer nehmen muss. Und dafür gibt es leider keine Faustregel, die Internetforen sind voll von Diskussionsbeiträgen zu diesem Thema. Eines kann ich aber mit Sicherheit sagen: Noch nie hat jemand eine einstimmige Antwort auf diese Frage erhalten.

Die “beste” Programmiersprache gibt es nicht. Eine Sprache ist leichter zu erlernen als manch andere und gilt daher vielleicht als “Einsteiger”-Programmiersprache. Mit einer anderen Programmiersprache hat man wiederum mehr Möglichkeiten als mit wieder einer anderen. Alle Sprachen haben aus einem bestimmten Grund ihre Daseinsberechtigung.
Vielmehr geht es beim Programmieren darum, dass man die grundlegenden Konzepte und Vorgehensweisen verstanden hat. In diesem Fall kann man mit verschiedenen Sprachen umgehen.

Wir werden in dieser Anleitung mit der Sprache “Java” beginnen. Sie ist in den letzten Jahren zu einer der beliebtesten und weit verbreitetesten Sprachen überhaupt geworden. Aus gutem Grund: Java ist modern und gut strukturiert, man kann sie für sehr viele Anwendungszwecke verwenden und im Internet gibt es eine große Anhängerschaft, bei der man Unterstützung bekommen kann.

Fazit

Wir haben folgendes gelernt: Es gibt eine Ur-Programmiersprache und viele weitere Sprachen, die auf dieser aufbauen. Eine dieser Sprachen heißt Java, welche wir auch verwenden.

Posted in Programmieren lernen | Tagged , , , , | Leave a comment