Objektorientierte Skriptsprache erfreut sich wachsender Beliebtheit

Ruby: Open-Source-Exot aus Japan

19.03.2004
Skriptsprachen sind längst nicht mehr auf die Lösung kleiner Aufgaben beschränkt, sondern finden auch Anwendung in großen Projekten. Rund um Perl und Python scharen sich bereits große Benutzergruppen, der Exot Ruby gewinnt allmählich auch im Westen Freunde. Von Armin Roehrl, Wolfgang Rudolph und Stefan Schmiedl*

Die Entwicklung von Ruby begann vor etwa elf Jahren in Japan damit, dass Yukihiro "Matz" Matsumoto auf der Suche nach der idealen Programmiersprache war. Da keine der vorhandenen Sprachen seinen Vorstellungen gerecht wurde, pickte er sich die besten Features aus verschiedenen Sprachen (unter anderem Perl, Smalltalk, Eiffel, Java, Python) heraus und vereinigte sie in einer dynamisch typisierten und durchgängig objektorientierten Skriptsprache. Ruby wurde in Japan schnell beliebt und ist dort populärer als etwa Python.

Für einen objektorientiert arbeitenden Programmierer ist der Umstieg auf Ruby relativ einfach. Er wird fast sicher auf Elemente stoßen, die ihm von anderswoher bekannt sind. Für Neueinsteiger hält sich der Lernaufwand in Grenzen, da Ruby weitgehend dem Prinzip der kleinsten Überraschung (Principle of Least Surprise) folgt. Matsumoto achtet nach wie vor sehr darauf, dass die Sprache in sich konsistent bleibt.

Ruby ist mit seiner BSD-ähnlichen Lizenz auch für den kommerziellen Einsatz frei verfügbar und kann mit einem ANSI-C-Compiler für die meisten Plattformen übersetzt werden. Es wird bei vielen namhaften Firmen und Institutionen eingesetzt: Unter anderem erstellen Intel, Lucent, Motorola, Amazon, Google, Credit Suisse und die Nasa mit Ruby sowohl Prototypen als auch Lösungen für den produktiven Einsatz. Das Anwendungsspektrum reicht von Essensbestellungen im Intranet über ERP-Komponenten bis hin zu hochkomplexen statistischen Modellierungen für Risiko-Management-Applikationen im Finanzbereich.

In Ruby gibt es keine primitiven Datentypen wie in Java, alle Daten sind echte Objekte. Eine weitere Ähnlichkeit zu Smalltalk ist die starke, aber dynamische Typisierung: Variablen haben keinen Typ, sie verweisen auf Objekte, die immer Instanzen einer Klasse sind.

Anleihen bei anderen Sprachen

Verglichen mit Smalltalk ist aber die eingebaute Syntax reichhaltiger, so dass Klassen- und Methodendefinitionen sowie die meisten Kontrollstrukturen ein "normales" Aussehen haben. Die Syntax ist zeilenorientiert, gestattet aber auch ein Semikolon als zeileninternes Trennzeichen. Leerräume und Zeilenschaltungen dienen der optischen Gestaltung, haben aber keine weitere Bedeutung, wie es in Python der Fall ist. Ein Präfix im Namen einer Variablen legt deren Gültigkeitsbereich (Instanz, Klasse, global) fest, lokale Variablen werden ohne diesen Namensbestandteil notiert.

Von Perl stammen die direkt in die Sprache integrierten regulären Ausdrücke. In ihrer kompakten Notationsform eignen sie sich hervorragend für Einzeiler und kurze Skripts. In komplexeren Ausdrücken können sie aber auch in ihrer objektorientierten Form verwendet werden und fügen sich dann nahtlos in das Sprachbild ein.

Um den Schwierigkeiten der Mehrfachvererbung zu entgehen, verwendet Ruby nur einfache Vererbungshierarchien. Allerdings gibt es neben den Klassen auch noch Module, die als "Mixins" verwendet werden können. So enthält das Modul "Enumerable" die Spezifikationen der vordefinierten Iterator-Methoden, implementiert unter alleiniger Verwendung der vollständigen Aufzählung "each". Wenn nun diese Iteratoren in einer eigenen Klasse ebenfalls benötigt werden, genügt es, dort die "each"-Aufzählung zu implementieren und das Modul "Enumerable" einzubinden. Durch die dynamische Typisierung ist eine solche generische Programmierung in Ruby ohne weiteres machbar.

Häufig wird auch mit Codeblöcken gearbeitet. Jeder Methode in Ruby kann ein Codeblock als letztes Argument beigestellt werden, dessen Auswertung der aufgerufenen Methode selbst überlassen ist. Mit dem Schlüsselwort "yield" kann der Iterator den Programmfluss in den Codeblock übertragen. Iteratoren machen hiervon natürlich intensiven Gebrauch. Die Iteratormethode kapselt den Zugriff auf die Elemente, der beigestellte Codeblock enthält nur Wissen über die Arbeit mit einem einzelnen Element. Der "Visitor" ist nicht das einzige Entwurfsmuster, das in Ruby als idiomatischer Ausdruck gebraucht wird.

Seltener gebraucht, aber trotzdem nützlich ist die Möglichkeit, Singleton-Klassen zu erzeugen, deren Methoden nur für ein einzelnes Objekt zur Verfügung stehen. Außerdem können wie in Smalltalk jederzeit Änderungen an bestehenden Klassen vorgenommen werden, so dass nachträgliche Erweiterungen immer möglich sind. Weitere Rosinen im Kuchen sind gute Mechanismen zur Introspektion, eine ausgefeilte Ausnahmebehandlung, Möglichkeiten zur Metaprogrammierung und Continuations.

Anbindung an Fremdsysteme

Ruby ist in C implementiert und verfügt über sehr gute Möglichkeiten, C-Bibliotheken einzubinden. Auch das Einbetten von Ruby in C- oder C++-Programme ist ohne großen Aufwand möglich.

Für den kooperativen Einsatz mit Java existieren zwei Möglichkeiten: Zum einen gibt es mit der Java-Implementierung "JRuby" ein Analogon zu "Jython", zum anderen entwickelte Mauricio Fernandez mit "rjni" eine Schnittstelle zum Java Native Interface, so dass von Ruby aus Java-Klassen und Objekte verwendet werden können.

Auch zu .NET besteht eine Brücke, die Ruby/.NET Bridge. Über sie können .NET-Projekte Ruby verwenden, andererseits können Ruby-Skripte aber auch mit .NET-Komponenten arbeiten. Unter http://www.saltypickle.com/RubyDotNet/32 gibt es einen Evaluator, nach Auskunft der Autoren eine Art "Smalltalk-Workspace für interaktive .NET-Entwicklung", und einen "WebEvaluator", der über einen Web-Server angesprochen wird.

Wenn allerdings keine zwingenden Gründe vorliegen, ist es nicht notwendig, auf Fremdsysteme zurückzugreifen. Obwohl Ruby mit "Amrita" auf Basis von Templates dynamische HTML-Seiten generieren kann, ist der Anwendungsbereich nicht auf dieses PHP-typische Anwendungsfeld begrenzt. Applikations-Server oder Geschäftslogik lassen sich in Ruby ebenso gut programmieren wie in Java, auch wenn die Ausführungsgeschwindigkeit des interpretierten Ruby-Skripts nicht an ein kompiliertes Java- oder C++ heranreicht. Ruby erlaubt es aber, den Flaschenhals bei der Ausführungsgeschwindigkeit schnell ausfindig zu machen und diese oft nur kurzen Abschnitte zum Beispiel in C zu optimieren.

Für kleine und große Programme

Ruby ist eine Skriptsprache, mit der sich sowohl kleine als auch große Programme realisieren lassen. Dave Thomas, bekanntes Mitglied der Ruby-Gemeinde, berichtet, in sechs Wochen ein 26000-Zeilen Programm termingerecht und im Kostenrahmen erstellt zu haben, das in den nächsten 18 Monaten auf über 38000 Zeilen erweitert wurde, ohne dabei Probleme zu verursachen. Nach seiner Meinung würde der gleiche Funktionsumfang in Java etwa viermal so viel Code benötigen. (ws)

*Dr. Armin Roehrl und Stefan Schmiedl leiten die Approximity GmbH.

Wolfgang Rudolph ist IT-Spezialist bei BMW.

Web-Ressourcen für Ruby

Seit Ende des letzten Jahres liegt die neue Version Ruby 1.8 vor. Zurzeit sind etwa 40 Programmierer an der Weiterentwicklung beteiligt.

Für Erweiterungen und Zusatzbibliotheken gibt es zwei zentrale Anlaufstellen. Im Ruby Application Archive (http://raa.ruby-lang.org) werden seit einigen Jahren Projekte gesammelt und nach verschiedenen Kategorien geordnet zum Download angeboten. Seit einigen Monaten existiert dazu ein Gegenstück bei Sourceforge namens "RubyForge (http://www.rubyforge.org)", das speziell für freie Ruby-Projekte geschaffen wurde. Für die meisten aktuellen Standardaufgaben (Soap, XML, YAML, Corba, Schnittstellen zu Datenbanken, Web-Applikations-Server) sind Bibliotheken mit verschiedenen Ansätzen und Reifegraden vorhanden.

Der "RubyGarden (http://www.rubygarden.org)" ist die Anlaufstelle für Neuigkeiten und den allgemeinen Informationsaustausch rund um Ruby. Auf der Dokumentations-Site (http://www.ruby-doc.org) werden die stetig zunehmenden Online-Dokumentationen zusammengetragen. In letzter Zeit hat sich "RDoc (http://rdoc.sourceforge.net)" als Standard für die Beschreibung von Ruby-Quellcode durchgesetzt und wird nun auch zur Dokumentation der Standardbibliothek verwendet.

Bei der Installation auf Unix- oder Linux-Systemen kann man vorkompilierte Versionen nutzen oder den Quellcode selbst kompilieren. Für Windows-Rechner gibt es ein vorkonfiguriertes und bestens ausgestattetes Installationsprogramm (http://rubyinstaller.sourceforge.net).

Bücher zu Ruby

Außerhalb Japans wurde Ruby vor allem durch das Buch "Programming Ruby" bekannt, das auch vier Jahre nach seiner Veröffentlichung nicht an Nützlichkeit verloren hat. Neben seiner deutschen Übersetzung gibt es bei uns noch das Einführungswerk "Programmieren in Ruby". Empfehlenswert ist auch das englischsprachige "The Ruby Way" von Hal Fulton.

Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides: Design Patterns. Addison-Wesley 1995

Armin Röhrl, Stefan Schmiedl, Clemens Wyss: Programmieren in Ruby. dpunkt.verlag 2002

Dave Thomas, Andrew Hunt: The Pragmatic Programmer. Addison-Wesley 1999

Dave Thomas, Andrew Hunt: Programming Ruby. Addison-Wesley 2000

Dave Thomas, Andrew Hunt: Programmieren in Ruby. Addison-Wesley 2002

Hal Fulton: The Ruby Way. Sams 2001

Abb: Kontaktfreudig

Ruby verfügt über eine Reihe von Techniken zur Anbindung an Fremdsysteme wie Java oder .NET. Quelle: Roehrl