Walter Bright es el "dictador benevolente de toda la vida" del lenguaje de programación D y fundador de Digital Mars . Tiene décadas de experiencia en el desarrollo de compiladores e intérpretes para varios lenguajes, incluido Zortech C ++, el primer compilador nativo de C ++. También es el creador de Empire , la principal inspiración de Sid Meier's Civilization.
El lenguaje D fue diseñado desde el principio para acceder fácil y directamente a C y, en menor medida, a C ++. Gracias a esto, innumerables bibliotecas C, la biblioteca C estándar y, por supuesto, las API del sistema, que generalmente se basan en la API C, están disponibles en él.
Pero C no se trata solo de bibliotecas. Muchos programas grandes e invaluables están escritos en C, como el sistema operativo Linux y la mayoría de los programas para él. Si bien los programas D pueden acceder a las bibliotecas C, no ocurre lo contrario. Los programas C no pueden acceder al código D. Es imposible (o al menos muy difícil) compilar varios archivos D y vincularlos a un programa C. El problema es que los archivos D compilados pueden acceder a algo que solo existe en el tiempo de ejecución D, y agregarlo al enlace no suele ser práctico (el tiempo de ejecución es bastante voluminoso).
Además, el código D no puede existir en un programa si D no controla la función main()
, porque así es como se inicia el tiempo de ejecución D. Por lo tanto, las bibliotecas D son inaccesibles para los programas C, y los programas quimera (una mezcla de C y D) se vuelven imprácticos. No puede simplemente "probar" D agregando módulos D a los módulos del programa C existentes.
Esto fue hasta que Better C.
Todo esto ya pasó, la idea no es nueva. Bjarne Stroustrup en 1988 escribió un artículo titulado Una Cuanto mejor sea el C . Su primer compilador de C ++ podía compilar código C casi sin cambios, y podía comenzar a usar las características de C ++ donde y cuando tuviera sentido, sin sacrificar el trabajo existente de C ++. Fue una estrategia brillante para asegurar el éxito inicial de 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
.
En mi propio nombre, puedo decir que desde que apareció la opción -betterC
, comencé a traducir muchos de mis programas antiguos, pero que todavía usaba, a D, una función a la vez. Al trabajar una función a la vez y ejecutar un conjunto de pruebas después de cada cambio, mantengo el programa ejecutándose en todo momento. Si algo se rompe, solo necesito probar una función para encontrar la causa. No estoy muy interesado en seguir manteniendo mis programas C, y con la llegada de Better C, ya no hay ninguna razón para eso.