D als verbessert C.

Walter Bright ist der "wohlwollende lebenslange Diktator" der Programmiersprache D und Gründer von Digital Mars . Er verfügt über jahrzehntelange Erfahrung in der Entwicklung von Compilern und Interpreten für mehrere Sprachen, darunter Zortech C ++, der erste native C ++ - Compiler. Er ist auch der Schöpfer von Empire , der Hauptinspiration für Sid Meiers Civilization.



Bessere C-Serie


Die D-Sprache wurde von Anfang an so konzipiert, dass sie einfach und direkt auf C und in geringerem Maße auf C ++ zugreifen kann. Dank dessen stehen unzählige C-Bibliotheken, die Standard-C-Bibliothek und natürlich die System-APIs zur Verfügung, die normalerweise auf den C-APIs basieren.



Bei C geht es aber nicht nur um Bibliotheken. Viele große und unschätzbare Programme sind in C geschrieben, wie das Linux-Betriebssystem und die meisten Programme dafür. Während D-Programme auf C-Bibliotheken zugreifen können, ist das Gegenteil nicht der Fall. C-Programme können nicht auf D-Code zugreifen. Es ist unmöglich (oder zumindest sehr schwierig), mehrere D-Dateien zu kompilieren und sie zu einem C-Programm zu verknüpfen. Das Problem ist, dass kompilierte D-Dateien auf etwas zugreifen können, das existiert nur in Laufzeit D, und das Hinzufügen zum Link ist normalerweise unpraktisch (die Laufzeit ist ziemlich umfangreich).



Außerdem kann D-Code in einem Programm nicht vorhanden sein, wenn D die Funktion nicht steuert main(), da auf diese Weise die D-Laufzeit gestartet wird. Daher sind D-Bibliotheken für C-Programme nicht zugänglich, und Chimärenprogramme (eine Mischung aus C und D) werden unpraktisch. Sie können D nicht einfach „ausprobieren“, indem Sie D-Module zu vorhandenen C-Programmmodulen hinzufügen.



Dies war bis Better C.



All dies ist bereits geschehen, die Idee ist nicht neu. Bjarne Stroustrup 1988 schrieb einen Artikel mit dem Titel A desto besser ist die C . Sein früher C ++ - Compiler konnte C-Code nahezu unverändert kompilieren und C ++ - Funktionen dort einsetzen, wo und wann es sinnvoll war - ohne die vorhandene C ++ - Arbeit zu beeinträchtigen. Es war eine brillante Strategie, um den frühen Erfolg von C ++ sicherzustellen.



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.



In meinem eigenen Namen kann ich sagen, dass ich seit dem Erscheinen der Option -betterCbegonnen habe, viele meiner alten, aber immer noch verwendeten Programme in D zu übersetzen - eine Funktion nach der anderen. Indem ich jeweils eine Funktion arbeite und nach jeder Änderung eine Reihe von Tests durchführe, lasse ich das Programm jederzeit laufen. Wenn etwas kaputt geht, muss ich nur eine Funktion testen, um die Ursache zu finden. Ich bin nicht sehr daran interessiert, meine C-Programme weiter zu unterstützen, und mit dem Aufkommen von Better C gibt es keinen Grund mehr dafür.




All Articles