Enten und andere Typen
In Java-Kreisen wird gerne versucht, Ruby herunterzureden. Die Argumente dabei sind oft nicht sonderlich gut durchdacht und haben mehr mit diffusen Ängsten als mit wirklicher Kenntnis der Sachverhalte zu tun. Diese Art wertloser Diskussion ist oft anzutreffen, wenn es um zwei wirklich oder vermeintlich konkurrierende Technologien geht. Es geht hier nicht darum, die bessere zu finden, sondern darum den Wert der Investition zu erhalten, die jemand in das Erlernen einer der Alternativen gesteckt hat.
Ein Argument, daß von den Java-Befürwortern gegen Ruby of aufgebracht wird, ist, daß durch das Java-Typsystem viele Fehler schon vom Compiler gefunden werden, die in Ruby erst zur Laufzeit auftreten, was das Debuggen entsprechend teurer machen soll. Ich habe neulich ein paar hundert Zeilen lang ein etwas komplizierteres Ruby-Programm geschrieben und dabei darauf geachtet, welche Probleme auftraten und diese mit meinen Javaerfahrungen verglichen.
Duck-Typing
Häufig wird gesagt, Sprachen wie Ruby seien "untypisiert". Dies stimmt so nicht. Da Ruby objektorientiert ist, erlaubt es natürlich die Definition von Klassen und Klassen sind Typen. Was anders behandelt wird, ist die Deklaration von Variablen und Parametern. Diesen können erst einmal alle Objekte unabhängig von Typ zugewiesen werden, im Laufe der Programmausführung auch unterschiedliche Typen für dieselbe Variable. Der Typ wird erst überprüft, wenn eine Methode des Objekts aufgerufen wird. Und hier geschieht das ganz pragmatisch. Wenn die Methode vorhanden ist, so wird sie aufgerufen, ansonsten wird eine spezielle Methode aufgerufen, die alle anderen Fälle abhandelt. Diese Typisierung wird oft als Ducktyping bezeichnet: egal, was der Zoologe dazu sagen würde, wenn es nach Ente schmeckt und eine knusprige Entenhaut besitzt, dann wird es wohl Ente sein.
Jetzt gibt es die Behauptung, daß hierdurch sicheres Refactoring erschwert würde. Da ist etwas dran, doch ist die Lage nicht so hoffnungslos. Schließlich wurde das erste brauchbare Tool zum Code-Refactoring für Smalltalk entwickelt, das ein vergleichbares Typsystem besitzt.
Wie sieht es nun mit den Programmierfehlern aus? In der Tat kommen immer wieder lästige Fehler vor, die Java verhindert hätte. Allerdings handelt es sich fast nie darum, daß ein Objekt einen falschen Typ hätte. Vielmehr führen Tippfehler dazu, daß zwei Objekte da sind, wo nur eins sein sollte. Diese Art von Fehler wird in Sprachen wie Lisp und Smalltalk dadurch verhindert, daß Variablen zuerst deklariert werden müssen, ehe sie verwendet werden können. In Skriptsprachen, zu denen Ruby gehört, entsteht eine Variable in dem Augenblick, in dem sie zum ersten Mal verwendet wird. Gegenüber Python ist Ruby da sogar noch im Vorteil, da in Ruby der Gültigkeitsbereich der Variable im Namen angegeben wird (durch kein, ein oder zwei @).
Was in der Argumentation unterschieden werden sollte, ist Deklaration und Typisierung von Variablen. Wie immer erschwert es auch hier die Argumentation, wenn zwei Dinge, die nur lose etwas miteinander zu tun haben, immer wie eins behandelt werden.
Und wie war es sonst mit Ruby?
Mit Ruby schreibt man drastisch weniger Code als mit Java. Dadurch macht man natürlich auch weniger Fehler. Allerdings gibt es auch voll typisierte Sprachen, die wesentlich dichteren Code zu schreiben erlauben wie Java (z.B. Scala).
Ruby-Code ist vergleichsweise langsam. Das ist nichts Neues und macht häufig auch nichts aus. Allerdings dürfte sich die Lage demnächst auch verbessern, wenn nicht bei nativem Ruby, dann sicht durch jRuby. Letzteres scheint heute schon in vielen Bereichen schneller zu sein. Es benutzt die JVM, die ein ausgereiftes Memorymanagement Codeoptimierung mitbringt.