2
0
Fork 0
mirror of https://github.com/MartinThoma/LaTeX-examples.git synced 2025-04-25 14:28:05 +02:00

Tippfehler korrigiert; Beispiele hinzugefügt

This commit is contained in:
Martin Thoma 2014-03-16 19:00:22 +01:00
parent deea4832fe
commit 0a336199c5
8 changed files with 68 additions and 22 deletions

View file

@ -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

View file

@ -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}

View file

@ -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.

Binary file not shown.

View file

@ -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];
}

View file

@ -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).