Сведения о вопросе

Математик

15:02, 17th August, 2020

Теги

java   c   ruby    

Ruby блоков/Java closures в C

Просмотров: 455   Ответов: 3

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

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

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

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

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



  Сведения об ответе

PIRLO

23:43, 10th August, 2020

Понятие closures требует понятия контекстов. Контекст C основан на стеке и регистрах CPU, поэтому для создания block/closure, вам нужно иметь возможность корректно (и повторно) манипулировать указателем стека и хранить/восстанавливать регистры по мере необходимости.

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


  Сведения об ответе

lesha

21:10, 24th August, 2020

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

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

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

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


  Сведения об ответе

dump

17:43, 18th August, 2020

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

Ruby_Blocks.pdf

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

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться