D como C melhorado

Walter Bright é o "ditador benevolente ao longo da vida" da linguagem de programação D e fundador da Digital Mars . Ele tem décadas de experiência no desenvolvimento de compiladores e interpretadores para várias linguagens, incluindo Zortech C ++, o primeiro compilador C ++ nativo. Ele também é o criador do Império , a principal inspiração para a Civilização de Sid Meier.



Better C Series


A linguagem D foi projetada desde o início para acessar fácil e diretamente C e, em menor medida, C ++. Graças a isso, inúmeras bibliotecas C, a biblioteca C padrão e, claro, as APIs do sistema, que geralmente são construídas nas APIs C, estão disponíveis nela.



Mas C não se trata apenas de bibliotecas. Muitos programas grandes e valiosos são escritos em C, como o sistema operacional Linux e a maioria dos programas para ele. Embora os programas em D possam acessar bibliotecas C, o oposto não é verdadeiro. Os programas C não podem acessar o código D. É impossível (ou pelo menos muito difícil) compilar vários arquivos D e vinculá-los a um programa C. O problema é que os arquivos D compilados podem acessar algo que existe apenas no runtime D e adicioná-lo ao link geralmente é impraticável (o runtime é bastante volumoso).



Além disso, o código D não pode existir em um programa se D não controlar a função main(), porque é assim que o tempo de execução D. Portanto, as bibliotecas D são inacessíveis aos programas C e os programas quimera (uma mistura de C e D) tornam-se impraticáveis. Você não pode simplesmente “experimentar” D adicionando módulos D aos módulos de programa C existentes.



Isso foi até Better C.



Isso já aconteceu, a ideia não é nova. Bjarne Stroustrup em 1988 escreveu um artigo chamado A melhor a C . Seu compilador C ++ inicial podia compilar código C quase inalterado e ele poderia começar a usar os recursos C ++ onde e quando fizessem sentido - sem sacrificar o trabalho C ++ existente. Foi uma estratégia brilhante para garantir o sucesso inicial do 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.



Em meu próprio nome, posso dizer que, desde que a opção apareceu -betterC, comecei a traduzir muitos dos meus programas antigos, mas ainda usados, em D - uma função por vez. Trabalhando uma função por vez e executando um conjunto de testes após cada alteração, mantenho o programa em execução o tempo todo. Se algo quebrar, eu só preciso testar uma função para encontrar a causa. Não estou muito interessado em continuar apoiando meus programas em C e, com o advento do Better C, não há mais razão para isso.




All Articles