2501d,d17年前就有了编译时

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.
有添加类似ZigsetFloatMode(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标准不添加它?它效果很好!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值