2011-06-17 25 views
6

我以前在業餘時間使用IronLua。 Lexing和解析目前已完成。因爲在.NET中實現Lua協程而不使用骯髒的線程攻擊並不容易,所以我停止了對它的工作。這與我如何編譯Lua函數有關,並且這是我在設計編譯器時需要儘早解決的一個問題。用於協同實現的CPS編譯器

我一直在研究協程的實現,事實證明我對延續的初步看法是正確的。由於協程創建,良率和其他操作不是語言關鍵字,而是「協同程序」表中的函數,因爲協程表可能已被先前腳本覆蓋,所以無法靜態切換到CPS樣式編譯。雖然我明白覆蓋協程表的腳本很少發生,但我希望保持安全並儘可能乾淨地處理問題。

我的計劃是對每個表達式使用continuation-passing樣式,無論我們是否在協同程序中。一切都會延續下去。

除了首先編寫編譯器的明顯困難,以及在其上添加CPS轉換之外,我對此設計決策及其性能影響感到困擾。

我在找.NET關於Lua協程實現的建議。

謝謝你的時間。

回答

0

您可能想要更多地瞭解在Scala上完成的工作。 Scala支持作爲編譯器插件的延續。

警告:我不知道延續支持是否可以在.NET中工作,或者實際上編譯器本身的工作有多高級。對此負責的人是米格爾·加西亞,你可以找到他在斯卡拉郎地址:The Scala Development Team

以下引用可能是有用的:

Scala comes to .Net

The Scala Compiler Corner, for .NET and Mono fans

+0

謝謝,我會看看他們的來源。將更新。 – Raine 2011-08-09 17:50:26

1

我不熟悉詳細介紹了lua的例程。但我認爲,你可以得到與lua本身支持的類似級別的協同例程支持的唯一方法是要求所有局部變量以某種形式分配在堆上。

你的問題不僅在於協程函數可能被替換,而且你調用的任何lua函數都可能產生。

您還應該看看在C#中實現非常類似行爲的異步CTP。我看到的主要區別是您需要將所有方法設置爲異步,而C#功能則是選擇加入。

如果你的.net集成很好(如果在DLR上構建,我期望它很好),那麼我不會擔心很多性能問題。在C#中編寫性能關鍵部件並使用lua代替膠水代碼很容易。

相關問題