2016-01-11 19 views
1

爲解釋器製作一個repl是微不足道的。但是,我想知道如何做一個編譯器相同。我看到LLVM如何在編譯語言(如C語言)中雙向工作並存在REPL,但不知道這是如何可行的。如何爲使用Reflection.Emit製作的編譯器生成REPL?

我建設F#的玩具語言,所以不知道該怎麼辦相同(即:如果編譯成字節碼的.NET)如果我生成反射組件發出

回答

1

的REPL的編譯語言工作的方式是通常它會發出代碼並立即運行它。當你使用F#Interactive時,F#代碼被解析,類型檢查和編譯(像往常一樣),但不是將它保存到文件中,它只是將生成的程序集保存在內存中,並立即運行代碼。我認爲C#REPL實際上將程序集保存在磁盤上,然後立即從那裏加載代碼。

  • 最簡單的切入點,這可能是DynamicMethod型.NET(見MSDN documentation with a sample,你可以用它來發出IL代碼,它包裝成一個委託並調用它。

  • 如果你需要發出類型(不只是方法機構),那麼你就需要DefineDynamicAssembly方法(見MSDN documentation),它可以讓你定義組件與類型。

另一種方法是建立你langua ge在Roslyn或F#語句之上,但是如果你已經編譯成了.NET字節碼,那麼上面的代碼就可以做到。

相關問題