Wie ist das Schreiben einer C-Schnittstelle in Ruby einfacher als in Perl?

8

Laut der offiziellen Ruby About-Seite ist es einfacher, Ruby mit C als mit Perl zu erweitern. Ich bin kein (Perl) XS-Typ, aber ich finde es dreck einfach, etwas schnell und einfach mit Inline zu schreiben: : C , warum ist es dann einfacher in Ruby?

  

Das Schreiben von C-Erweiterungen in Ruby ist einfacher als in Perl oder Python, mit einer sehr eleganten API zum Aufrufen von Ruby von C. Dies beinhaltet Aufrufe zum Einbetten von Ruby in Software als Skriptsprache. Eine SWIG-Schnittstelle ist ebenfalls verfügbar.

Jede weitere Erklärung von denen, die mehr C-Erweiterungen tun, wäre nützlich.

    
Evan Carroll 09.04.2011, 23:45
quelle

2 Antworten

12

(Volle Offenbarung, ich bin ein Perl-Programmierer)

Die Ruby C API sieht sicherlich viel schöner aus als Perl . Es sieht aus wie eine reguläre C-Bibliothek mit Funktionen, die dem Ruby-Code entsprechen. Perls API ist ein Durcheinander von Makros in Makros innerhalb von Makros und magischen Threading-Flags. Die Verwendung der Perl-API außerhalb des Perl-Kerns ist sicherlich zweitrangig. Ruby gewinnt definitiv, wenn er nicht fürchterlich erschreckend ist.

Während Ruby eine bessere C-API hat, hat Perl die besseren Tutorials, wie man damit alles macht. Die generierte Ruby-Dokumentation enthält keine zusammenhängende Anleitung oder einen beschreibenden Text. Es ist möglich, dass ich an der falschen Stelle suche , aber das ist alles, was angeboten wurde . Im Gegensatz dazu ist die Perl-API-Dokumentation handgeschriebene Prosa mit nützlichen Informationen darüber, was jede Funktion macht. Darüber hinaus gibt es in den Kerndokumenten mehr als ein Dutzend Dokumente zur Verwendung von Perl und C . Ich würde sagen, dass Perl auf Dokumenten gewinnt.

FFI sieht ziemlich beeindruckend aus. Das nächste, was Perl an FFI hat, ist Inline :: C , das ein Wrapper rund um das Chaos von XS ist. Es ist in erster Linie zu Inline-C-Code in Ihr Perl-Programm , aber Sie können auch Verwenden Sie es, um auf C-Bibliotheksfunktionen zuzugreifen .

Hier ist ein triviales Beispiel ähnlich dem getpid-Beispiel von nash.

%Vor%

Jetzt betrüge ich, weil getpid technisch pid_t auf meinem System zurückgibt, aber das ist nur eine Ganzzahl. FFI scheint eine Menge Code für getpid zu haben, daher vermute ich, dass die Benutzerfreundlichkeit direkt davon abhängt, ob FFI sich bereits darum gekümmert hat. Triviale Beispiele sind trivial. Es wäre interessant zu sehen, was passiert, wenn typische Komplikationen auftreten, wie z. B. Funktionen, die vorbelegten Speicher zurückgeben und seltsame Typen haben und Strukturen umwerfen.

Während FFI und Inline :: C dazu verwendet werden können, das Gleiche zu tun, sieht es sehr anders aus. Inline :: C kompiliert und speichert C-Code. FFI macht irgendwie keine Kompilierung. Ich bin mir nicht sicher, ob das wirklich echt ist, oder ob die Kompilierung für Sie zur Installationszeit für allgemeine Bibliotheken erledigt ist.

Darüber hinaus glättet FFI die Portabilitätsprobleme in den verschiedenen Ruby-Implementierungen und deren unterschiedliche Methoden zum Aufruf von nativen APIs. Das ist etwas, was Inline :: C nicht zu tun hat, und ehrlich gesagt ist es erstaunlich, wenn es wirklich funktioniert. Ein Vorteil ist, dass die FFI-Schnittstelle viel glatter ist als Inline :: C. Mit Inline :: C ist es sehr klar, dass Sie einen Wrapper um einen C-Compiler schreiben.

    
Schwern 11.04.2011, 05:27
quelle
6

Mit FFI ist es sehr einfach, Ruby mit C zu erweitern. Dies ist ein Beispiel aus github

%Vor%
  

Sie benötigen keinen installierten Compiler   Ihr System, um FFI ausführen zu können   Erweiterungen. Unter Linux tun Sie das auch nicht   muss die Entwicklung installieren   Versionen von Bibliotheken, nur die   Laufzeitversionen. Natürlich, die   Bibliotheken, die Sie verlinken, werden benötigt   zu einem bestimmten Zeitpunkt zusammengestellt worden sein,   aber Chancen haben Sie nicht haben müssen   es.

Ссылка

    
Vasiliy Ermolovich 10.04.2011 07:13
quelle

Tags und Links