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.
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.