ruby-mine

exploring the mine

[2050°C] Der Anfang

von bovi am 20.04.2006 (02 Uhr)

Murphy hat Euch in den letzten Wochen einen tiefen Einblick in die syntaktischen Finessen von Ruby geliefert. Ihr habt normale Strings und Fancy Strings kennengelernt. Es stellte sich heraus, dass Here Docs ebenfalls nur Strings mit einer zusätzlichen Dimension sind. Die funktionale Programmierung mit Symbol#to_proc macht Euch das Leben um einiges leichter. Und Fehlerbehandlung mit rescue ist nun zu einem selbstverständlichen Codefragment geworden, welches jeden unsicheren Code schmückt. Parallel hierzu möchten wir euch nun auf einer neuen Ebene einen Einblick in unseren Rubin verschaffen. Hierzu fahren wir die Schmelzanlage auf knapp 2050°C hoch und schauen uns an, was sich im inneren des Edelsteins befindet.

Was ist Ruby?

Subjektiv: eine interpretierte Programmiersprache
Objektiv: C Dateien mit ein paar Ruby Bibliotheken

Da wir Minenarbeiter u.a. sehr objektiv sind (vorsicht, diese Aussage war subjektiv), beschränken wir uns heute doch mal auf diese paar C-Dateien, welche im Verbund das Herzstück unserer Sprache ausmachen. Hierzu nun ein paar Fakten, die es dabei zu berücksichtigen gilt:

Woher bekomme ich Ruby?

Ruby wird via CVS verwaltet. Folglich muss es einen Ruby-CVS-Server geben, der sämtlichen Sourcecode beinhaltet. Die Adresse zu diesem findet man auf der Ruby-Homepage.

Im Repository befinden sich derzeit 11 Module. Hierbei interessiert uns ganz speziell das Modul 'ruby'. Dieses beinhaltet nämlich den begehrten Sourcecode. Beim Auschecken dieser Sourcen werden wir bemerken, dass es eine Vielzahl von Branches und Tags gibt.

Branches (Auszug):

Tags (Auszug):

Der aktuelle Hauptbranch heißt ruby_1_8. Dieser interessiert uns jedoch nicht, da wir die gleichen Sourcen mit hoher Wahrscheinlichkeit schon besitzen (unser Standardinterpreter sollte nämlich eine Version aus diesem Branch sein). Unser Interesse richtet sich vielmehr auf den aktuellen HEAD des CVS-Moduls. Hier befindet sich nämlich der Entwicklerzweig mit der Versionsnummer 1.9.

Der innere Kern

Nach einem Checkout sehen wir u.a. folgende Verzeichnisse in unserer CVS Arbeitskopie:

Zusätzlich liegen dort noch viele einzelne Dateien herum, von denen uns im Moment nur die Datei ChangeLog interessiert. In dieser können wir in etwa sowas lesen:

Tue Apr 18 17:40:37 2006 Hidetoshi NAGAI

* ext/tk/lib/multi-tk.rb: add a binding to a
container for a slave IP.

* ext/tk/lib/tk.rb: update RELEASE_DATE.

* ext/tk/tcltklib.c: forget to reset a Tcl interpreter.

* ext/tk/stubs.c: fix potential bugs about handling rb_argv0.

Sat Apr 8 18:06:28 2006 Masaki Suketa

* ext/win32ole/win32ole.c: add WIN32OLE_METHOD#inspect,
WIN32OLE_PARAM#inspect.

* test/win32ole/test_win32ole_method.rb: ditto.

* add test/win32ole/test_win32ole_param.rb.

...

Als Laie würde ich sagen, die letzte Änderung fand am 18.04.2006 statt. Hierbei wurden ein paar TCLTK-Fehler gefixt. Also scheinbar passiert ja doch etwas bei den Ruby-Entwicklern.

Einen Rubin backen

Ein interessanter Befehl, mit dem wir starten wollen, ist autoconf. Dieser Befehl generiert uns eine erste configure-Datei, welche im CVS logischerweise nicht vorhanden ist. Auf dieser Basis könnten wir nun den allseits bekannten Dreisatz anwenden. Da ich euch persönlich nicht empfehlen würde, den Entwicklerinterpreter auf eurer Maschine zu installieren, werde ich das Target 'install' überspringen. Eine Installation ist selbstverständlich parallel zu einem anderen Interpreter möglich aber ich mülle meinen Rechner nicht gerne mit sowas voll. Weiter geht es also mit dem Befehl configure. Dieses Kommando akzeptiert alle möglichen Übergabeparameter wie z.B.:

Unter Mac OS X ist es sinnvoll, den Schalter enable-pthread zu aktivieren, da es ansonsten zu Fehlern mit C-Extensions kommen kann, die standardmäßig mit dieser Option übersetzt wurden. Nach dem Durchlauf von configure finden wir ein Makefile in unserem Ordner. Jeder, der vergessen hat, einen Schalter beim Konfigurieren zu setzen hat nun die Möglichkeit, die entsprechenden Informationen direkt hier anzupassen. Interessant ist hierbei der C-Compiler (gcc ist Standard) und der Parser-Generator (bison ist Standard). Wer ein wenig spielen will, kann den Intel Compiler statt gcc oder yacc statt bison verwenden. Jedoch wird es hierbei zu Problemen kommen; wer also noch vollkommen unbelastet ist, kann mithilfe dieser Optionen die tollsten Fehlermeldungen produzieren. Lange Rede, kurzer Sinn: Ich starte den Buildvorgang jetzt einfach mal mit make.

Es werden die Kern-Elemente übersetzt und in die Datei libruby-static.a gepackt:

Nun wird ein Mini-Ruby-Interpreter erstellt: C-Erweiterungen werden kompiliert: Vollständiger Ruby Interpreter wird erstellt:

Nun haben wir also einen Ruby-Interpreter mit dem wohlklingenden Namen ruby in unserem Verzeichnis. Dieser meldet sich auch voller Stolz mit der Meldung: ruby 1.9.0 (2006-04-18) [powerpc-darwin8.6.0], wenn wir nach seiner Versionsnummer fragen.

In den nächsten Tagen werde ich mich mal hinsetzen und eine C-Erweiterung für CodeRay basteln. Dann werden wir endlich sehen, ob man Rubycode dadurch wirklich optimieren kann. Bis dahin.


Kommentar schreiben

Name (notwendig)

Mail (wird nicht veröffentlicht)

Webseite


Kommentare

  1. Olli schrieb am 20.04.2006 (11 Uhr)

    thx fuer die uebersicht

  2. Ruby-Mine » Blog Archive » [2050°C] Erweiterung mit C schrieb am 22.04.2006 (02 Uhr)

    [...] Wie ich hier kurz erwähnte, will ich mich heute ins Ruby-Ghetto wagen. Es geht darum C in Ruby einzubinden. [...]