Extension Ruby C et volatile

Lorsque j'écrivais une extension de Ruby en langage C, j'ai commencé à remarquer le mot-clé «volatile».

Qu'est-ce que «volatile»?

volatile n'est généralement pas pris en charge même si vous programmez en C ou C ++. Celles-ci sont essentiellement liées à l'interaction avec ** en dehors du programme **. Pour le dire simplement, l'effet est que "la lecture et l'écriture vers la destination avec" volatile "seront effectuées exactement comme elles ont été écrites dans le programme". En d'autres termes, pour éviter des optimisations telles que "J'écris plusieurs fois de suite, donc je ne le ferai que la dernière fois" ou "Je lis sans rien changer dans le code, donc je vais interrompre la lecture". Devenir. c'est,

C'est un mécanisme pratique pour la manipulation (il y a aussi article plus détaillé).

Cependant, Ruby n'a pas d'accès direct au matériel. Si oui, cela signifie «travail externe», mais qu'est-ce que c'est?

À propos du ramasse-miettes de Ruby

Ruby a un garbage collector, qui est implémenté au niveau du langage C de base. Et ce ramasse-miettes ne sera pas récupéré en mettant simplement le handle [^ 1] VALUE de l'objet Ruby dans le registre ou la pile, pas seulement dans une zone spéciale.

Cependant, si l'espace n'est pas considéré comme une variable, cela est également inutile. Ainsi, «VALEUR volatile» apparaîtra fréquemment pour vous forcer à réserver de l'espace en tant que variable.

Scènes qui manquent encore

Cependant, certaines parties ne peuvent toujours pas être couvertes. Normalement, il n'y a pas de problème car VALUE est acheminé, mais si vous retirez le pointeur du contenu avec une chaîne de caractères etc. et n'utilisez que cela, après la dernière référence à VALUE (en langage C) ) La variable VALUE peut devenir inutile et peut être écrasée par autre chose et devenir la proie du ramasse-miettes (Exemple. /2012/04/ruby-garbage-collection-exerb-ruby.html)). Dans un tel cas, écrivez RB_GC_GUARD (variable VALUE) après la partie qui nécessite VALUE afin que VALUE puisse survivre jusqu'à ce point [^ 2].

Résumé

Même dans le monde de l'extension C, la "facilité d'écriture" comme l'idée de Ruby est toujours vivante, mais je pense que le conflit avec l'obscurité du langage C est aussi un aspect indéniable.

[^ 1]: Il y a des choses comme Fixnum, nil, false, true qui le traitent comme une valeur directe au lieu d'un handle. [^ 2]: Le contenu de RB_GC_GUARD inclut" passer "VALUE" à une fonction dont l'optimisation est supprimée par une notation spécifique au compilateur "et" écrire "VALUE" dans une variable externe "volatile" ". C'était.

Recommended Posts

Extension Ruby C et volatile
[Tutoriel] [Ruby] Création et débogage de gemmes d'extension native C
Rubis et gemme
J'ai créé une bibliothèque d'extension Ruby en C
Symboles et rubis destructeur
[Ruby] Big Decimal et DECIMAL
Classes et instances Ruby
Héritage et délégation Ruby
Résolution avec Ruby, Perl et Java AtCoder ABC 128 C
Résolution avec Ruby, Perl et Java AtCoder ABC 113 C Reference
Note secrète de Mathematical Girl 104e implémentée en Ruby et C
Erreurs de syntaxe et contre-mesures Ruby
Utiliser le programme C de Ruby
À propos des hachages et symboles Ruby
Résumer l'injection de rubis et de dépendances
À propos de Ruby, modèle objet
[Ruby] Méthodes singulières et classes singulières
À propos des classes et des instances Ruby
Méthodes et classes Ruby (basiques)
Création de classes et d'instances Ruby
Histoire de remplacement C # et Java
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 1)
Comment écrire un exemple d'implémentation F03 ruby et C en temps réel hors ligne
AtCoder ARC 081 C hash à résoudre en Ruby, Perl et Java
[Ruby] Différence entre obtenir et publier
Écrire des méthodes Ruby en utilisant C (Partie 1)
[Ruby] Différence entre is_a? Et instance_of?
Entrée standard Ruby et diverses méthodes
À propos des guillemets simples et doubles Ruby
CGI en C et Dart: Introduction (1)
[Bases de Ruby] méthode split et méthode to_s
À propos de l'opérateur de produit Ruby (&) et de l'opérateur somme (|)
Ecrire des clés et des valeurs dans Ruby
Mise à niveau de la version du projet Ruby and Rails
À propos de l'héritage orienté objet et du rendement Ruby
Crypter avec Java et décrypter avec C #
[Ruby / Refactoring] Du traitement itératif Ruby tel que Java et C au traitement itératif de type Ruby
Tri par hachage AtCoder ABC 111 C résolu en Ruby, Perl et Java
Résolution avec Ruby, Perl et Java AtCoder ABC 129 C (Partie 2) Méthode de planification dynamique