D作为改进的C

沃尔特·布赖特Walter Bright)是D编程语言的“仁慈终身独裁者”,也是Digital Mars的创始人他在开发多种语言的编译器和解释器方面拥有数十年的经验,其中包括第一个本机C ++编译器Zortech C ++。他还是《帝国》的创建者,《帝国》是西德·迈耶《文明》的主要灵感来源。



更好的C系列


D语言从一开始就被设计为易于直接访问C,在较小程度上访问C ++。因此,这里提供了无数的C库,标准C库以及通常基于C API构建的系统API。



但是C不仅与库有关。许多大型而无价的程序都是用C编写的,例如Linux操作系统及其大多数程序。虽然D程序可以访问C库,但事实并非如此。 C程序无法访问D代码。不可能(或至少非常困难)编译多个D文件并将它们链接到C程序中。问题在于,已编译的D文件可以访问某些仅在运行时D中存在,并且将其添加到链接通常是不切实际的(运行时非常庞大)。



另外,如果D不控制该功能main()则程序中将不会存在D代码,因为这是D运行时的启动方式,因此C库无法访问D库,并且嵌合体程序(C和D的混合物)变得不切实际。您不能只是通过将D模块添加到现有C程序模块来“尝试”D。



直到BetterC。



所有这一切已经发生了,这个主意并不是新鲜事。Bjarne Stroustrup于1988年写了一篇名为《A the Better the C》的文章他早期的C ++编译器几乎可以不变地编译C代码,并且可以在不影响现有C ++工作的情况下在适当的时间和地点开始使用C ++功能,这是确保C ++早日成功的绝妙策略。



Kotlin, . Kotlin Java, Java-, Java Kotlin. Kotlin — « Java», .



D C



D C. C, , C ( , ..). D — D, , . -betterC.



D D? , . . , C. , C D.





, , — , . , C: malloc .



C++ COM  , D — , .



, typeid, , RAII . , , .



Better C RAII . (. .)

assert , C D.



( , . Better C).





, Better C C?



C , . , : , , , , , , , (Compile Time Function Execution, CTFE), , (Design by Introspection, DbI).





:



#include <stdio.h>

int main(int argc, char** argv) {
    printf("hello world\n");
    return 0;
}


:



_main:
push EAX
mov [ESP],offset FLAT:_DATA
call near ptr _printf
xor EAX,EAX
pop ECX
ret


— 23 068 .



D:



import core.stdc.stdio;

extern (C) int main(int argc, char** argv) {
    printf("hello world\n");
    return 0;
}


: 23 068 . , C, D , . ( D 194 ). , D C .



Hello World — . - : :



#include <stdio.h>

/* Eratosthenes Sieve prime number calculation. */

#define true    1
#define false   0
#define size    8190
#define sizepl  8191

char flags[sizepl];

int main() {
    int i, prime, k, count, iter;

    printf ("10 iterations\n");
    for (iter = 1; iter <= 10; iter++) {
        count = 0;
        for (i = 0; i <= size; i++)
            flags[i] = true;
        for (i = 0; i <= size; i++) {
            if (flags[i]) {
                prime = i + i + 3;
                k = i + prime;
                while (k <= size) {
                    flags[k] = false;
                    k += prime;
                }
                count += 1;
            }
        }
    }
    printf ("\n%d primes", count);
    return 0;
}


Better C:



import core.stdc.stdio;

extern (C):

__gshared bool[8191] flags;

int main() {
    int count;

    printf("10 iterations\n");
    foreach (iter; 1 .. 11) {
        count = 0;
        flags[] = true;
        foreach (i; 0 .. flags.length) {
            if (flags[i]) {
                const prime = i + i + 3;
                auto k = i + prime;
                while (k < flags.length) {
                    flags[k] = false;
                    k += prime;
                }
                count += 1;
            }
        }
    }
    printf("%d primes\n", count);
    return 0;
}


, - :



  • extern(C) C.
  • D (thread-local storage, TLS). C . __gshared.
  • foreach — .
  • const , prime .
  • iter, i, prime k , .
  • flags flags.length, - .


, : flags . - ! .



Better C, , C. , D , , goto.



我可以代表我自己说,自从出现该选项以来-betterC,我就开始将许多旧的但仍然使用的程序转换为D-一次只转换一个函数。通过一次运行一个功能并在每次更改后运行一组测试,我可以使程序始终运行。如果发生故障,我只需要测试一个功能即可找到原因。我对进一步支持我的C程序不是很感兴趣,并且随着Better C的出现,不再需要这样做。




All Articles