{{Vorlage:Sprache
|Name = D
|[[Assembler | Inlineassembler]] = Ja (Intel-Syntax)
|Compiler = dmd (Digital Mars), gdc (GNU)
|Plattformen = Alle
|Kernel = s.u.
|Homepage = http://www.digitalmars.com/d
}}
D ist eine prozedurale sowie objekorientierte [[Kategorie:Programmiersprache | Programmiersprache]] und wird seit 1999 von Walter Bright entwickelt. Primäres Ziel der Entwicklung war dabei die Produktivität von Scriptsprachen wie Python mit der Abstraktion von [[C++]] und der Nähe zum System von [[C]] zu vereinen.
== D als Sprache für ein Betriebssystem ==
D kann primär als objektorientiertes C (ähnlich C++) gesehen werden. Mit D lässt sich genauso wie in C sehr systemnah programmieren, es sind Sprachmittel wie Pointer vorhanden und man kann per Inline-Assembler (Intel-Syntax) Assembler-Routinen einbauen. Einzig muss (z.B. für den [[Kernel]]) ein kleines Runtime implementiert werden, welcher Funktionen zum Überprüfen von Werten während der Laufzeit zur Verfügung stellt (mehr dazu weiter unten). Um Sprachmittel wie Konstruktoren und Desktruktoren einzusetzen, bedarf es ebenfalls Kompatibillitätscode.
== Kernel in D ==
=== Konstruktoren/Destruktoren ===
Wer in D seinen Kernel programmiert, möchte vielleicht den Vorteil der Objektorientierung nicht missen. Dazu muss allerdings, wie in C++ auch, Code geschrieben werden, welcher die Konstruktoren/Destruktoren aufruft.
Für die Konstruktoren:
OUTPUT_FORMAT(elf32-i386)
ENTRY (start)
SECTIONS{
. = 0x00100000;
.text :{
code = .; _code = .; __code = .;
*(.text)
*(.rodata)
}
.rodata ALIGN (0x1000) : {
*(.rodata)
}
.data ALIGN (0x1000) : {
data = .; _data = .; __data = .;
*(.data)
start_ctors = .; *(.ctors) end_ctors = .;
start_dtors = .; *(.dtors) end_dtors = .;
}
.bss :{
sbss = .;
bss = .; _bss = .; __bss = .;
*(COMMON)
*(.bss)
ebss = .;
}
end = .; _end = .; __end = .;
}
=== Runtime ===
Wer in D einen Kernel schreibt wird bei der Benutzung von Arrays beim Linken schnell folgenden Fehler zu sehen bekommen:
undefined reference to _d_array_bounds
_d_array_bounds ist dabei nicht anderes, als eine Funktion im D-Runtime, welche überprüft, ob Array-Grenzen eingehalten werden.
Um diesen Fehler vorzubeugen, sollte also zumindest eine Stub-Funktion erstellt werden:
$ gdc -no-bounds-check=== Der eigentliche Kernel === Nichts weltbewegendes, wir geben ein einfaches 'D' auf dem Bildschirm aus: