mirror of
https://github.com/MartinThoma/LaTeX-examples.git
synced 2025-04-25 06:18:05 +02:00
Tippfehler korrigiert; Beispiele hinzugefügt
This commit is contained in:
parent
deea4832fe
commit
0a336199c5
8 changed files with 68 additions and 22 deletions
Binary file not shown.
|
@ -1,8 +1,5 @@
|
||||||
%!TEX root = Programmierparadigmen.tex
|
%!TEX root = Programmierparadigmen.tex
|
||||||
\chapter{Programmiersprachen}
|
\chapter{Programmiersprachen}
|
||||||
Im folgenden werden einige Begriffe definiert anhand derer
|
|
||||||
Programmiersprachen unterschieden werden können.
|
|
||||||
|
|
||||||
\begin{definition}\xindex{Programmiersprache}\xindex{Programm}%
|
\begin{definition}\xindex{Programmiersprache}\xindex{Programm}%
|
||||||
Eine \textbf{Programmiersprache} ist eine formale Sprache, die durch eine
|
Eine \textbf{Programmiersprache} ist eine formale Sprache, die durch eine
|
||||||
Spezifikation definiert wird und mit der Algorithmen beschrieben werden
|
Spezifikation definiert wird und mit der Algorithmen beschrieben werden
|
||||||
|
@ -27,8 +24,8 @@ Wie nah ist sie an einer mathematisch / algorithmischen Beschreibung?
|
||||||
|
|
||||||
\begin{beispiel}[Maschinensprachen]
|
\begin{beispiel}[Maschinensprachen]
|
||||||
\begin{bspenum}
|
\begin{bspenum}
|
||||||
\item \xindex{x86}x86:
|
\item \xindex{x86}x86
|
||||||
\item \xindex{SPARC}SPARC:
|
\item \xindex{SPARC}SPARC
|
||||||
\end{bspenum}
|
\end{bspenum}
|
||||||
\end{beispiel}
|
\end{beispiel}
|
||||||
|
|
||||||
|
@ -65,28 +62,39 @@ Wie nah ist sie an einer mathematisch / algorithmischen Beschreibung?
|
||||||
\end{beispiel}
|
\end{beispiel}
|
||||||
|
|
||||||
\section{Paradigmen}
|
\section{Paradigmen}
|
||||||
Die grundlegendste Art, wie man Programmiersprachen unterscheiden
|
Eine weitere Art, wie man Programmiersprachen unterscheiden
|
||||||
kann ist das sog. \enquote{Programmierparadigma}, also die Art wie
|
kann ist das sog. \enquote{Programmierparadigma}, also die Art wie
|
||||||
man Probleme löst.
|
man Probleme löst.
|
||||||
|
|
||||||
\begin{definition}[Imperatives Paradigma]\xindex{Programmierung!imperative}
|
\begin{definition}[Imperatives Paradigma]\xindex{Programmierung!imperative}%
|
||||||
In der imperativen Programmierung betrachtet man Programme als
|
In der \textit{imperativen Programmierung} betrachtet man Programme als
|
||||||
eine folge von Anweisungen, die vorgibt auf welche Art etwas
|
eine Folge von Anweisungen, die vorgibt auf welche Art etwas
|
||||||
Schritt für Schritt gemacht werden soll.
|
Schritt für Schritt gemacht werden soll.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
\begin{definition}[Prozedurales Paradigma]\xindex{Programmierung!prozedurale}
|
\begin{beispiel}[Imperative Programmierung]
|
||||||
|
In folgenden Programm erkennt man den imperativen Programmierstil vor allem
|
||||||
|
an den Variablenzuweisungen:
|
||||||
|
\inputminted[numbersep=5pt, tabsize=4]{c}{scripts/c/fibonacci-imperativ.c}
|
||||||
|
\end{beispiel}
|
||||||
|
|
||||||
|
\begin{definition}[Prozedurales Paradigma]\xindex{Programmierung!prozedurale}%
|
||||||
Die prozeduralen Programmierung ist eine Erweiterung des imperativen
|
Die prozeduralen Programmierung ist eine Erweiterung des imperativen
|
||||||
Programmierparadigmas, bei dem man versucht die Probleme in
|
Programmierparadigmas, bei dem man versucht die Probleme in
|
||||||
kleinere Teilprobleme zu zerlegen.
|
kleinere Teilprobleme zu zerlegen.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
\begin{definition}[Funktionales Paradigma]\xindex{Programmierung!funktionale}
|
\begin{definition}[Funktionales Paradigma]\xindex{Programmierung!funktionale}%
|
||||||
In der funktionalen Programmierung baut man auf Funktionen und
|
In der funktionalen Programmierung baut man auf Funktionen und
|
||||||
ggf. Funktionen höherer Ordnung, die eine Aufgabe ohne Nebeneffekte
|
ggf. Funktionen höherer Ordnung, die eine Aufgabe ohne Nebeneffekte
|
||||||
lösen.
|
lösen.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
|
\begin{beispiel}[Funktionale Programmierung]
|
||||||
|
Der Funktionale Stil kann daran erkannt werden, dass keine Werte zugewiesen werden:
|
||||||
|
\inputminted[numbersep=5pt, tabsize=4]{haskell}{scripts/haskell/fibonacci-akk.hs}
|
||||||
|
\end{beispiel}
|
||||||
|
|
||||||
Haskell ist eine funktionale Programmiersprache, C ist eine
|
Haskell ist eine funktionale Programmiersprache, C ist eine
|
||||||
nicht-funktionale Programmiersprache.
|
nicht-funktionale Programmiersprache.
|
||||||
|
|
||||||
|
@ -97,21 +105,31 @@ Wichtige Vorteile von funktionalen Programmiersprachen sind:
|
||||||
sich sehr elegant formulieren.
|
sich sehr elegant formulieren.
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
\begin{definition}[Logisches Paradigma]\xindex{Programmierung!logische}
|
\begin{definition}[Logisches Paradigma]\xindex{Programmierung!logische}%
|
||||||
In der logischen Programmierung baut auf der Unifikation auf.\todo{genauer!}
|
Das \textbf{logische Programmierparadigma} baut auf der formalen Logik auf.
|
||||||
|
Man verwendet \textbf{Fakten} und \textbf{Regeln}
|
||||||
|
und einen Inferenzalgorithmus um Probleme zu lösen.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
|
Der Inferenzalgorithmus kann z.~B. die Unifikation nutzen.
|
||||||
|
|
||||||
|
\begin{beispiel}[Logische Programmierung]
|
||||||
|
Obwohl die logische Programmierung für Zahlenfolgen weniger geeignet erscheint,
|
||||||
|
sei hier zur Vollständigkeit das letzte Fibonacci-Beispiel in Prolog:
|
||||||
|
\inputminted[numbersep=5pt, tabsize=4]{prolog}{scripts/prolog/fibonacci.pl}
|
||||||
|
\end{beispiel}
|
||||||
|
|
||||||
\section{Typisierung}
|
\section{Typisierung}
|
||||||
Eine weitere Art, Programmiersprachen zu unterscheiden ist die stärke
|
Eine weitere Art, Programmiersprachen zu unterscheiden ist die Stärke
|
||||||
ihrer Typisierung.
|
ihrer Typisierung.
|
||||||
|
|
||||||
\begin{definition}[Dynamische Typisierung]\xindex{Typisierung!dynamische}
|
\begin{definition}[Dynamische Typisierung]\xindex{Typisierung!dynamische}%
|
||||||
Bei dynamisch typisierten Sprachen kann eine Variable ihren Typ ändern.
|
Bei dynamisch typisierten Sprachen kann eine Variable ihren Typ ändern.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
Beispiele sind Python und PHP.
|
Beispiele sind Python und PHP.
|
||||||
|
|
||||||
\begin{definition}[Statische Typisierung]\xindex{Typisierung!statische}
|
\begin{definition}[Statische Typisierung]\xindex{Typisierung!statische}%
|
||||||
Bei statisch typisierten Sprachen kann eine niemals ihren Typ ändern.
|
Bei statisch typisierten Sprachen kann eine niemals ihren Typ ändern.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
|
@ -125,10 +143,11 @@ C und Java werden kompiliert, Python und TCL interpretiert.
|
||||||
|
|
||||||
\section{Dies und das}
|
\section{Dies und das}
|
||||||
\begin{definition}[Seiteneffekt]\xindex{Seiteneffekt}\index{Nebeneffekt|see{Seiteneffekt}}\index{Wirkung|see{Seiteneffekt}}%
|
\begin{definition}[Seiteneffekt]\xindex{Seiteneffekt}\index{Nebeneffekt|see{Seiteneffekt}}\index{Wirkung|see{Seiteneffekt}}%
|
||||||
Seiteneffekte sind Veränderungen des Zustandes.\todo{Das geht besser}
|
Seiteneffekte sind Veränderungen des Zustandes eines Programms.
|
||||||
\end{definition}
|
\end{definition}
|
||||||
|
|
||||||
Manchmal werden Seiteneffekte auch als Nebeneffekt oder Wirkung bezeichnet.
|
Manchmal werden Seiteneffekte auch als Nebeneffekt oder Wirkung bezeichnet.
|
||||||
|
Meistens meint man insbesondere unerwünschte oder überaschende Zustandsänderungen.
|
||||||
|
|
||||||
\begin{definition}[Unifikation]\xindex{Unifikation}%
|
\begin{definition}[Unifikation]\xindex{Unifikation}%
|
||||||
Die Unifikation ist eine Operation in der Logik und dient zur Vereinfachung
|
Die Unifikation ist eine Operation in der Logik und dient zur Vereinfachung
|
||||||
|
|
|
@ -82,8 +82,13 @@ Ein Companion Object ist ein Objekt mit dem Namen einer Klasse oder eines Traits
|
||||||
Im Gegensatz zu anderen Objekten / Traits hat das Companion Object zugriff auf
|
Im Gegensatz zu anderen Objekten / Traits hat das Companion Object zugriff auf
|
||||||
die Klasse.
|
die Klasse.
|
||||||
|
|
||||||
\section{actor}\xindex{actor}
|
\section{actor}
|
||||||
actor dient der Concurrency.
|
\begin{definition}[Aktor]\xindex{Aktor}\index{actor|see{Aktor}}
|
||||||
|
Ein \textit{Aktor} ist ein Prozess, der Nebenläufig zu anderen Aktoren
|
||||||
|
läuft. Er kommuniziert mit anderen Aktoren, indem er Nachrichten austauscht.
|
||||||
|
\end{definition}
|
||||||
|
|
||||||
|
Das folgende Wetter-Beispiel zeigt, wie man Aktoren benutzen kann.
|
||||||
|
|
||||||
\section{Beispiele}
|
\section{Beispiele}
|
||||||
\subsection{Wetter}
|
\subsection{Wetter}
|
||||||
|
|
|
@ -21,7 +21,7 @@ fraglich, ob ich bis zur Klausur alles in guter Qualität bereitstellen
|
||||||
kann. Daher freue ich mich über jeden Verbesserungsvorschlag.
|
kann. Daher freue ich mich über jeden Verbesserungsvorschlag.
|
||||||
|
|
||||||
Anregungen, Verbesserungsvorschläge und Ergänzungen können per
|
Anregungen, Verbesserungsvorschläge und Ergänzungen können per
|
||||||
Pull-Request gemacht werden oder mir per Email an info@martin-thoma.de
|
Pull-Request gemacht werden oder mir per E-Mail an info@martin-thoma.de
|
||||||
geschickt werden.
|
geschickt werden.
|
||||||
|
|
||||||
\section*{Erforderliche Vorkenntnisse}
|
\section*{Erforderliche Vorkenntnisse}
|
||||||
|
@ -32,3 +32,6 @@ das $\mathcal{O}$-Kalkül aus \enquote{Grundbegriffe der Informatik} hilfreich s
|
||||||
|
|
||||||
Die Unifikation wird wohl auch in \enquote{Formale Systeme}
|
Die Unifikation wird wohl auch in \enquote{Formale Systeme}
|
||||||
erklärt; das könnte also hier von Vorteil sein.
|
erklärt; das könnte also hier von Vorteil sein.
|
||||||
|
|
||||||
|
Die Grundlagen des Kapitels \enquote{Parallelität} wurden in Softwaretechnik I
|
||||||
|
(kurz: SWT I) gelegt.
|
BIN
documents/Programmierparadigmen/scripts/c/fibonacci
Executable file
BIN
documents/Programmierparadigmen/scripts/c/fibonacci
Executable file
Binary file not shown.
|
@ -0,0 +1,14 @@
|
||||||
|
int fib(int n) {
|
||||||
|
if (n < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int fib[2] = {0, 1}, tmp;
|
||||||
|
|
||||||
|
for (; n > 0; n--) {
|
||||||
|
tmp = fib[1];
|
||||||
|
fib[1] = fib[0] + fib[1];
|
||||||
|
fib[0] = tmp;
|
||||||
|
}
|
||||||
|
return fib[0];
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
fibAkk n n1 n2
|
fibAkk n n1 n2
|
||||||
| (n == 0) = n1
|
| (n == 0) = n1
|
||||||
| (n == 1) = n2
|
| (n == 1) = n2
|
||||||
| otherwise = fibAkk (n - 1) n2 (n1 + n2)
|
| otherwise = fibAkk (n - 1) n2 (n1 + n2)
|
||||||
fib n = fibAkk n 0 1
|
fib n = fibAkk n 0 1
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
fib(0, A, _, A).
|
||||||
|
fib(N, A, B, F) :- N1 is N - 1,
|
||||||
|
Sum is A + B,
|
||||||
|
fib(N1, B, Sum, F).
|
||||||
|
fib(N, F) :- fib(N, 0, 1, F).
|
Loading…
Add table
Add a link
Reference in a new issue