HTML ist keine Programmiersprache, oder: Wann ist eine Sprache eine Programmiersprache?
Man liest immer wieder von Leuten, die angeblich HTML programmieren können – wie geht das denn? Über die Motive dieser Leute kann ich nur spekulieren, vielleicht denken sie, sie würden programmieren, weil sie es mit Code zu tun haben und Code? Ja klar, das muss doch mit Programmieren zu tun haben! Andere wissen vielleicht einfach kein besseres Wort, für das was sie da mit HTML machen oder sie wollen einfach geek sein, denn als Programmierer ist man ja ein oberschlauer Hacker. Zu behaupten, HTML sei eine Programmiersprache, ist aber natürlich Unsinn.
Eine unwissenschaftliche Erklärung
HTML-Seiten werden weder programmiert, noch sind Menschen, die HTML schreiben, Programmierer. HTML ist stattdessen eine Auszeichnungsprache (dafür stehen auch die letzten beiden Buchstaben des englischen Akronyms: HTML – Hypertext Markup Language) und HTML wird nicht programmiert, sondern einfach geschrieben. Das Schreiben von HTML-Seiten ist so ungefähr auf dem Level mit dem Schreiben von Word-Dokumenten (es soll ja sogar Leute geben, die HTML-Seiten auch tatsächlich mit Word schreiben). HTML hat keine Befehle und es fehlen essenzielle Sprachkonstrukte von „echten“ Programmiersprachen (Schleifen, Bedingungen etc.). Man kann also keine Algorithmen in HTML schreiben.
Echte Programmiersprachen im Web sind hingegen Java, JavaScript, PHP und Perl. Sie können mit HTML kombiniert werden, machen deshalb aber aus HTML keine Programmiersprache.
Eine wissenschaftliche Erklärung
Puh, dafür muss ich erstmal etwas ausholen…
Vermutlich geht diese Erklärung völlig an der Zielgruppe vorbei, denn wer HTML als Programmiersprache bezeichnet, der hat wahrscheinlich noch nie eine echte Programmiersprache gesehen oder gar genutzt und dem werden für diesen Erklärungsansatz einige Vergleichsmöglichkeiten fehlen. Nun denn, los geht’s…
Alan Turing
Alan Turing war ein britischer Logiker und Mathematiker und ist ein Hauptbegründer der theoretischen Informatik. Turing entwickelte eines der ersten Schachprogramme und erfand den Turing-Test. Darüber hinaus war Turing an der Entwicklung des Röhrencomputers Colossus beteiligt, welcher half, die Geheimsprache der deutschen Wehrmacht Enigma zu knacken und trug damit entscheidend zur Wende des 2.Weltkriegs bei.
Insbesondere aber – und das ist im Zusammenhang mit meiner Erklärung wichtig – entwickelte Turing ein (theoretisches) Gerät, mit dem sämtliche mathematischen Funktionen ausgerechnet werden können (Grundlage für die ersten Computermodelle). Dieses Gerät wird Turingmaschine genannt.
Alan Turing wurde 1912 geboren und starb 1954 an Suizid durch Cyanid-Vergiftung, nachdem er der Homosexualität bezichtigt wurde und infolge der psychiatrischen Behandlung mit Östrogenen an Depressionen litt.
Jedes Jahr wird zu Ehren von Alan Turing der Turing-Preis verliehen – eine der bedeutendsten Informatik-Auszeichnungen.
Turing-Maschine
Alles, was berechenbar ist, kann mit der Turingmaschine ausgerechnet werden. Es gibt keine mathematische Funktion, die man zwar als Mensch lösen kann, an der die Turingmaschine aber versagt. Die einfachste Version der Turingmaschine ist die 1-Band-Turingmaschine. Sie besteht aus folgenden Komponenten:
- Ein (nach beiden Seiten) unendlich langes Speicherband.
- Das Band ist in unendlich viele Speicherzellen aufgeteilt.
- Jede Speicherzelle kann genau ein Zeichen (z.B. „a“, „c“) oder das Leerzeichen enthalten.
- Ein Schreib- und Lesekopf, der von einem Steuerwerk gesteuert wird.
- Der Kopf wird von einem Programm gesteuert.
- Der Schreib-Lese-Kopf hat einen Anfangszustand z0.
- Das Ergebnis wird vom Schreib- und Lesekopf am Ende auf das Band geschrieben.
(Turingmaschinen sind ein theoretisches Modell, denn es leuchtet schnell ein, dass man keine Turingmaschine mit einem unendlich langen Speicherband bauen kann. Außerdem ist die Turingmaschine in der Praxis zu langsam.)
Das Programm für die Turingmaschine hat folgende Eigenschaften:
- Lesezugriff
Es kann das Zeichen an der aktuellen Position des Schreib-Lese-Kopfes gelesen werden. - Bedingungen
Es kann eine Bedingung (~if) abgefragt werden, nämlich ob an der aktuellen Position ein bestimmtes Zeichen enthalten ist. - Schreibzugriff, Bewegung des Schreib-Lese-Kopfes und Zustandsänderung
Es kann eine Aktion ausführen, nämlich den Schreib-Lese-Kopf eine Speicherzelle nach links/rechts bewegen, ein Zeichen oder Leerzeichen an der aktuellen Position schreiben und den Zustand z ändern.
Aufbauend auf diesem recht einfachen Rechnermodell und den 3 Programmanweisungen lassen sich weitere Funktionen realisieren. Zunächst wären da die arithmetischen Funktionen (Addition, Multiplikation…) und zum anderen erhält man damit die grundlegenden Sprachkonstrukte, die (fast) alle Programmiersprachen gemein haben, nämlich Schleifen, bedingte Anweisungen, Sprünge, Rekursionen, Arrays usw. usf.
Das besondere an der Turingmaschine ist, dass alle anderen Rechnermodelle (Automaten) mit ihr simuliert werden können. Selbst die Funktionsweise von sehr komplizierten und fortgeschrittenen Rechnermaschinen (z.B. Quantencomputer) können mit einer Turingmaschine nachgeahmt werden (was allerdings aufgrund der primitiven Grundfunktionalität der Turingmaschine sehr komplex werden kann). Umgekehrt gilt dasselbe: Die Turingmaschine kann auf jedem anderen Rechnermodell emuliert werden.
Wenn ein Rechnermodell oder auch eine Sprache alles berechnen kann, was man auch mit einer Turingmaschine berechnen kann, dann wird das Rechnermodell oder die Sprache als Turing-vollständig bezeichnet. Gibt es allerdings eine mathematische Funktion, die mit dem Modell oder der Sprache nicht berechnet werden kann, dann spricht man von Turing-Unvollständigkeit. Etwas anders ausgedrückt heißt das, dass man mit einer Turing-unvollständigen Sprache nicht alle mathematischen Funktionen ausrechnen kann.
Bei nahezu allen heutigen Programmiersprachen ist Turing-Vollständigkeit gegeben, egal ob es sich um imperative, objektorientierte, oder funktionale Programmiersprachen handelt. Selbst sehr spezialisierte oder eingeschränkte Sprachen wie XSLT und Basic können turing-vollständig und damit Programmiersprachen sein (man muss also mit einer Programmiersprache keine Betriebssysteme programmieren können).
Zurück zu HTML
Der Beweis, warum HTML keine Programmiersprache ist, fällt jetzt sehr leicht. Es reicht zu zeigen, dass HTML turing-unvollständig ist, also dass es eine mathematische Funktion gibt, die man mit HTML nicht ausrechnen kann. Eine einfache Funktion wäre f(×)=x. Mit HTML ist diese Berechnung von f(×) unmöglich und damit ist HTML keine Programmiersprache.