Die Programmiersprache Ruby

Blog| Forum| Wiki  

Inhaltsverzeichnis

Definition

Es gibt in Ruby ganz normale Objekte (Instanzen von String, IO oder Struct) und sogenannte Immediate Values oder auch direkte Werte. Diese sind keine Referenzen auf eine Ruby-Objektstruktur im Speicher, sondern haben einen direkten Wert, der überall im Programm gleich ist.

Zu den Immediate Values gehören:

  • false, true und nil
  • Fixnums (von -1.073.741.824 bis +1.073.741.823)
  • Symbole (:foo, :<<, :@@bar etc.)

Technische Realisierung

(übersetzt aus dem RubyGarden-Wiki)

Rubys Objekte werden in der C API durch VALUE repräsentiert. Das ist eine typedef (Typendefinition) für einen unsigned long (positive Ganzzahl).

Der Wert 0 wird für false und 4 für nil benutzt. Andernfalls gilt: Wenn die zwei niederwertigsten Bits 00 sind, ist es ein Pointer (Zeiger) auf eine Struktur im Heap (Speicherhalde), die ein Ruby-Objekt repräsentiert [...] Andere Werte sind Immediate Objects [Anm. d. Autors: ich finde Immediate Values als Bezeichnung sinnvoller] oder spezielle Konstanten (kleine Ganzzahlen, Symbole, true).

Das funktioniert, weil die Strukturen im Speicher quad-aligned (Vierer-weise ausgerichtet) sind, so dass der Pointer immer ein Vielfaches von 4 ist (das heißt, die letzten beiden Bits sind 0.)

FIX2INT konvertiert zum Beispiel eine Fixnum zu einer C-Ganzzahl, indem es den VALUE nach rechts schiebt (shiftet).

Kritik und Verteidigung

Kritik

Immediate Values widersprechen streng genommen dem Prinzip, dass alles ein Objekt ist. Sie können zum Beispiel keine Singleton-Methoden (Methoden nur für ein Objekt) haben, und man kann sie nicht duplizieren (mit dup) oder klonen (mit clone). Es gelten für einige Objekte andere Regeln.

Verteidigung

  • false, true und nil sind Konstanten (sogar Schlüsselwörter). Sie sind tief in die Sprache integriert (if reagiert zum Beispiel nur auf false und nil negativ) und haben jeweils eigene Klassen (FalseClass, TrueClass, NilClass), deren einzige Instanz sie sind. Singleton-Methoden sind also nicht nötig, man kann normale Methoden definieren. dup braucht man ebenfalls nicht; es ergibt keinen Sinn, mehrere falses oder nils in einem Programm zu haben.
  • Symbole sind technisch sehr wichtig in Ruby, da Methoden, Variablen usw. intern als Symbole dargestellt sind. Sie sind aus performancetechnischen Gründen nützlich und können dort eingesetzt werden, wo man in C Enums (Aufzählungstypen) benutzt. Symbole sind eine eigene Art von Objekten, die sich gerade dadurch auszeichnen, dass sie unveränderlich und global einzigartig sind.
  • Fixnums sind ebenfalls aus Effizienzgründen als Immediate Values implementiert. Betrachtet man sie, wie Strings oder Arrays, als ganz normale Objekte, wirkt diese Einschränkung unverständlich.
    Aber Fixnums haben eine Sonderstellung, und zwar weil sie mathematische Objekte sind. Aus mathematisch-philosophischer Sicht könnte man sagen: 2 ist immer und überall 2, und es gibt keine zweite 2. Wir können zwar keine Singleton-Methoden definieren, aber Umwege sind machbar.
    Und zum Duplizieren: Normalerweise dupliziert man Objekte, damit man sie verändern kann, ohne das Original zu verändern. Immediate Values sind aber immutable (unveränderlich). Es gibt kein "Original" einer 2, und erst recht keine Kopie; es gibt einfach nur die 2.
  • Diese Argumente passen ebenso auf die anderen Zahlentypen in Ruby, Float und Bignum. Sie haben (obwohl keine Immediate Values) dieselben Einschränkungen. Das macht weitere Optimierungen möglich. Um Überraschungen zu vermeiden, sind auch sie immutable.
    Zahlen (egal welcher Art) sind in Ruby also konstant.

Weitere Links

Diskussion im ruby-talk