2012-07-12 71 views
8

我將這個特性集成到了我喜歡的語言OCaml中,我知道這是D中的性能特徵,但除了一些優化之外,編譯時評估的用例是什麼? 越越好,geeker更好:-)D的編譯時間評估的用例是什麼

+1

你說的你的意思是「集成這個功能」您「最喜歡的編程語言OCaml的」?當你沒有用例時,你爲什麼這樣做? – jmg 2012-07-12 14:43:11

+0

這是我的其他項目的副作用。正如我所說的優化是一個用例。但我認爲應該有更多 – bobzhang 2012-07-12 14:51:06

+1

類似的問題:http://stackoverflow.com/questions/3555456/examples-of-what-ds-templates-can-be-used-for – 2012-07-12 15:31:09

回答

12

優化當然是一個很大的用例。諸如ctRegex之類的東西比它們的運行時編譯的正則表達式(通常)更好。解析器生成器也很有趣(見Pegged),並將越來越受到關注。人們開始接觸到可以做的事情。

你可以做一些像mixin(import_c("header.h"))這樣的解析和構建一個任意C頭文件的D接口文件(當然,你需要在D中爲C編寫一個解析器來做到這一點)。

由於格式字符串(例如,"%0.2f")通常在編譯時已知,所以可以進行極快的字符串格式化。您可以閱讀格式字符串,只生成格式化所需的代碼,剝離各種不必要的部分。

vibe.d實際上支持編譯時模板。模板文件(基於Jade/HAML)可以包含D代碼。它讀取它並生成一個D代碼的自定義塊(想象它像「」〜title〜「...」)。我不認爲作者已經做了基準測試,但它應該是非常快的。

從本質上講,您可以在保持高水平的同時獲得專門的手動優化代碼。很難回答你的問題,因爲我們不知道它將用於什麼。它讓我想起了C++模板。他們的設計人員並沒有預見到它所支持的高級元編程技術。

+0

我在D編譯時間評估中發現了一個重要的限制,即所有的源應該出現在一個文件中,這使得編寫非常強大的編譯時評估函數變得非常困難,因爲那時你不能使用任何庫。你怎麼看它 – bobzhang 2012-07-25 22:58:50

+0

這基本上是C++模板面臨的相同的限制。對此沒有簡單的解決方法。有些人想將源代碼嵌入到庫目標文件中以解決這個問題,但沒有人嘗試過。 – eco 2012-07-25 23:53:56

9

幾點建議:

  • 如何解析PEG語法,組裝PEG解析器,然後使用解析器說,都在編譯時 ?這是Pegged項目。
  • 構建大型靜態查找表。
  • 爲正則表達式生成最佳本機代碼:std.regex.StaticRegex
  • 從定義文件實現protobufs。
  • 許多函數,如果他們的輸入在編譯時已知的話,可以被評估,而不是在運行時 - 所有這些都不需要改變函數的實現。
+0

感謝您的建議。我不熟悉D,如果編譯時評估返回一個自定義的數據結構,那麼D如何處理?你會對此有所瞭解嗎? – bobzhang 2012-07-12 15:49:26

+0

或者更確切地說,使用編譯時評估功能的D限制是什麼? – bobzhang 2012-07-12 15:51:55

+0

以下是[完整限制列表](http://dlang.org/function.html#interpretation)。 – eco 2012-07-12 16:28:48

5

mixin一起使用時,它可以提供很大的靈活性。

請看下面的例子:

template StructFromFile(string fileName){ 
    string makeStructMembersCode(string[] s){ 
     if(0==s.length){ 
      return null; 
     } 
     string memberName=s[0].strip; 
     return q{ 
      string }~memberName~q{; 
      }~makeStructMembersCode(s[1..$]); 
    } 
    struct StructFromFile{ 
     mixin(makeStructMembersCode(import(fileName).splitLines)); 
    } 
} 

這將創建一個結構,它的成員是一個文本文件的行。現在,假設你在數據庫中有一個表,並且你想創建一個D結構來存儲該表中的行。您可以編寫一個shell腳本來讀取該表的模式並將其寫入文件,然後使用StructFromFile自動創建一個可以容納該表的行的結構。如果你改變模式,你沒有改變結構的代碼。但是,您必須更改任何依賴舊架構的代碼 - 但這是一件好事,因爲它會導致運行時錯誤編譯錯誤。

當然,您還可以使用此方法添加getter + setter屬性,並將其用於XML DTD和Web服務。

4

下面是我能想到的編譯時評估的最熱門的應用:以函數string f(string code)的形式爲您自己的編程語言編寫一個編譯器,它將您的編程語言的源代碼作爲參數並吐出D代碼。然後寫入如

mixin(f(import("my_code_file"))); 

到您的main.d文件中。通過這種方式,您可以濫用D編譯器及其後端爲您生成可執行文件。如果你願意,你可以編寫一個shell腳本(或類似的東西),它創建main.d文件並在其上運行D編譯器。這樣你可以爲你的語言獲得一半的編譯器。至少你不需要關心後端。 ;)

從Appart酒店,我讀過有關D.編譯時的光線跟蹤