\chapter{Programmiersprachen} Im folgenden werden einige Begriffe definiert anhand derer Programmiersprachen unterschieden werden können. \begin{definition}\xindex{Programmiersprache}\xindex{Programm}% Eine \textbf{Programmiersprache} ist eine formale Sprache, die durch eine Spezifikation definiert wird und mit der Algorithmen beschrieben werden können. Elemente dieser Sprache heißen \textbf{Programme}. \end{definition} Ein Beispiel für eine Sprachspezifikation ist die \textit{Java Language Specification}.\footnote{Zu finden unter \url{http://docs.oracle.com/javase/specs/}} Obwohl es kein guter Stil ist, ist auch eine Referenzimplementierung eine Form der Spezifikation. Im Folgenden wird darauf eingegangen, anhand welcher Kriterien man Programmiersprachen unterscheiden kann. \section{Abstraktion} Wie nah an den physikalischen Prozessen im Computer ist die Sprache? Wie nah ist sie an einer mathematisch / algorithmischen Beschreibung? \begin{definition}\xindex{Maschinensprache}\xindex{Befehlssatz}% Eine \textbf{Maschinensprache} beinhaltet ausschließlich Instruktionen, die direkt von einer CPU ausgeführt werden können. Die Menge dieser Instruktionen sowie deren Syntax wird \textbf{Befehlssatz} genannt. \end{definition} \begin{beispiel}[Maschinensprachen] \begin{bspenum} \item \xindex{x86}x86: \item \xindex{SPARC}SPARC: \end{bspenum} \end{beispiel} \begin{definition}\xindex{Assembler}% \textbf{Assembler} TODO \end{definition} \begin{beispiel}[Assembler]% TODO \end{beispiel} \section{Paradigmen} Die grundlegendste Art, wie man Programmiersprachen unterscheiden kann ist das sog. \enquote{Programmierparadigma}, also die Art wie man Probleme löst. \begin{definition}[Imperatives Paradigma]\xindex{Programmierung!imperative} In der imperativen Programmierung betrachtet man Programme als eine folge von Anweisungen, die vorgibt auf welche Art etwas Schritt für Schritt gemacht werden soll. \end{definition} \begin{definition}[Prozedurales Paradigma]\xindex{Programmierung!prozedurale} Die prozeduralen Programmierung ist eine Erweiterung des imperativen Programmierparadigmas, bei dem man versucht die Probleme in kleinere Teilprobleme zu zerlegen. \end{definition} \begin{definition}[Funktionales Paradigma]\xindex{Programmierung!funktionale} In der funktionalen Programmierung baut man auf Funktionen und ggf. Funktionen höherer Ordnung, die eine Aufgabe ohne Nebeneffekte lösen. \end{definition} Haskell ist eine funktionale Programmiersprache, C ist eine nicht-funktionale Programmiersprache. Wichtige Vorteile von funktionalen Programmiersprachen sind: \begin{itemize} \item Sie sind weitgehend (jedoch nicht vollständig) frei von Seiteneffekten. \item Der Code ist häufig sehr kompakt und manche Probleme lassen sich sehr elegant formulieren. \end{itemize} \begin{definition}[Logisches Paradigma]\xindex{Programmierung!logische} In der logischen Programmierung baut man Unifikation.\todo{genauer!} \end{definition} \section{Typisierung} Eine weitere Art, Programmiersprachen zu unterscheiden ist die stärke ihrer Typisierung. \begin{definition}[Dynamische Typisierung]\xindex{Typisierung!dynamische} Bei dynamisch typisierten Sprachen kann eine Variable ihren Typ ändern. \end{definition} Beispiele sind Python und PHP. \begin{definition}[Statische Typisierung]\xindex{Typisierung!statische} Bei statisch typisierten Sprachen kann eine niemals ihren Typ ändern. \end{definition} Beispiele sind C, Haskell und Java. \section{Kompilierte und interpretierte Sprachen} Sprachen werden überlicherweise entweder interpretiert oder kompiliert, obwohl es Programmiersprachen gibt, die beides unterstützen. C und Java werden kompiliert, Python und TCL interpretiert. \section{Dies und das} \begin{definition}[Seiteneffekt]\xindex{Seiteneffekt}\xindex{Nebeneffekt}\xindex{Wirkung} Seiteneffekte sind Veränderungen des Zustandes.\todo{Das geht besser} \end{definition} Manchmal werden Seiteneffekte auch als Nebeneffekt oder Wirkung bezeichnet. \begin{definition}[Unifikation]\xindex{Unifikation} \todo[inline]{Was ist das?} \end{definition}