Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst

Einführung

Ich werde kurz erklären, wie man eine in C geschriebene Bibliothek von Ruby aufruft. Es gibt einige Websites, die dies erklären, einschließlich der offiziellen, aber ich wollte, dass Sie es mir einfacher sagen ...

Referenz

https://ruby-doc.org/core-2.5.3/doc/extension_ja_rdoc.html https://qiita.com/suketa/items/ab6b88093de4a54b3b06

Probe gemacht

https://github.com/hakua-doublemoon/rb_ext_hello

Ich werde es sofort schaffen

Erstellen Sie eine Bibliothek für Ruby in C.

Wie im oben gezeigten Beispiel C-Code gezeigt. Definieren Sie eine Klasse mit einer Init-Funktion (Sie können auch ein Modul definieren), erstellen Sie eine Methodendefinition und die entsprechende Funktion. Bei der Methode wird sie am Anfang des offiziellen Dokuments geschrieben. Da sich die Verwendung von Typen zwischen Ruby und C unterscheidet, verwenden Sie bei der Interaktion eine spezielle Funktion. Mit anderen Worten, es sieht wie folgt aus.

hello.c


    return rb_str_new("Hello World", 11);

Mach ein Makefile und mach

Ich schreibe das Makefile nicht selbst. Sie können es erstellen, indem Sie extconf.rb und dann ruby extconf.rb erstellen. Dies ist auch im Beispiel enthalten. (Ich denke, es kann ausgeführt werden, wenn Ruby installiert ist, aber vielleicht ist "Ruby-Dev" notwendig?) Der durch create_makefile () angegebene Modulname (Klassenname?) Muss nicht mit dem Fall des Dateinamens übereinstimmen. Also habe ich hello.c im unteren C-Dateinamen und Hello im Klassennamen wie Typname verwendet. ruby extconf.rb und wenn das Makefile erstellt wird, make. Übrigens, selbst wenn Sie extconf.rb schreiben, bevor Sie eine C-Datei erstellen, erhalten Sie möglicherweise ein Makefile, das Sie nicht erstellen können.

Versuche zu rennen

Da es eine große Sache ist, werde ich bis zu dem Punkt schreiben, an dem ich es versuchen werde. Ich habe es in das Beispiel geschrieben, aber Sie können es wie folgt tun.

require "./Hello"

hello = Hello::new

hello.methods
#=> [:say, :instance_variable_set, :instance_variable_defined?, ...
#    ^Es gibt eine Methode, die ich hier gemacht habe.

hello.say
#=> "Hello World"

hello.say.class
#=> String

Hintergrund, den ich gemacht habe

Zuerst habe ich mich gefragt, ob ich ein in C als Befehl von Ruby geschriebenes Programm ausführen soll, aber ich habe gelernt, dass der Overhead von popen ziemlich groß ist, also habe ich beschlossen, eine gemeinsam genutzte Bibliothek zu erstellen. Wenn Sie in einem einzigen Schuss öffnen, sehen Sie nicht viel Overhead. Ich denke jedoch, dass es einen großen Unterschied macht, ob Sie es ungefähr 1000 Mal mit popen ausführen oder die Bibliothek laden und ausführen. (Ich denke, es hängt von der Ausführungsumgebung ab) Das Folgende ist das Ergebnis des Experiments.

Das Ergebnis der 1000-maligen Ausführung des Hello World C-Programms mit popen:
                 user     system      total        real
Case01       0.125000   0.296875   2.625000 ( 11.617396)

Das Ergebnis der Ausführung der Bibliothek habe ich diesmal 1000 mal gemacht:
                 user     system      total        real
Case01       0.000000   0.000000   0.000000 (  0.000436)

1000 Bibliotheken habe ich diesmal gemacht*Ergebnis des 1000-maligen Laufens:
                 user     system      total        real
Case01       0.109375   0.015625   0.125000 (  0.130412)

abschließend

Als Person, die Ruby verwendet, können Sie versuchen, die Ursache für den starken Pop von Ruby zu finden ...

Recommended Posts

Hallo Welt mit Ruby-Erweiterungsbibliothek vorerst
Verwenden Sie vorerst eine externe Java-Bibliothek
"Hallo Welt" für ImageJ mit Eclipse
[Erstes Java] Machen Sie etwas, das vorerst mit Intellij funktioniert
Erste Programmierung in meinem Leben Java 1st Hello World
Installieren Sie vorerst Amazon Corretto (Vorschau)
Führen Sie jetzt Dataflow, Java, Streaming aus
Hallo Welt mit Micronaut
Versuchen Sie vorerst, Spring Cloud Config auszuführen
Befehl, um Docker vorerst zu verwenden
Vorläufiges Memo beim Erstellen der CentOS 6-Serie mit VirtualBox
Hallo Welt mit Spring Boot
Hallo Welt mit Spring Boot!
Hallo Welt mit VS Code!
Greifen Sie mit Get on Android auf die Web-API zu und verarbeiten Sie Json (vorerst Java).
Hallo Welt mit Spring Boot
Hallo Welt mit SpringBoot / Gradle
Mit der Software, die ich schon lange mache ...
Hallo Welt, mit Asakusa Framework!
Erstmaliges Modellieren von Digimon mit DDD Teil 1
Java14 kam heraus, also habe ich vorerst versucht aufzunehmen
Probieren Sie HelloWorld mit der Mindestkonfiguration von Heroku Java Spring-Boot aus
Spring Boot zum ersten Mal
Hallo Welt für ImageJ Java Plugin
Bis "Hallo Welt" mit Spring Boot
Programmieren mit Ruby (unterwegs)
Hallo Welt mit Kotlin und JavaFX
Hallo Welt mit Docker und C Sprache
(Intellij) Hallo Welt mit Spring Boot
Hallo Welt mit GlassFish 5.1 + Servlet + JSP
Erstellen Sie PDF mit itext7 ~ HelloWorld ~
Spring AOP zum ersten Mal
Hallo Welt mit GWT 2.8.2 und Maven
Lassen Sie uns den Berechtigungscode-Grant-Flow mit Spring Security OAuth-Teil 2: Erstellen einer App vorerst erleben
Aufbau eines DLNA-Servers unter Ubuntu (vorerst nur verschieben)
Java12 kam heraus, also habe ich vorerst den Schalterausdruck ausprobiert
Glassfish Tuning List, die ich vorerst behalten möchte
Erste Schritte mit Ruby für Java-Ingenieure
Einführung in Java zum ersten Mal # 2
Hallo Welt mit Eclipse + Spring Boot + Maven
Hallo Welt! Im Bootstrap Loader Bereich
Hallo Welt mit Java Template Engine Thymeleaf
Java-Entwicklung mit Codenvy: Hello World! Run
"Hallo Welt!" Mit Kotlin + CLI in 5 Minuten
Hallo Welt mit Kotlin und Tornado FX
Zum ersten Mal Java lernen [Einführung]
Wie Spring Security mit Hello World funktioniert
(IntelliJ + gradle) Hallo Welt mit Spring Boot
Verwenden Sie die Methode l für die Zeitnotation
Ich möchte, dass Sie Scala vorerst als besseres Java verwenden
Hello World, eine plattformübergreifende GUI-App mit Groovy, die auf der Java-Plattform ausgeführt wird
[Ruby] Definieren Sie die Hierarchie gleichzeitig mit der Initialisierung von Hash mit der Tap-Methode
[Deep Learning von Grund auf neu] in Java 1. Zur Zeit Differenzierung und teilweise Differenzierung