Einführung 1/31 Erste Schritte Organisatorisches/Einstieg Florian Adamsky, B. Sc. (PhD cand.) [email protected] http://florian.adamsky.it/ cbd Softwareentwicklung im WS 2014/15 Einführung Outline 2/31 1 Einführung Motivation Theoretische Grundlagen Programmierparadigmen Übersetzung in Maschinencode 2 Erste Schritte Entwicklungsumgebung Erste Schritte Einführung Table of Contents 3/31 1 Einführung Motivation Theoretische Grundlagen Programmierparadigmen Übersetzung in Maschinencode 2 Erste Schritte Entwicklungsumgebung Erste Schritte Einführung Motivation: Warum Programmieren lernen? 4/31 YouTube-Video: What Most Schools Don’t Teach Programmieren ist die Sprache des 21. Jahrhunderts Erste Schritte Einführung Erste Schritte Entscheidungsproblem 5/31 Theorem (Entscheidungsproblem) Gibt es ein System von Axiomen, aus denen alle Gesetze der Mathematik mechanisch ableitbar sind? David Hilbert (1900) Einführung Erste Schritte Entscheidungsproblem 5/31 Theorem (Entscheidungsproblem) Gibt es ein System von Axiomen, aus denen alle Gesetze der Mathematik mechanisch ableitbar sind? David Hilbert (1900) Negativbeweise durch: 1936: Alonzo Church mit seinem Lambda-Kalkül 1936: Alan Turing mit der Turing Maschine Einführung Erste Schritte λ-Kalkül minimale universelle Programmiersprache entwickelt von Church und Stephen Kleene bestehst aus: Funktionsabstraktion λ x . A anonyme Funktion die x als Parameter bekommt und A als Funktionskörper hat Funktionsapplikation 6/31 F A die Funktion F wird auf den Ausdruck A angewendet Abbildung: Alonzo Church by Princeton University Einführung Erste Schritte Turingmaschine 7/31 mathematisches Modell das aus folgenden Komponenten besteht: unendlich langem Speicherband mit Feldern programmierbaren Lese- und Schreibkopf q1 Turingmaschine ist die Basis der Von-Neumann-Architektur ... b b a a a a q1 . . . Speicherband Abbildung: Darstellung auf Basis von Sebastian Sardina Abbildung: Alan Turing Einführung Erste Schritte Definitionen Programmierparadigma ist ein Programmierstil dem verschiedene Prinzipien zugrunde liegen. Eine spezielle Art über Probleme nachzudenken. Programmiersprache formale Sprache die ein oder mehrere Programmierparadigmen unterstützt (Multiparadigmen-Sprache). 8/31 Einführung 9/31 Erste Schritte C/C++ OCaml F# Haskell Imperativ Funktional Smalltalk zustandsfrei Prolog Assembler Programmierung zustandsbe haftet Objektori entiert C++ Java Logik Esoterik Brainfuck Whitespace Einführung 10/31 Erste Schritte C/C++ OCaml F# Haskell Imperativ Funktional Smalltalk zustandsfrei Prolog Assembler Programmierung zustandsbe haftet Objektori entiert C++ Java Logik Esoterik Brainfuck Whitespace Einführung Erste Schritte Funktionale Programmierung 11/31 Basiert auf dem λ-Kalkül Formales Modell das auf Alonzo Church (1930) zurückgeht Funktionen entsprechen der mathematische Definition Funktionen sind nur abhängig von den Argumenten Einführung Erste Schritte Funktionale Programmierung 11/31 Basiert auf dem λ-Kalkül Formales Modell das auf Alonzo Church (1930) zurückgeht Funktionen entsprechen der mathematische Definition Funktionen sind nur abhängig von den Argumenten Definition (Funktion) f : D → Z : x 7→ f (x), d.h. jedem Element x ∈ D ist genau ein Element durch f (x) ∈ Z zugeordnet. Z D 0 1 2 3 1 2 4 Einführung Beispiel für funktionale Programmierung Example (Imperative – C#) int sum = 0; foreach (int i in mylist) { sum += (i + 1); } 12/31 Erste Schritte Einführung Erste Schritte Beispiel für funktionale Programmierung Example (Imperative – C#) Example (Funktional – Lisp) int sum = 0; (reduce '+ (mapcar '1+ mylist)) foreach (int i in mylist) { sum += (i + 1); } 12/31 Einführung Erste Schritte Prinzipien der funktionalen Programmierung 13/31 First-Class Funktionen Higher-Order Functions Lazy Evaluation Rekursion Programmiersprachen Common Lisp, Racket, Clojure, Scheme, Haskell, F#, OCaml, R, Erlang, Mathematica, . . . Einführung 14/31 Erste Schritte C/C++ OCaml F# Haskell Imperativ Funktional Smalltalk zustandsfrei Prolog Assembler Programmierung zustandsbe haftet Objektori entiert C++ Java Logik Esoterik Brainfuck Whitespace Einführung Logik Programmierung 15/31 basiert auf mathematischer Logik besteht daher aus einer Menge aus Axiomen Example (Prolog) grossvater(X,Y) :- vater(X,Z), vater(Z,Y). vater(adam,tobias). vater(tobias,frank). ?- grossvater(adam,frank). true. Erste Schritte Einführung 16/31 Erste Schritte C/C++ OCaml F# Haskell Imperativ Funktional Smalltalk zustandsfrei Prolog Assembler Programmierung zustandsbe haftet Objektori entiert C++ Java Logik Esoterik Brainfuck Whitespace Einführung Erste Schritte Imperative Programmierung 17/31 längste bekannte Programmierparadigma Quellcode legt fest, was in welcher Reihenfolge ausgeführt wird vergleichbar mit einem Kochrezept tue erst das, dann das Programmiersprachen C, Fortran, Ada, Cobol, Assembler Einführung 18/31 Erste Schritte C/C++ OCaml F# Haskell Imperativ Funktional Smalltalk zustandsfrei Prolog Assembler Programmierung zustandsbe haftet Objektori entiert C++ Java Logik Esoterik Brainfuck Whitespace Einführung Erste Schritte Objektorientierte Programmierung 19/31 Abbildung der Wirklichkeit in Form von Objekten, Attributen und Methoden Versteckt die imperative Programmierung in Klassen Example (Rechteck) Attribute höhe, breite Methoden vergrößern, berechneFlaechenInhalt, verschieben, . . . Rechteck quadrat(32, 32); quadrat.vergroessern(100); quadrat.berecheFlaecheninhalt(); quadrat.verkleinern(40); Einführung Erste Schritte Prinzipien der OO Programmierung 20/31 Klassen, Objekte, Vererbung Datenkapselung Polymorphismus Komposition und Aggregation Programmiersprachen Simula, Smalltalk, Java, C#, C++, Python, Ruby, Perl, Lisp (CLOS), . . . Einführung 21/31 Erste Schritte C/C++ OCaml F# Haskell Imperativ Funktional Smalltalk zustandsfrei Prolog Assembler Programmierung zustandsbe haftet Objektori entiert C++ Java Logik Esoterik Brainfuck Whitespace Einführung Erste Schritte Esoterische Programmierung 22/31 Sind nicht für den praktischen Einsatz gedacht Man versucht möglichst unverständliche Syntax zu erzeugen Viel Spaß auf http://esolangs.org/wiki/Main_Page Programmiersprachen Brainfuck, Whitespaces, Shakespeare Programming Language, Omgrofl, Einführung Erste Schritte Hello World in esoterischen Sprachen 23/31 Example (Brainfuck) ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++ +++++++++++++.>.+++.------.--------.>+.>. Einführung Erste Schritte Hello World in esoterischen Sprachen 23/31 Example (Brainfuck) ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++ +++++++++++++.>.+++.------.--------.>+.>. Example (Omgrofl) lol iz 72 rofl lol lol iz 101 Einführung Erste Schritte Hello World in esoterischen Sprachen 23/31 Example (Brainfuck) ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++ +++++++++++++.>.+++.------.--------.>+.>. Example (Omgrofl) lol iz 72 rofl lol lol iz 101 Example (SPL) Romeo, a young man with a remarkable patience. Juliet, a likewise young woman of remarkable grace. Einführung Compilevorgang Schritt 1 Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } Erste Schritte Einführung Erste Schritte Compilevorgang Schritt 1 Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } Objekt-Datei compile 10010110101010100 11010101010101110 (LIB REF) 01010101001010001 01010101001010001 (LIB REF) 01010101001010001 01010101001010001 Einführung Erste Schritte Compilevorgang Schritt 1 Quelltext Objekt-Datei int main() { 10010110101010100 if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } compile 11010101010101110 (LIB REF) Binär-Datei 10010110101010100 linken 11010101010101110 01010110101001011 01010101001010001 01010101001010001 01010101001010001 01010101001010001 10101010010111010 (LIB REF) 01010101001010001 01010101001010001 01010101001010001 01010101001010001 Bibliothek 10010110101010100 11010101010101110 01010110101001011 01010101001010001 01010101001010001 10101010010111010 01010101001010001 01010101001010001 Einführung Erste Schritte Compilevorgang Schritt 1 24/31 Quelltext Objekt-Datei int main() { 10010110101010100 if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } compile 11010101010101110 (LIB REF) Binär-Datei 10010110101010100 linken 11010101010101110 01010110101001011 01010101001010001 01010101001010001 01010101001010001 01010101001010001 10101010010111010 (LIB REF) 01010101001010001 01010101001010001 01010101001010001 01010101001010001 Bibliothek 10010110101010100 11010101010101110 01010110101001011 01010101001010001 01010101001010001 10101010010111010 01010101001010001 01010101001010001 ausführen CPU Einführung Erste Schritte Compiler Vor- und Nachteile 25/31 Vorteile sehr schnell, da Compiler viele Optimierung vornehmen kann Nachteile schwerer zu programmieren Systemabhängig Einführung Interpreter Skript #/usr/bin/perl use Module; my $hello = “ Hello World“ ; say $hello; Erste Schritte Einführung Erste Schritte Interpreter Skript #/usr/bin/perl use Module; my $hello = “ Hello World“ ; say $hello; ausführen Interpreter Einführung Erste Schritte Interpreter Skript #/usr/bin/perl ausführen Interpreter use Module; my $hello = “ Hello World“ ; say $hello; Bibliothek sub function { my ($a, $b, $c) = _; return $a + $b + $c; } Einführung Erste Schritte Interpreter 26/31 Skript #/usr/bin/perl ausführen Interpreter use Module; my $hello = “ Hello World“ ; say $hello; Bibliothek sub function { my ($a, $b, $c) = _; return $a + $b + $c; } 0010111010 CPU Einführung Erste Schritte Interpreter Vor- und Nachteile 27/31 Vorteile kein Compilieren notwendig kein selbstständiges Speichermanagement notwendig einfacher zu programmieren Betriebssystem-unabhängig, wenn Interpreter für das Betriebsystem zur Verfügung steht Nachteile deutlich langsamer als kompilierter Code Einführung Virtuelle Maschine Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } Erste Schritte Einführung Erste Schritte Virtuelle Maschine Bytecode Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; } compile 0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 cin >> var; 9: iconst_2 return 0; 10: istore_2 11: iload_2 Einführung Erste Schritte Virtuelle Maschine 28/31 VM 1010101 Linux VM 1010101 Windows VM 1010101 Mac OS ausführen Bytecode Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; } compile 0: iconst_2 1: istore_1 2: iload_1 ausführen 3: sipush 1000 6: if_icmpge 44 cin >> var; 9: iconst_2 return 0; 10: istore_2 11: iload_2 ausführen Einführung Erste Schritte VM Vor- und Nachteile 29/31 Vorteile schneller als Interpreter-Sprache, weil vorcompiliert einfacher zu programmieren Betriebssystem-unabhängig, wenn VM für das Betriebsystem zur Verfügung steht Nachteile langsamer als C Einführung Table of Contents 1 Einführung Motivation Theoretische Grundlagen Programmierparadigmen Übersetzung in Maschinencode 2 Erste Schritte 30/31 Entwicklungsumgebung Erste Schritte Einführung Erste Schritte Entwicklungsumgebung IDE 31/31 Texteditor Code::Blocks Sublime Text 2 http://www.codeblocks.org/ http://www.sublimetext.com/2 Visual C++ Express Notepad++ http://www.microsoft.com/ http://notepad-plus-plus.org/ visualstudio/eng/products/ Emacs visual-studio-2010-express http: Eclipse CDT //www.gnu.org/software/emacs/ http://www.eclipse.org/cdt/