[RUBY] Rubin / Rost-Zusammenarbeit (1) Zweck

Artikelserie

Einführung

Ruby und Rust sind gewissermaßen gegensätzliche Sprachen. Deshalb,

Ich würde es gerne erwarten.

Daher möchte ich einen Artikel über die Zusammenarbeit zwischen Ruby und Rust in mehreren Teilen schreiben. (Weil es eine Person ist, die nicht lange hält, kann es bald aufhören)

Zum ersten Mal dachte ich über den Zweck der Zusammenarbeit nach, wenn es schön wäre, zusammenzuarbeiten.

Obwohl ich ein langes und schlankes Ruby-Leben habe, bleibt Rust für immer ein Amateur (oder besser gesagt, ich schreibe selten Programme in Rust). Ich kenne die Welt der Systemprogrammierung überhaupt nicht und leide in erster Linie an Compiler-Phobie.

Verwenden Sie Rust von Ruby

Ich will die Geschwindigkeit von Rust

Wenn ich ein Skript in Ruby schreibe, frage ich mich oft: "Warum schreibe ich diesen Teil nicht in Rust um, um ihn schneller zu machen?"

Zum Beispiel zeigte die Helix [^ helix] -Demo ein Beispiel für die Implementierung von ActiveSupports "blank?" In Rust, um die Leistung [^ blank] überwältigend zu verbessern.

[^ helix]: Einer der Mechanismen, die Ruby und Rust verbinden. https://github.com/tildeio/helix

[^ blank]: Natürlich geht es bei der großen Leistungsverbesserung um die Methode "blank?". Nicht die gesamte Rails-Anwendung wird explodieren. Das heißt, "leer?" Wird oft in Rails ausgeführt, daher halte ich es nicht für eine gute Idee.

Es ist jedoch eine verbreitete Illusion, dass "das Ersetzen von Ruby durch eine Systemprogrammiersprache (nicht nur Rust) es schneller macht (alles)". Am Beispiel der String-Verarbeitung arbeiten integrierte Methoden wie "String # gsub" und "String # downcase" an sich sehr schnell. Selbst wenn ein Amateur den Prozess der Kombination einiger dieser Methoden mit Rust neu schreibt, gibt es keinen Gewinn.

"Ruby ist langsam", aber in welchem Sinne ist es langsam? Methodenaufrufe und Blockauswertungen sind relativ kostspielig. Wenn Sie also einen Prozess ausführen, der eine große Anzahl von Methodenaufrufen in einer großen Anzahl von Iterationen kombiniert, ist er viel langsamer als in C oder Rust geschrieben. Das ist oft der Fall. An einem solchen Ort kann es Raum geben, über ein Umschreiben durch Rust nachzudenken.

Was Sie von der Beschleunigung durch Rust erwarten möchten, ist parallele / parallele Programmierung. Rust befürwortet "Fearless Concurrency" [^ fc], und es scheint, dass die parallele Programmierung einen Mechanismus hat, der es schwierig macht, sie mit Fehlern zu überdecken, und es scheint, dass die Parallelisierung mit hochparalleler Verarbeitung sehr einfach durchgeführt werden kann [^ para]. ].

[^ fc]: Es ist auch der Kapiteltitel der Rust-Programmiersprache (TRPL).

[^ para]: Nach meiner Erfahrung mit Rust nahe Null wurde die Ausführungszeit halbiert, indem nur eine kleine Parallelisierung mit rayon hinzugefügt wurde. war dort.

Ich möchte GC vermeiden

Es hängt mit der Geschichte zusammen, Geschwindigkeit zu wollen, aber ist es nicht möglich, den Speicherverbrauch zu reduzieren, indem die Verarbeitung, die in Ruby eine extrem große Menge Müll verursacht, in Rust konvertiert wird? Ein Programm, das weiterhin ausgeführt wird, z. B. eine Webanwendung, verfügt häufig über eine Speicherbereinigung. Die Leistung kann sich verbessern, wenn die Frequenz verringert wird.

Beispielsweise ist die morphologische Analyse wahrscheinlich ein Prozess, bei dem wahrscheinlich Müll auftritt. Ruby verfügt auch über eine morphologische Analysebibliothek, die auf MeCab, Juman ++ usw. basiert, sodass Sie die morphologische Analyse problemlos verwenden können. Selbst wenn Sie beispielsweise nur die Nomenklatur aus dem Text extrahieren möchten, wird eine große Anzahl zusätzlicher Zeichenfolgen generiert. Weil die aus diesen Bibliotheken erhaltenen Informationen beispielsweise morphologisch sind (am Beispiel von MeCab).

Ist ein Assistent,Fallassistent,Allgemeines,*,*,*,Aber,Ga,Ga

(Die Registerkarte nach "ga"). Wenn Sie dies durch Tabulatoren und Kommas teilen, können Sie eine Reihe von String-Objekten erstellen. Die meisten von ihnen sind unnötig. Diese werden zu Müll. Wenn ich also den Teiltext mit "Nomenklatur" ... usw. vergleiche, habe ich das Gefühl, dass er ineffizient zu sein scheint [^ ineffizient].

[^ ineffizient]: Ich weiß nicht, ob es wirklich ineffizient ist, wenn ich es nicht richtig messe.

Da Rust den Speicher ohne Verwendung der Speicherbereinigung verwaltet, kann es effizient sein, wenn Rust für die morphologische Analyse und das Extrahieren der erforderlichen Informationen und die Übergabe des Ergebnisses an ein Ruby-Skript verantwortlich ist. ..

Ich möchte Rust-Software verwenden

Was ist mit etwas anderem als Leistung?

Manchmal möchten Sie einige der besten Rust-Tools und -Bibliotheken von Ruby verwenden. Es ist ganz natürlich, C-Software in Ruby zu verwenden, und die meisten sogenannten "Erweiterungsbibliotheken" werden wahrscheinlich in C erstellt. Das Schreiben einer in Rust weit verbreiteten Erweiterungsbibliothek ist insofern eine große Hürde, als ein Rust-Compiler am Installationsziel erforderlich ist. Es ist jedoch durchaus denkbar, wenn es sich um ein internes Tool handelt.

Die Verwendung von Rust-Software in Ruby wird in Zukunft zunehmen, auch wenn es sich nicht um eine Erweiterungsbibliothek handelt.

Verwenden Sie Ruby from Rust

Es ist auch möglich, Ruby von Rust zu verwenden.

Es ist häufig der Fall, dass die Verarbeitung, die in Ruby sehr präzise geschrieben werden kann, in Rust, C, C ++ usw. sehr mühsam ist. Es kann möglich sein, eine solche Verarbeitung teilweise in Ruby zu schreiben.

Tatsächlich scheint Rutie [^ rutie] einen Mechanismus zu haben, um Ruby-Code von der Rust-Seite aufzurufen.

[^ rutie]: Einer der Mechanismen, die Ruby und Rust verbinden. https://github.com/danielpclark/rutie

Für Ruby, der von der Seite von Rust angerufen wird, kann mruby auch ein Kandidat sein. Referenz: mruby-sys

Recommended Posts

Rubin / Rost-Zusammenarbeit (1) Zweck
Rubin / Rost-Kooperation (2) Mittel
Rubin / Rost-Kooperation (6) Extraktion der Morphologie
Ruby / Rust-Kooperation (3) Numerische Berechnung mit FFI
Ruby / Rust-Verknüpfung (4) Numerische Berechnung mit Rutie