È stato rilasciato DMD 2.112, il compilatore di riferimento per il linguaggio D. Il codice del compilatore è distribuito sotto la licenza libera BSL (Boost Software License). Sono supportati i sistemi Linux, Windows, macOS e FreeBSD.
Il linguaggio D utilizza il typing statico, ha una sintassi simile a C/C++ e offre le prestazioni dei linguaggi compilati. Il linguaggio D eredita anche alcune funzionalità dei linguaggi dinamici, utili per migliorare l'efficienza dello sviluppo e garantire la sicurezza. Ad esempio, supporta: array associativi, definizioni di tipo indiretto, gestione automatica della memoria, strumenti per la programmazione concorrente, template e componenti per la metaprogrammazione. Un garbage collector è disponibile facoltativamente. Nei programmi scritti in linguaggio D è possibile utilizzare librerie scritte in C, così come alcune librerie in C++ e Objective-C.
Tra le modifiche nella versione 2.112:
- Le operazioni sugli array associativi (hashmap) sono state implementate tramite template.
- I bit field sono stati inclusi nel linguaggio e ora non è più necessario utilizzare il «-preview=bitfields» separato.
- Gli operatori "else" pendenti, specificati senza racchiudere il blocco tra parentesi graffe, ora genereranno un errore invece di un avviso: int i, j; if (i) if (j) return 1; else // Errore: else è pendente, aggiungere { } dopo la condizione `if (i)` return 2;
- È stata aggiunta una nuova chiave «-extI» per specificare i percorsi di importazione esterni, che è simile al parametro del percorso di importazione (-I), a eccezione del fatto che indica che il modulo trovato tramite di esso si trova al di fuori dell'eseguibile che si sta attualmente compilando. In Windows, viene utilizzato quando il parametro di override dllimport è impostato su qualsiasi valore diverso da "none", per forzare l'importazione dei simboli del modulo esterno tramite DllImport.
- Sono stati aggiunti moduli per file C. Analogamente all'estensione «__import», la parola chiave «__module» trasferisce le dichiarazioni dei moduli dal linguaggio D al linguaggio C. Questo è particolarmente utile quando è necessario importare più file C con lo stesso nome (ad esempio, hello/utils.c e world/utils.c), poiché entrambi i file devono essere importati con import utils quando specificati nella riga di comando, il che porta a conflitti. —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);
- È stato dichiarato obsoleto il casting implicito di interi nell'assegnazione di valori del tipo «int op= float». Questo è stato fatto per prevenire errori potenziali quando l'assegnazione «op=» tronca implicitamente la parte destra dell'espressione da un valore non nullo a zero. uint a; float b = 0.1; a += b; // Obsolescenza: `uint += float` sta eseguendo una conversione troncante
- Sono state aggiunte diverse nuove implementazioni generiche a runtime.
- Sono stati corretti i bug relativi a una modifica non documentata nell'ABI macOS 15.4.
- I macro ora si trasformano in modelli durante l'uso di «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; }
- Nella libreria standard è implementata la funzione «lazyCache» che fornisce un meccanismo di caching per intervalli con valutazione ritardata. A differenza di cache, che valuta immediatamente gli elementi dell'intervallo al momento della sua creazione, lazyCache ritarda la valutazione finché gli elementi non vengono esplicitamente richiesti. auto result = iota(-4, 5).map!(a => tuple(a, expensiveComputation(a)))().lazyCache(); // Nessun calcolo eseguito a questo punto auto firstElement = result.front; // Il primo elemento è ora valutato
- Migliorata la retrocompatibilità di «getrandom()» su versioni più vecchie di Linux e su altri sistemi.
- «std.uni» è stato aggiornato per supportare Unicode 17.
- A «std.uuid» è stata aggiunta la supporto per uuid v7.
- Nuovo API per «std.conv», dove sono state aggiunte tre funzioni «writeText», «writeWText» e «writeDText».
- Agestore dei pacchetti dub è stata aggiunta l'opzione «-dest e la chiave frameworks. —Era: lflags «-framework» «Cocoa» —Ora è possibile: frameworks «Cocoa» «OpenGL»
In aggiunta, si può notare lo sviluppo di una serie di progetti interessanti nel linguaggio D:
- Nel campo dello sviluppo di giochi (GameDev) ci sono stati i seguenti aggiornamenti: in dvn, il motore per la creazione di visual novel, sono stati aggiunti esempi di utilizzo. Supporto sperimentale per l'esportazione su Web è stato aggiunto al porting del motore Godot. Su Steam è stata rilasciata la game The Art of Reflection, realizzata utilizzando le tecnologie D e DirectX su un motore proprietario.
- Nel campo dello sviluppo web, è in fase di sviluppo un pianificatore leggero di fiber, photon, che ha mostrato risultati eccellenti nel test di performance TechEmpower, rientrando nella top 10 dei risultati in diversi test (Plaintest, JSON). Questo motore è stato integrato nel popolare framework web Vibe.D, il che ha permesso di ottenere un aumento delle performance senza modificare il codice delle applicazioni web.
- Dopo l'annuncio dell'inizio dello sviluppo di un nuovo garbage collector alla conferenza Dconf (video1, video2), questo aggiornamento è stato incluso nel nuovo rilascio. È inoltre possibile provare a installare il nuovo GC come pacchetto separato. Attualmente è supportata l'architettura x86_64 per il sistema operativo Linux e Windows. Si sta lavorando per il supporto di macOS e altre architetture.
Fonte: opennet.ru
