D在17
年前就有了編譯時
!D功能
穩步進入其他語言
.
:此處的編譯時
關鍵字指示
在編譯時運行它前面的塊
.
D
不使用關鍵字
來觸發它.觸發它的是"常 式"
.當然,必須在編譯時
可計算常
式.如:
int sum(int a, int b) => a + b;
void test()
{int s = sum(3, 4); //在運行時運行,enum e = sum(3, 4); //在編譯時運行
}
只要避免使用非常全局變量
,I/O
和調用系統函數
(如malloc()
),無需更改
,可在編譯時
運行相當大比例的函數
.
甚至可(使用D的自動管理內存
)用它分配內存
.
這是我最喜歡的用法之一
.我曾經編寫一個單獨的程序
來生成靜態表
.用編譯時執行函數
時,不再需要它了
.下面是一例
:
__gshared uint[256] tytab = tytab_init;
extern (D) private enum tytab_init =
() {uint[256] tab;foreach (i; TXptr) { tab[i] |= TYFLptr; }foreach (i; TXptr_nflat) { tab[i] |= TYFLptr; }foreach (i; TXreal) { tab[i] |= TYFLreal; }/*為簡潔起見,刪除了更多行*/return tab;
} ();
由計算數組
然后返回它的λ
返回'tytab'
數組的初化器
.
它的全部榮耀的鏈接.
CTFE
的另一個常見用法
是用來創建DSL
.
:感謝你創建D!
.
別客氣!
:在每臺x86
計算機上都是相同值?
它在所有機器
上都是相同值
,因為整數類型
是(不依賴實現
)固定大小
的,且2的補碼算術
是強制性
的.
但是,因為計算常的順序不同
,浮點結果
可能會有所不同
.如,x87
的計算精度
更高,然后僅在寫入內存
時圓整它.
:我接著要感謝你制作D
.我仍沒有找到一個我可以/會實際使用的
有更多編譯時功能的語言
.所以我仍在使用D
.
有添加類似Zig
的setFloatMode(strict)
等的想法嗎?我有1個或2個
項目想法,對某些計算,我需要確定性
然后是性能
.但仍非常需要浮點
所能提供的性能
.
謝謝你的客氣話!
浮點確定性
的最佳選擇
是堅持使用雙精
.然后,在64
位代碼中,使用堅持
使用64
位算術的XMM
寄存器和指令完成雙精數學
運算.
實際上
,Zig
也允許這樣做(在運行時
和編譯時
環境中調用相同函數
):
fn square(num: i32) i32 {return num * num;
}
pub fn main() void {_ = square(2);_ = comptime square(3);
}
如果內容
與編譯時
不兼容,則編譯時
調用產生編譯錯誤
(恕我直言,這是一個重要的功能
,因為如果期望在編譯時
運行的代碼因為某些輸入參數
已按運行時求值
更改從編譯時
,因此意外進入運行時
,它會敲響警鐘
).
D的ImportC
也可用C代碼
做CTFE
!
int sum(int a, int b) { return a + b; }
_Static_assert(sum(3, 4) == 7, "你看,編譯時檢查!");
為什么C標準
不添加它?它效果很好
!