Varianten der Programmiersprache C

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von ANSI C)
Wechseln zu: Navigation, Suche

Seit dem Erscheinen der Programmiersprache C im Jahre 1972 wurden mehrere Varianten (Spezifikationen und internationale Standards) veröffentlicht.

K&R-C[Bearbeiten]

Mit K&R-C wird die C-Variante bezeichnet, wie sie ursprünglich von den Erfindern Brian W. Kernighan und Dennis Ritchie verfasst wurde und in der ersten Auflage ihres Buches The C Programming Language von 1978 (K&R1) beschrieben ist.

C89, C90[Bearbeiten]

Im Jahre 1983 wurde vom American National Standards Institute (ANSI) ein Komitee namens X3J11 gegründet, um eine Norm für die Programmiersprache C zu entwickeln. Als Grundlage für die Sprachdefinition diente die Programmiersprache C, wie sie von den Erfindern Brian W. Kernighan und Dennis Ritchie (K&R-C) konzipiert wurde.

Nach sechsjähriger Arbeit konnte im Dezember 1989 die Norm ANSI X3.159-1989 Programming Language C verabschiedet werden. Diese Fassung der Sprache C wird aufgrund ihres Erscheinungsjahres auch als C89 bezeichnet. Ein Jahr später, 1990, wurde diese Norm (mit ein paar kleineren Änderungen) von der WG14 der ISO als Norm ISO/IEC 9899:1990 (C90), übernommen. Die überarbeitete zweite Auflage des Buches The C Programming Language von 1988 (K&R2) reflektiert die Änderungen an der Sprache durch den Standardisierungsprozess.

Viele der bis dato ungenormten Eigenschaften der Sprache wurden einheitlich festgelegt, aber auch neue Sprachmittel wie Funktionsprototypen, ein leistungsfähigerer C-Präprozessor, sowie die Möglichkeit zur Deklaration von Konstanten, wurden in die Sprache aufgenommen. Die C-Norm räumte dabei unter anderem mit Unklarheiten in der ursprünglichen Definition auf, hierzu zählen die Ausführungsreihenfolge der vier Inkrement- und Dekrement-Operatoren (++, --). Mit der Norm wurde ferner der Umfang der enthaltenen Standardbibliothek festgelegt.

Bis heute ist C90 die Sprachbasis für alle Weiterentwicklungen der Programmiersprache C, unter anderem auch für C++, das über Möglichkeiten zur objektorientierten und generischen Programmierung verfügt.

Ein auf C90 basierendes Programm sollte ohne Probleme von jedem C-Compiler übersetzt und ausgeführt werden können. In der Praxis ist das nur bedingt der Fall, da fast alle C-Derivate zusätzliche Bibliotheken und Funktionsprototypen benutzen, um auf die individuellen Komponenten des Computersystems zugreifen zu können.

Wichtigste Neuerungen von C90[Bearbeiten]

  • Der Funktionsumfang sowie das Verhalten der Funktionen der Standardbibliothek wurden normiert.
  • Ein verbesserter Präprozessor wurde eingeführt.
  • Funktionsprototypen wurden eingeführt.
  • void für leere Funktionsparameter-Deklarationen und zur Kennzeichnung von Funktionen ohne Returnwert sowie void* für einen universell kompatiblen Zeigertyp kamen neu hinzu.
  • Die neuen Schlüsselwörter const, volatile und signed wurden eingeführt.
  • Das ungenutzte Schlüsselwort entry wurde entfernt.
  • Unterstützung für wide-character- (mehr als 8 Bit Breite) sowie für Multibyte-Zeichensätze wurde hinzugefügt.

Präprozessortest auf C90-Kompatibilität[Bearbeiten]

#if __STDC__
/*
 * C90-kompatibler Quellcode.
 */
#endif

C95[Bearbeiten]

1995 veröffentlichte die ISO eine Erweiterung – das Amendment 1 – zur C-Norm, die dann als ISO/IEC 9899/AMD1:1995 (C95) bezeichnet wurde. Neben Fehlerkorrekturen gab es auch Änderungen am Sprachumfang.[1] [2]

Wichtigste Neuerungen von C95[Bearbeiten]

  • Verbesserung der Unterstützung von Multibyte- und wide-character-Zeichensätzen durch die Standardbibliothek.
  • Hinzufügen von Digraphen zur Sprache.
  • Definition von Standard-Makros zur alternativen Schreibweise von Operatoren, zum Beispiel and für &&.
  • Definition des Standard-Makros __STDC_VERSION__.

Präprozessortest auf C95-Kompatibilität[Bearbeiten]

#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L
/*
 * C95-kompatibler Quellcode.
 */
#endif

C99[Bearbeiten]

1995 wurde erneut ein Ausschuss gegründet, um C zu erweitern und zu verbessern. Daraus ging 1999 der neue ISO-Standard ISO/IEC 9899:1999 hervor, auch als C99 bezeichnet. Er löste den Standard ISO/IEC 9899:1994-09 (C95) ab. Zu diesem Standard erschienen 2001 ein Technical Corrigendum 1[3], 2004 ein Technical Corrigendum 2[4] und 2007 ein Technical Corrigendum 3[5]. C99 einschließlich dieser Korrekturen wird inoffiziell auch als C0X bezeichnet und bildet die Basis für kommende C-Standards.[6]

Mit C99 flossen einige aus C++ bekannte Erweiterungen in die Sprache C ein, zum Beispiel Inline-Funktionen und die Möglichkeit, Variablen innerhalb der for-Anweisung zu deklarieren.

Wichtigste Neuerungen von C99[Bearbeiten]

  • Unterstützung von komplexen Zahlen durch den neuen Datentyp _Complex und entsprechende Funktionen in der Standardbibliothek.
  • Erweiterung der ganzzahligen Datentypen um einen mindestens 64 Bit breiten Typ long long, sowie um Typen mit vorgegebener Mindestbreite, zum Beispiel int_least8_t und uint_least32_t. Außerdem werden Integer-Typen mit exakter Breite spezifiziert, aber als optional bezeichnet – zum Beispiel int32_t.
  • Lokale Felder variabler Größe.
  • Der boolesche Datentyp _Bool. Über einen eigenen Header <stdbool.h> wird für ihn ein Makro namens bool definiert.
  • Weiter verbesserte Unterstützung für internationale Zeichensätze.
  • Erweiterte Unterstützung von Gleitkommazahlen inklusive neuer mathematischer Funktionen in der C-Bibliothek.
  • Alias-freie Zeiger (Schlüsselwort restrict).
  • Frei platzierbare Deklaration von Bezeichnern (in C90 durften diese nur am Anfang eines Blocks stehen).
  • Inline-Funktionen (Schlüsselwort inline).
  • Verbot des „impliziten int“; Verbot impliziter Funktionsdeklarationen.
  • Hexadezimale Gleitkommakonstanten. Ein- und Ausgabe in scanf() und printf() über „%a“ und „%A“.
  • Präprozessor-Makros mit variabler Parameteranzahl.
  • Zulassen des aus C++ bekannten Zeilenkommentars „//“.

Präprozessortest auf C99-Kompatibilität[Bearbeiten]

#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
 // C99 kompatibler Quellcode.
#endif

C11[Bearbeiten]

Das Normierungskomitee WG14 arbeitete an einer Neuauflage des C-Standards mit Arbeitstitel C1X, basierend auf dem C99-Standard inklusive der Technical Corrigenda TC1, TC2 und TC3 (C0X). Am 8. Dezember 2011 wurde C11 als ISO/IEC 9899:2011 verabschiedet.[7][8]

Neuerungen von C11[Bearbeiten]

Die Auflistung basiert auf diversen Technical Reports[9] und dem aktuellen Arbeitsdokument zu C1X.[10]

  • Unterstützung von Multithreading (<threads.h>, <stdatomic.h>)
  • Angaben zur Speicherausrichtung von Objekten (<stdalign.h>)
  • Neue Datentypen char16_t und char32_t zur verbesserten Unterstützung von Unicode, insbesondere UTF-16 und UTF-32 (<uchar.h>)
  • Änderungen an der Standardbibliothek zur Prüfung von Feldgrenzen zur Laufzeit des Programms, um z. B. Pufferüberläufe wirksamer vermeiden zu können[11]
  • Unterstützung der internen dezimalen Darstellung von Gleitkommazahlen gemäß IEEE 754-2008
  • Öffnen von Dateien mit exklusivem Lese-/Schreibrecht (Modus "x")
  • Generische Ausdrücke (Schlüsselwort _Generic), generische mathematische Funktionen für Gleitkommazahlen und komplexe Zahlen (<tgmath.h>)
  • Entfernung der Bibliotheksfunktion gets
  • Einige in C99 geforderte Funktionalität ist Compiler-Herstellern bei C11 wieder freigestellt, wie z.B. lokale Felder variabler Größe, komplexe Zahlen. Der Funktionsumfang kann mit Hilfe von Compiler-Defines abgefragt werden: __STDC_NO_COMPLEX__ (keine komplexe Zahlen), __STDC_NO_VLA (keine lokalen Felder variabler Länge)

Beispiele für den Unterschied zwischen verschiedenen Fassungen der Sprache C[Bearbeiten]

K&R-C:

/* Es gibt noch keine Funktionsprototypen. */
Ausgabe( str )
char *str;
{
    printf( "%s\n", str );
}
 
main()
{
    Ausgabe( "Hallo Welt!" );
    return 0;
}

C90/C95:

#include <stdio.h>
 
/* Das Argument darf nicht geändert werden. */
void Ausgabe( const char * const str )
{
    printf( "%s\n", str );
}
 
main()
{
    Ausgabe( "Hallo Welt!" );
    return 0;
}

C99:

#include <stdio.h>
 
// Das Argument ist konstant und es gibt keinen Alias.
void Ausgabe( const char * const restrict str )
{
    printf( "%s\n", str );
}
 
int main( void ) // der Rückgabetyp muss angegeben werden
{
    Ausgabe( "Hallo Welt!" );
    // "return 0;" muss nicht mehr angegeben werden.
}

Einzelnachweise[Bearbeiten]

  1. Clive D.W. Feather: A brief description of Normative Addendum 1. Abgerufen am 12. September 2010 (englisch).
  2. ISO/IEC 9899:1990/Amd 1:1995. International Organization for Standardization, abgerufen am 22. März 2013 (englisch).
  3. C99 Technical Corrigendum 1. Abgerufen am 22. September 2010 (PDF; 21 kB, englisch).
  4. C99 Technical Corrigendum 2. Abgerufen am 22. September 2010 (PDF; 353 kB, englisch).
  5. C99 Technical Corrigendum 3. Abgerufen am 22. September 2010 (PDF; 0 kB, englisch).
  6. John Benito: Offizielle Charta für den C1X Standardisierungsprozess. Abgerufen am 12. September 2010 (PDF; 49 kB, englisch).
  7. ISO aktualisiert C-Standard. Abgerufen am 23. Dezember 2011 (englisch).
  8. Artikel von heise online. Abgerufen am 23. Dezember 2011 (englisch).
  9. Projektstatus für C1X. Abgerufen am 12. September 2010 (englisch).
  10. ISO/IEC 9899:201x. Abgerufen am 12. April 2011 (PDF; 1,6 MB, englisch, nicht-normatives Arbeitsdokument).
  11. Extensions to the C Library, Part I: Bounds-checking interfaces. Abgerufen am 31. Oktober 2010 (PDF; 565 kB, englisch, Entwurf).

Weblinks[Bearbeiten]