我將這個特性集成到了我喜歡的語言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. 編譯時對constexpr的編譯時間評估
- 2. 爲什麼Clojure在AOT編譯期間評估表單?
- 3. 在.NET中,爲什麼常量是在編譯時而不是在JIT時間進行評估的?
- 4. 爲什麼「{1:'a',True:'b',1.0:'c',1.00:'d'}」評估爲「{1:'d'}」?
- 5. 是在編譯時或運行時評估的F#範圍
- 6. 編譯/運行時Java枚舉評估
- 7. 編譯時間'const'是什麼意思?
- 8. F#評估的順序是什麼?
- 9. 什麼時候評估django的values()values_list()?
- 10. 編譯時間可以評估數組嗎?
- 11. 在D中編譯時間碼生成
- 12. 編譯器是否會刪除總是評估爲零的塊?
- 13. 什麼是運行時間和編譯時間多態性?
- 14. 評估行元素之間的時間
- 15. 爲什麼strtof總是評估爲HUGE_VAL?
- 16. 什麼是'console`標籤評估環境
- 17. 什麼時候評估了右值?
- 18. 什麼時候val值準確評估?
- 19. 什麼時候評估ng-if?
- 20. 評估開發SDLC階段所需時間的最佳做法是什麼?
- 21. 評估這個的順序是什麼?爲什麼? C++
- 22. 如何使msvc 14在編譯時評估我的constexpr
- 23. 在編譯時評估構件的位置
- 24. 函數的編譯時評估來計算常量
- 25. 爲什麼Excel的「評估」方法是一般表達式評估器?
- 26. 經過時間評估
- 27. CMD IF EXIST評估時間
- 28. 編譯器評估常量表達式
- 29. Swift 3評估通用表達式時出現編譯錯誤
- 30. 評估在編譯時使用模板哈斯克爾
你說的你的意思是「集成這個功能」您「最喜歡的編程語言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