Pergunta

Tenho tentado entender como funcionam os blocos Ruby, e para isso tenho tentado implementá-los em C.

Uma maneira fácil de implementar fechamentos é passar um void* para a pilha envolvente ao fechamento/função, mas os blocos Ruby também parecem lidar com retornos e instruções de interrupção do escopo que usa o bloco.

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

Acho que uma das propostas de encerramento para Java também funciona assim.

Então, como você implementaria blocos Ruby/fechamentos Java em C?

Foi útil?

Solução

O conceito de encerramentos requer o conceito de contextos.O contexto de C é baseado na pilha e nos registros da CPU, portanto, para criar um bloco/fechamento, você precisa ser capaz de manipular o ponteiro da pilha de maneira correta (e reentrante) e armazenar/restaurar registros conforme necessário.

A maneira como isso é feito por intérpretes ou máquinas virtuais é ter um context estrutura ou algo semelhante, e não usar a pilha e os registros diretamente.Essa estrutura controla uma pilha e, opcionalmente, alguns registros, se você estiver projetando uma VM baseada em registro.Pelo menos, essa é a maneira mais simples de fazer isso (embora tenha um desempenho um pouco menor do que mapear as coisas corretamente).

Outras dicas

Na verdade, eu não implementei nada disso, então aceite isso com cautela.

Existem duas partes para um fechamento:o ambiente de dados e o ambiente de código.Como você disse, provavelmente você pode passar um void* para lidar com referências a dados.Você provavelmente poderia usar setjmp e longjmp para implementar os saltos de fluxo de controle não lineares que a quebra do Ruby requer.

Se você deseja encerramentos, provavelmente deveria programar em uma linguagem que realmente os suporte.:-)

ATUALIZAR:Coisas interessantes estão acontecendo em Clang.Eles criaram um protótipo de fechamento para C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html pode ser uma leitura interessante.

Há um bom conjunto de slides sobre Ruby Blocks como parte do curso "Rails with Passion":

Ruby_Blocks.pdf

Isso abrange a representação de um bloco, como eles passam argumentos e são executados e ainda mais em coisas como objetos Proc.Está muito claramente explicado.

Talvez seja interessante ver como o pessoal do JRuby lidou com isso em sua análise para Java.Dê uma olhada na fonte em codehaus.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top