Vorlesung2. Sitzung Grundlegende Programmiertechniken Wintersemester 2007/2008 Dozent Nino Simunic M.A. Computerlinguistik, Campus DU Grundlegende Programm, Algorithmus Syntax, Semantik Realisierungsebenen von Programmen Programmiertechniken, WS 2007/2008 Binärcode, Assembler, Höhere Programmiersprachen Compiler, Interpreter Code-Struktur (in Java) Variablen und Datentypen (in Java) Grundlegende Programmiertechniken, WS 2007/2008 Programm, Algorithmus Syntax, Semantik Woraus bestehen Programme im Wesentlichen? Programm = Daten + Befehle Daten Elemente, die das Programm verarbeitet Zahlen, Texte, Bilder, Videos, etc. Befehle Operationen, die mit den Daten ausgeführt werden Math. Operationen, Texte (vor-/ein-)lesen/schreiben, -4- Anordnung/Abarbeitung der Befehle strukturiert ist endlich: Algorithmus Algorithmen (1) Präzise definierte Handlungsvorschrift zur Lösung eines Problems in endlicher Zeit/endlichen Schritten. Alltagsalgorithmen Computerprogramme können aus mehreren Algorithmen bestehen -5- Bedienungsanleitungen, Kochrezepte, Routen, Waschmaschinenprogramm Analogie Kochrezept: Neben Hauptalgorithmus weitere Algorithmen für's Herstellen von Sahne, Blätterteig, etc. Bestehen aber aus einer begrenzten Anzahl von CodeZeilen. Algorithmen (2) Abstrakter Algorithums: Gegenstück zum konkret auf eine Maschine zugeschnittenen Programm Ist im Optimalfall Grundlage für die Implementierung. Abstraktion erfolgt im Weglassen der spezifischen Details der Maschine/Programmiersprache. 1. drucke "Hello World" … Oft auch in natürlicher Sprache semi-formal: Bsp.»Kaffeekoch«-Programm als »PseudoAlgorithmus«: take Filter -> place Filter -> take coffeePowder -> measure coffeePowder -> … -6- Hello World: Daten, Befehle, Algorithmus Das Hello World Programm enthält sowohl Daten, Befehle, und einen (zugegeben sehr simplen) Algorithmus: -7- "Hello World" System.out.println( DATEN ) Weitere Aspekte einer Programmiersprache: Syntax, Semantik Syntax Grammatik, Syntaxregeln, Symbole, »Vokabeln« Syntaxfehler werden vom Compiler/Interpreter anhand der Grammatik und einem Parser erkannt und zurückgewiesen Zuweisungsregel: Variable = Ausdruck (3+1) = eineVariable eineVariable = (3+1) Auch clas (class) ist ein syntaktischer Fehler Semantik Was "bedeutet" die Regel Variable = Ausdruck? Werte den Ausdruck rechts vom = aus und weise ihn der Variablen links vom = zu Online Spezifikation der »Java-Sprache«: http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html -8- Grundlegende Programmiertechniken, WS 2007/2008 Realisierungsebenen von Programmen Binärcode, Assembler, Höhere Programmiersprachen Realisierungsebenen von Programmen: Binärcode, Assembler Rechner sind »Abspielgeräte« für Programme und verstehen nur eine bestimmte Menge an elementaren Befehlen, die in Machinencode kodiert sind. Z.B.: -1010- ADDI ACC, 6 ACC = ACC + 6 01 11 0110 SUBI ACC, 6 ACC = ACC - 6 Programmierung in Assembler bzw. Maschinencod/Binärcode: 00 11 0110 Vorteil: Sehr performante Ausführung (kaum »Umwege«) Für den Programmierer unpraktikabel: Schwer zu programmieren, lesen, warten Anpassung für verschiedene Rechnersysteme/Prozessoren nötig. Kompromiss gesucht: Formale (»maschinell nutzbare«) Sprache mit höherem Anteil »Menschenlesbarkeit« Realisierungsebenen von Programmen: Höhere Programmiersprachen (1) Kompromiss bereits von Ihnen mit Hello World verwendet: Java als höhere Programmiersprache (PS) »Vokabular« und Konstrukte/Syntax oft in Anlehnung an die engl. Sprache: -1111- this, for, if, do, while, etc. IF thisIsTrue THEN this ELSE that WHILE (thisIsTrue) DO { thisAndThat} Realisierungsebenen von Programmen: Höhere Programmiersprachen (2) Höheren Programmiersprachen Höhere Programmiersprachen müssen übersetzt bzw. kompiliert werden -1212- Sind formale Sprachen und Mindestvoraussetzung für die Programmierung von Maschinen im Allgemeinen Besitzen demnach auch eine spezifische Grammatik Perl, JScript, Turbo Pascal, C#, C, C++ sind auch höhere Programmiersprachen. HTML, XML, etc. sind keine Programmiersprachen. By the way: Assembler muss auch kompiliert werden. Grundlegende Programmiertechniken, WS 2007/2008 Compiler, Interpreter Übersetzung höherer Programmiersprachen Interpreter Compiler -1414- Beispiele: Perl, PHP, Javascript, … Übersetzt bei Ausführung Zeile für Zeile eines Programms in Maschinencode: Syntaxfehler in Zeile 1000 wird es beim Erreichen dieser Stelle zur Laufzeit erkannt. C(++), Pascal, Java, … Übersetzt Quelltext vor der Laufzeit gänzlich in CPUverarbeitbaren Maschinencode Nur bedingt gültig für Java (Bytecode) Syntaxfehler nicht erst zur Laufzeit des Programms Java ist plattformunabhängig (Kompilierte) Java-Programme sind plattformunabhängig Mindestvoraussetzung: JRE (enthält JVM) auf dem ausführenden Rechner -1515- C, C++, …: Code muss für jede Plattform neu kompiliert werden Java-Version von Entwicklungs- und ausführendem Rechner sollten im Idealfall identisch sein Unterstützte OS, obligatorische Softwarekomponenten Solaris x64, Solaris OS SPARC, Solaris OS x86 Windows Intel IA32, Windows AMD64/EM64T 32-bit mode, Windows AMD64/EM64T 64-bit mode Linux Intel IA32, Linux AMD64/EM64T 32-bit mode, Linux AMD64/EM64T 64-bit mode … Überblick: http://java.sun.com/j2se/1.5.0/system-configurations.html -1616- Skizze: Interpreter-Sprachen und Übersetzung … Programmierer Spezifikation, Lösungsidee, Algorithmus (x==1) goto 10; … Programmiersprache Ausführung CPU -1717- If via Interpreter Skizze: Compiler-Sprachen und Übersetzung … 100110101 011011011 … … Programmierer Spezifikation, Lösungsidee, Algorithmus If (x==1) goto 10; … Compiler Ausführbares Programmiersprache Programm in Binärcode Direkte CPU -1818- Ausführung Skizze: Java Übersetzungsprozess, und Bytecode Compiler: Programmierer Spezifikation, Lösungsidee, Algorithmus Quelltext javac.exe ?6? ?7 ? ?8 ?9 ?: ? ?; ?< ?= Programm in ?> ?? in Java Ausführung: Interpretation Bytecode java.exe Laufzeitumgebung, Virtuelle Maschine JIT-Compiler -1919- CPU Plattformabhängigkeit (C, C++, …) Compiler (SPARC) Compiler //Quelltext (Pentium) Compiler (AMD64) (Kompilierte) Binärdatei SPARCPlattform (Kompilierte) Binärdatei PentiumPlattform (Kompilierte) Binärdatei AMD64- Plattform -2020- Plattformunabhängigkeit (Java) JVM (SPARCPlattform) Java //Quelltext Compiler (javac.exe) Java Bytecode Datei Plattformunbhängig JVM (PentiumPlattform) JVM (AMD64Plattform) -2121- Implementierungsprozess: Abstrakte/Generische Perspektive Aufgabe Modellierung Implementierung Einsatz Modellierung Konzeptioneller, abstrakter, algorithmisierter Entwurf der Problemlösung Implementierung Quelltext (Code, Quellcode) in einer ausgewählten Programmiersprache wie Java Einsatz Evaluation des Programms -2222- Je besser die Modellierung, desto effizienter die Programmierung Grundlegende Programmiertechniken, WS 2007/2008 Code-Struktur (in Java) Quelltext-Struktur in Java Quelltext-Datei Import-Anweisungen, Paketdefinitiaonen Klassendefinition Variablen mit Sichtbarkeitsmodifizierer Methode 1 Anweisung Anweisung Anweisung Anweisung Methode 2 Anweisung Anweisung Anweisung Anweisung Anweisung Anweisung -2424- Weitere Klassen möglich – später mehr dazu Programm bzw. Klassen-Struktur -2525- Ein Programm besteht aus mindestens einer Klasse Eine der Klassen enthält die main()-Methode Eine Klasse besteht (mindestens) aus dem Schlüsselwort class, gefolgt von einem Bezeichner und { einer Auflistung von Attributen, die Auflistung darf leer sein einer Auflistung von Methoden, die ebenfalls leer sein darf der schließenden geschweiften Klammer } Eine Methode besteht (mindestens) aus einem Schlüsselwort für den Rückgabewert (für jetzt: void) einem Bezeichner,gefolgt von einer Parameterliste in Klammern und { Null bis beliebig vielen Anweisungen der schließenden geschweiften Klammer } Veranschaulichung einiger Grundbegriffe Sichtbarkeitsmodifikator Schlüsselwort Klassenbezeichner Methodenbezeichner Parameterliste public class HelloWorld { Methodenkopf (Formaler) Parameter public static void main ( String[] args ) { Kommentar Methodenrumpf // Jetzt kommt eine Anweisung System.out.println( "Hello World!" ); } Argument (hier Literal) Methode (-naufruf) } static-Modifikator Anweisung -2626- Rückgabewert(-Typ) Elemente in dieser Farbe: Schlüsselwörter Schlüsselwörter, Symbole Schlüsselwörter Symbole -2727- Durch Java reservierte Wörter, die nicht als Bezeichner verwendet werden dürfen class ist bspw. kein gültiger Bezeichner für den Klassennamen oder anderes Besondere Bedeutung, u.a. die syntaktische Organisation und Strukturierung des Quellcodes Klammern: { }, ( ), [ ] ; Semikola/Semikolons am Ende jeder Anweisung , Kommata zum Trennen von Listenelementen Auflistung d. Schlüsselwörter -2828- Grundlegende Programmiertechniken, WS 2007/2008 Variablen, Datentypen Variablen: Einleitung und Definitionen (1) Variablen Deklaration -3030- Speichern veränderliche Werte Der Wertebereich von Variablen wird durch den Datentyp festgelegt Festlegung wird Deklaration einer Variablen genannt Der (Daten-)Typ der Variablen muss vor der Verwendung festgelegt werden, d.h. welche Werte sie annehmen kann Variablen: Deklarationseigenschaften Deklaration innerhalb einer Methode: -3131- Variable existiert sie nur innerhalb und während der Ausführung der Methode Eine weitere Methode in der Klasse hat (ohne Weiteres) keinen Zugriff! Eine Variable darf innerhalb einer (main-)Methode nur einmal deklariert werden! Innerhalb einer Methode haben Variablen keine Sichtbarkeitsmodifikatoren! (Mehr dazu später). Variablen: Datentypen -3232- Alle primitiven Datentypen und Referendatenztypen möglich Zuweisung eines nicht kompatiblen Werts (»passt nicht zum deklarierten Typ«), führt zu Fehlermeldungen (u. ggfs. zum Absturz des Programms)! Welche primtiven Datentypen gibt es in Java? Variablen: Einfache/Primitive Datentypen Ganzzahlen Schlüsselwort Bit Wertebereich Klasse byte 8 -128 bis 127 Byte short 16 -32768 bis 32767 Short int 32 -2147483648 bis 2147483647 Int long 64 -9223372036854775808 bis 9223372036854775807 Long Gleitkommazahlen (Wertebeich: ±m*2e (IEEE-754 Spez.)) Schlüsselwort Bit m e Klasse float 32 0 bis 224 -149 bis 104 Float double 64 0 bis 253 -1075 bis 970 Double Character, Boolean Schlüsselwort Bit Wertebereich Klasse char 16 \u0000 bis \uffff Character boolean 1 true oder false Boolean -3333- Variablen: (Syntax der) Deklaration Deklarationssyntax <Datentyp> <Variablenname>; oder <Datentyp> <Variablenname> = <Initialwert> ; int a; Anwendung Fehler -3434- int a=8; int a; a=8; a=2; a=251; int a=8; a=1; a=2; a=251; int a=8; a=1; int a=2; int a=8; a=1; String a="0"; Referenzdatentyp: String Zeichenketten werden in Objekten der Klasse String gespeichert Explizite Instanzierung nicht notwendig Zuweisung von Literalen direkt möglich String city = "44225 Dortmund"; String country = "NRW, Germany"; Konkatenation: Verknüpfung bzw. Verkettung von Zeichenketten Via + Operator String nachname = "Uwenknecht"; String vorname = "Ochse"; String name = vorname + " " + vorname; -3535- Primitive vs. Referenzdatentypen (mehr dazu später) Primitive Datentypen sind nicht komplex! Besitzen keine Attribute und Methoden Komplexe Datentypen (z.B. String) können beides besitzen! Aufruf nur nach Erzeugung eines Objekts möglich Ausnahmen: Statische Klassen-Elemente Aufruf von Methoden oder Attribut via Punktnotation System.out.println( "Hallo" ); String a = "Hi"; System.out.println( a.length() ); // 2 -3636- Deklarationsbeispiele innerhalb der main-Methode: Fehlerfälle public static void main (String[] var) { String text ="Jetzt lerne ich Java."; System.out.println(text); String text ="Jetzt lerne ich etwas anderes."; System.out.println(text); } public static void main (String[] var) { System.out.println(String text="Jetzt mache ich etwas falsch..."); text ="Jetzt lerne ich etwas anderes."; System.out.println(text="Och nö – doch nicht, anders überlegt."); } public static void main (String[] var) { text ="Jetzt lerne ich etwas anderes."; System.out.println(text); } public static void main (String[] var) { System.out.println(text); text ="Jetzt lerne ich Java."; } -3737- Variablen: Zusammenfassung -3838- Eine Variable ist ein benanntes Aufbewahrungsfach für einen Wert Eine Variable wird durch ihren Bezeichner (Namen) identifiziert Einer Variablen kann man einen Wert zuweisen (im Fach "hinterlegen") Der Wert einer Variablen kann man auslesen und modifizieren Eine Variable hat einen bestimmten Typ Nur Werte mit kompatiblem Typ können an die Variable zugewiesen werden Eine Variable muss vor ihrer Benutzung deklariert (erklärt) werden Deklaration an beliebiger Stelle innerhalb einer Klasse Doppelte Deklaration im selben Codeblock nicht zulässig (Für) Nächste Woche Lesen Sie aus Sprechen Sie Java? [Mössenböck:2005] die mindestens die Seiten 1-26. Hauptthemen der nächsten Woche Tutorien (3 x Woche) -3939- Operationen, Operatoren Kontrollstrukturen ... Termine werden bis zum 28.10. auf unserer Seite bekannt gemacht