1 Erste Schritte 1- 1 Erste Schritte Inhalt Literatur Einführung in die Computer-Architektur Programme und Daten Dateien und Verzeichnisse Die Kommandozeile (Shell) Das erste Java-Programm Übungsaufgaben Literatur • Krüger G.: Java 1.1 lernen • Flanagan D.: Java in a Nutshell (O'Reilly) • Flanagan D.: Java Examples in a Nutshell (O'Reilly) • Lemay L. : Java 1.1 in 21 Tagen • Davis S.: Java Now! (Java Jetzt!), Microsoft Press • Bishop J: Java Gently (Addison-Wesley) Software • Java Development Kit, http://www.javasoft.com • Symantec Cafe, http://www.symantec.com • Visual Age for Java, http://www.software.ibm.com/ad/vajava/ • Sun, http://www.sun.com • Java World, http://www.javaworld.com Internet 1 Erste Schritte 1- 2 Einführung in die Computer-Architektur Stichwort: von Neumann Architektur Diese Einführung ist nur sehr stichwortartig gehalten. 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 • Speicher für Programme und Daten. • Prozessor (arbeitet Befehle der Programme sequentiell ab, liest und schreibt Daten) Angeschlossen sind Peripherie-Geräte • Massenspeicher, wie Festplatten und CD-ROM • Grafik-Ausgabe (bestehend aus Grafikspeicher, Prozessor und Bildschirm) • Eingabegeräte (Tastatur, Maus) 1 Erste Schritte 1- 3 • externen Geräten, wie Drucker und Modem • Netzkarten zur Verbindung mit anderen Rechnern 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 muß 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. In diesem Abschnitt ist von den Daten im Speicher (RAM, random access memory) die Rede. 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 meist in Schichten wachsender Komplexität organisiert. Es • stellt Routinen zur Kommunikation mit den Peripheriegeräten zur Verfügung, zum Teil schon im nichtflüchtigen Speicher (ROM) als BIOS (basic input/output), • stellt kompliziertere Schichten zur Kommunikation und Datenverwaltung zur Verfügung, z.B. zur Kommunikation mit der Festplatte oder mit einer Netzkarte, • stellt in einer höheren Schicht Grafikroutinen zur Verwaltung des Bildschirms (graphical user interface, GUI) zur Verfügung. Grundsätzlich kann ein Programm folgende Datenbereiche benutzen. • Stack: Ein Stapelspeicher, der von unten nach oben wächst und von oben nach unten schrumpft (last in, first out, lifo); wird meist für kurzlebige Daten benutzt. • Heap: Ein Teil des Speichers der längerfristig vom System zur Verfügung gestellt wird. 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. Der Stack wird insbesondere benutzt, um Daten für Unterprogramme zu halten 1 Erste Schritte 1- 4 Unterprogramme sind Teile eines Programms, die von verschiedenen Stellen angesprungen werden und automatisch zurückkehren. Dabei werden • die Rücksprungadresse, • eventuelle Parameter an das Unterprogramm, • lokale Daten, die nach Beendigung des Unterprogramms nicht mehr benötigt werden, auf dem Stack abgelegt. Es können mehrere Programme gleichzeitig aktiv sein. Der Prozessor wechselt so schnell zwischen den Programmen (Prozessen) hin und her, daß 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 Prozeß zu Prozeß 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änging (nicht portabel). Es gibt nun zwei Arten, die Maschinensprache zu umgehen. • Compiler übersetzen eine verständlichere Sprache in die MaschinenAnweisungen, die dann das ausführbare Programm bilden. 1 Erste Schritte • 1- 5 Interpreter lesen die Anweisungen einer Sprache und führen zu jeder Anweisung eine Reihe von Maschinenbefehlen aus. Es gibt auch Zwitter, wie etwa Java, die zunächst in einen Bytecode übersetzen und diesen dann interpretieren. Dies hat gegenüber den obigen Extremen Vorteile. • Im Unterschied zum Compiler ist das übersetzte Programm vom verwendeten Compiler unabhängig. • Die Interpretation von Byte-Code ist weitaus schneller als die direkte Interpretation des Programmtextes (allerdings natürlich langsamer als das Ausführen von Maschinensprache). 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; zusammengefaßt. 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); zusammengefaßt. Eine weitere Reduktion der Komplexität bringt die Objektorientierte Programmierung (OOP), die Daten und zugehörige Unterprogramme in Objekten zusammenfaßt. Java ist eine objektorientierte Sprache. Dazu später erheblich mehr. Man könnte die Komplexität noch weiter reduzieren, indem man Objekte zu ganzen Programmteilen zusammenfaßt, 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) zusammengefaßt. 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). 1 Erste Schritte 1- 6 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 DOS und Windows wird jedes Laufwerk mit einem Laufwerksbuchstaben A,B,C,... gekennzeichnet. Die einzelnen Dateien haben Namen, die je nach Betriebssytem anderen Konventionen unterliegen. So sieht ein vollständiger Name unter DOS und Windows 3.1 folgendermaßen aus C:\MYFILES\FILE.TXT Dies wäre die Datei mit Namen FILE.TXT im Verzeichnis MYFILES auf der Festplatte C. Den Teil nach dem letzten Punkt (txt) nennt man Dateierweiterung (extension). Unter Windows 95 kommt hinzu, daß Dateinamen und Verzeichnisnamen länger als 8 Zeichen sein können und Leerzeichen erlaubt sind. Außerdem wird Groß- und Kleinschreibung unterschieden C:\Meine Dateien\Erste Datei.txt Unter UNIX heißt eine typische Datei /home/mga010/My_Files/first_file.txt Leerzeichen sind möglich, aber nicht üblich. Der Seperator ist hier /, und der Laufwerksbuchstabe entfällt. Daneben gibt es auch relative Namen. Diese gehen davon aus, daß ein aktuelles Verzeichnis eingestellt ist. Falls etwa /home/mga010 das aktuelle Verzeichnis ist, so bezeichnet My_Files/first_file.txt dieselbe Datei wie im letzten Beispiel. Daneben gibt es noch das übergeordnete Verzeichnis. ../test.txt bezeichnet die Datei test.txt im Mutterverzeichnis des aktuellen Verzeichnisses. Unter DOS 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, daß der Zugriff auf Dateien innerhalb eines Programms stets über Routinen des 1 Erste Schritte 1- 7 Betriebssystems erfolgt. Die Kommandozeile (Shell) Das Programm, womit man unter DOS und UNIX als erstes in Berührung kommt, ist die Kommandozeile (Shell). Unter Windows oder einer graphischen UNIX-Oberfläche läßt sich eine solche Kommandozeile mit einem einzigen Mausklick aufrufen. 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 unerläßlich. Die Kommandozeile • nimmt Eingaben mit der Tastatur entgegen, • stellt sie am Bildschirm dar • und interpretiert diese Eingaben. Sie kann auf diese Weise • andere Programme starten, • gewisse Operationen mit Dateien direkt ausführen, • Informationen über den Rechner ausgeben, und anderes. 1 Erste Schritte 1- 8 Im folgenden werden einige wichtige Kommandos für UNIX erklärt (und das DOSÄ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 DOS-Kommandozeile. Zunächst kann man mit ls Die Dateien im aktuellen Verzeichnis auflisten. Das entsprechende DOS-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, vewendet man ls -l *.java Mit dem Minuszeichen werden in UNIX Optionen angegeben. Uner DOS 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 DOS 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 DOS). 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 muß. 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 deltree directory 1 Erste Schritte 1- 9 unter DOS (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 DOS 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, muß 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 für die Kommandozeile genügen. Das erste Java-Programm 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 muß 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. Dann muß man den Text eingeben, ohne irgendwelche 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 zunächst nur in einer Kommandozeile erfolgen. javac HelloWorld.java Dabei muß javac in einem Verzeichnis im Pfad sein. Falls nicht, muß man den vollen Namen eingeben oder den Pfad verändern (siehe oben). Achten Sie darauf, daß die Datei vom Editor tatsächlich unter dem Namen HelloWorld.java abgespeichert wurde. 1 Erste Schritte 1 - 10 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 muß das Programm java im Pfad enthalten sein. Das ganze sieht unter Windows 95 folgendermaßen aus. D:\java\kurs>javac HelloWorld.java D:\java\kurs>java HelloWorld Hello World! D:\java\kurs> Falls Fehler im Programm sind, so werden diese nach dem Compiler-Aufruf ausgegeben. Das Programm muß dann entsprechend korrigiert werden. Ü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 bewußt einen Fehler in das Programm, und sehen Sie die Fehlermeldung des Compilers an. In welcher Zeile trat der Fehler auf?