CPS-компилятор для реализации сопрограмм - PullRequest
6 голосов
/ 17 июня 2011

В свое свободное время я работал на IronLua. Лексирование и разбор в данный момент сделано. Я как бы перестал работать над этим из-за разочарования, поскольку реализация сопрограмм Lua в .NET без использования грязных потоковых хаков не легка. Это связано с тем, как я компилирую функции Lua, и это проблема, которую мне нужно решить на ранних этапах проектирования компилятора.

Я исследовал реализации сопрограмм, и оказалось, что мои первоначальные чувства о продолжениях были правильными.

Поскольку создание сопрограммы, yield и другие операции являются не ключевыми словами языка, а функциями в таблице «сопрограммы», я не могу статически переключаться на компиляцию в стиле CPS, поскольку таблица сопрограмм могла быть перезаписана предыдущим сценарием. Хотя я понимаю, что сценарии, перезаписывающие таблицу сопрограмм, являются редким явлением, я бы хотел быть в безопасности и подходить к вопросу максимально четко.

Мой план - использовать стиль передачи продолжения для каждого выражения, независимо от того, находимся мы в сопрограмме или нет. За всем последует продолжение.

Помимо очевидной трудности написания компилятора в первую очередь и добавления CPS-преобразования поверх него, меня беспокоит это дизайнерское решение и его влияние на производительность.

Я ищу совет по реализации сопрограммы Lua в .NET.

Спасибо за ваше время.

Ответы [ 2 ]

1 голос
/ 09 августа 2011

Я не знаком с деталями подпрограмм Луа.Но я думаю, что единственный способ получить поддержку подпрограмм на уровне, аналогичном тому, который поддерживает сама lua, - это то, что все локальные переменные размещаются в куче в некоторой форме.

Ваша проблема не только в том, чтосопрограммные функции могут быть заменены, но любая вызываемая вами функция lua может дать.

Вы также должны взглянуть на асинхронную CTP, которая реализует очень похожее поведение в C #.Основное отличие, которое я вижу, заключается в том, что вам нужно сделать все методы асинхронными, в то время как функция C # включена.

Если у вас хорошая интеграция .net (и я ожидаю, что она будет хорошей, если использовать DLR)) тогда я бы не стал сильно беспокоиться о производительности.Легко написать критические для производительности части в C # и использовать lua для склеивания кода.

0 голосов
/ 09 августа 2011

Возможно, вы захотите подробнее ознакомиться с работой, проделанной для Scala в .NET. Scala поддерживает продолжения как плагин компилятора.

Предупреждение: я понятия не имею, работает ли поддержка продолжений в .NET или насколько продвинута работа над самим компилятором. Ответственным за это является Мигель Гарсия, его адрес можно найти в Scala Lang: Команда разработчиков Scala

Следующие ссылки могут быть полезны:

Scala приходит в .Net

Уголок компилятора Scala, для поклонников .NET и Mono

...