Edelsprachlich
Wann Ruby 2.0 Realität wird, steht noch nicht fest. Mit der aktuellen Entwicklerversion 1.9 können Programmierer ihre Software aber schon auf die Zukunft vorbereiten.
- Denny Carl
Die ursprünglich aus Japan stammende und hierzulande lange wenig beachtete dynamische Programmiersprache Ruby hat mit dem Web-Framework Ruby on Rails weltweit immens an Popularität gewonnen. Dementsprechend hoch ist die Erwartungshaltung der wachsenden Community an eine Weiterentwicklung der objektorientierten Sprache. Die Version 1.9 gibt mit ihren vielen Änderungen und Verbesserungen einen Ausblick auf die nächste Ruby-Generation.
1993 begann Yukihiro Matsumoto mit seinen Arbeiten an einer Programmiersprache, da er damals vorherrschende wie Perl oder Lisp als unzulänglich empfand. Bei dem Entwurf von Ruby sollten deren Fehler nicht mehr in Erscheinung treten und nur die brauchbaren Eigenschaften vereint werden. Weihnachten 1995 erschien Ruby 0.95. Fast exakt zwölf Jahre später stellte der meist nur Matz genannte Erfinder von Ruby Version 1.9 vor, die einen neuen Meilenstein in der Ruby-Entwicklung einleitet. Sie gilt mehr als Experimentierfeld und soll keinesfalls die aktuell als stabil gekennzeichnete und für den Produktiveinsatz vorgesehene Version 1.8.7 ablösen. Das soll Ruby 2.0 vorbehalten bleiben, dessen Erscheinungsdatum jedoch noch nicht feststeht. Ruby 1.9, von Matz Bleeding Edge genannt, bietet jedoch die Gelegenheit, eigene Programme und Bibliotheken auf Ruby 2.0 und dessen zu erwartenden Neuerungen vorzubereiten.
Besser: Performance und Design
Bei der Entwicklung von Ruby 1.9 galt es, drei Hauptziele umzusetzen: Performance-Verbesserung, Steigerung der Leistungsfähigkeit der Sprache und die Korrektur von Designfehlern beim Entwurf von Ruby.
Ruby-on-Rails-Entwickler bemängeln des Öfteren die fehlende Performance der Sprache, insbesondere beim Einsatz des Frameworks auf Websites mit großen Zugriffsraten. Ruby 1.9 hat in ersten Tests eine in Teilen bis zu 50-fach höhere Geschwindigkeit gezeigt. Ganze Anwendungen konnten laut Entwicklerangaben bis zu zehnmal schneller ausgeführt werden. War die Ruby-Implementierung auf der virtuellen Maschine von Java (JRuby) bisher schneller als Ruby 1.8, so überholt Ruby 1.9 nun diese.
Die Leistungsfähigkeit der Sprache hat das Hinzufügen neuer Eigenschaften sowie die Aufnahme von bisher externen Funktionen in den Ruby-Core erhöht. Unsaubere Sprachkonstrukte haben die Entwickler beseitigt oder korrigiert. Dies führte allerdings dazu, dass Ruby 1.9 zu Vorgängerversionen nicht vollständig kompatibel ist.
Wichtige Inkompatibilitäten
Mit Ruby 1.9 sind Blockparameter grundsätzlich lokale Variablen. Die Verwendung außerhalb des Blocks existierender Objekte als Blockparameter ist nicht mehr möglich.
# Ruby 1.8.7
a = 10
2.times { |a| a = 2}
a # => 2
# Ruby 1.9
a = 10
2.times { |a| a = 2}
a # => 10
Eine weitere bedeutsame Neuerung taucht in der String-Klasse auf. Sie ist kein Enumerable mehr, sondern besitzt auf Zeichenketten zugeschnittene, eigene Iteratoren wie String#each_char, String#each_byte und String#each_line statt nur String#each.
Darüber hinaus verarbeitet Ruby Strings nicht mehr als Byte-, sondern als echte Zeichenketten. Dementsprechend gibt der Zugriff auf ein Zeichen über dessen Index nicht mehr den ASCII-Wert, sondern das Zeichen selbst zurück.
Mit dieser Änderung einher geht die längst überfällige Unterstützung von Encodings und Unicode. Über die aus Python bekannten Magic Comments kann ein Programmierer ein Skript so einstellen, dass es ASCII-8BIT (Standard), UTF-8, EUC-JP oder viele andere Zeichenstandards verwendet – nun versteht Ruby Japanisch.
# Ruby 1.8.7
"Zeichenkette"[0] # => 90
# Ruby 1.9
"Zeichenkette"[0] # => "Z"
"Zeichenkette".encoding # =>
#<Encoding:ASCII-8BIT>
Weitere Neuerungen
Klassenvariablen behandelt Ruby 1.9 anders. Eine Unterklasse kann den Wert einer Klassenvariablen lesen. Bei deren Veränderung wird jedoch eine lokale Kopie in der Unterklasse erzeugt. Der Wert der Klassenvariablen in der Superklasse bleibt unverändert.
Optionale Parameter einer Methode müssen nun nicht mehr zwingend am Ende der Parameterliste stehen, obwohl dies sicherlich gewöhnungsbedürftig sein dürfte.
def test(a, b=2, c)
puts "#{a}, #{b], #{c}"
end
test 5,6 # => "5, 2, 6"
test 5,6,7 # => "5, 6, 7"
Ein großes Ärgernis stellt bisher bisweilen die Tatsache dar, dass sich die bei der Erzeugung festgelegte Reihenfolge von Hash-Elementen unvorhersehbar verändern kann. Mit Ruby 1.9 ist das Geschichte.
h = {:a => 1, :b => 2, :c => 3}
h[:d] = 4
# Ruby 1.8.7
h.values # => [1, 3, 2, 4]
# Ruby 1.9
h.values # => [1, 2, 3, 4]
Ruby 1.9 spendiert Entwicklern einige alternative Formen der Notation. So kann man ein Lambda nun mit „->“ notieren. Die Schlüssel-Wert-Paare eines Hashes kann man nun auch durch einen Doppelpunkt trennen.
Bei Verwendung von Iterator-Methoden wie times oder each ohne Block erzeugt Ruby daraus ein Enumerator-Objekt, das beispielsweise später verwendet werden kann. Es handelt sich um sogenannte externe Iteratoren.
Rake, YARV, Oniguruma
Offiziell ist Rake jetzt das Ruby-Build-Tool; bisher musste es jeder eigenständig installieren. Gleiches gilt für den komfortablen Paketmanager Rubygems.
YARV steht für Yet Another Ruby Virtual Machine und bezeichnet eine der größten Neuerungen: eine virtuelle Maschine, die aus Ruby erzeugten Bytecode interpretiert und somit für Verbesserungen in der Geschwindigkeit von Skripten sorgt. Diese VM existierte neben anderen schon eigenständig vor Ruby 1.9. Matz wählte YARV als die für Ruby geeignetste offiziell aus.
Echte, native Threads und damit parallele Prozesse werden mit Ruby 1.9 allmählich Wirklichkeit, obwohl es hier bislang noch Schwierigkeiten gibt.
Hinter Onigoruma steckt eine der mächtigsten Bibliotheken für reguläre Ausdrücke. Matz will sie allem Anschein nach offiziell in Ruby integrieren. JSON for Ruby ist ebenfalls fester Bestandteil der Sprache geworden und ermöglicht somit, es als Alternative für YAML als Format serialisierter Daten zu nutzen.
Fazit
Ruby 1.9 gilt als Zwischenschritt auf dem Weg zur Version 2.0. Vieles befindet sich im Umbruch und ist daher mit Vorsicht zu genießen. Ruby 2.0 soll Ergebnisse des hier nur in Auszügen Vorgestellten enthalten und nach Aussagen von Matsumoto darüber hinaus großen Wert auf Skalierbarkeit von Programmen, Daten und Entwicklerteams legen.
Version 1.9 ist spannend für alle, die den Prozess der Fortentwicklung einer inzwischen bedeutenden Programmiersprache aktiv oder passiv begleiten wollen, die auf die zu erwartenden Features der Zukunft gespannt sind oder ihre eigene Software an die neuen Features anpassen möchten.
Denny Carl
ist seit 2001 selbstständiger Webdesigner und -entwickler in Berlin.
(hb)