我將這個特性集成到了我喜歡的語言OCaml中,我知道這是D中的性能特徵,但除了一些優化之外,編譯時評估的用例是什麼? 越越好,geeker更好:-)D的編譯時間評估的用例是什麼
回答
優化當然是一個很大的用例。諸如ctRegex之類的東西比它們的運行時編譯的正則表達式(通常)更好。解析器生成器也很有趣(見Pegged),並將越來越受到關注。人們開始接觸到可以做的事情。
你可以做一些像mixin(import_c("header.h"))
這樣的解析和構建一個任意C頭文件的D接口文件(當然,你需要在D中爲C編寫一個解析器來做到這一點)。
由於格式字符串(例如,"%0.2f"
)通常在編譯時已知,所以可以進行極快的字符串格式化。您可以閱讀格式字符串,只生成格式化所需的代碼,剝離各種不必要的部分。
vibe.d實際上支持編譯時模板。模板文件(基於Jade/HAML)可以包含D代碼。它讀取它並生成一個D代碼的自定義塊(想象它像「」〜title〜「...」)。我不認爲作者已經做了基準測試,但它應該是非常快的。
從本質上講,您可以在保持高水平的同時獲得專門的手動優化代碼。很難回答你的問題,因爲我們不知道它將用於什麼。它讓我想起了C++模板。他們的設計人員並沒有預見到它所支持的高級元編程技術。
幾點建議:
- 如何解析PEG語法,組裝PEG解析器,然後使用解析器說,都在編譯時 ?這是Pegged項目。
- 構建大型靜態查找表。
- 爲正則表達式生成最佳本機代碼:std.regex.StaticRegex
- 從定義文件實現protobufs。
- 許多函數,如果他們的輸入在編譯時已知的話,可以被評估,而不是在運行時 - 所有這些都不需要改變函數的實現。
與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服務。
下面是我能想到的編譯時評估的最熱門的應用:以函數string f(string code)
的形式爲您自己的編程語言編寫一個編譯器,它將您的編程語言的源代碼作爲參數並吐出D代碼。然後寫入如
mixin(f(import("my_code_file")));
到您的main.d
文件中。通過這種方式,您可以濫用D編譯器及其後端爲您生成可執行文件。如果你願意,你可以編寫一個shell腳本(或類似的東西),它創建main.d
文件並在其上運行D編譯器。這樣你可以爲你的語言獲得一半的編譯器。至少你不需要關心後端。 ;)
從Appart酒店,我讀過有關D.編譯時的光線跟蹤
- 1. 編譯時間評估
- 2. 編譯時對constexpr的編譯時間評估
- 3. 爲什麼Clojure在AOT編譯期間評估表單?
- 4. 在.NET中,爲什麼常量是在編譯時而不是在JIT時間進行評估的?
- 5. 爲什麼「{1:'a',True:'b',1.0:'c',1.00:'d'}」評估爲「{1:'d'}」?
- 6. 是在編譯時或運行時評估的F#範圍
- 7. 爲什麼`a == b或c或d`總是評估爲True?
- 8. 什麼時候評估「this」?
- 9. 估計編譯時間?
- 10. 編譯/運行時Java枚舉評估
- 11. C代碼宏評估在編譯時
- 12. 力constexpr在編譯時進行評估
- 13. 「git branch -d」的用例是什麼
- 14. 編譯器決定調用函數「POW」,而不是在編譯時對其進行評估。爲什麼?
- 15. 編程語言用於評估AST的算法是什麼?
- 16. 編譯時間'const'是什麼意思?
- 17. 什麼是需要編譯一個簡單的GTK d應用
- 18. F#評估的順序是什麼?
- 19. 什麼是Marketo的評估對象?
- 20. 什麼是WEKA中集羣的評估?
- 21. 什麼時候評估django的values()values_list()?
- 22. 編譯時間可以評估數組嗎?
- 23. C++表達式評估。 「評估」是什麼意思?
- 24. 編譯器是否會刪除總是評估爲零的塊?
- 25. 在D中編譯時間碼生成
- 26. 什麼是運行時間和編譯時間多態性?
- 27. 評估行元素之間的時間
- 28. 爲什麼這總是評估錯誤?
- 29. 「頂級評估」是什麼意思?
- 30. 爲什麼strtof總是評估爲HUGE_VAL?
你說的你的意思是「集成這個功能」您「最喜歡的編程語言OCaml的」?當你沒有用例時,你爲什麼這樣做? – jmg 2012-07-12 14:43:11
這是我的其他項目的副作用。正如我所說的優化是一個用例。但我認爲應該有更多 – bobzhang 2012-07-12 14:51:06
類似的問題:http://stackoverflow.com/questions/3555456/examples-of-what-ds-templates-can-be-used-for – 2012-07-12 15:31:09