Domanda

Ho cercato di capire come funzionano i blocchi Ruby e per farlo ho provato a implementarli in C.

Un modo semplice per implementare le chiusure è passare a void* allo stack che lo racchiude alla chiusura/funzione, ma i blocchi Ruby sembrano anche gestire i ritorni e le istruzioni di interruzione dall'ambito che utilizza il blocco.

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

Penso che anche una delle proposte di chiusura per Java funzioni in questo modo.

Quindi, come implementeresti i blocchi Ruby/chiusure Java in C?

È stato utile?

Soluzione

Il concetto di chiusure richiede il concetto di contesti.Il contesto del C è basato sullo stack e sui registri della CPU, quindi per creare un blocco/chiusura è necessario essere in grado di manipolare lo stack pointer in modo corretto (e rientrante) e memorizzare/ripristinare i registri secondo necessità.

Il modo in cui ciò viene fatto dagli interpreti o dalle macchine virtuali è avere un file context struttura o qualcosa di simile e non utilizzare direttamente lo stack e i registri.Questa struttura tiene traccia di uno stack e facoltativamente di alcuni registri, se stai progettando una VM basata su registri.Almeno, questo è il modo più semplice per farlo (anche se leggermente meno performante rispetto alla mappatura corretta delle cose).

Altri suggerimenti

In realtà non ho implementato nulla di tutto ciò, quindi prendilo con le pinze.

Ci sono due parti in una chiusura:l'ambiente dei dati e l'ambiente del codice.Come hai detto, probabilmente puoi passare un void* per gestire i riferimenti ai dati.Probabilmente potresti usare setjmp e longjmp per implementare i salti del flusso di controllo non lineare richiesti dalla rottura di Ruby.

Se vuoi delle chiusure dovresti probabilmente programmare in un linguaggio che le supporti effettivamente.:-)

AGGIORNAMENTO:A Clang stanno accadendo cose interessanti.Hanno prototipato una chiusura per C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html potrebbe rivelarsi una lettura interessante.

C'è una buona serie di diapositive su Ruby Blocks come parte del corso "Rails with Passion":

Ruby_Blocks.pdf

Questo riguarda la rappresentazione di un blocco, il modo in cui vengono passati gli argomenti ed eseguiti e anche cose come gli oggetti Proc.È spiegato molto chiaramente.

Potrebbe quindi essere interessante vedere come i ragazzi di JRuby li hanno gestiti durante l'analisi in Java.Dai un'occhiata alla fonte su codehaus.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top