- Der Schlüssel zur Produktivität beim Programmieren liegt weniger in der Sprache selbst als in einem reichen Bibliotheks-Ökosystem
- Frameworks wie Ruby on Rails, die fortgeschrittene Sprachfunktionen nutzen, bieten selbst Nicht-Spezialisten hohe Produktivität
- Wegen struktureller Grenzen von Sprachen ist es jedoch schwierig, ein Framework auf dem Niveau von Rails in Java oder C umzusetzen
- Sprachdesign bestimmt direkt Form und Komplexität der Bibliotheken, die geschrieben werden können, und genau darin liegt der eigentliche Zweck der Weiterentwicklung von Sprachen
- Die Sprache Stanza zeigt aus dieser Perspektive, wie wichtig Sprachdesign ist, um leistungsfähige und leicht nutzbare Bibliotheken zu ermöglichen
Die Beziehung zwischen Programmiersprachen und Bibliotheken
- Die meisten Programmiersprachen besitzen ähnliche Grundelemente wie Variablen, Arrays, Schleifen und Funktionen
- Einige Sprachen bieten fortgeschrittene Funktionen wie Funktionen erster Klasse oder Coroutines, doch Nicht-Spezialisten nutzen diese kaum
- Für viele Entwickler ist der entscheidende Produktivitätsfaktor nicht die Sprache, sondern die Bibliothek
- Ruby on Rails macht es zum Beispiel leicht, datenbankgestützte Webanwendungen zu erstellen
- Dank Rails ist die Präferenz für das Framework oft größer als die für die Ruby-Sprache selbst
Das Zusammenspiel von Ruby on Rails und Sprachfunktionen
- Rails nutzt verschiedene Funktionen von Ruby wie Metaprogrammierung, Auswertung zur Laufzeit, Funktionen erster Klasse und Garbage Collection
- Beispiel: ActiveRecords verwendet Metaprogrammierung, das Template-System nutzt Laufzeitauswertung
- Die Ereignisbehandlung wird umgesetzt, indem Funktionen erster Klasse als Callbacks übergeben werden
- In Java oder C fehlen diese Fähigkeiten, sodass die Umsetzung eines Frameworks auf Rails-Niveau unmöglich ist
- Die Metaprogrammierung in Java ist nicht mächtig genug, um ActiveRecords zu implementieren
- Daher ist Rails nur dank der Struktur der Ruby-Sprache möglich, und Sprachdesign bestimmt die Möglichkeiten von Bibliotheken
Sprachdesign bestimmt die Form von Bibliotheken
- Die Sprache C unterstützt Wiederverwendung nur über Funktionsdeklaration und -aufruf, daher bestehen die meisten C-Bibliotheken aus Sammlungen von Funktionen
- Ruby unterstützt Funktionen erster Klasse und kann dadurch „welche Aktion bei einem Button-Klick ausgeführt werden soll“ knapp ausdrücken
- In Java muss man dagegen eine Handler-Klasse definieren, wodurch der Code komplexer wird
- Die Ausdrucksstärke einer Sprache bestimmt Struktur und Benutzbarkeit von Bibliotheken unmittelbar
Interaktive Software und das Aufkommen erweiterbarer Frameworks
- Im Batch-Computing der 1970er Jahre reichten funktionszentrierte Bibliotheken aus
- In moderner interaktiver Software sind erweiterbare Bibliotheken erforderlich
- In GUI- oder ereignisbasierten Systemen wird eine Struktur benötigt wie: „Führe meinen Code aus, wenn der Benutzer klickt“
- Java und C++ unterstützen Erweiterbarkeit durch Vererbung und Methodenüberschreibung, und diese Struktur entwickelte sich zu Frameworks
Hintergrund des Stanza-Designs und Grenzen von Sprachen
- Die Motivation für das Design von Stanza entstand aus der Schwierigkeit, in Java leicht nutzbare Bibliotheken für die Spieleprogrammierung zu schreiben
- In Java musste Nebenläufigkeit als Zustandsmaschine (
state machine) ausgedrückt werden
- Scheme unterstützt Continuations und erlaubt dadurch eine intuitivere Umsetzung
- Scheme unterstützt jedoch keine statische Typprüfung, wodurch Debugging weniger effizient ist
- Die meisten heutigen Sprachen können ihr Typsystem nicht per Bibliothek erweitern
- Stanza bietet ein optionales Typsystem, Garbage Collection und ein auf Multimethoden basierendes Objektsystem
- Ein benutzerdefiniertes Objektsystem lässt sich jedoch nicht neu schreiben
Ziel von Sprachen und Forschungsrichtungen
- Das Ziel allgemeiner Programmiersprachen ist es, die Erstellung leistungsfähiger und leicht nutzbarer Bibliotheken zu unterstützen
- Je mächtiger eine Sprache ist, desto knapper wird die Nutzung von Bibliotheken
- Wenn Code gut entworfene Bibliotheken verwendet, besitzt er eine Natürlichkeit, als würde man einem Kollegen Anweisungen geben
- Racket, Shen und Forschungen zu Metaobjektprotokollen untersuchen erweiterbare Typ- und Objektsysteme
- Letztlich unterscheiden sich Sprachen danach, „welche Bibliotheken man nutzen kann und welche nicht“
- Hinter eleganten Bibliotheken stehen jahrzehntelange Forschung und Designarbeit an Programmiersprachen
Noch keine Kommentare.