WS 14/15 - Florian Adamsky

Werbung
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/
Herunterladen