Microsoft C
# Microsoft C

Microsoft C/C++ ist ein Compiler für die Programmiersprachen C und C++ auf Basis von Lattice C und ist ANSI C und K&R C kompatibel. Es ist möglich, zwischen reinem ANSI C und den Spracherweiterungen von Microsoft zu wählen. Die letzte Version des Compilers stellt den Vorgänger von Microsoft Visual C++ 1.0 Professional dar. Die Standard-Edition von Visual C++ 1.0 basiert hingegen weitestgehend auf Microsoft QuickC.

## Geschichte

Die erste Version von Microsoft C war identisch mit Lattice C. Es wurde letztendlich nur das Produkt Lattice C unter einem anderen Namen vertrieben. Auch die zweite Version basierte auf Lattice C. Allerdings wurden die verfügbaren Speichermodelle angepasst.
Speichermodelle von Lattice C 2.0 :
| Speicher­modell | Segmente | Segmente | Zeiger | Zeiger | Beschreibung |
| Speicher­modell | Code | Data | Code | Data | Beschreibung |
| Small (S) | 64 KiB | 64 KiB | Near | Near | Entspricht dem Small-Modell im x86-Standard |
| Program (P) | 1 MiB | 64 KiB | Far | Near | Entspricht dem Medium-Modell im x86-Standard |
| Data (D) | 64 KiB | 1 MiB | Near | Far | Entspricht dem Compact-Modell im x86-Standard |
| Large (L) | 1 MiB | 1 MiB | Far | Far | Entspricht dem Large-Modell im x86-Standard |
Ab Version 3.0 nutzt Microsoft eine eigene Implementierung für den C-Compiler. Die Speichermodelle von Lattice C wurden durch die Intel-x86-Speichermodelle (vgl. Speichermodelle von Turbo C) ersetzt. Diese legen fest, wie der Speicher im Real Mode von x86-Prozessoren segmentiert werden soll. Darüber hinaus wird ab dieser Version Mixed-Model Programming unterstützt. Programme, die das Tiny-Speichermodell nutzen, können auch als COM-Datei erzeugt werden. Allerdings können diese Programme dann keinen Return Code zurückliefern. Standardmäßig wird das Small-Modell genutzt und eine EXE-Datei erzeugt.
Es können nur 16-Bit-Anwendungen erstellt werden. Der Compiler unterstützt die Befehlssatzarchitekturen Intel 8086, Intel 80186 und Intel 80286. Aus der Dokumentation von Microsoft C++ 7.0 geht hervor, dass auch die 32-Bit-Befehlssatzarchitekturen Intel 80386 und Intel 80486 vorgesehen waren, aber nicht in der Version implementiert wurden. Allerdings wurden entsprechende Kommandozeilenparameter für zukünftige Versionen reserviert.
Im Gegensatz zu den früheren Versionen enthält Microsoft C ab der dritten Version ein vergleichsweise großes SDK. Dabei handelt es sich um die C-Standard-Bibliothek und weitere Header-Dateien. Unter anderem wird auch eine Bibliothek bereitgestellt, mit der die Kompatibilität zu älteren, in Lattice C geschriebenen Programme sichergestellt werden kann.
Ab Version 7.0 unterstützt der Compiler auch C++ und damit die Sprachelemente der objektorientierten Programmierung (z. B. Klassen) und die strukturierte Ausnahmebehandlung. Er ist vollständig mit dem AT&T C++ Standard 2.1 kompatibel, jedoch nur eingeschränkt mit der Version 3.0 oder später. Im Lieferumfang sind zudem das Windows 3.1 SDK und die erste Version der Microsoft Foundation Classes (MFC) als statische Bibliothek enthalten. Es ist damit möglich, komplexe grafische Benutzeroberflächen mit Fenstern, Dialogen, Steuerelementen, Object Linking and Embedding (OLE) und Multiple Document Interfaces (MDI) zu erstellen. Ab dieser Version können erstmals 32-Bit-Anwendungen erstellt werden, die im Protected Mode von x86-Prozessoren lauffähig sind. Im Gegensatz zu den meisten anderen C Compilern aus der damaligen Zeit, unterstützte der Compiler von Microsoft auch p-Code.
Die erste Version von Visual C++ unterstützte ebenfalls nur 16-Bit-Architekturen und wurde im Februar 1993 veröffentlicht. Im August 1993 erschien eine Version, die auch in der Lage war, 32-Bit-Anwendungen zu erstellen. Ab der Version 2.0 von Visual C++ wurden nur noch 32-Bit-Anwendungen unterstützt.
Neben Microsoft C/C++ wurde auch eine vereinfachte Version namens Microsoft QuickC entwickelt. Die Standard-Edition von Visual C++ 1.0 basierte auf QuickC, während die Professional-Edition auf Microsoft C/C++ 7.0 basiert. Die letzte Version von QuickC (Microsoft QuickC for Windows 1.0) ist kompatibel mit dem Compiler von Microsoft C 6.0.
Durch Microsofts Freigabe und Veröffentlichung des Quellcodes von MS-DOS 4.0 am 25. April 2024 ist der Microsoft C Compiler in der Version 5.10 mitsamt dessen Linker LINK.EXE (Version 3.65) und NMAKE.EXE (Version 1.00.05), sowie der dazugehörigen C-Bibliothek und dem Microsoft Assembler MASM (Version 5.10) als Binärcode öffentlich auf GitHub verfügbar.

## Entwicklungsumgebung

Seit Version 6.0 wird neben dem Compiler auch die zeichenorientierte Entwicklungsumgebung Programmer’s WorkBench (PWB) mitgeliefert. Unter anderem ermöglicht die Entwicklungsumgebung die Kombination von Programmfragmenten, die in unterschiedlichen Programmiersprachen entwickelt wurden (Mixed-Language Programming). Neben Microsoft C werden die Programmiersprachen Microsoft Macro Assembler (MASM), QuickBASIC, FORTRAN und COBOL unterstützt.

### Mixed-Language Programming

Programmfragmente in unterschiedlichen Sprachen werden von unterschiedlichen Compilern in Objektdateien (*.obj) umgewandelt und anschließend mit einem Linker zu einem fertigen Programm zusammengeführt.
Die unterschiedlichen Programmiersprachen nutzen unterschiedliche Ansätze zur Speicherverwaltung und -adressierung. Daher ist es nur möglich, die Speichermodelle Medium, Large und Huge zu nutzen. Die Speichermodelle Small und Compact werden nicht unterstützt und führen zu Schutzverletzungen und letztendlich zum Programmabsturz.
Darüber hinaus unterstützt Microsoft C auch Inline-Assemblerfragmente. Dazu dienen __asm-Böcke. Allerdings wird hier nur eine Teilmenge des MASM-Befehlssatzes unterstützt. Das Schlüsselwort asm aus dem AT&T-Standard wird nicht unterstützt.

### Kontextsensitive Hilfe

Die Entwicklungsumgebung bietet eine kontextsensitive Hilfe an. Befindet sich der Cursor innerhalb eines Schlüsselwortes oder bekannten Funktion, kann man durch Drücken der F1-Taste oder einem Rechtsklick die Dokumentation für das jeweilige Sprachelement anzeigen lassen.

## Beispiel

Das folgende Hallo-Welt-Programm gibt den Text „Hallo Welt!“ im Standard-Ausgabe-Datenstrom (STDOUT) aus.