Über Ruby

Fragen Sie sich, warum Ruby so beliebt ist? Seine Fans nennen es eine schöne, kunstvolle Sprache. Und doch sagen sie, es sei praktisch und nützlich. Was steckt dahinter?

Die Ideale von Rubys Schöpfer

Ruby ist eine Sprache sorgfältiger Balance. Sein Schöpfer, Yukihiro „Matz“ Matsumoto, mischte Teile seiner Lieblingssprachen (Perl, Smalltalk, Eiffel, Ada und Lisp) zu einer neuen Sprache, die funktionale Programmierung mit imperativer Programmierung ausbalancierte.

Er hat oft gesagt, dass er „versucht, Ruby natürlich, nicht einfach zu machen“, auf eine Weise, die das Leben widerspiegelt.

Darauf aufbauend fügt er hinzu:

Ruby ist im Aussehen einfach, aber innen sehr komplex, genau wie unser menschlicher Körper1.

Über Rubys Wachstum

Seit seiner öffentlichen Veröffentlichung im Jahr 1995 hat Ruby weltweit engagierte Programmierer angezogen. Im Jahr 2006 erreichte Ruby die Massenakzeptanz. Mit aktiven Benutzergruppen in den wichtigsten Städten der Welt und gut besuchten Ruby-bezogenen Konferenzen.

Ruby-Talk, die primäre Mailingliste für die Diskussion der Ruby-Sprache, stieg im Jahr 2006 auf durchschnittlich 200 Nachrichten pro Tag. Sie ist in den letzten Jahren zurückgegangen, da die Größe der Community die Diskussion von einer zentralen Liste auf viele kleinere Gruppen verlagert hat.

Ruby rangiert in den meisten Indizes, die das Wachstum und die Popularität von Programmiersprachen weltweit messen (wie dem TIOBE-Index), unter den Top 10. Viel des Wachstums wird der Popularität von in Ruby geschriebener Software zugeschrieben, insbesondere dem Web-Framework Ruby on Rails.

Ruby ist auch vollkommen kostenlos. Nicht nur kostenlos im Sinne von gratis, sondern auch frei zu nutzen, zu kopieren, zu verändern und zu verteilen.

Alles als Objekt betrachten

Anfangs sah Matz andere Sprachen an, um eine ideale Syntax zu finden. Rückblickend auf seine Suche sagte er: „Ich wollte eine Skriptsprache, die mächtiger als Perl und objektorientierter als Python war2.“

In Ruby ist alles ein Objekt. Jede Information und jeder Code kann seine eigenen Eigenschaften und Aktionen erhalten. Objektorientierte Programmierung nennt Eigenschaften Instanzvariablen und Aktionen sind als Methoden bekannt. Rubys rein objektorientierter Ansatz wird am häufigsten durch ein Code-Fragment demonstriert, das eine Aktion auf eine Zahl anwendet.

5.times { print "We *love* Ruby -- it's outrageous!" }

In vielen Sprachen sind Zahlen und andere primitive Typen keine Objekte. Ruby folgt dem Einfluss der Smalltalk-Sprache, indem es allen seinen Typen Methoden und Instanzvariablen zuweist. Dies erleichtert die Nutzung von Ruby, da Regeln, die für Objekte gelten, für ganz Ruby gelten.

Rubys Flexibilität

Ruby wird als flexible Sprache angesehen, da sie es ihren Benutzern ermöglicht, ihre Teile frei zu verändern. Wesentliche Teile von Ruby können nach Belieben entfernt oder neu definiert werden. Bestehende Teile können erweitert werden. Ruby versucht, den Programmierer nicht einzuschränken.

Zum Beispiel wird die Addition mit dem Pluszeichen (+) Operator durchgeführt. Wenn Sie jedoch lieber das lesbare Wort plus verwenden möchten, könnten Sie eine solche Methode zu Rubys integrierter Numeric Klasse hinzufügen.

class Numeric
  def plus(x)
    self.+(x)
  end
end

y = 5.plus 6
# y is now equal to 11

Rubys Operatoren sind syntaktischer Zucker für Methoden. Sie können auch neu definiert werden.

Blöcke: Ein wirklich ausdrucksstarkes Merkmal

Rubys Blöcke werden ebenfalls als Quelle großer Flexibilität angesehen. Ein Programmierer kann jeder Methode eine Closure anhängen, die beschreibt, wie diese Methode agieren soll. Die Closure wird als Block bezeichnet und ist zu einem der beliebtesten Merkmale für Neulinge in Ruby aus anderen imperativen Sprachen wie PHP oder Visual Basic geworden.

Blöcke sind von funktionalen Sprachen inspiriert. Matz sagte: „Bei Ruby-Closures wollte ich die Lisp-Kultur respektieren3.“

search_engines =
  %w[Google Yahoo MSN].map do |engine|
    "http://www." + engine.downcase + ".com"
  end

Im obigen Code ist der Block innerhalb der do ... end Konstruktion beschrieben. Die map Methode wendet den Block auf die bereitgestellte Liste von Wörtern an. Viele andere Methoden in Ruby lassen ein Loch offen, in das ein Programmierer seinen eigenen Block schreiben kann, um die Details dessen auszufüllen, was diese Methode tun soll.

Ruby und das Mixin

Im Gegensatz zu vielen objektorientierten Sprachen bietet Ruby **absichtlich** nur einfache Vererbung. Aber Ruby kennt das Konzept von Modulen (in Objective-C als Kategorien bezeichnet). Module sind Sammlungen von Methoden.

Klassen können ein Modul "mixin" (einbinden) und erhalten alle seine Methoden kostenlos. Zum Beispiel kann jede Klasse, die die each Methode implementiert, das Enumerable Modul einbinden, das eine Vielzahl von Methoden hinzufügt, die each zum Durchlaufen verwenden.

class MyArray
  include Enumerable
end

Im Allgemeinen sehen Rubyisten dies als einen viel klareren Weg als Mehrfachvererbung, die komplex und zu einschränkend sein kann.

Rubys visuelle Erscheinung

Während Ruby oft sehr begrenzte Satzzeichen verwendet und normalerweise englische Schlüsselwörter bevorzugt, werden einige Satzzeichen zur Dekoration von Ruby verwendet. Ruby benötigt keine Variablendeklarationen. Es verwendet einfache Namenskonventionen, um den Geltungsbereich von Variablen zu kennzeichnen.

  • var könnte eine lokale Variable sein.
  • @var ist eine Instanzvariable.
  • $var ist eine globale Variable.

Diese Sigils erhöhen die Lesbarkeit, indem sie dem Programmierer ermöglichen, die Rollen jeder Variable leicht zu erkennen. Es wird auch unnötig, jedem Instanzmember ein ermüdendes self. voranzustellen.

Über die Grundlagen hinaus

Ruby verfügt über eine Fülle weiterer Funktionen, darunter die folgenden:

  • Ruby verfügt über Funktionen zur Ausnahmebehandlung, ähnlich wie Java oder Python, um die Fehlerbehandlung zu erleichtern.

  • Ruby verfügt über einen echten Mark-and-Sweep-Garbage-Collector für alle Ruby-Objekte. Kein Bedarf an Referenzzählungen in Erweiterungsbibliotheken. Wie Matz sagt: „Das ist besser für Ihre Gesundheit.“

  • Das Schreiben von C-Erweiterungen in Ruby ist einfacher als in Perl oder Python, mit einer sehr eleganten API für den Aufruf von Ruby aus C. Dies beinhaltet Aufrufe zum Einbetten von Ruby in Software zur Verwendung als Skriptsprache. Eine SWIG-Schnittstelle ist ebenfalls verfügbar.

  • Ruby kann Erweiterungsbibliotheken dynamisch laden, wenn das Betriebssystem dies zulässt.

  • Ruby verfügt über OS-unabhängige Threads. Somit gibt es für alle Plattformen, auf denen Ruby läuft, auch Multithreading, unabhängig davon, ob das Betriebssystem dies unterstützt oder nicht, sogar unter MS-DOS!

  • Ruby ist hoch portabel: Es wird hauptsächlich unter GNU/Linux entwickelt, funktioniert aber auf vielen Arten von UNIX, macOS, Windows, DOS, BeOS, OS/2 usw.

Andere Implementierungen von Ruby

Ruby hat als Sprache einige verschiedene Implementierungen. Diese Seite hat die Referenzimplementierung besprochen, in der Community oft als **MRI** („Matz’s Ruby Interpreter“) oder **CRuby** (da es in C geschrieben ist) bezeichnet, aber es gibt auch andere. Sie sind oft in bestimmten Situationen nützlich, bieten zusätzliche Integration mit anderen Sprachen oder Umgebungen oder haben spezielle Funktionen, die MRI nicht hat.

Hier ist eine Liste:

  • JRuby ist Ruby auf der JVM (Java Virtual Machine), das die optimierenden JIT-Compiler, Garbage Collectors, Concurrent Threads, das Tool-Ökosystem und die riesige Sammlung von Bibliotheken der JVM nutzt.
  • Rubinius ist „Ruby in Ruby geschrieben“. Aufgebaut auf LLVM, verfügt Rubinius über eine schicke virtuelle Maschine, auf der auch andere Sprachen aufgebaut werden.
  • TruffleRuby ist eine Hochleistungs-Ruby-Implementierung auf GraalVM.
  • mruby ist eine leichtgewichtige Implementierung der Ruby-Sprache, die in eine Anwendung eingebunden und integriert werden kann. Seine Entwicklung wird von Rubys Schöpfer Yukihiro „Matz“ Matsumoto geleitet.
  • IronRuby ist eine Implementierung, die „eng in das .NET Framework integriert“ ist.
  • MagLev ist „eine schnelle, stabile Ruby-Implementierung mit integrierter Objektpersistenz und verteiltem Shared Cache“.
  • Cardinal ist ein „Ruby-Compiler für die Parrot Virtual Machine“ (Perl 6).

Eine vollständiger Liste finden Sie unter Awesome Rubies.

Referenzen

1 Matz, auf der Ruby-Talk Mailingliste, 12. Mai 2000.

2 Matz, in Ein Interview mit dem Schöpfer von Ruby, 29. Nov. 2001.

3 Matz, in Blöcke und Closures in Ruby, 22. Dezember 2003.