改善されたCとしてのD

ウォルターブライトのDプログラミング言語と創業者の「慈悲深い生涯独裁者」であるデジタル火星彼は、最初のネイティブC ++コンパイラであるZortechC ++を含む、いくつかの言語用のコンパイラとインタプリタの開発に数十年の経験があります。彼はまた、シド・マイヤーの文明の主なインスピレーションであるエンパイアの作成者でもあります。



ベターCシリーズ


D言語は、最初からCに簡単かつ直接アクセスできるように設計されており、程度は低いもののC ++にアクセスするように設計されています。このおかげで、無数のCライブラリ、標準のCライブラリ、そしてもちろん、通常はCAPI上に構築されているシステムAPIを利用できます。



しかし、Cはライブラリだけではありません。 Linuxオペレーティングシステムやそのためのほとんどのプログラムなど、多くの大規模で貴重なプログラムはCで記述されています。 DプログラムはCライブラリにアクセスできますが、その逆は当てはまりません。 CプログラムはDコードにアクセスできません。複数のDファイルをコンパイルしてCプログラムにリンクすることは不可能です(または少なくとも非常に困難です)。問題は、コンパイルされたDファイルが何かにアクセスできることです。ランタイムDにのみ存在し、リンクに追加することは通常実用的ではありません(ランタイムは非常に大量です)。



また、Dが関数を制御しない場合main()、Dランタイムが開始されるため、Dコードはプログラムに存在できません。したがって、DライブラリはCプログラムにアクセスできず、キメラプログラム(CとDの混合)は実用的ではなくなります。Dモジュールを既存のCプログラムモジュールに追加するだけでDを「試す」ことはできません。



これはベターCまででした。



これはすべてすでに起こっており、アイデアは新しいものではありません。1988年のBjarneStroustrupは、A the Better theCという記事を書きました彼の初期の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に変換し始めました-一度に1つの関数。一度に1つの機能を実行し、変更するたびに一連のテストを実行することで、プログラムを常に実行し続けます。何かが壊れた場合、原因を見つけるために1つの関数をテストするだけで済みます。私は自分のCプログラムをさらにサポートすることにあまり興味がなく、Better Cの登場により、その理由はなくなりました。




All Articles