Als ich eine Erweiterung von Ruby in C-Sprache schrieb, bemerkte ich das Schlüsselwort "volatile".
volatile
wird normalerweise nicht erledigt, selbst wenn Sie in C oder C ++ programmieren. Diese beziehen sich grundsätzlich auf die Interaktion mit ** außerhalb des Programms **. Einfach ausgedrückt bedeutet dies, dass "das Lesen und Schreiben mit" flüchtig "zum Ziel genau so ausgeführt wird, wie es im Programm geschrieben ist." Mit anderen Worten, um Optimierungen wie "Ich schreibe viele Male hintereinander, also mache ich es nur das letzte Mal" oder "Ich lese, ohne etwas im Code zu ändern, also schneide ich das Lesen ab" zu verhindern. Werden. das ist,
Es ist ein praktischer Mechanismus für die Handhabung (Es gibt auch ausführlicheren Artikel).
Ruby hat jedoch keinen direkten Zugriff auf die Hardware. Wenn ja, bedeutet es "externe Arbeit", aber was ist das?
Ruby verfügt über einen Garbage Collector, der auf der Basisstufe C implementiert ist. Und dieser Garbage Collector wird kein Garbage Collector sein, indem einfach das Handle [^ 1] VALUE
des Ruby-Objekts in das Register oder den Stapel gelegt wird, nicht nur in einem speziellen Bereich.
Wenn der Speicherplatz jedoch nicht als Variable verwendet wird, ist dies ebenfalls nutzlos. Daher wird "volatile VALUE" häufig angezeigt, um Sie zu zwingen, Speicherplatz als Variable zu reservieren.
Es gibt jedoch noch einige Teile, die nicht abgedeckt werden können. Normalerweise gibt es kein Problem, da VALUE
herumgeleitet wird, aber wenn Sie den Zeiger des Inhalts mit einer Zeichenfolge usw. herausnehmen und nur diesen verwenden, nach dem letzten Verweis auf VALUE
(in C-Sprache) ) Die Variable "VALUE" kann unnötig werden und von etwas anderem überschrieben werden und dem Garbage Collector zum Opfer fallen (Beispiel. /2012/04/ruby-garbage-collection-exerb-ruby.html)). In einem solchen Fall schreiben Sie "RB_GC_GUARD (VALUE-Variable)" nach dem Teil, der "VALUE" benötigt, damit "VALUE" bis zu diesem Punkt überleben kann [^ 2].
Selbst in der Welt der C-Erweiterung lebt die "Leichtigkeit des Schreibens" als Idee von Ruby noch, aber ich denke, dass der Konflikt mit der Dunkelheit der C-Sprache auch ein unbestreitbarer Aspekt ist.
[^ 1]: Es gibt einige Dinge wie "Fixnum", "nil", "false", "true", die es als direkten Wert anstelle eines Handles behandeln. [^ 2]: Der Inhalt von "RB_GC_GUARD" umfasst "Übergeben von" VALUE "an eine Funktion, deren Optimierung durch eine compilerspezifische Notation unterdrückt wird" und "Schreiben von" VALUE "an eine" flüchtige "externe Variable". Es war.
Recommended Posts