Die Version DMD 2.112, ein Referenzcompiler für die Programmiersprache D, wurde veröffentlicht. Der Compiler-Code wird unter der freien BSL (Boost Software License) lizenziert. Unterstützt werden die Betriebssysteme Linux, Windows, macOS und FreeBSD.
Die Sprache D verwendet statische Typisierung, hat eine Syntax, die C/C++ ähnlich ist, und bietet die Leistung von kompilierenden Sprachen. Die Sprache D übernimmt auch einige Funktionen dynamischer Sprachen, die sich positiv auf die Effizienz der Entwicklung und die Sicherheit auswirken. Beispielsweise wird die Unterstützung folgender Elemente geboten: assoziative Arrays, indirekte Typdefinition, automatisches Speichermanagement, Werkzeuge für paralleles Programmieren, Templates sowie Komponenten für Metaprogrammierung. Ein Garbage Collector ist optional verfügbar. In D-Programmen können Bibliotheken in C sowie einige Bibliotheken in C++ und Objective-C verwendet werden.
Unter den Änderungen in der Version 2.112:
- Operationen auf assoziativen Arrays (Hashmaps) werden jetzt über Templates realisiert.
- Bitfelder wurden in die Sprache integriert, sodass die separate Verwendung von „-preview=bitfields“ nicht mehr erforderlich ist.
- Hängende »else«-Operatoren, die ohne geschweifte Klammern definiert sind, erzeugen jetzt einen Fehler anstelle einer Warnung: int i, j; if (i) if (j) return 1; else // Fehler: else ist hängend, fügen Sie { } nach der Bedingung `if (i)` hinzu return 2;
- Ein neuer Schlüssel »-extI« wurde hinzugefügt, um externe Importpfade anzugeben. Dieser ist vergleichbar mit dem Importpfad-Parameter (-I), allerdings weist er darauf hin, dass das mit ihm gefundene Modul außerhalb der aktuell zu kompilierenden ausführbaren Datei liegt. Unter Windows wird er verwendet, wenn der dllimport-Überschreibungsparameter auf einen Wert ungleich »none« gesetzt ist, um die Symbole des externen Moduls mithilfe von DllImport zwangsweise zu importieren.
- Module für C-Dateien hinzugefügt. Ähnlich wie die Erweiterung „__import“ verschiebt das Schlüsselwort „__module“ die Moduldarstellung von D zu C. Dies ist besonders nützlich, wenn mehrere C-Dateien mit demselben Namen (z. B. hello/utils.c und world/utils.c) importiert werden müssen, da beide Dateien mit import utils importiert werden, wenn sie in der Befehlszeile angegeben sind, was zu Konflikten führt. —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);
- Die implizierte Umwandlung von Ganzzahlen bei der Zuweisung von Werten des Typs „int op= float“ wurde als veraltet erklärt. Dies wurde durchgeführt, um potenzielle Fehler zu vermeiden, wenn die Zuweisung „op=“ die rechte Seite des Ausdrucks von einem Nichtnullwert auf null schneidet. uint a; float b = 0.1; a += b; // Veraltung: `uint += float` führt zu einer truncierenden Umwandlung.
- Mehrere neue Template-Implementierungen wurden zur Runtime hinzugefügt.
- Fehler im Zusammenhang mit der undokumentierten Änderung in der ABI von macOS 15.4 wurden behoben.
- S-Makros werden jetzt in Vorlagen umgewandelt, wenn Sie "ImportC" verwenden: 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; }
- In der Standardbibliothek wurde die Funktion „lazyCache“ implementiert, die einen Mechanismus zur Berechnung von Bereichen mit verzögerter Auswertung bereitstellt. Im Gegensatz zu cache, das Elemente des Bereichs sofort während seiner Erstellung bewertet, wird lazyCache die Bewertung hinauszögern, bis die Elemente explizit angefordert werden. auto result = iota(-4, 5).map!(a => tuple(a, expensiveComputation(a)))().lazyCache(); // Zu diesem Zeitpunkt wurden keine Berechnungen durchgeführt auto firstElement = result.front; // Das erste Element wird jetzt bewertet.
- Die Abwärtskompatibilität von „getrandom()“ wurde in älteren Versionen von Linux und anderen Systemen verbessert.
- „std.uni“ wurde auf die Unterstützung von Unicode 17 aktualisiert.
- In „std.uuid“ wurde die Unterstützung für uuid v7 hinzugefügt.
- Eine neue API für „std.conv“, die drei Funktionen „writeText“, „writeWText“ und „writeDText“ enthält.
- Im Paketmanager dub wurde die Option „-dest“ und der Schlüssel frameworks hinzugefügt. —Früher: lflags „-framework“ „Cocoa“ —Jetzt können Sie: frameworks „Cocoa“ „OpenGL“
Zusätzlich kann die Entwicklung einiger interessanter Projekte in der Programmiersprache D hervorgehoben werden:
- Im Bereich der Spieleentwicklung (GameDev) gab es die folgenden Updates: In dvn, einer Engine zur Erstellung visueller Romane, wurden Beispieldateien hinzugefügt. Der Godot-Engine wurde experimentelle Unterstützung für den Export ins Web hinzugefügt. Das Spiel The Art of Reflection wurde auf Steam veröffentlicht, realisiert mit Technologien von D und DirectX auf einer hauseigenen Engine.
- Im Bereich der Webentwicklung entwickelt sich der leichte Fiberscheduler photon, der in den TechEmpower-Leistungstests hervorragende Ergebnisse erzielt hat und unter den Top 10 in mehreren Tests (Plaintest, JSON) rangiert. Diese Engine wurde in das beliebte Web-Framework Vibe.D integriert, was zu einer Leistungssteigerung ohne Änderungen am Code der Webanwendungen führte.
- Nach der Ankündigung der Entwicklung eines neuen Garbage Collectors auf der Dconf-Konferenz (Video 1, Video 2) wurde dieses Update in die neue Version aufgenommen. Der neue GC kann auch als separates Paket installiert werden. Derzeit wird die Architektur x86_64 für Linux- und Windows-Betriebssysteme unterstützt. Es wird weiterhin an der Unterstützung von macOS und anderen Architekturen gearbeitet.
Quelle: opennet.ru
