D (lenguaje de programación)

D
Desarrollador(es)
Digital Mars, Andrei Alexandrescu (desde 2006)
Información general
Extensiones comunes .d
Paradigma multiparadigma: orientado a objetos, imperativo, funcional, meta
Apareció en 2001[1]
Diseñado por Walter Bright, Andrei Alexandrescu (desde 2006)
Última versión estable 2.064 / 1.075[4] )
Tipo de dato Fuerte, Estático
Implementaciones DMD, GDC, LDC
Influido por C++, C, C#, Java, Eiffel, Python, Ruby
Ha influido a MiniD, DScript, Vala, Qore, Swift[5]
Sistema operativo DMD: Unix-like ( FreeBSD, Linux etc) , Windows, OS X
Licencia GPL/ Artistic (DMD frontend),
Boost (librerías estándar y de tiempo de ejecución),
código disponible (DMD backend),[6]
Completamente open-source (LDC u GDC)[7]
[ editar datos en Wikidata]

D es un lenguaje de programación de uso general desarrollado por Walter Bright cuya primera versión apareció en 1999. Se origina como un rediseño de C++, con un enfoque más pragmático, pero no es un lenguaje puramente derivado del anterior. D ha mantenido algunas características de C++ y también está influido por otros conceptos de otros lenguajes como Java, C# y Eiffel. Una versión estable fue lanzada el 2 de enero de 2007.

Características

D está siendo diseñado con lecciones aprendidas del uso de C++ en vez de ser diseñado desde una perspectiva teórica. Aunque usa muchos de los conceptos de C/C++ también descarta algunos, y por lo tanto no es compatible con código escrito en C o C++. D retiene la habilidad de C++ de hacer código de bajo nivel, permitiendo incluir código en ensamblador. La herencia múltiple de C++ es reemplazada por herencia simple e interfaces y 'mixins'. La sintaxis de declaración y la sintaxis para las expresiones se parecen a las de C++.

El soporte del lenguaje ensamblador demuestra una de las diferencias entre D con respecto a otros lenguajes como Java y C#. Esto permite incluir código específico de la máquina con código D, una técnica comúnmente usada por programadores de software de sistema para acceder a características de bajo nivel necesarias para interactuar directamente con el hardware, permitiendo escribir software como sistemas operativos y drivers.

D incluye soporte para comentarios de documentación, pero hasta ahora sólo el compilador entregado por Digital Mars implementa un generador de documentación.

Orientada a objetos

La programación orientada a objetos está basada en herencia simple, con todas las clases derivadas de la clase Object. D no soporta herencia múltiple; en vez de eso, usa interfaces parecidas a las de Java, que son comparables a las clases abstractas de C++.

Metaprogramación

La Metaprogramación está soportada por una combinación de plantillas, la ejecución de funciones en tiempo de compilación, tuplas y 'mixins' de cadenas. Soporta CTFE (evaluación de funciones en tiempo de compilación). Los siguientes ejemplos demuestran algunas de las características en tiempo de ejecución del lenguaje D.

Las plantillas en D se pueden escribir en más de un estilo imperativo comparado con el estilo funcional de las plantillas de C++. El siguiente ejemplo es una función regular que calcula el producto factorial de un número:

ulong factorial(ulong n)
{
    ulong Producto = 1;
    for(ulong i = 2; i <= n; i++){
        Producto *= i;
    }
    return Producto;
}

Aquí, se muestra el uso de la palabra reservada static if (la construcción condicional en tiempo de ejecución en D), para construir una plantilla que es capaz de realizar el mismo cálculo:

template Factorial(ulong n)
{
    ulong Producto = 1;
    static for(i = 2; i <= n; i++){
        Product *= i;
    }
    return Producto;
}

En los siguientes dos ejemplos, la plantilla y la función definidas arriba se utilizan para calcular factoriales. No es necesario especificar explícitamente los tipos de las constantes cuando el compilador infiere sus tipos desde el lado derecho de las asignaciónes:

enum fact_7 = Factorial!(7);

Este es un ejemplo de una función en tiempo de ejecución. Las funciones ordinarias pueden usar constantes, aunque expresiones en tiempo de ejecución deben reunir ciertos criterios:

enum fact_9 = factorial(9);

La función std.string.format, del estilo printf, sirve para dar formato a los datos (también en tiempo de ejecución, a través de CTFE (ejecución de función en tiempo de ejecución), y el pragma "msg" (directiva) que muestra el resultado en tiempo de ejecución:

import std.string : format;
pragma(msg, format("7! = %s", fact_7));
pragma(msg, format("9! = %s", fact_9));

Los "mixins" de cadenas, combinadas con las CTFE, permiten generar código D usando operaciones expresadas en cadenas de caracteres, en tiempo de ejecución. Puede ser utilizado para análisis sintáctico de un lenguaje específico del dominio hacia código D, el cual se compila como parte del programa:

import FooToD; // Modulo hipotetico que contiene una funcion que analiza el codigo fuente Foo
               // y devuelve el codigo D equivalente
void main()
{
    mixin(fooToD(import("example.foo")));
}

Funciones

D soporta características de programación funcional tal como funciones anónimas, clausuras, objetos recursivamente immutables y el uso de funciones de orden superior. Hay dos sintaxis para funciones anónimas, incluyendo una forma de declaración múltiple y una notación abreviada de expresiones simples:[8]

int function(int) g;
g = (x) { return x * x; }; // forma larga
g = (x) => x * x; // forma abreviada

Manejo de memoria

La memoria es usualmente manejada por un recolector de basura, pero objetos específicos pueden ser finalizados inmediatamente cuando salen del ámbito. Es posible el manejo de memoria explícito usando los operadores sobrecargados new y delete, y simplemente llamando las funciones malloc y free de C directamente. La recolección de basura puede ser controlada: los programadores pueden agregar y excluir rangos de memoria de ser observados por el recolector, pueden pausar y reanudar el recolector y forzar un ciclo generacional o de recolección completa.[9] El manual da muchos ejemplos de cómo implementar diferentes esquemas de manejo de memoria altamente optimizados para cuando la recolección de basura es inadecuada para el programa.

Interacción con otros sistemas

La API de C es admitida, al igual que todos los tipos fundamentales y derivados de C, permitiendo acceso directo al código existente escrito en C y bibliotecas. La biblioteca estándar de C es parte del D estándar. A menos que se usen namespaces muy explícitos puede ser de alguna forma difícil de acceder, como se puede observar en módulos escritos en D que hagan uso de dicha característica. Pero la biblioteca estándar de D es usualmente suficiente.

Other Languages