Erste Schritte

Inhalt

 

 

Literatur

 

Einführung in die Computer-Architektur

 

Programme und Daten

 

Dateien und Verzeichnisse

 

Die Kommandozeile (Shell)

 

Das erste Java-Programm

Bessere Editoren und Entwicklungsumgebungen

 

Übungsaufgaben

Einführung in die Computer-Architektur

Stichwort: von Neumann Architektur

Diese Einführung in Computer und ihre Architektur ist nur sehr kurz gehalten. Es ist heute nicht mehr nötig oder auch möglich, Computer in jedem Detail zu verstehen. Es geht in diesem Text nur darum, eine allgemeine Vorstellung davon zu bekommen, wie Programme und Daten im Innern des Rechners zusammenwirken.

Die Zentraleinheit besteht aus

Angeschlossen sind Peripherie-Geräte

Die Peripheriegeräte sind durch Schnittstellen (elektrische oder andere Verbindungen) oder Bus-Systeme mit der Zentraleinheit verbunden, die gewöhnlich in einer einzigen Platine, dem sogenannten Mainboard, realisiert wird.

Programme und Daten

Programme und Daten werden beide im Speicher gehalten. Die Programme werden von der Festplatte in den Speicher geladen. Die Daten werden von den Programmen erzeugt oder auch von der Festplatte (oder Diskette, CD-ROM und ähnliches) geladen.

Man muss sorgfältig zwischen den Daten im Speicher und den Daten auf den Massenspeichern, wie Festplatte und CD-ROM, unterscheiden. Der Prozessor hat nur direkten Zugriff auf die Daten im Speicher (RAM). Die Daten von der Festplatte müssen erst über die Schnittstellen eingelesen werden

Das Betriebssytem ist ein Programm, das ständig zur Verfügung steht, obwohl nicht alle Teile im Speicher vorhanden sein müssen, sondern bei Bedarf nachgeladen werden können. Es ist in Schichten wachsender Komplexität organisiert. Es

Grundsätzlich kann ein Programm folgende Datenbereiche benutzen. Diese beiden Bereiche werden dem Programm beim Start vom Betriebssystem zur Verfügung gestellt.

Ein Programm besteht aus einer Folge von Anweisungen, die von der CPU (central processing unit) abgearbeitet werden. Normalerweise geschieht dies sequentiell. Es gibt jedoch Sprungbefehle, die unter gewissen Bedingungen ausgeführt werden, und die Verarbeitung von Schleifen erlauben. Dazu springt der Prozessor immer wieder an dieselbe Stelle zurück, bis eine gewisse Bedingung erfüllt ist.

Ein anderes Beispiel für nicht-sequentielle Abarbeitung von Programmen sind Unterprogramme.

Unterprogramme sind Teile eines Programms, die von verschiedenen Stellen angesprungen werden und automatisch zurückkehren. Dabei werden die folgenden Daten auf dem Stack abgelegt:

Der Stack wächst also bei jedem Unterprogrammaufruf ein wenig an. Unterprogramme bekommen so ihren eigenen Datenbereich. Dadurch können Unterprogramme wieder andere Unterprogramme, oder sogar sich selbst aufrufen. Die Daten kommen sich nicht in die Quere, und der Prozessor findet immer wieder zur Aufrufstelle zurück.

Es können mehrere Programme gleichzeitig aktiv sein. Der Prozessor wechselt so schnell zwischen den Programmen (Prozessen) hin und her, dass es erscheint, als liefen alle gleichzeitig (Multitasking). Java kann innerhalb eines Programmes mehrere Threads erzeugen, die dann vom Prozessor quasi gleichzeitig ausgeführt werden. Der Wechsel von Prozess zu Prozess ist aufwendiger als der Wechsel von Thread zu Thread im selben Programm.

Programmiersprachen

Die eigentliche Sprache, die der Prozessor versteht und in der die Programme im Speicher vorliegen, nennt man Maschinensprache. Man kann einen Rechner direkt in dieser Sprache programmieren, indem man einen Assembler verwendet. Dies ist jedoch in höchstem Maße unübersichtlich und unproduktiv. Die Maschinensprache ist außerdem vom Prozessor abhängig (nicht portabel).

Es gibt nun zwei Arten, die Maschinensprache zu umgehen.

Es gibt auch Zwitter, die zunächst in einen Bytecode übersetzen und diesen dann interpretieren. Dies hat gegenüber den obigen Extremen Vorteile.

Java verwendet außerdem einen Compiler, einen sogenannten just-in-time (JIT) Compiler, der den Bytecode weiter verarbeitet. Die Ausführung von Java ist daher auf dem Niveau von maschinennäheren Programmiersprachen wie C.

Grundlegende Aufgabe einer Programmiersprache ist die Reduktion der Komplexität. So wird im einfachsten Fall eine Folge von Maschinenanweisungen

Load P in Register 1
Load I in Register 2
Multiply I by 8
Add Register 2 to Register 1
Load X in Register F
Store X at the Address in Register 1

in einer einzigen Anweisung

P[I]=X;

zusammengefasst. Auf der nächsten Stufe der Reduktion steht die Zusammenfassung von Befehlen zu Unterprogrammen, die von beliebigen Punkten aus zur Verfügung stehen. So wird die Befehlsfolge

S=0;
for (i=0; i<P.length; i++) S=S+P[I];

(die die Summe der Zahlen in einem Vektor berechnet) zu einem einzigen Befehl

S=sum(P);

zusammengefasst.

Eine weitere Reduktion der Komplexität bringt die Objektorientierte Programmierung (OOP), die Daten und zugehörige Unterprogramme in Objekten zusammenfasst. Java ist eine objektorientierte Sprache.

Man könnte die Komplexität noch weiter reduzieren, indem man Objekte zu ganzen Programmteilen zusammenfasst, die vordefinierte Kommunikationsmittel verwenden. Dies wird bei der visuellen Programmierung (z.B. mit Java-Beans) realisert.

Dateien und Verzeichnisse

Die Daten auf der Festplatte sind in Dateien (files) organisiert. Diese Dateien werden vom Betriebssystem als Ganzes verwaltet. Die Dateien sind wiederum in Verzeichnissen (directories) zusammengefasst. Verzeichnisse können wiederum in anderen Verzeichnissen enthalten sein. Es entsteht so eine hierarchische Ordung von Verzeichnissen. An der Spitze steht das Wurzelverzeichnis eines Laufwerks (drive).

Unter Unix existiert ein einziger großer Baum von Verzeichnissen. Laufwerke auf entfernten Rechnern erscheinen einfach als Teil des Baumes unter einem Verzeichnisnamen. Sie werden dorthin gemounted.

Unter Windows wird jedes Laufwerk mit einem Laufwerksbuchstaben A,B,C,... gekennzeichnet. Dies führt dazu, dass die vollständigen Namen von Dateien mit Laufwerksbuchstaben, gefolgt von einem Doppelpunkt beginnen.

Die einzelnen Dateien haben Namen, die je nach Betriebssytem anderen Konventionen unterliegen. So sieht ein vollständiger Name unter Windows folgendermaßen aus

C:\MYFILES\FILE.TXT

Dies wäre die Datei mit Namen FILE.TXT im Verzeichnis MYFILES auf der Festplatte (dem Laufwerk) C. Den Teil nach dem letzten Punkt (txt) nennt man Dateierweiterung (extension).

In Dateinamen sind Leerzeichen erlaubt, wie in

C:\Meine Dateien\Erste Datei.txt

Beim Aufruf auf einer Kommandozeile macht dies Probleme. Die Datei muss dann in Anführungszeichen eingeschlossen werden. Unter UNIX heißt eine typische Datei

/home/mga010/My_Files/first_file.txt

Der Separator, der die Verzeichnisnamen voneinander und von den Dateien trennt, ist in Unix / und in Windows \, und der Laufwerksbuchstabe entfällt in Unix.

Daneben gibt es auch relative Namen. Diese gehen davon aus, dass ein aktuelles Verzeichnis eingestellt ist. Falls etwa /home/mga010 das aktuelle Verzeichnis ist, so bezeichnet

My_Files/first_file.txt

dieselbe Datei wie im obigen Beispiel. Daneben gibt es noch das übergeordnete Verzeichnis, das mit zwei Punkten bezeichnet wird.

../test.txt

bezeichnet die Datei test.txt im Mutterverzeichnis des aktuellen Verzeichnisses. Unter Windows sieht das genauso aus. Das aktuelle Verzeichnis wird übrigens mit einem Punkt . bezeichnet.

Das Betriebssytem setzt für jedes Programm, das gestartet wird, ein aktuelles Verzeichnis. Das Programm kann dieses Verzeichnis wechseln und so Dateien relativ ansprechen. Man erinnere sich, dass der Zugriff auf Dateien innerhalb eines Programms stets über Routinen des Betriebssystems erfolgt.

Die Kommandozeile (Shell)

Das Programm, womit man unter UNIX als erstes in Berührung kommt, ist die Kommandozeile (Command Shell). Unter Windows oder einer graphischen UNIX-Oberfläche lässt sich eine solche Kommandozeile ebenfalls mit einem einzigen Mausklick aufrufen. Sie heißt dort Eingabeaufforderung.

Allerdings wird die Kommandozeile mehr und mehr von graphischen Benutzeroberflächen (GUI) abgelöst, mit denen man viel intuitiver arbeiten kann. Für unsere Zwecke ist die Kenntnis der wichtigsten Kommandos jedoch sehr nützlich, da es für den Anfang am einfachsten ist, den Java-Compiler in einer der Kommandozeile zu steuern.

Man startet die Kommandozeile unter Windows über das Icon Eingabeaufforderung. Es öffnet sich das unten abgebildete Fenster. Normalerweise zeigt der Text vor dem blinkenden Cursor den aktuellen Pfad an. Hinter dem >-Zeichen gibt man Kommandos ein. Mit Hilfe der Return-Taste werden die Kommandos ausgeführt. Das gestartete Kommando gibt eventuell Ausgaben unterhalb der Eingabezeile aus.

Die Kommandozeile

Sie kann auf diese Weise

Im folgenden werden einige wichtige Kommandos für UNIX erklärt (und das Windows-Äquivalent). Es existieren Hunderte von Büchern über dieses Thema, insbesondere für UNIX, weil dort die Shell weit mehr Möglichkeiten eröffnet als die Eingabeaufforderung in Windows.

Zunächst kann man mit

ls

Die Dateien im aktuellen Verzeichnis auflisten. Das entsprechende Windows-Kommando heißt dir. Falls man nur bestimmte Dateien wünscht, so kann man einen Filter anhängen.

ls *.java

Dies listet die Namen aller Dateien, die auf .java enden. Um mehr Informationen zu bekommen, verwendet man

ls -l *.java

Mit dem Minuszeichen werden in UNIX Optionen angegeben. Unter Windows werden Optionen mit einem nachgestellten / angegeben, z.B. gibt

dir *.java /p

die Dateien seitenweise auf, wobei es nach jeder Seite stoppt und auf einen Tastendruck wartet. Hilfe bekommt man unter UNIX mit

man ls

und unter Windows mit

help dir

Man kann mit der Kommandozeile Dateien direkt kopieren, umbenennen und löschen. Die entsprechenden Kommandos lauten unter UNIX

cp datei.txt datei.bak
mv datei.txt other-name.txt
rm datei.txt

(copy, ren und del unter Windows). Dabei kann man z.B. auch ganze Gruppen von Dateien verschieben.

cp *.txt ../backup

Dies kopiert alle Dateien mit der Endung .txt in das Verzeichis backup, das ein Unterverzeichnis des übergeordneten Verzeichnis sein muss.

Zum Wechseln des aktuellen Verzeichnisses verwendet man

cd directory

Man kann Verzeichnisse mit

mkdir directory

(md unter DOS) erzeugen und mit

rmdir directory

löschen, wenn sie leer sind. Volle Verzeichnisse löscht man mit

rm -r directory

unter UNIX, und mit

rmdir /S directory

in Windows (Vorsicht!).

Natürlich kann man von der Kommandozeile aus auch Programme aufrufen. Dazu gibt man den Namen des Programms ein, gefolgt von den Parametern. Da nicht alle Programme, die man aufrufen will, im aktuellen Verzeichnis sind, existiert ein Suchpfad. Der Pfad ist unter Windows und UNIX anders organisiert, besteht jedoch immer aus einer Aufzählung von Verzeichnissen, die durchsucht werden sollen. Man erfährt den Pfad unter DOS mit

path

und mit

echo $PATH

unter UNIX. Um ihn zu ändern, muss man unter DOS etwa

path %PATH%;c:\java\bin

eingeben. Dies erweitert den Pfad um ein Verzeichnis c:\java\bin. Unter UNIX sieht dies so aus

PATH=$PATH:/software/jdk/bin

Dies soll vorerst als Erklärung der Kommandozeile genügen.

Das erste Java-Programm

Vor der Erstellung des ersten Java-Programms muss man sicher stellen, dass Java auf dem Rechner korrekt installiert ist, und zwar das Java Development Kit (JDK).

Falls Sie Linux verwenden, so ist dieses Kit möglicherweise in Ihrer Distribution enthalten, und sie brauchen es nur als Paket aufzurufen.

Unter Windows laden Sie sich bitte das inzwischen recht große Installationsprogramm vom Server von Oracle herunter und installieren es als Administrator. Verwechseln Sie das Paket nicht mit dem Java Runtime Environment (JRE), das für unsere Zwecke nicht genügt und im Development Kit enthalten ist.

Mit Hilfe der Kommandozeile und eines Editors kann man das erste Java-Programm erstellen. Wir verwenden folgende Version von "Hello World".

public class HelloWorld
{   
    public static void main (String args[])
    {   
        System.out.println("Hello World");
    }
}

Dieser Text muss nun in eine Datei HelloWorld.java gespeichert werden. Zum Erstellen einer solchen Datei verwenden wir einen Editor, wie etwa Notepad. Am einfachsten startet man den Editor mit der graphischen Benutzeroberfläche oder mit einer Kommandozeile, wie etwa unter Windows mit

notepad HelloWorld.java

Dies startet das Programm notepad mit dem Parameter HelloWorld.java. Notepad fragt hier nach, ob es eine neue Datei dieses Namens erstellen soll. Unter Unix stehen ebenso einfache Editoren zur Verfügung. Berühmt ist der sehr einfache Editor "vi" unter Unix, oder auch der sehr komplexe Editor "emacs".

Dann muss man den Text eingeben, ohne Fehler einzubauen. Mit Hilfe des Speicherkommandos des Editors wird der Text in das aktuelle Directory unter dem Namen HelloWorld.java abgespeichert werden.

Danach wird das Java-Programm kompiliert. Dies kann in einer Kommandozeile erfolgen.

javac HelloWorld.java

Dabei muss javac in einem Verzeichnis im Pfad sein, was nach der Installation des Java Development Kits normalerweise der Fall sein sollte. Falls nicht, muss man den vollen Namen eingeben oder den Pfad verändern (siehe oben). Achten Sie darauf, dass die Datei vom Editor tatsächlich unter dem Namen HelloWorld.java abgespeichert wurde. Insbesondere notepad nennt die Datei gerne in HelloWorld.java.txt um.

Der Compiler erzeugt nun eine Datei namens HelloWorld.class, die den Byte-Code enthält. Das Programm kann dann folgendermaßen ausgeführt werden.

java HelloWorld

Wieder muss das Programm java im Pfad enthalten sein. Das ganze sieht unter Windows folgendermaßen aus.

...>javac HelloWorld.java

...>java HelloWorld
Hello World!

...>

Falls Fehler im Programm sind, so werden diese nach dem Compiler-Aufruf ausgegeben. Das Programm muss dann entsprechend korrigiert werden.

Bessere Editoren

Es ist nicht optimal, Notepad oder einen entsprechend einfachen Unix-Editor zu verwenden. Eine Alternative ist ein mächtigerer Editor, der Unterstützung bei der Syntax erlaubt, und Programme und Compiler  automatisch startet. Unter Unix kann man Emacs verwenden. In Windows ist Notepad++ ein guter Edtior, oder auch der vom Autor dieses Kurses geschriebene JE.

Es empfiehlt sich aber, bessere Umgebungen für Java zu verwenden. Der Autor selbst verwendet Eclipse, das sie hier beziehen können. Diese Umgebung erfordert eine gewisse Einarbeitung. Eine Alternative ist BlueJ.

Übungsaufgaben

  1. Legen Sie auf Ihrem Computer einen Ordner java an.
  2. Machen Sie den Ordner java zum aktuellen Ordner.
  3. Starten Sie dort einen Editor und geben Sie das Programm HelloWorld.java ein.
  4. Speichern Sie es ab und kompilieren Sie es.
  5. Sehen Sie nach, wie groß die Datei HelloWorld.class ist.
  6. Starten Sie den Interpreter und führen Sie das Programm aus.
  7. Machen Sie bewusst einen Fehler in das Programm, und sehen Sie die Fehlermeldung des Compilers an. In welcher Zeile trat der Fehler auf?
  8. Installieren Sie eine Entwicklungsumgebung und programmieren Sie dort HelloWorld.

Zurück zum Java-Kurs