<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=D_%28Programmiersprache%29</id>
	<title>D (Programmiersprache) - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki-de.moshellshocker.dns64.de/index.php?action=history&amp;feed=atom&amp;title=D_%28Programmiersprache%29"/>
	<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=D_(Programmiersprache)&amp;action=history"/>
	<updated>2026-05-30T06:35:30Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Wikipedia (Deutsch) – Lokale Kopie</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://wiki-de.moshellshocker.dns64.de/index.php?title=D_(Programmiersprache)&amp;diff=200578&amp;oldid=prev</id>
		<title>imported&gt;Invisigoth67: form</title>
		<link rel="alternate" type="text/html" href="https://wiki-de.moshellshocker.dns64.de/index.php?title=D_(Programmiersprache)&amp;diff=200578&amp;oldid=prev"/>
		<updated>2025-11-21T14:08:33Z</updated>

		<summary type="html">&lt;p&gt;form&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&lt;br /&gt;
{{Infobox Programmiersprache&lt;br /&gt;
| Name                         = D&lt;br /&gt;
| Logo                         = [[Datei:D Programming Language logo.svg|120px]]&lt;br /&gt;
| Beschreibung                 = &lt;br /&gt;
| Paradigma                    = [[Imperative Programmierung|imperativ]], [[Objektorientierte Programmierung|objektorientiert]], [[Funktionale Programmierung|funktional]], [[Parallele Programmierung|parallel]], [[Generische Programmierung|generisch]], [[Modulare Programmierung|modular]]&lt;br /&gt;
| Erscheinungsjahr             = 2007&lt;br /&gt;
| Designer                     = &lt;br /&gt;
| Entwickler                   = Walter Bright,&amp;lt;br /&amp;gt;Andrei Alexandrescu (ab D 2.0)&lt;br /&gt;
| AktuelleVersion              = &lt;br /&gt;
| AktuelleVersionFreigabeDatum = &lt;br /&gt;
| AktuelleVorabVersion         = &lt;br /&gt;
| AktuelleVorabVersionFreigabeDatum = &lt;br /&gt;
| Typisierung                  = [[Starke Typisierung|Stark]], [[Statische Typisierung|statisch]]&lt;br /&gt;
| Implementierung              = [https://dlang.org/download.html DMD], [https://gdcproject.org/ GDC], [https://github.com/ldc-developers/ldc/releases LDC]&lt;br /&gt;
| Dialekte                     = &lt;br /&gt;
| Standardisierungen           = &lt;br /&gt;
| Beeinflusst_von              = [[C (Programmiersprache)|C]], [[C++]], [[Eiffel (Programmiersprache)|Eiffel]], [[Java (Programmiersprache)|Java]], [[Python (Programmiersprache)|Python]], [[Ruby (Programmiersprache)|Ruby]]&amp;lt;ref&amp;gt;[https://www.digitalmars.com/d/1.0/ D Programming Language 1.0, Intro.] Digital Mars&amp;lt;/ref&amp;gt;&lt;br /&gt;
| Beeinflusste                 = DScript, Genie, MiniD, Qore, [[Swift (Programmiersprache)|Swift]], [[Vala (Programmiersprache)|Vala]]&lt;br /&gt;
| Betriebssystem               = Plattformunabhängig&lt;br /&gt;
| Lizenz                       = [https://www.boost.org/users/license.html Boost Software License]&amp;lt;ref name=&amp;quot;bsl&amp;quot;&amp;gt;[https://dlang.org/faq.html#q5 FAQ – Is D open source?]&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bsl2&amp;quot;&amp;gt;[https://github.com/dlang/dmd/blob/master/LICENSE.txt Lizenz im Compiler-Quellcode]&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bsl3&amp;quot;&amp;gt;[https://github.com/dlang/druntime/blob/master/LICENSE.txt Lizenz der Laufzeitbibliothek]&amp;lt;/ref&amp;gt;&amp;lt;ref name=&amp;quot;bsl4&amp;quot;&amp;gt;[https://github.com/dlang/phobos/blob/master/LICENSE_1_0.txt Lizenz der Standardbibliothek]&amp;lt;/ref&amp;gt;&lt;br /&gt;
| Website                      = [https://dlang.org/ dlang.org]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; ist eine seit 1999 von Walter Bright entwickelte [[Programmiersprache]] mit [[Objektorientierte Programmierung|objektorientierten]], [[Imperative Programmierung|imperativen]] sowie [[Deklarative Programmierung|deklarativen]] Sprachelementen. D wurde am 3.&amp;amp;nbsp;Januar 2007 in der stabilen Version 1.0 veröffentlicht.&amp;lt;ref&amp;gt;Heise Online: &amp;#039;&amp;#039;[https://www.heise.de/newsticker/meldung/Eleganter-programmieren-D-ist-da-130475.html Eleganter programmieren: D ist da]&amp;#039;&amp;#039;, 3. Januar 2007&amp;amp;nbsp;– 14:52&amp;lt;/ref&amp;gt; Sie lehnt sich äußerlich stark an [[C++]] an, jedoch ohne vollständige sprachliche [[Kompatibilität (Technik)|Kompatibilität]] dazu.&lt;br /&gt;
&lt;br /&gt;
Vom 17.&amp;amp;nbsp;Juni 2007 bis Ende 2010 wurde die Version&amp;amp;nbsp;2 von D entwickelt, die neue Funktionalität wie [[Closure (Funktion)|Closures]] und dem Begriff [[Referentielle Transparenz|referentiell transparenter]] [[Funktion (Programmierung)|Funktionen]] sowie das funktionale Paradigma ergänzt, aber nicht kompatibel zum Vorgänger ist. Mit der Freigabe der neuen Version wurde auch das Buch &amp;#039;&amp;#039;The D Programming Language&amp;#039;&amp;#039; von [[Andrei Alexandrescu]] veröffentlicht, der entscheidend beim Design der Sprache mitwirkte.&lt;br /&gt;
&lt;br /&gt;
== Sprachmittel ==&lt;br /&gt;
D übernimmt die meisten Sprachmittel der Sprache [[C (Programmiersprache)|C]], verzichtet im Gegensatz zu C++ aber auf die Kompatibilität dazu. Dadurch soll die Übernahme von Entwurfsnachteilen vermieden werden. Durch [[Binärschnittstelle|ABI]]-Kompatibilität sind aber trotzdem alle in C geschriebenen Programme und Bibliotheken nutzbar. Die Anbindung von C++-Code unterliegt dagegen Einschränkungen.&amp;lt;ref&amp;gt;[https://dlang.org/spec/cpp_interface.html Interfacing to C++]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
D ist eine objektorientierte, imperative Programmiersprache, die ab D 2.0 auch Möglichkeiten der [[Funktionale Programmierung|funktionalen Programmierung]] innerhalb einer imperativen Programmiersprache bietet, und verfügt über [[Template (C++)|Klassenvorlagen]] und [[Überladen|überladbare]] Operatoren. D bietet [[Design by contract]] und [[Modul (Software)|Module]]. [[Garbage Collection|Automatische Speicherbereinigung]] ist im Gegensatz zu z. B. C/C++ fester, wenn auch prinzipiell optionaler Bestandteil der Sprache, wobei geplant ist, die Laufzeitumgebung selbst insoweit von dieser zu entkoppeln, dass ein Arbeiten mit D auch in Situationen möglich ist, wo der Einsatz eines Garbage Collectors unmöglich oder unerwünscht ist.&amp;lt;ref&amp;gt;[https://dlang.org/spec/garbage.html &amp;#039;&amp;#039;Garbage Collection&amp;#039;&amp;#039;.] dlang.org, abgerufen am 21. September 2019.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;Michael Parker: [https://dlang.org/blog/2017/03/20/dont-fear-the-reaper/ &amp;#039;&amp;#039;Don’t Fear the Reaper&amp;#039;&amp;#039;] The D Blog, 20. März 2017, abgerufen am 21. September 2019.&amp;lt;/ref&amp;gt; Automatische [[Referenzzählung]] wird hingegen nicht unterstützt.&amp;lt;ref&amp;gt;[https://wiki.dlang.org/Memory_Management &amp;#039;&amp;#039;Memory Management&amp;#039;&amp;#039;.] im D Wiki, abgerufen am 21. September 2019.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Programme können in D ohne [[Zeiger (Informatik)|Zeiger]] geschrieben werden. So bestehen [[Feld (Datentyp)|Felder]] transparent sowohl aus dem Ort ihrer Daten als auch aus ihrer Länge, wodurch [[Zeiger (Informatik)|Zeigerarithmetik]] überflüssig ist und die Zulässigkeit von Feldzugriffen zur Laufzeit überprüft werden kann. Im Gegensatz zu [[Java (Programmiersprache)|Java]] ist es aber dennoch möglich, Zeiger bei Bedarf nahezu wie in C zu benutzen und so maschinennah zu programmieren.&lt;br /&gt;
&lt;br /&gt;
=== Konstante und schreibgeschützte Werte ===&lt;br /&gt;
&lt;br /&gt;
In D werden schreibgeschützte Werte mit &amp;lt;code&amp;gt;const&amp;lt;/code&amp;gt;-Datentypen ausgezeichnet. Schreibgeschützt heißt, dass &amp;#039;&amp;#039;über diese Variable&amp;#039;&amp;#039; der Wert nicht verändert werden kann. Das bedeutet jedoch nicht, dass es keine andere Variable gibt, über die eine Änderung stattfinden kann. Dem gegenüber stehen (wirklich) konstante Werte, die mit &amp;lt;code&amp;gt;immutable&amp;lt;/code&amp;gt;-Datentypen ausgezeichnet werden. Ist ein Wert &amp;lt;code&amp;gt;immutable&amp;lt;/code&amp;gt;, gibt es &amp;#039;&amp;#039;überhaupt keine&amp;#039;&amp;#039; schreibbare Variable auf den Wert.&lt;br /&gt;
&lt;br /&gt;
=== Funktionsattribute ===&lt;br /&gt;
&lt;br /&gt;
In D werden Funktionen mit Funktionsattributen versehen, um anzuzeigen, dass die entsprechende Funktion gewisse Garantien macht (oder auch nicht).&lt;br /&gt;
Folgende Attribute stellen Garantien dar:&lt;br /&gt;
* &amp;lt;code&amp;gt;pure&amp;lt;/code&amp;gt; zeigt an, dass die Funktion referentiell transparent ist.&lt;br /&gt;
* &amp;lt;code&amp;gt;nothrow&amp;lt;/code&amp;gt; zeigt an, dass die Funktion keine &amp;lt;code&amp;gt;Exception&amp;lt;/code&amp;gt; wirft (möglicherweise aber einen &amp;lt;code&amp;gt;Error&amp;lt;/code&amp;gt;).&lt;br /&gt;
* &amp;lt;code&amp;gt;@nogc&amp;lt;/code&amp;gt; zeigt an, dass die Funktion keinen Speicher von der automatischen Speicherverwaltung anfordert und daher keine automatische Speicherbereinigung (Garbage Collection) auslösen kann.&lt;br /&gt;
* &amp;lt;code&amp;gt;@safe&amp;lt;/code&amp;gt; zeigt an, dass die Funktion keine [[Schutzverletzung|Speicherzugriffsverletzung]] auslösen kann, die zu [[Undefiniertes Verhalten|undefiniertem Verhalten]] führt.&amp;lt;ref&amp;gt;&lt;br /&gt;
{{Internetquelle&lt;br /&gt;
 |titel=Function Safety&lt;br /&gt;
 |sprache=en&lt;br /&gt;
 |url=https://dlang.org/spec/function.html#function-safety&lt;br /&gt;
 |abruf=2021-01-03&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;@live&amp;lt;/code&amp;gt; zeigt an, dass die Funktion das Ownership-Borrowing-Modell für die Speicherverwaltung verwendet.&amp;lt;ref&amp;gt;&lt;br /&gt;
{{Internetquelle&lt;br /&gt;
 |titel=Live Functions&lt;br /&gt;
 |sprache=en&lt;br /&gt;
 |url=https://dlang.org/spec/ob.html&lt;br /&gt;
 |abruf=2021-01-03&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zu &amp;lt;code&amp;gt;@safe&amp;lt;/code&amp;gt; gehören die Attribute &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt; und &amp;lt;code&amp;gt;@trusted&amp;lt;/code&amp;gt;.&lt;br /&gt;
Unter anderem unterliegen mit &amp;lt;code&amp;gt;@safe&amp;lt;/code&amp;gt; gekennzeichnete Funktionen der Beschränkung, nur andere solche Funktionen aufrufen zu dürfen, sowie solche mit &amp;lt;code&amp;gt;@trusted&amp;lt;/code&amp;gt;.&lt;br /&gt;
Mit &amp;lt;code&amp;gt;@trusted&amp;lt;/code&amp;gt; oder &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt; gekennzeichnete Funktionen dürfen jedoch beliebige Anweisungen ausführen.&lt;br /&gt;
Nicht explizit gekennzeichnete Funktionen sind implizit &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Normalerweise arbeitet ein Großteil des Programms innerhalb der Grenzen von &amp;lt;code&amp;gt;@safe&amp;lt;/code&amp;gt;. Da sich D als Systemprogrammiersprache versteht, wird dem Programmierer nicht die Möglichkeit verwehrt, Anweisungen auszuführen, deren Freiheit von möglichen Speicherzugriffsverletzungen sich der Prüfung durch den Compiler entzieht.&lt;br /&gt;
Typischerweise ist eine Funktion &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt;, wenn sie Speicherzugriffsverletzungen auslöst, wenn sie falsch benutzt wird.&lt;br /&gt;
Mit &amp;lt;code&amp;gt;@trusted&amp;lt;/code&amp;gt; ausgezeichnete Funktionen bilden eine Zwischenschicht, die &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt; Code nutzt, aber auf eine Weise, die bekanntermaßen keine Speicherzugriffsverletzungen auslöst. Das wird vom Compiler jedoch nicht maschinell geprüft und es obliegt dem Programmierer oder der [[Qualitätssicherung]], nachzuweisen, dass der &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt; korrekt verwendet wird.&amp;lt;ref&amp;gt;{{Internetquelle&lt;br /&gt;
 |titel=SafeD&lt;br /&gt;
 |sprache=en&lt;br /&gt;
 |url=https://dlang.org/articles/safed.html&lt;br /&gt;
 |abruf=2021-01-03&lt;br /&gt;
}}&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ein Beispiel dafür ist die C-Funktion &amp;lt;code&amp;gt;memcpy&amp;lt;/code&amp;gt;, die &amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;amp;nbsp;Bytes von &amp;#039;&amp;#039;A&amp;#039;&amp;#039; nach &amp;#039;&amp;#039;B&amp;#039;&amp;#039; kopiert. Ist der Puffer&amp;amp;nbsp;&amp;#039;&amp;#039;B&amp;#039;&amp;#039; nicht groß genug, die &amp;#039;&amp;#039;n&amp;#039;&amp;#039;&amp;amp;nbsp;Bytes aufzunehmen, ist eine Speicherzugriffsverletzung möglich. Daher ist Anbindung von &amp;lt;code&amp;gt;memcpy&amp;lt;/code&amp;gt; in D &amp;lt;code&amp;gt;@system&amp;lt;/code&amp;gt;. Ein geeigneter D-Wrapper nimmt zwei sog. Slices an statt zweier Zeiger und einer Anzahl. Slices bestehen aus einem Zeiger und einer Länge; es kann also überprüft werden, ob der annehmende Puffer groß genug ist. Ein Wrapper, der einen geordneten Programmabsturz herbeiführt, darf somit mit &amp;lt;code&amp;gt;@trusted&amp;lt;/code&amp;gt; annotiert werden. Bei Testläufen sollten Falschverwendungen des Wrappers sofort ersichtlich werden.&lt;br /&gt;
&lt;br /&gt;
Ein weiteres Beispiel sind Funktionen mit [[Inline-Assembler]]-Blöcken, da diese sich grundsätzlich einer Überprüfung durch den Compiler entziehen. Möglicherweise ist jedoch offensichtlich, dass ein solcher Block keine unsicheren Speicheroperationen durchführt. Auch dann ist die Annotation &amp;lt;code&amp;gt;@trusted&amp;lt;/code&amp;gt; korrekt und sinnvoll.&lt;br /&gt;
&lt;br /&gt;
== Compiler ==&lt;br /&gt;
DMD, der [[Digital Mars]] D-Compiler,&amp;lt;ref name=&amp;quot;DMD&amp;quot;&amp;gt;DMD (Digital Mars D): [https://www.digitalmars.com/d/dcompiler.html DMD]&amp;lt;/ref&amp;gt; ist die [[Referenzimplementierung]] von Walter Bright und für die [[x86-Prozessor|x86]]/[[x64|x86-64]]-Versionen von [[Windows]], [[Linux]], [[macOS]] und [[FreeBSD]] erhältlich.&lt;br /&gt;
&lt;br /&gt;
Die wichtigsten Übersetzer mit alternativen [[Compiler#Backend (auch „Synthesephase“)|Backends]] sind der auf [[GNU Compiler Collection|GCC]] aufbauende GDC&amp;lt;ref name=&amp;quot;GDC&amp;quot;&amp;gt;GDC (GNU D Compiler): [https://gdcproject.org/ GDC]&amp;lt;/ref&amp;gt; sowie LDC,&amp;lt;ref&amp;gt;[https://github.com/ldc-developers/ldc &amp;#039;&amp;#039;LDC&amp;#039;&amp;#039; auf GitHub]&amp;lt;/ref&amp;gt; das sich auf die Qualitäten von [[LLVM]] stützt. Neben der hohen Geschwindigkeit des generierten Maschinencodes ermöglichen diese [[Front-End und Back-End|Backends]] außerdem die Bedienung von x86-64- und verschiedener anderer Architekturen.&lt;br /&gt;
&lt;br /&gt;
Inzwischen wurden auch zwei Compiler für D in D selbst programmiert: Dil&amp;lt;ref&amp;gt;[http://code.google.com/p/dil/ DIL-Projektseite]&amp;lt;/ref&amp;gt; und [[Dang (Compiler)|Dang]],&amp;lt;ref&amp;gt;[http://www.dsource.org/projects/dang Dang-Projektseite]&amp;lt;/ref&amp;gt; die kompatibel zu LLVM sind. Ein [[Codegenerator]] für die [[.Net-Framework|.NET]]-Plattform stellt eher einen Machbarkeitsnachweis dar als einen funktionstüchtigen Übersetzer.&amp;lt;ref&amp;gt;{{Webarchiv|url=http://dnet.codeplex.com/ |wayback=20180126042332 |text=D Compiler for .NET |archiv-bot=2022-10-20 19:41:48 InternetArchiveBot }}&amp;lt;/ref&amp;gt; Seit Version 9.1 des GCC wird die Sprache D unterstützt.&amp;lt;ref&amp;gt;[http://gcc.gnu.org/gcc-9/changes.html#d GCC 9 Release Series Changes, New Features, and Fixes]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Entwicklungsumgebungen ==&lt;br /&gt;
D wird zunehmend von verschiedenen [[Integrierte Entwicklungsumgebung|IDEs]] unterstützt. Zum Einsatz kommen unter anderen die Editoren Entice Designer, [[Emacs]], [[Vim]], [[Scite]], Scite4D, [[Smultron]], [[TextMate]], Zeus, [[Geany]] und [[Visual Studio Code]]. Vim und Scite4D unterstützen [[Syntaxhervorhebung]] und [[Autovervollständigen|Autovervollständigung]]. Für TextMate und Visual Studio Code existiert jeweils eine Erweiterung, auch [[Code::Blocks]] unterstützt D teilweise.&lt;br /&gt;
&lt;br /&gt;
Darüber hinaus gibt es noch [[Plug-in]]s für andere IDEs:&lt;br /&gt;
[[Eclipse (IDE)|Eclipse]] unterstützt D mit dem Plug-in DDT,&amp;lt;ref&amp;gt;[https://github.com/DDT-IDE/DDT/ &amp;#039;&amp;#039;DDT auf Github&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt; für [[MonoDevelop]] gibt es Mono-D.&amp;lt;ref&amp;gt;[https://wiki.dlang.org/Mono-D &amp;#039;&amp;#039;Mono-D&amp;#039;&amp;#039;]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Zudem gibt es in D geschriebene IDEs, wie &amp;#039;&amp;#039;Poseidon&amp;#039;&amp;#039;, das Autovervollständigung sowie [[Refactoring]] unterstützt und einen integrierten [[Debugger]] hat. [[WinDbg]] und der [[GNU Debugger]] unterstützen D rudimentär.&amp;lt;ref&amp;gt;[https://dlang.org/windbg.html &amp;#039;&amp;#039;windbg Debugger&amp;#039;&amp;#039;] auf dlang.org, abgerufen am 14. Februar 2019.&amp;lt;/ref&amp;gt;&amp;lt;ref&amp;gt;[https://sourceware.org/gdb/current/onlinedocs/gdb/D.html#D &amp;#039;&amp;#039;Debugging with GDB: D&amp;#039;&amp;#039;], abgerufen am 13. Februar 2019.&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Programmbeispiele ==&lt;br /&gt;
; Hallo Welt&lt;br /&gt;
{{Hauptartikel|Liste von Hallo-Welt-Programmen/Höhere Programmiersprachen#D|titel1=Hallo Welt in D}}&lt;br /&gt;
&lt;br /&gt;
;Ausgabe der Kommandozeilenparameter&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
// Programm, geschrieben in D2, das seine Parameter ausgibt&lt;br /&gt;
void main(string[] args) @safe&lt;br /&gt;
{&lt;br /&gt;
    // Importiert writefln aus dem Modul std.stdio&lt;br /&gt;
    import std.stdio : writefln;&lt;br /&gt;
    // In D können Imports auch in Funktionen stattfinden.&lt;br /&gt;
&lt;br /&gt;
    // Jeder Eintrag im Feld args wird ausgegeben.&lt;br /&gt;
    foreach(i, arg; args)&lt;br /&gt;
        writefln!&amp;quot;Parameter %d = &amp;#039;%s&amp;#039;&amp;quot;(i, arg);&lt;br /&gt;
    // Der Format-String wird zur Compilezeit geprüft,&lt;br /&gt;
    // sodass nur passende Parameter verwendet werden können.&lt;br /&gt;
    // Werden i und arg vertauscht, kompiliert das Programm nicht.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Annotation &amp;lt;code&amp;gt;@safe&amp;lt;/code&amp;gt; bedeutet, dass die Funktion frei von Speicherzugriffsverletzungen ist und der Compiler das überprüfen wird. Sie ist nicht notwendig, aber sinnvoll.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--=== Erläuterung ===--&amp;gt;&lt;br /&gt;
Der &amp;lt;code&amp;gt;main&amp;lt;/code&amp;gt;-Funktion werden die [[Kommandozeilenparameter]] als ein Feld von [[Zeichenkette]]n (Strings) übergeben. Ruft man dieses Programm unter Windows mit &amp;lt;code&amp;gt;beispiel.exe -win -s&amp;lt;/code&amp;gt; auf, dann gibt es diesen Text in einem [[Kommandozeile|Konsolen-Fenster]] aus:&lt;br /&gt;
 Parameter 0 = &amp;#039;beispiel.exe&amp;#039;&lt;br /&gt;
 Parameter 1 = &amp;#039;-win&amp;#039;&lt;br /&gt;
 Parameter 2 = &amp;#039;-s&amp;#039;&lt;br /&gt;
&lt;br /&gt;
; Unittests&lt;br /&gt;
[[Modultest|Unittests bzw. Modultests]]&amp;lt;ref&amp;gt;[https://dlang.org/unittest.html dlang.org-unittests]&amp;lt;/ref&amp;gt; sind Blöcke, die Programmcode enthalten, welcher eine Funktion auf unterschiedliche Fälle testen soll.&lt;br /&gt;
Zusätzlich kann der in Unittest-Code als Beispiel in der von DDOC&amp;lt;ref&amp;gt;[https://dlang.org/ddoc.html dlang.org-DDOC]&amp;lt;/ref&amp;gt; generierten Dokumentation aufgeführt werden.&lt;br /&gt;
In D werden die Unittests unmittelbar vor der Main-Funktion ausgeführt.&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
/++&lt;br /&gt;
    Ermittelt, ob eine Zahl eine Primzahl ist.&lt;br /&gt;
    Hinweis: Das Verfahren ist nicht optimal.&lt;br /&gt;
Params:&lt;br /&gt;
    a: die zu testende Zahl&lt;br /&gt;
Returns:&lt;br /&gt;
    true, falls die Zahl eine Primzahl ist;&lt;br /&gt;
    false, ansonsten&lt;br /&gt;
+/&lt;br /&gt;
bool isPrime(long a) pure&lt;br /&gt;
{&lt;br /&gt;
    if (a &amp;lt;= 1)&lt;br /&gt;
        return false;&lt;br /&gt;
&lt;br /&gt;
    // falls a keine Primzahl ist und a restlos durch n teilbar ist&lt;br /&gt;
    for (long n = 2; n*n &amp;lt;= a; ++n)&lt;br /&gt;
        if (a % n == 0)&lt;br /&gt;
            return false;&lt;br /&gt;
&lt;br /&gt;
    // a war nicht teilbar -&amp;gt; a muss eine Primzahl sein&lt;br /&gt;
    return true;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unittest&lt;br /&gt;
{&lt;br /&gt;
    // Die Bedingung in dem Assert-Aufruf muss erfüllt werden (wahr sein).&lt;br /&gt;
    // Sonst ist ein Fehler aufgetreten und das Programm bricht ab.&lt;br /&gt;
    assert(isPrime( 0) == false);&lt;br /&gt;
    assert(isPrime( 1) == false);&lt;br /&gt;
    assert(isPrime( 2) == true);&lt;br /&gt;
    assert(isPrime( 7) == true);&lt;br /&gt;
    assert(isPrime( 4) == false);&lt;br /&gt;
    assert(isPrime(10) == false);&lt;br /&gt;
&lt;br /&gt;
    // Hier wird erwartet, dass der Test fehlschlägt, da 11 prim ist.&lt;br /&gt;
    // Fehlerhafter Code: Assert schlägt immer fehl!&lt;br /&gt;
    assert(isPrime(11) == false);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Die Annotation &amp;lt;code&amp;gt;pure&amp;lt;/code&amp;gt; bedeutet, dass &amp;lt;code&amp;gt;isPrime&amp;lt;/code&amp;gt; eine referentiell transparente Funktion ist, ihr Ergebnis also nur von den Eingaben, aber nicht von globalen Variablen abhängt. Der Compiler überprüft die Korrektheit der Annotation.&lt;br /&gt;
&lt;br /&gt;
Unittests sind Testfunktionen, die das Verhalten einer Funktion auf alle Möglichkeiten testen sollen.&lt;br /&gt;
Damit Unittests ausgeführt werden, muss ein Compiler-Flag gesetzt werden (-unittest bei DMD).&lt;br /&gt;
&lt;br /&gt;
=== Generische Programmierung ===&lt;br /&gt;
Zusätzlich zu [[Mixin]]-Templates&amp;lt;ref&amp;gt;[https://dlang.org/template-mixin.html dlang.org-Mixin-Templates]&amp;lt;/ref&amp;gt; implementiert die Programmiersprache D alle gängigen [[Template (C++)|Templatearten]].&amp;lt;ref&amp;gt;[https://dlang.org/template.html dlang.org-Templates]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Funktionstemplates&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
// Diese Funktion liefert als Return-Wert das Maximum der beiden Parameter&lt;br /&gt;
// Der Template Datentyp T wird dabei automatisch (falls möglich) erkannt&lt;br /&gt;
T max(T)(T a, T b) {&lt;br /&gt;
    if (a &amp;lt; b)&lt;br /&gt;
        return b;&lt;br /&gt;
    else&lt;br /&gt;
        return a;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
unittest {&lt;br /&gt;
    assert(max(2, 3) == 3);&lt;br /&gt;
    assert(max(&amp;#039;a&amp;#039;, &amp;#039;c&amp;#039;) == &amp;#039;c&amp;#039;);&lt;br /&gt;
    assert(max(3.1415, 2.61) == 3.1415);&lt;br /&gt;
    assert(max(&amp;quot;Hallo&amp;quot;, &amp;quot;Abc&amp;quot;) == &amp;quot;Hallo&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Meta-Programmierung&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
// Berechnet das Ergebnis von basis^exp&lt;br /&gt;
template Pow(double basis, uint exp) {&lt;br /&gt;
    static if (exp &amp;gt; 0)&lt;br /&gt;
        enum Pow = basis * Pow!(basis, exp - 1);&lt;br /&gt;
    else&lt;br /&gt;
        enum Pow = 1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void main() {&lt;br /&gt;
    import std.stdio;&lt;br /&gt;
&lt;br /&gt;
    // Da pow ein Template ist, wird das Ergebnis zur Compilezeit bestimmt&lt;br /&gt;
    // und steht zur Laufzeit als Konstante zur Verfügung&lt;br /&gt;
    writeln(&amp;quot;2.7182^3 = &amp;quot;, Pow!(2.7182, 3));&lt;br /&gt;
    writeln(&amp;quot;3.1415^5 = &amp;quot;, Pow!(3.1415, 5));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
Ausgabe:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
2.7182^3 = 20.0837&lt;br /&gt;
3.1415^5 = 305.975&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
; Compile Time Function Execution&lt;br /&gt;
&lt;br /&gt;
Mit noch während der Kompilierung ausgeführten Funktionen (CTFE) können Initialisierungslisten, Lookup-Tables u.&amp;amp;nbsp;Ä. erstellt&amp;lt;ref&amp;gt;[https://dlang.org/function.html#interpretation dlang.org-CTFE]&amp;lt;/ref&amp;gt; und durch sog. Mixins bei der Übersetzung aus [[Zeichenkette|Strings]] generierter D-Code eingebunden werden.&amp;lt;ref&amp;gt;[https://dlang.org/mixin.html dlang.org-mixins]&amp;lt;/ref&amp;gt; Diese beiden Features bieten eine Möglichkeit für die Realisierung [[Domänenspezifische Sprache|domänenspezifischer Sprachen]] in D.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;d&amp;quot;&amp;gt;&lt;br /&gt;
T sum(T)(T[] elems) {&lt;br /&gt;
    T result = T(0);&lt;br /&gt;
&lt;br /&gt;
    foreach (elem; elems)&lt;br /&gt;
        result += elem;&lt;br /&gt;
&lt;br /&gt;
    return result;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
enum arr = [10, 13, 14, 15, 18, 19, 22, 24, 25, 36];&lt;br /&gt;
&lt;br /&gt;
// summeVonArr ist zur Kompilierungszeit bekannt.&lt;br /&gt;
enum summeVonArr = sum(arr); // == 196&lt;br /&gt;
&lt;br /&gt;
// Statisches Integer-Array mit der Laenge 196&lt;br /&gt;
int[summeVonArr] staticArray;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Die Initialisierung von &amp;lt;code&amp;gt;result&amp;lt;/code&amp;gt; mit null ist notwendig, falls &amp;lt;code&amp;gt;T&amp;lt;/code&amp;gt; durch einen Fließkomma-Datentyp wie &amp;lt;code&amp;gt;double&amp;lt;/code&amp;gt; belegt wird, denn uninitialisierte Fließkommazahlen-Variablen werden mit [[NaN]] initialisiert, statt mit null.&lt;br /&gt;
&lt;br /&gt;
== Literatur ==&lt;br /&gt;
* Ali Çehreli: &amp;#039;&amp;#039;[http://ddili.org/ders/d.en/index.html Programming in D: Tutorial and Reference].&amp;#039;&amp;#039; 1. Auflage. [[CreateSpace.com|CreateSpace]], 2015, ISBN 978-1-5150-7460-1.&lt;br /&gt;
* Adam D. Ruppe: &amp;#039;&amp;#039;D Cookbook.&amp;#039;&amp;#039; 1. Auflage. Packt Publishing, 2014, ISBN 978-1-78328-721-5.&lt;br /&gt;
* [[Andrei Alexandrescu]]: &amp;#039;&amp;#039;The D Programming Language.&amp;#039;&amp;#039; 1. Auflage. [[Addison-Wesley]], 2010, ISBN 978-0-321-63536-5.&lt;br /&gt;
* Tobias Wassermann, Christian Speer: &amp;#039;&amp;#039;Programmieren in D.&amp;#039;&amp;#039; 1. Auflage. entwickler.press, 2007, ISBN 978-3-939084-69-3.&lt;br /&gt;
* Manfred Hansen: [http://www.steinmole.de/d/d_buch.pdf &amp;#039;&amp;#039;D-Buch – Programmiersprache D.&amp;#039;&amp;#039;] 2009.&lt;br /&gt;
&lt;br /&gt;
== Weblinks ==&lt;br /&gt;
* [https://dlang.org/ Offizielle Website]&lt;br /&gt;
* [https://www.digitalmars.com/ Die Programmiersprache D] bei Digital Mars&lt;br /&gt;
* [http://rainers.github.io/visuald/visuald/StartPage.html Visual D] D-Integration für Visual Studio 2005, 2008 und 2010 (englisch)&lt;br /&gt;
* [https://archive.codeplex.com/?p=dnet D.NET] D-Compiler für .NET (englisch)&lt;br /&gt;
&lt;br /&gt;
== Einzelnachweise ==&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Normdaten|TYP=s|GND=7606805-5}}&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:Imperative Programmiersprache]]&lt;br /&gt;
[[Kategorie:Objektorientierte Programmiersprache]]&lt;/div&gt;</summary>
		<author><name>imported&gt;Invisigoth67</name></author>
	</entry>
</feed>