EMZETT.
Login

C

Kurz: Eine der ältesten und einflussreichsten Programmiersprachen (1972) — sehr maschinennah, ohne automatische Speicherverwaltung, Vorbild für die Syntax vieler späterer Sprachen (C++, Java, C#, JavaScript).

Genauer: In C verwaltet man Speicher manuell (Zeiger/Pointer, malloc/free) — es gibt keinen Garbage Collector wie in Java. Das macht C extrem performant und kontrollierbar, aber auch fehleranfällig (Speicherlecks, Buffer Overflows). Bis heute die Sprache der Wahl für Betriebssystemkerne, Treiber und eingebettete Systeme.

Im Detail

Ein einfaches C-Programm zeigt die manuelle Speicherverwaltung, die die Sprache prägt:

int *zahl = malloc(sizeof(int));
*zahl = 42;
free(zahl); // Speicher muss explizit wieder freigegeben werden

Vergisst man free(), entsteht ein Speicherleck; greift man nach dem free() versehentlich weiter auf den Zeiger zu, ist das Verhalten undefiniert — genau solche Fehlerklassen (Buffer Overflows, Use-after-free) sind über Jahrzehnte für einen erheblichen Anteil aller Sicherheitslücken in C-Software verantwortlich, was neuere, speichersichere Sprachen wie Rust als Alternative für systemnahe Programmierung populär gemacht hat.

Trotzdem bleibt C bis heute extrem relevant: Der Linux-Kernel selbst ist zu einem großen Teil in C geschrieben, ebenso viele Compiler, Datenbanken und eingebettete Systeme (z. B. Mikrocontroller-Firmware), wo minimaler Ressourcenverbrauch und direkte Hardwarekontrolle entscheidend sind. Fast jede spätere Mainstream-Sprache (C++, Java, C#, JavaScript, sogar Python) übernahm zumindest Teile von Cs geschweifter-Klammern-Syntax.

Entstehung bei Bell Labs

C wurde 1972 von Dennis Ritchie bei Bell Labs entwickelt, ursprünglich um das Unix-Betriebssystem (das zuvor in Assembly geschrieben war) portabler zu machen — ein Betriebssystemkern in einer höheren Sprache zu schreiben war zu dieser Zeit ungewöhnlich, setzte sich aber durch, weil sich C-Code mit vergleichsweise wenig Aufwand auf neue Prozessorarchitekturen übertragen ließ. Das 1978 erschienene Buch “The C Programming Language” von Ritchie und Brian Kernighan (bekannt als “K&R”) prägte über Jahrzehnte den Programmierstil ganzer Entwicklergenerationen und gilt bis heute als eines der einflussreichsten Programmierbücher überhaupt.

Zeigerarithmetik als Kern und Risiko

Was C von höheren Sprachen unterscheidet, ist der direkte Zugriff auf Speicheradressen über Zeiger (Pointer) — eine Variable, die nicht den Wert selbst, sondern die Adresse speichert, an der der Wert im Speicher liegt. Das erlaubt extrem effiziente Datenstrukturen und direkten Hardwarezugriff, öffnet aber auch die Tür für die berüchtigten Fehlerklassen der Sprache: Ein Buffer Overflow entsteht, wenn Code über die Grenzen eines allozierten Speicherbereichs hinausschreibt, ohne dass die Sprache das automatisch verhindert — solche Fehler waren über Jahrzehnte hinweg die Grundlage unzähliger Sicherheitslücken, vom berühmten Morris-Wurm 1988 bis zu modernen Exploits.

Standardisierung und Dialekte

C ist kein starres, einmal festgelegtes Konstrukt, sondern wurde mehrfach offiziell standardisiert — ANSI C (1989, auch C89 genannt) war der erste weit verbreitete Standard, gefolgt von C99, C11, C17 und C23 mit jeweils neuen Sprachfeatures (z. B. Inline-Funktionen, bessere Unterstützung für nebenläufige Programmierung). Compiler wie GCC und Clang unterstützen meist mehrere dieser Standards gleichzeitig und lassen sich per Flag (-std=c99) auf einen bestimmten festlegen — relevant, weil älterer Code oft bewusst auf einem älteren Standard aufbaut, um mit möglichst vielen Compilern kompatibel zu bleiben.

Siehe auch: C++, Rust, Garbage Collector