Einführung Java AnPr Name 1 Klasse Datum Programm, Programmiersprache „Computer sind dumm, aber zuverlässig“ – so könnte man im Groben die Eigenschaften eines Rechners beschreiben. Ein Computer ist im Wesentlichen ein Automat, der Befehle ohne „nachzudenken“ zuverlässig abarbeitet. Jeder Programmierer muss sich hierüber absolut im Klaren sein. Ein Programm, welches abstürzt ist nicht ein Problem des Computers, sondern ein Problem des Programmierers. Auch wenn man gerne über den Computer schimpft… Die aneinandergereihten Befehle bezeichnet man als Programme, welche eine Realisierung eines entsprechenden Algorithmus darstellen. Algorithmen sind Abarbeitungsregeln, Programme die reale Umsetzung davon. Unter Programmieren versteht man im Wesentlichen den Prozess, wie man eine Aufgabenstellung (oder besser Problemstellung) unter Einsatz einer (oder auch mehrerer) Programmiersprachen zu lösen. Hierzu gehört neben der eigentlichen Arbeit am Rechner auch die vorausgehende Konzeption. Es ist sogar in bestimmten Konstellationen denkbar, die Testvorbereitung und Durchführung ebenfalls hier einzureihen. Da Prozessoren nur eine reduzierte Anzahl von sehr einfachen Befehlen beherrschen1, sind Programme, die 1:1 vom Prozessor abgearbeitet werden können, nur sehr schwer für einen Menschen erstellbar bzw. nachvollziehbar. Man spricht hier von Maschinencode. Um uns dennoch zu ermöglichen effizient Programme zu erstellen, unterscheidet man grob zwischen maschinennahen Programmiersprachen und problemnahen Programmiersprachen (oder auch benutzernahe, bzw. höhere Programmiersprachen). Um nun ein Programm einer höheren Programmiersprache in Maschinencode umzuwandeln, benötigt man einen Compiler2. 1.1 Kompilierung in Binär Code Im Gegensatz zu problemorientierten Sprachen orientieren sich maschinennahe Sprachen an den Möglichkeiten der verwendeten Prozessoren. Da Prozessoren nur über einen primitiven Sprachvorrat verfügen, erlauben maschinennahe Sprachen keine problemorientierte Formulierung von Programmen. Q u e ll-P ro g ra m m in S p ra c h e A C o m p ile r fü r S p rach e A u n d P ro zesso r X C o m p ile r fü r S p rach e A u n d P ro zesso r Y C o m p ile r fü r S p rach e A u n d P ro zesso r Z O b je k t-P ro g ra m m (B in ä r C o d e ) fü r P ro z e s s o rty p X O b je k t-P ro g ra m m (B in ä r C o d e ) fü r P ro z e s s o rty p Y O b je k t-P ro g ra m m (B in ä r C o d e ) fü r P ro z e s s o rty p Z Abbildung 1: Übersetzung von Programmen, geschrieben mit traditionellen Programmiersprachen 3 1 Unterschiedliche Prozessortypen haben auch einen unterschiedlichen Sprachvorrat (engl.: Instruction Set) Zu beachten ist, das Scripts nicht kompiliert, sondern ausschließlich interpretiert werden. 3 Eigenheiten des Betriebssystems werden in dieser Grafik nicht betrachtet 2 ANPR_01_EinfuehrungJAVA_v02.docx Seite 1 Einführung Java AnPr Die Grafik zeigt die traditionelle Vorgehensweise wie bspw. C oder C++ bei der mittels Compiler Binär Code (also maschinenlesbarer Code, der bspw. in *.dll oder *.exe Dateien abgelegt wird) generiert wird. Dies gilt vor allem für Microcontroller, bei denen im Regelfall kein Betriebssystem vonnöten ist. Für PCs gilt, dass die Compiler nicht auf den Prozessor, sondern auf das Betriebssystem zugeschnitten sind. Wir werden noch eine weitere Strategie kennen lernen. Zur Bewertung der beiden Strategien können wir nun einige Vor- und Nachteile benennen: Vorteile: Optimale Ausnutzung der jeweiligen Prozessoreigenschaften, dadurch hohe Abarbeitungsgeschwindigkeit der übersetzten Programme. Nachteile Das übersetzte Programm läuft nur auf dem jeweiligen Prozessortyp. Für jeden Prozessortyp muss das Programm mit einem anderen Compiler übersetzt werden. Oft gibt es für verschiedene Prozessoren nur Compiler unterschiedlicher Hersteller, die sich auch teils unterschiedlich verhalten. Programmiersprachen sind oft nicht plattformunabhängig definiert, so dass pro Prozessortyp die Programme voneinander abweichen. 1.2 Kompilierung in Byte Code Neben der Kompilierung des Codes in Binärcode, der direkt vom Prozessor abgearbeitet werden kann, hat sich noch eine weitere Strategie durchgesetzt, bei der das Kompilat nicht direkt auf dem Prozessor abgearbeitet wird, sondern in einer Laufzeitumgebung, der sog. „Virtual Machine“. Bekanntestes Beispiel hierfür ist Java, oder auch C#. Java Development and Runtime Environment (JDRE) Java Source code Class Loader Java Class Libraries Java Interpreter Java Virtual Machine Java Compiler (javac) Runtime System Java Byte code (class) Operating System Hardware Compiletime Runtime Abbildung 2: Übersetzung von Programmen, geschrieben in Java Wie man sieht, wird auch hier kompiliert, jedoch in einen sog. Byte Code, welcher von der Laufzeitumgebung interpretiert und ausgeführt wird und entsprechend an das Betriebssystem und schließlich dem Prozessor weitergegeben wird. Vorteile Java ist unabhängig von allen Plattformen exakt definiert. Übersetzte Java-Programme laufen ohne Neuübersetzung auf allen Plattformen (Prozessortypen), für die es einen Java-Interpreter gibt. Nachteile Die übersetzten Programme laufen langsamer, da sie interpretiert werden. Seite 2 AnPr Einführung Java 1.3 Elemente einer Programmiersprache Allen modernen Programmiersprachen sind aus fünf Basiselementen aufgebaut. Diese Elemente unterscheiden die verschiedenen Sprachen: 1. 2. 3. 4. 5. Die Zeichensetzung, Interpunktion (punctuation) sind die verwendeten Symbole der Sprache Der Syntax (syntax) ist die Grammatik der Programmiersprache. Das Vokabular (vocabulary) besteht aus den reservierten Schlüsselwörtern (keywords). Die Operatoren (operators) verarbeiten Daten (+, -, *, /, and, or, …) Variablen (identifiers) werden benötigt für die Speicherreservierung. Programmiersprachen werden auch in sogenannten Generationen eingeteilt: Generation Beschreibung: Nutzung: 1 Binäre Maschinensprache Wird von Prozessor 1:1 verstanden. 2 Assemblersprachen Zur extrem hardwarenahen Programmierung (laufzeitoptimiert) 3 Problemorientierte, Sprachen imperative/prozedurale Effizienten Programmierung von Anwendungen. 4 4GL-Sprachen sind anwendungsorientiert, Viertgenerationssprachen dienen der schnellen z.B. SQL, Maple Schaffung von Lösungen für einen bestimmten Anwendungsbereich. 5 Deklarative Programmiersprachen 2 Beschreibung des Problems, nicht des Lösungswegs. Software Definitionen: Brockhaus Enzyklopädie: Sammelbezeichnung für Programme, die für den Betrieb von Rechensystemen zur Verfügung stehen, einschließlich der zugehörigen Dokumentation. Duden: Die nichtapparativen Funktionsbestandteile, die zum Betrieb einer Datenverarbeitungsanlage erforderlich sind. Lexikon der Informatik und Datenverarbeitung: Unter Software subsumiert man alle immateriellen Teile einer Datenverarbeitungsanlage. Software hat folgende Charakteristika: Software ist ein immaterielles Produkt Software unterliegt keinem Verschleiß Software wird nicht durch physikalische Gesetze begrenzt Software ist im allgemeinen leichter und schneller änderbar als ein technisches Produkt Für Software gibt es keine Ersatzteile Software altert Begriff: Algorithmus Anwendungssoftware Assemblersprache Erklärung: Programmlösungsbeschreibung, die festlegt, wie ein Problem gelöst werden kann. Software, die Aufgaben des Anwenders mit Hilfe eines Computersystems löst. Setzt in der Regel auf die Systemsoftware der verwendeten Hardware auf. Maschinennahe Programmiersprache, in der im Wesentlichen die Maschinenbefehle in sog. Mnemonics – also in merkbare Kürzel übersetzt sind. Ein Seite 3 Einführung Java AnPr Begriff: Erklärung: Assembler wiederum übersetzt die Programme von Assemblersprache in die eigentlichen Maschinenprogramme um. Compiler Ein kompliziertes Programm, das Quell-Programme, geschrieben in einer problemorientierten Programmiersprache, in Objekt-Programme (Sprachvorrat des Prozessors) umwandelt. Interpreter Analysiert Anweisung für Anweisung eines Programms und führt jede analysierte Anweisung sofort aus, bevor er die nächste analysiert. Problemorientierte Programmiersprache welche darauf hin designend wurde, problemnahe Programmiersprache Formulierungen der Algorithmen zu ermöglichen. Sie gehören zu den „Hochsprachen“ und müssen dementsprechend via Compiler in die Maschinensprache des Prozessors, bzw. in für das Betriebssystem ausführbaren Code konvertiert werden. Programmierumgebung Besser bekannt als „IDE“ (Integrated Development Environment), in der die (IDE) für das Entwickeln notwendigen Komponenten in eine Umgebung integriert wurden. Hierbei finden sich in der Regel „intelligente“ Texteditoren, Compiler, Fehlerdiagnosesysteme, Aufgabenverwaltungen, Bibliotheksverwaltungen, Batch-Hilfsprogramme und vieles mehr. Beispiele hierfür sind Eclipse oder Microsoft Visual Studio. Systemsoftware Software, die für eine spezielle Hardware oder Hardwarefamilie entwickelt wurde. Sie dient hauptsächlich dazu, die entsprechenden Funktionen der Komponenten zu ergänzen oder mitunter gar erst zu ermöglichen. Dies gilt sowohl für den Betrieb, als auch für die Wartung der Komponenten. 3 „Hello, World“ in Java Keine Informatikveranstaltung über Programmierung kann ohne das Erstellen der Anwendung „Hello, world“4 beginnen, auch diese nicht. Ziel ist es also, dass der Rechner den Satz Hello, world ausgibt. Java wurde von Sun entwickelt und ist eine objektorientierte5, plattformunabhängige Programmiersprache. Zur Entwicklungszeit von Java Applikationen wird das sog. JDK (Java Development Kit) und eine Entwicklungsumgebung (oder zumindest ein Texteditor) benötigt. Zur Laufzeit ist auf den Client-Rechnern das sog. JRE (Java Runtime Environment), die Java Virtual Machine notwendig. 3.1 Applikation erstellen Für das erste Beispiel verzichten wir auf eine IDE (Integrated Development Environment – also eine integrierte, meist grafische Entwicklungsumgebung) und erstellen alles „per Hand“ mit einem einfachen Editor, wie Wordpad, oder Notepad, Linux User würden als einfachsten Editor vi nutzen. Hier der Quellcode: class Hello { public static void main (String args[]) { System.out.println("Hello, World"); } } Dieser Quellcode muss nun als *.java Datei abgelegt werden, deren Name des Namens der Hauptklasse, also „Hello“ entspricht: Hello.java. 4 5 Erstmals durch Brian Kerningham in einem internen Programmierbuch eingeführt, erlangte es schließlich durch das Buch Kerningham/Ritchie: The C Programming Language Bekanntheit. Im Gegensatz zur prozeduralen Programmiersprache orientiert sich eine OO Programmiersprache nicht an Funktionen, sondern an Objekten, denen Eigenschaften und Methoden zugeordnet werden. Seite 4 AnPr Einführung Java 3.2 Applikation kompilieren Der Java Compiler javac.exe wird mit der Installation des JDK unter dem Installationspfad in dem Unterordner bin abgelegt. Bei Aufruf des Compilerprogramms wird als Parameter die Quellcodedatei (hier: Hello.java) übergeben. Das Komilierergebnis ist ein neues File mit der Endung *.class, also Hello.class, welche innerhalb der Virtual Machine ausführbar ist. Abbildung 3: Manueller Kompiliervorgang in Java Anmerkung: Damit das Betriebssystem Windows den Compiler in beliebigen Ordnern erkennt, sollte der Speicherort von javac.exe in die PATH Variable eingetragen werden. Alternativ dazu kann auch der gesamte Pfad bei der Ausführung von javac angegeben werden. Bei Nutzung einer IDE ist dies üblicherweise nicht der Fall, da der Pfad in der IDE Konfiguration eingetragen ist. 3.3 Applikation ausführen Damit die Applikation ausgeführt werden kann, muss sie dem Javainterpreter java.exe übergeben werden, wobei die auszuführende Hauptklasse, welche auch als *.class File vorhanden sein muss, als Parameter übergeben wird. Abbildung 4: Manuelles Ausführen einer Java Anwendung J2SE: J2EE: J2ME: Java RTS: Begriffe: Java Platform Standard Edition (zur Anwendungsprogrammentwicklung) Java Platform Enterprise Edition (für Applicationserver) Java Platform Mobile Edition (für mobile Geräte wie z.B. Mobiltelefone) Java Real-Time System (Für Echtzeitanwendungen ist nicht unbedingt die Ausführungsgeschwindigkeit entscheidend, sondern vielmehr die Tatsache, dass eine Aufgabe in einer definierten Zeit erledigt wird. Des Weiteren muss ein Echtzeitsystem in einer vorher definierten Zeit auf externe Ereignisse reagieren. Seite 5 Einführung Java 4 AnPr Lizenz Diese(s) Werk bzw. Inhalt von Maik Aicher (www.codeconcert.de) steht unter einer Creative Commons Namensnennung - Nicht-kommerziell - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz. Seite 6