# Turing-Vollständigkeit

Mit Turing-Vollständigkeit (engl. turing completeness) eines Systems wird seine universelle Programmierbarkeit beschrieben. Für die Adjektivform Turing-vollständig wird synonym häufig auch turingmächtig verwendet. Der Name ist abgeleitet vom englischen Mathematiker Alan Turing, der das Modell der universellen Turingmaschine eingeführt hat.

## Definition und Anwendung des Begriffs

Exakt ausgedrückt bezeichnet Turing-Vollständigkeit in der Berechenbarkeitstheorie die Eigenschaft einer Programmiersprache oder eines anderen logischen Systems, sämtliche (Turing)-berechenbaren Funktionen auch berechnen zu können. Eine universelle Turingmaschine kann alle berechenbaren Funktionen berechnen.
Anders ausgedrückt: ein Turing-vollständiges System und eine universelle Turingmaschine können sich gegenseitig emulieren.
Noch vor der Prägung des Begriffs wurde der erste turingmächtige mathematische Formalismus von Kurt Gödel im Jahre 1931 in seiner Arbeit zum Unvollständigkeitssatz veröffentlicht.
Die theoretische Definition einer Turingmaschine geht von unbegrenztem Speicherplatz aus, daher muss die Physik der Mathematik eine Grenze setzen. Da für die Funktion einer Turingmaschine prinzipiell unerheblich ist, wo der Speicher, mit dem sie arbeitet, seine Grenzen hat, so lange er groß genug ist, werden gängige Programmiersprachen und Computer, die universell wären, wenn sie unbegrenzten Speicher besäßen, als Turing-vollständig bezeichnet: sie besitzen alle Voraussetzungen (außer unbegrenzten Speicher), um eine Turingmaschine simulieren zu können. Die in den 1830er Jahren von Charles Babbage entworfene Analytical Engine hätte in diesem Sinne Turing-Vollständigkeit besessen, wäre sie jemals gebaut worden.
Die Zuse Z3 wurde 1941 gebaut, sie war nicht turingmächtig konstruiert und wurde auch nicht dafür genutzt. Wie Raúl Rojas im Jahr 1998 herausfand, ist sie über zwei Tricks (begrenzte Rechengenauigkeit und Zusammenkleben des Lochstreifens zu einer Schleife) dennoch Turing-vollständig, wird dabei aber sehr langsam.
Im Jahre 1954 veröffentlichte Hans Hermes als einer der Ersten einen Beweis für die Turing-Vollständigkeit der Von-Neumann-Rechenmaschinen, also von tatsächlich realisierten Computern. Alle modernen Computer sind ebenfalls im weiteren Sinne Turing-vollständig.
Eine Maschine, die Turing-vollständig ist, kann jede Berechnung, die irgendein Computer ausführen kann, ebenso ausführen und wird daher auch als universell programmierbar bezeichnet. Hierdurch ergibt sich jedoch weder eine Aussage über den Aufwand, ein bestimmtes Programm auf einer solchen Maschine zu implementieren, noch über die Zeit, die zur Ausführung benötigt werden würde.
Die Berechenbarkeitstheorie befasst sich damit, welche Probleme mit Hilfe einer Maschine, insbesondere mit einer Turingmaschine, lösbar sind.

## Beispiele

Die gängigen Programmiersprachen sind Turing-vollständig. Einige Autoren definieren den Begriff „Programmiersprache“ sogar auf Basis der Turing-Vollständigkeit. Dies schließt konventionelle prozedurale Sprachen wie C und objektorientierte Sprachen wie C++ und Java ein. Auch Sprachen, die nach weniger geläufigen Paradigmen entworfen wurden, unter anderem funktionale Programmiersprachen wie LISP und Haskell und Sprachen für Logikprogrammierung wie Prolog, sind Turing-vollständig. Ebenfalls Turing-vollständig sind die in der Berechenbarkeitstheorie verwendeten, minimalistischen Programmiersprachen GOTO und WHILE.
Beispiele für nicht Turing-vollständige Programmiersprachen zu finden, fällt Fachleuten schwer, da diese die Sprachen nach Funktionalität filtern und strukturelle Sprachen und rein prozessorientierte von vornherein als sehr eingeschränkt erachten und sie gar nicht erst in die Betrachtung aufnehmen. Ein häufig diskutiertes Beispiel sind SGML-Dialekte und -Derivate wie beispielsweise HTML, die Auszeichnungssprache zur Darstellung von Webseiten. Diese Struktur-Sprache ist bei Einsatz aller gegebenen Attribute durchaus in der Lage, universelle Beschreibungen für Prozesse zu halten. Auch die zeit-diskrete Steuerung bzw. die zeitliche Abfolge lässt sich mit Hilfe der Relationalen beschreiben. Alle Instrumentale, die nötig wären, sind im Sprachschatz vorhanden. Einziges Hindernis zur Aufnahme in die Reihe der Turing-vollständigen Sprachen stellt die Tatsache dar, dass HTML in sich nicht aktiv sein kann. Erst in Ergänzung um eine aktive Komponente, wie z. B. JavaScript, oder durch den ausführenden Webbrowser ergibt sich die Steuerbarkeit und verfolgbare zeitliche und hierarchische Abhängigkeit.
Eine Folge von Formeln in einer Tabellenkalkulation ohne Schleife ist nicht Turing-vollständig, obwohl es möglich ist, komplexe Operationen mit einem solchen System durchzuführen. Dagegen ist z. B. die Programmiersprache VBA für Microsoft Excel ihrerseits Turing-vollständig.
Reguläre Ausdrücke in Programmiersprachen, Editoren oder Systemwerkzeugen (z. B. grep), wo sie vor allem zum Pattern Matching verwendet werden, sind nicht Turing-vollständig, auch wenn in vielen Implementierungen reguläre Ausdrücke um Konstrukte wie Rückwärtsreferenzen (engl. backreferences) erweitert werden, die nicht mehr von endlichen Automaten erzeugt werden können.
Die relationale Algebra ist nicht Turing-vollständig, da es innerhalb dieser nicht möglich ist, die transitive Hülle zu bilden. Außerdem verfügt die Relationale Algebra nicht über Schleifen.
Turing-vollständig sind μ-rekursive Funktionen (daher kommt auch die Bezeichnung rekursiv für entscheidbare Mengen).
Der untypisierte Lambda-Kalkül ist Turing-vollständig, aber viele typbehaftete Kalküle, unter anderem System F, sind es nicht. Der Vorteil von typbehafteten Systemen ist ihre Möglichkeit, die meisten typischen Computerprogramme darzustellen, dabei aber mehr Fehler entdecken zu können.

## Weitergehende Schlussfolgerungen

Eine wichtige Schlussfolgerung aus der Berechenbarkeitstheorie ist, dass es keinen Algorithmus geben kann, der über jedes in einer bestimmten Turing-vollständigen Programmiersprache geschriebene Programm aussagen kann, ob es in endlicher Zeit abbricht oder für immer in einer Schleife bleibt (siehe Halteproblem). Eine Methode, dieses Problem zu umgehen, ist das Abbrechen eines Programmablaufs nach einer fixen Zeitspanne oder das Herabsetzen der Mächtigkeit von Kontroll-Anweisungen. Solche Systeme gelten jedoch strikt als nicht Turing-vollständig. Dieses Resultat wurde z. B. von Landweber abgeleitet.
Ein weiteres Theorem stammt aus der Berechenbarkeitstheorie. Mit einer Maschine, die nur endliche Schleifen bietet (zum Beispiel LOOP oder die dazu äquivalenten primitiv-rekursiven Funktionen), ist garantiert, dass jedes Programm irgendwann anhält. Mit dieser Maschine können jedoch nicht alle Probleme gelöst werden, die von einer Turing-Maschine gelöst werden können, z. B. die Ackermann-Funktion.