Was genau ist eine native Erweiterung?

9

Ich finde, dass eine native Erweiterung wie Bibliotheken ist, die Sie auf Ihrem System installieren sollten, bevor Sie versuchen, diese Edelsteine ​​zu installieren, die von den nativen Erweiterungen abhängen. Wie die ImageMagic -Bibliothek. Ist das korrekt? Gibt es noch etwas, das wir über native Erweiterungen wissen sollten?

    
Danny Ocean 03.07.2015, 09:01
quelle

4 Antworten

10

Eine native Erweiterung von gem kann eine Verknüpfung zu einer separaten Bibliothek herstellen, die vorinstalliert sein muss, und RMagick ist ein Beispiel dafür.

Der Begriff bedeutet jedoch nur "enthält etwas Code, der für Ihre Maschine kompiliert werden muss". Der Code wird kompiliert und verknüpft, sodass die resultierende ausführbare Datei require d von Ruby auf dem Computer sein kann.

Die üblichen Gründe für das Schreiben einer Ruby C- oder C ++ - Erweiterung sind:

  • Geschwindigkeit. Bei einigen CPU-intensiven Aufgaben kann C-Code 100 Mal schneller als Ruby sein. In diesem Fall kann eine native Erweiterung vollständig mit dem gesamten C-Quellcode, der in dem Juwel enthalten ist, eigenständig sein.

  • Bibliothek von Drittanbietern, die bereits in C geschrieben ist. In diesem Fall enthält der Edelstein C-Quellcode, der die Bibliotheksfunktionen in Ruby-Module, -Klassen und -Methoden bindet.

Sie können den C-Quellcode für Edelsteine ​​mit nativen Erweiterungen anzeigen, er wird neben dem Ruby-Quellcode installiert. Per Konvention gibt es einen Ordner innerhalb des Edelsteins namens ext/gem_name , der eine Ruby-Datei extconf.rb enthält, die Informationen an den Compiler weiterleitet (technisch erstellt er ein Datei erstellen ). Außerdem werden die C-Quelldateien ebenfalls dort abgelegt.

MRI Ruby ist als eine sehr "flache" Struktur in C implementiert, die im Wesentlichen aus einer großen Anzahl von C-Funktionen besteht. Dies macht es relativ einfach zu lernen, wie man eine native Erweiterung implementiert, selbst wenn Sie nicht viel C wissen. Sie können lesen Erweitern von Ruby 1.9 als Einführung in das Thema.

Native Erweiterungen können nicht ordnungsgemäß installiert oder funktionieren. Es gibt viele Fragen zu Stack Overflow, in denen nach bestimmten fehlgeschlagenen Installationen gefragt wird. Die üblichen Probleme sind:

  • Fehlende Bibliotheken. Hoffentlich erklärt der Edelsteinautor, was Sie in der README vorinstallieren müssen, ist aber nicht immer klar.

  • Kompilierer stimmt nicht überein. Es ist schwierig, alle Zielsysteme zu testen, daher funktionieren die Anweisungen in extconf.rb manchmal nicht auf einem bestimmten System, oder der C-Code wird aufgrund von Unterschieden Warnungen ausgeben oder nicht kompilieren. In Windows haben Sie wahrscheinlich keinen funktionierenden Compiler, wenn Sie nicht das Ruby Devkit

    installieren
  • Funktioniert nicht mit allen Versionen von Ruby. Zum Beispiel kann JRuby C native Erweiterungen verwenden, wenn es aktiviert wurde, aber es ist nicht immer ratsam - das Thema ist ziemlich komplex, vermeide aber im Allgemeinen JRuby und native Erweiterungen zu mischen.

Neil Slater 03.07.2015, 09:16
quelle
4

Native Erweiterung ist nur ein Juwel, das (ganz oder teilweise) in C geschrieben ist.

Es kann oder kann nicht von einer externen Bibliothek abhängen, das ist hier kein Faktor. Was zählt ist, dass ein solches Juwel kompiliert werden muss und es wahrscheinlich plattformabhängig ist (es gab einen Grund, C zu verwenden, oder? Vielleicht für die Verwendung einer Low-Level-OS-API oder so etwas. Aber meistens ist es eine Schnittstelle zu einem Bibliothek).

    
Sergio Tulentsev 03.07.2015 09:12
quelle
1

Ich bin kein großer Rubinspezialist, also nimm das mit einem Körnchen Salz:

Ich bin ziemlich sicher, dass es nur ein Juwel ist, das eine native Bibliothek (z. B. C-Library) installieren muss, um zu funktionieren. Viele Edelsteine ​​wickeln einfach vorhandene C-Bibliotheken mit einer Ruby API ein.

Die Installation des Gems löst den Download von C-Bibliotheken aus, die dann mit gcc oder einem anderen Compiler erstellt werden. Wenn Ihre Systemkonfiguration nicht unterstützt wird, müssen Sie Parameter an das Gem-Tool übergeben, um die richtigen Verzeichnisse usw. anzugeben. Wenn Sie Pech haben, müssen Sie möglicherweise die make-Dateien direkt ändern.

    
Frank R. 03.07.2015 09:06
quelle
1

Zitieren diesen Artikel

  

"Native Erweiterungen" sind der Klebstoff, der ein Ruby-Juwel mit einer anderen Nicht-Ruby-Softwarekomponente oder -bibliothek verbindet, die auf Ihrem Computer vorhanden ist.

Die native Erweiterung ist nicht die Abhängigkeit. Eine native Erweiterung ist in der Regel ein C-Code, der mit einer Nicht-Ruby-Abhängigkeit interagiert.

Ein Juwel, das ImageMagic verwendet, hat beispielsweise eine in C geschriebene native Erweiterung, die mit ImageMagic kommuniziert und die Brücke vom Ruby-Juwel zu ImageMagic darstellt.

Wenn Sie das Gem installieren und die native Erweiterung kompiliert wird, kompilieren Sie die C-Bibliothek (z. B. ImageMagic) nicht, diese Bibliothek muss bereits auf Ihrem System vorhanden sein. Sie kompilieren die mit dem Juwel gebündelte C-Brücke.

    
Simone Carletti 03.07.2015 09:10
quelle

Tags und Links