JavaScript: Die weltweit meist missverstandene Programmiersprache
TL;DR:
JavaScript, aka Mocha, aka LiveScript, aka JScript, aka ECMAScript, ist eine der weltweit populärsten Programmiersprachen überhaupt. Fast jeder PC auf der Erde hat zummindest einen JavaSCript-Interpreter installiert und nutzt ihn aktiv. JavaScripts Popularität wuchs durch die Schlüsselrolle als Scriptsprache für das WWW. Trotz dieser Popularität wissen die wenigsten dass JavaScript eine ausgereifte, dynamisch objektorientierte Universal-Programmiersprache ist. Warum ist das immer noch ein Geheimnis? Warum wird diese Sprache so missverstanden?
Dieser Text wurde im Orginal von Douglas Crockford verfasst und auf crockford.com veröffentlicht. Die Übersetzung stammt von mir (Aaron Müller).
Der Name
Das Java-Prefix suggeriert, dass JavaScript irgendwie zu Java gehört, eine Teilmenge oder limitierte Version von Java sei. Es scheint als wäre der Name absichtlich zur Verwirrung gewählt worden. Und von Verwirrung kommt Missverständnis. JavaScript ist kein interpretiertes Java. Java ist interpretiertes Java. JavaScript ist eine andere Sprache.
JavaScript hat eine syntaktische Ähnlichkeit mit Java, genau so viel wie Java mit C hat. Aber es ist nicht mehr Teilmenge von Java wie Java Teilmenge von C ist.
JavaScript wurde nicht von Sun Microsystems - dem Ursprung von Java - entwickelt. JavaScript wurde von Netscape entwickelt. Anfangs hieß es LiveScript, aber der Name war wohl nicht verwirrend genug.
Das -Script Suffix suggeriert, dass es keine echte Programmiersprache sei, dass eine Scriptsprache weniger ist als eine Programmiersprache. Hier spielt die Spezialisierung eine Rolle. Verglichen mit C ist JavaScript auf Performance, Ausdrucksstärke und Dynamisierung aus.
Lisp in C's Kleidern
JavaScripts Anlehnung an die Syntax von C (geschweifte Klammern und das allbekannte for-Statement) lässt die Sprache wie eine normale funktionale Sprache erscheinen. Das ist irreführend, denn JavaScript hat mehr mit funktionalen Sprachen wie Lisp oder Scheme gemeinsam als mit C oder Java. Es gibt Arrays anstatt Listen und Objekte anstatt PropertyLists. Es gibt sogar Closures. Man bekommt Lambdas ohne Klammernpaare auszubalancieren.
Typcasting
JavaScript wurde anfangs für den Netscape Navigator entwickelt. Der Erfolg der Sprache machte sie zum Standard in so gut wie jedem Web Browser. Dies führte zu Typcasting. JavaScript ist der George Reeves der Programmiersprachen. JavaScript ist gut gerüstet für eine weite Spanne von nicht-webbezogenen Anwendungen.
Moving Target
Die erste Version von JavaScript war ziemlich schlecht. Es gab keine Exception-Handling, keine inneren Funktionen und Vererbung. In der heutigen Form ist sie eine komplett objektorientierte Programmiersprache. Allerdings basieren viele Entscheidungen und Konzepte auf den unausgereiften Formen von damals.
Designfehler
Keine Programmiersprache ist perfekt. Designfehler wie das Überladen des +-Operators um die Addition und die Verkettung von Zeichen über denselben Operator (Typzwang) und das fehleranfällige with-Statement hätten vermieden werden können. Semikolons einzuführen war ein großer Fehler, genauso die Notation für reguläre Ausdrücke. Diese Designfehler führten zu Programmfehler und stellte das Design der ganzen Sprache in Frage. Allerdings können viele der Probleme mit einem guten lint-Programm gelindert werden.
Das Design der Sprache als Ganzes ist recht gut. Überraschenderweise ist das ECMAScript Komitee nicht daran interessiert diese Probleme zu korrigieren. Sie sind mehr darauf aus neue zu Schaffen.
Schlechte Implementierungen
Einige der frühen Implementierungen von JavaScript waren sehr fehlerträchtig. Dies warf ein schlechtes Image auf die Sprache. Weiterhin waren diese Implementierungen in schrecklich fehlerhaften Web Browsern eingebettet.
Schlechte Bücher
Fast alle Bücher zu JavaScript sind furchtbar. Sie enthalten Fehler, schlechte Beispiele und lehren schlechte Praktiken. Wichtige Features der Sprache werden oft schlecht erklärt oder komplett ausgelassen. Ich habe mehrere Duzend JavaScript Bücher gelesen und ich kann nur eines empfehlen: JavaScript: The Definitive Guide (5th Edition) von David Flanagan.
Substandard Standard
Die offizielle Spezifikation der Sprache wird auf ECMA veröffentlicht. Die Spezifikation ist qualitativ sehr schlecht. Sie ist schwer zu lesen und sehr schwer zu verstehen. Dies hat Einfluss auf das Schlechte Bücher
-Problem weil Autoren das Dokument nicht dafür nutzen konnten um ihr eigenes Verständnis der Sprache zu verbessern. ECMA und das TC39 Komitee sollte sich was schämen.
Anfänger
Die meisten die JavaScript-Code schreiben sind keine Programmierer. Ihnen fehlt es an Training und Disziplin um gute Programme zu schreiben. Dies gab JavaScript den Ruf, nur für Anfänger zu sein, die mit einer professionellen Programmiersprache überfordert wären. Das ist ganz klar nicht der Fall.
Objektorientiert
Ist JavaScript objektorientiert? Die Sprache hat Objekte welche Daten enthalten können und Methoden, die selbst wie diese Daten behandelt werden können. Objekte können weitere Objekte enthalten. Es gibt keine Klassen, aber es gibt Konstruktoren welche das selbe Konzept einer Klasse bietet die wiederum als Kontainer für Klassenvariablen und Methoden dienen können. Es gibt keine Vererbung die man von klassenorientierten Sprachen her kennt, aber es gibt prototypeorientierte Vererbung.
Die zwei Hauptarten um Objektsysteme aufzubauen sind Vererbung (is-a) und Aggregation (has-a). JavaScript kann beides aber durch die dynamische Natur der Sprache zeichnen sich die Beziehungen eher als Aggregationen ab.
Manche mögen einwenden dass JavaScript keine richtige objektorientierte Sprache ist weil sie kein Information Hiding (Kapselung) anbietet. Objekte können keine privaten Variablen und Methoden haben: Alle Elemente sind public.
Aber es zeigte sich, dass JavaScript-Objekte doch private Variablen und Methoden haben kann. Natürlich verstehen das nur wenige, da JavaScript ist die meist missverstandene Programmiersprache ist.
Einige behaupten, dass JavaScript nicht komplett objektorientiert ist, weil keine Vererbung unterstützt wird. Aber es zeigte sich wieder, dass JavaScript nicht nur Klassenvererbung unterstützt, sondern noch weitere Mechanismen zur Wiederverwendung von Code bereitstellt.