Ruby-блоки / Java-замыкания в C - PullRequest
6 голосов
/ 21 августа 2008

Я пытался понять, как работают блоки Ruby, и для этого я пытался реализовать их в C.

Один простой способ реализовать замыкания - это передать void* во вмещающий стек в замыкание / функцию, но блоки Ruby, похоже, также обрабатывают операторы возврата и прерывания из области, в которой используется блок.

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

Я думаю, что одно из предложений замыканий для Java работает так же.

Итак, как бы вы реализовали Ruby-блоки / Java-замыкания в C?

Ответы [ 3 ]

10 голосов
/ 21 августа 2008

Концепция замыканий требует концепции контекстов. Контекст С основан на стеке и регистрах ЦП, поэтому для создания блока / замыкания необходимо иметь возможность корректно (и повторно вводить) управлять указателем стека и сохранять / восстанавливать регистры по мере необходимости. 1001 *

Способ, которым это делается интерпретаторами или виртуальными машинами, заключается в том, чтобы иметь структуру context или что-то подобное, и не использовать стек и регистры напрямую. Эта структура отслеживает стек и, возможно, некоторые регистры, если вы разрабатываете виртуальную машину на основе регистров. По крайней мере, это самый простой способ сделать это (хотя и немного менее производительный, чем на самом деле правильное отображение).

3 голосов
/ 01 сентября 2008

Я на самом деле не реализовал ничего из этого, поэтому возьмите это с мешком соли.

Закрытие состоит из двух частей: среды данных и среды кода. Как вы сказали, вы, вероятно, можете передать void * для обработки ссылок на данные. Вероятно, вы могли бы использовать setjmp и longjmp для реализации нелинейных переходов потока управления, которые требуются в Ruby break.

Если вы хотите замыкания, вы, вероятно, должны программировать на языке, который на самом деле их поддерживает. : -)

ОБНОВЛЕНИЕ: Интересные вещи происходят в Clang. Они прототипировали закрытие для C. http://lists.cs.uiuc.edu/pipermail/cfe-dev/2008-August/002670.html может оказаться интересным чтением.

2 голосов
/ 22 августа 2008

Есть хороший набор слайдов на Ruby Blocks в рамках курса "Rails with Passion":

Ruby_Blocks.pdf

Это охватывает представление блока, то, как они передают аргументы и выполняются, и даже дальше, в такие вещи, как объекты Proc. Это очень четко объяснено.

Тогда может быть интересно посмотреть, как парни из JRuby справились с этим при анализе на Java. Взгляните на источник в codehaus .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...