Se ha publicado DMD 2.112, el compilador de referencia para el lenguaje D. El código del compilador se distribuye bajo la licencia gratuita BSL (Boost Software License). Los sistemas compatibles son: Linux, Windows, macOS y FreeBSD.
El lenguaje D está tipado estáticamente, tiene una sintaxis similar a C/C++ y proporciona el rendimiento de los lenguajes compilados. El lenguaje D también toma prestadas algunas características de los lenguajes dinámicos que son útiles para mejorar la eficiencia del desarrollo y garantizar la seguridad. Por ejemplo, hay soporte para: matrices asociativas, definición de tipos indirectos, gestión automática de memoria, herramientas de programación paralela, plantillas, componentes para metaprogramación. El recolector de basura está disponible opcionalmente. Los programas D pueden utilizar bibliotecas C, así como algunas bibliotecas C++ y Objective-C.
Los cambios en la versión 2.112 incluyen:
- Las operaciones en la matriz asociativa (hashmap) se implementan a través de plantillas.
- Los campos de bits están incluidos en el lenguaje y ya no es necesario utilizar una opción separada "-preview=bitfields".
- Las declaraciones "else" colgantes especificadas sin encerrar el bloque entre llaves ahora producirán un error en lugar de una advertencia: int i, j; if (i) if (j) return 1; else // Error: else está colgante, agregue { } después de la condición `if (i)` return 2;
- Se ha añadido un nuevo parámetro "-extI" para especificar rutas de importación externas, similar a la opción de ruta de importación (-I), con la diferencia de que especifica que el módulo encontrado con él se encuentra fuera del archivo ejecutable que se está compilando actualmente. Windows Se utiliza cuando la opción de anulación de dllimport está configurada con cualquier valor distinto de "ninguno" para forzar la importación de símbolos de módulos externos mediante DllImport.
- Se agregaron módulos para archivos C. Al igual que la extensión __import, la palabra clave __module mueve las declaraciones de módulos de D a C. Esto es especialmente útil cuando se deben importar varios archivos C con el mismo nombre (por ejemplo, hello/utils.c y world/utils.c), ya que ambos archivos se deben importar con import utils cuando se especifica en la línea de comandos, lo que genera conflictos. --hello/utils.c: #if __IMPORTC__ __module hello.utils; #endif int sqr(int x) { return x * x; } --world/utils.c: #if __IMPORTC__ __module world.utils; #endif int max(int a, int b) { return a > b ? a : b; } --app.d: import hello.utils; import world.utils; static assert(sqr(3) == 9); static assert(max(3, 5) == 5);
- La conversión implícita de enteros en la asignación "int op= float" ha quedado obsoleta. Esto se hace para evitar posibles errores donde la asignación "op=" trunca implícitamente el lado derecho de la expresión de un valor distinto de cero a cero. uint a; float b = 0.1; a += b; // Obsoleto: `uint += float` está realizando la conversión de truncamiento.
- Se han agregado varias nuevas implementaciones de plantillas al tiempo de ejecución.
- Se corrigieron errores relacionados con un cambio no documentado en la ABI. macOS 15.4.
- Las macros de C ahora se convierten en plantillas al ejecutar "ImportC": import core.sys.posix.stdlib; import core.sys.posix.unistd; extern(C) int main() { int status, pid = vfork(); if (pid == 0) { // … return 0; } waitpid(pid, &status, 0); if (WIFEXITED(status)) { // … } return 0; }
- La biblioteca estándar implementa la función "lazyCache", que proporciona un mecanismo para almacenar en caché rangos con evaluación diferida. A diferencia de la caché, que evalúa inmediatamente los elementos del rango durante su construcción, lazyCache pospone la evaluación hasta que los elementos se solicitan explícitamente. auto result = iota(-4, 5).map!(a => tuple(a, expensiveComputation(a)))().lazyCache(); // No se realizan cálculos en este momento. auto firstElement = result.front; // Se evalúa el primer elemento.
- Compatibilidad mejorada con versiones anteriores de getrandom() Linux y otros sistemas.
- "std.uni" se ha actualizado para admitir Unicode 17.
- Se agregó soporte para uuid v7 a std.uuid .
- Nueva API para "std.conv", donde aparecieron tres funciones "writeText", "writeWText" y "writeDText".
- El gestor de paquetes dub ahora incluye la opción "-dest" y la clave "frameworks". —Anteriormente: lflags "-framework" "Cocoa" —Ahora: frameworks "Cocoa" "OpenGL"
Además, cabe destacar el desarrollo de una serie de proyectos interesantes en el lenguaje D:
- El desarrollo de juegos (GameDev) ha recibido las siguientes actualizaciones: dvn, un motor de novelas visuales, ha añadido ejemplos de uso. Se ha añadido compatibilidad experimental con la exportación web a la versión del motor Godot. The Art of Reflection, desarrollado con tecnologías D y DirectX en un motor personalizado, se ha publicado en Steam.
- En el ámbito del desarrollo web, se está desarrollando el programador ligero Photon Fiber. Obtuvo excelentes resultados en la prueba de rendimiento de TechEmpower y se situó entre los 10 primeros en varias pruebas de rendimiento (Plaintest, JSON). Este motor se ha integrado en el popular framework web Vibe.D, lo que ha mejorado el rendimiento sin modificar el código de la aplicación web.
- Tras el anuncio del desarrollo del nuevo recolector de basura en la conferencia Dconf (vídeo 1, vídeo 2), esta actualización se ha incluido en la nueva versión. El nuevo recolector de basura también se puede instalar como un paquete independiente. Actualmente, se admite la arquitectura x86_64 para el sistema operativo. Linux и WindowsContinúan los trabajos de soporte. macOS y otras arquitecturas.
Fuente: opennet.ru
