Kolumne: The Good Parts

Süßwaren für JavaScript-Entwickler
Kommentare

JavaScript ist eine Sprache der Gegensätze. Diverse Entwickler finden ihre Syntax unverständlich, andere lieben die Sprache gerade deswegen umso mehr. Einige freuen sich über die Flexibilität der prototypischen Konzepte, andere wünschen sich ein klassischeres Objektmodell. Das Konzept der Closures ist vielen unverständlich, andere können es aus ihrem Entwicklungsalltag nicht mehr wegdenken. Gibt es eine Lösung, die alle zufrieden stellt? Die Menge von Kritik- und Diskussionspunkten an JavaScript ist sehr groß.

PHP Magazin

Die Kolumne „The Good Parts“ von Jakob Westhoff ist erstmalig erschienen im PHP Magazin 3.2013

Die Entstehungsgeschichte der Sprache ist daran nicht ganz unschuldig, da einige übereilte Entscheidungen getroffen wurden. Aber auch die heutigen Einsatzgebiete der Sprache sind an der Problematik beteiligt. Niemand, nicht einmal der Erfinder von JavaScript, Brendan Eich, hätte sich träumen lassen, dass JavaScript jemals eine derartige Verbreitung und Einsatzvielfalt haben würde. Die Sprache hat unbestreitbar diverse Vor- und auch Nachteile, und dennoch ist sie aus unserer modernen, vernetzten Welt kaum noch wegzudenken. Alternativen wie TypeScript [1] oder Dart [2] existieren zwar, jedoch sind sie noch zu jung und ihre Verbreitung noch nicht groß genug, um als praxisrelevante Alternative dienen zu können. Auch JavaScript selbst entwickelt sich weiter, mit der nächsten Iteration der Sprachspezifikation (ECMAScript Harmony) werden diverse Änderungen vollzogen und dringend benötigte Features, wie Module und Symbole, in die Sprache Einzug halten. Aber natürlich werden diese Änderungen ebenfalls nicht jedem gefallen. Was ist also der Ausweg aus diesem Dilemma?

Makros als Rettung?

Eine mögliche Lösung auf dem Weg zu einer saubereren Sprache, die den Ansprüchen des eigenen Teams genügt, sind Makros. Andere Sprachen wie Scheme oder Lisp machen es vor. Durch eine mächtige Makrosprache können spezifische Konstrukte geschaffen werden, die den eigenen Anforderungen gerecht werden und sich dennoch in bestehende Codestrukturen nahtlos eingliedern.

Ein Projekt, das genau diesen Ansatz erforscht, ist Sweet.js [3]. Entwickelt unter der Federführung der Mozilla Foundation, stellt dieses Tool eine mächtige Makrosprache bereit, mit der JavaScript sich an die eigenen Bedürfnisse anpassen lässt.

Sweet.js

Sweet.js ist ebenfalls in JavaScript geschrieben. Es macht Gebrauch vom hervorragenden Esprima-Projekt [4]. Hierbei handelt es sich um einen Parser für die Sprache selbst, mit dem sich JavaScript-Quelltext in einen abstrakten Syntaxbaum zur weiteren Verarbeitung überführen lässt. Neben dem Parser existiert ebenfalls ein Codegenerator, der den erstellten und gegebenenfalls veränderten Syntaxbaum wieder zurück in JavaScript-Code übersetzt.

Auf dieser Basis haben die Sweet.js-Entwickler „Hygienic Macros“ implementiert. Der gleichnamige Kasten erklärt, worum es sich bei dieser speziellen Sorte von Makros genau handelt.

Hygienic Macros

Hygienic Macros sind eine spezielle Form von Makrosprachen, wie sie z. B. in den Sprachen Scheme und Dylan existieren. Diese besondere Form der Makros garantiert, dass keinerlei Bezeichner bei der Auswertung des Makros überschrieben oder versehentlich überschattet werden.

Ein Beispiel eines sehr einfachen C-Makros verdeutlicht die Problematik:

#define ADD(result,a,b) {int tmp = a + b; result=tmp;}

int main(void) {
  int tmp = 0;
  ADD(tmp, 23, 42);
  printf("tmp has the value %d", tmp);
}

In diesem Beispiel wird ein einfaches Makro mit dem Namen ADD definiert, das zwei Zahlen sowie einen Speicherort für ein Ergebnis entgegennimmt. Das Makro erzeugt anschließend eine temporäre Variable tmp, in der es das Ergebnis der Addition der beiden Zahlen speichert, bevor es diese anschließend dem übergebenen Speicherort zuweist. Um nicht versehentlich in Variablen des äußeren Blocks einzugreifen, wird die Operation in einen eigenen Scope (Block) eingeschlossen.

Das Problem ergibt sich hier nun dadurch, dass der gewünschte Speicherort für das Ergebnis der Addition den gleichen Namen besitzt, wie die innerhalb des Makros verwendete temporäre Variable. Dadurch wird diese innerhalb des Blocks, in dem das Makro seine Addition ausführt, definiert und verlässt diesen somit niemals. Das printf-Kommando wird hier also den Wert „0“ und nicht den erwarteten Wert „65“ zurückliefern.

Hygienic Macros umgehen dieses Problem, indem sie durch unterschiedliche Techniken sicherstellen, dass eine derartige Überschattung von Variablen bzw. Bezeichnern nicht passieren kann. Eine dieser Techniken ist z. B. die automatische Umbenennung aller in Makros deklarierten Variablen.


Themen der folgenden Seiten:

  • Vorbereitungen für den Einsatz
  • Anwendung ohne Makro
  • Ein erstes Makro
  • Verfeinern von Makros mittels Pattern-Klassen
  • Ein naheliegendes Beispiel aus der echten Welt
  • Wiederholungen in Makros
  • Lesbarer durch Makros
  • Liegt hier die Zukunft?
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -