Question

J'ai essayé de comprendre comment fonctionnent les blocs Ruby et, pour ce faire, j'ai essayé de les implémenter en C.

Un moyen simple de mettre en œuvre des fermetures consiste à passer un void* à la pile englobante à la fermeture/fonction, mais les blocs Ruby semblent également gérer les déclarations de retour et de rupture de la portée qui utilise le bloc.

loop do
  break i if (i >= 4000)
  i *= 2
end

Je pense que l'une des propositions de fermeture pour Java fonctionne également comme ça.

Alors, comment implémenteriez-vous les blocs Ruby/Java-closures en C ?

Était-ce utile?

La solution

Le concept de clôtures nécessite le concept de contextes.Le contexte de C est basé sur la pile et les registres du CPU, donc pour créer un bloc/fermeture, vous devez être capable de manipuler le pointeur de pile de manière correcte (et réentrante), et de stocker/restaurer les registres selon vos besoins.

La façon dont cela est fait par les interprètes ou les machines virtuelles est d'avoir un context structure ou quelque chose de similaire, et ne pas utiliser directement la pile et les registres.Cette structure assure le suivi d'une pile et éventuellement de certains registres, si vous concevez une VM basée sur des registres.Au moins, c'est la façon la plus simple de le faire (bien que légèrement moins performante que de mapper correctement les choses).

Autres conseils

Je n'ai en fait rien mis en œuvre de tout cela, alors prenez-le avec un sac de sel.

Une fermeture comporte deux parties :l’environnement des données et l’environnement du code.Comme vous l'avez dit, vous pouvez probablement passer un void* pour gérer les références aux données.Vous pourriez probablement utiliser setjmp et longjmp pour implémenter les sauts de flux de contrôle non linéaires requis par le break Ruby.

Si vous souhaitez des fermetures, vous devriez probablement programmer dans un langage qui les prend réellement en charge.:-)

MISE À JOUR:Des choses intéressantes se passent à Clang.Ils ont prototype une fermeture pour C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html pourrait s'avérer être une lecture intéressante.

Il existe une bonne série de diapositives sur Ruby Blocks dans le cadre du cours "Rails with Passion":

Ruby_Blocks.pdf

Cela couvre la représentation d'un bloc, la façon dont les arguments sont transmis et exécutés, et même plus loin dans des choses comme les objets Proc.C'est très clairement expliqué.

Il pourrait alors être intéressant de voir comment les gars de JRuby les ont gérés dans leur analyse en Java.Jetez un œil à la source sur maison de code.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top