1/31 Organisatorisches/Einstieg Florian Adamsky, B. Sc. (PhD cand.) florian.adamsky@iem.thm.de http://florian.adamsky.it/ cbd Softwareentwicklung im WS 2014/15
2/31 Outline 1 Motivation Theoretische Grundlagen Programmierparadigmen Übersetzung in Maschinencode 2 Entwicklungsumgebung
3/31 Table of Contents 1 Motivation Theoretische Grundlagen Programmierparadigmen Übersetzung in Maschinencode 2 Entwicklungsumgebung
4/31 Motivation: Warum Programmieren lernen? YouTube-Video: What Most Schools Don t Teach Programmieren ist die Sprache des 21. Jahrhunderts
5/31 Entscheidungsproblem Theorem (Entscheidungsproblem) Gibt es ein System von Axiomen, aus denen alle Gesetze der Mathematik mechanisch ableitbar sind? David Hilbert (1900)
5/31 Entscheidungsproblem 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
6/31 λ-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 F A die Funktion F wird auf den Ausdruck A angewendet Abbildung: Alonzo Church by Princeton University
7/31 Turingmaschine 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... Speicherband q 1 Abbildung: Darstellung auf Basis von Sebastian Sardina Abbildung: Alan Turing
8/31 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).
9/31 OCaml C/C++ F# Imperativ Assembler Haskell Funktional Smalltalk zustandsfrei Programmierung zustandsbe haftet Objektori entiert C++ Prolog Logik Java Esoterik Brainfuck Whitespace
10/31 OCaml C/C++ F# Imperativ Assembler Haskell Funktional Smalltalk zustandsfrei Programmierung zustandsbe haftet Objektori entiert C++ Prolog Logik Java Esoterik Brainfuck Whitespace
11/31 Funktionale Programmierung 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
11/31 Funktionale Programmierung 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 f (x), d.h. jedem Element x D ist genau ein Element durch f (x) Z zugeordnet. D Z 1 2 3 4 0 2 1
12/31 Beispiel für funktionale Programmierung Example (Imperative C#) int sum = 0; foreach (int i in mylist) { sum += (i + 1); }
12/31 Beispiel für funktionale Programmierung Example (Imperative C#) int sum = 0; foreach (int i in mylist) { sum += (i + 1); } Example (Funktional Lisp) (reduce '+ (mapcar '1+ mylist))
13/31 Prinzipien der funktionalen Programmierung First-Class Funktionen Higher-Order Functions Lazy Evaluation Rekursion Programmiersprachen Common Lisp, Racket, Clojure, Scheme, Haskell, F#, OCaml, R, Erlang, Mathematica,...
14/31 OCaml C/C++ F# Imperativ Assembler Haskell Funktional Smalltalk zustandsfrei Programmierung zustandsbe haftet Objektori entiert C++ Prolog Logik Java Esoterik Brainfuck Whitespace
15/31 Logik Programmierung 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.
16/31 OCaml C/C++ F# Imperativ Assembler Haskell Funktional Smalltalk zustandsfrei Programmierung zustandsbe haftet Objektori entiert C++ Prolog Logik Java Esoterik Brainfuck Whitespace
17/31 Imperative Programmierung 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
18/31 OCaml C/C++ F# Imperativ Assembler Haskell Funktional Smalltalk zustandsfrei Programmierung zustandsbe haftet Objektori entiert C++ Prolog Logik Java Esoterik Brainfuck Whitespace
19/31 Objektorientierte Programmierung 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);
20/31 Prinzipien der OO Programmierung Klassen, Objekte, Vererbung Datenkapselung Polymorphismus Komposition und Aggregation Programmiersprachen Simula, Smalltalk, Java, C#, C++, Python, Ruby, Perl, Lisp (CLOS),...
21/31 OCaml C/C++ F# Imperativ Assembler Haskell Funktional Smalltalk zustandsfrei Programmierung zustandsbe haftet Objektori entiert C++ Prolog Logik Java Esoterik Brainfuck Whitespace
22/31 Esoterische Programmierung 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,
23/31 Hello World in esoterischen Sprachen Example (Brainfuck) ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++ +++++++++++++.>.+++.------.--------.>+.>.
23/31 Hello World in esoterischen Sprachen Example (Brainfuck) ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<++ +++++++++++++.>.+++.------.--------.>+.>. Example (Omgrofl) lol iz 72 rofl lol lol iz 101
23/31 Hello World in esoterischen Sprachen 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.
Compilevorgang Schritt 1 Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; }
Compilevorgang Schritt 1 Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } compile Objekt-Datei 10010110101010100 11010101010101110 (LIB REF) (LIB REF)
Compilevorgang Schritt 1 Quelltext Objekt-Datei Binär-Datei int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } compile 10010110101010100 11010101010101110 (LIB REF) (LIB REF) linken 10010110101010100 11010101010101110 01010110101001011 10101010010111010 Bibliothek 10010110101010100 11010101010101110 01010110101001011 10101010010111010
24/31 Compilevorgang Schritt 1 Quelltext Objekt-Datei Binär-Datei int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } compile 10010110101010100 11010101010101110 (LIB REF) (LIB REF) linken 10010110101010100 11010101010101110 01010110101001011 10101010010111010 ausführen CPU Bibliothek 10010110101010100 11010101010101110 01010110101001011 10101010010111010
25/31 Compiler Vor- und Nachteile Vorteile sehr schnell, da Compiler viele Optimierung vornehmen kann Nachteile schwerer zu programmieren Systemabhängig
Interpreter Skript #/usr/bin/perl use Module; my $hello = Hello World ; say $hello;
Interpreter Skript #/usr/bin/perl use Module; my $hello = Hello World ; say $hello; ausführen Interpreter
Interpreter Skript #/usr/bin/perl use Module; my $hello = Hello World ; say $hello; ausführen Interpreter Bibliothek sub function { my ($a, $b, $c) = _; return $a + $b + $c; }
26/31 Interpreter Skript #/usr/bin/perl use Module; ausführen Interpreter 0010111010 CPU my $hello = Hello World ; say $hello; Bibliothek sub function { my ($a, $b, $c) = _; return $a + $b + $c; }
27/31 Interpreter Vor- und Nachteile 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
Virtuelle Maschine Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; }
Virtuelle Maschine Quelltext int main() { if (a < b) cout << ffoo``; do while z = x - y; cin >> var; return 0; } compile Bytecode 0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 6: if_icmpge 44 9: iconst_2 10: istore_2 11: iload_2
28/31 Virtuelle Maschine VM 1010101 Linux ausführen Quelltext Bytecode int main() { if (a < b) cout << ffoo``; do while compile 0: iconst_2 1: istore_1 2: iload_1 3: sipush 1000 ausführen VM 1010101 Windows z = x - y; 6: if_icmpge 44 cin >> var; 9: iconst_2 return 0; 10: istore_2 } 11: iload_2 ausführen VM 1010101 Mac OS
29/31 VM Vor- und Nachteile 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
30/31 Table of Contents 1 Motivation Theoretische Grundlagen Programmierparadigmen Übersetzung in Maschinencode 2 Entwicklungsumgebung
31/31 Entwicklungsumgebung IDE Code::Blocks http://www.codeblocks.org/ Visual C++ Express http://www.microsoft.com/ visualstudio/eng/products/ visual-studio-2010-express Eclipse CDT http://www.eclipse.org/cdt/ Texteditor Sublime Text 2 http://www.sublimetext.com/2 Notepad++ http://notepad-plus-plus.org/ Emacs http: //www.gnu.org/software/emacs/