Was ist die Programmiersprache C

I. Was ist C?

C ist eine universelle Programmiersprache, die 1972 für das UNIX-Betriebssystem entwickelt wurde. Das Betriebssystem selbst und die meisten mitgelieferten Programme sind in C geschrieben. Trotzdem ist die Sprache nicht an UNIX gebunden und läuft auf jedem beliebigen Computer oder System. Man bezeichnet sie oft als „Systemprogrammiersprache“: Man kann damit Betriebssysteme und Compiler erstellen, aber auch alle gängigen Standardsoftware-Anwendungen entwickeln.

C entstand aus der B-Sprache (abgeleitet von BCPL). Sowohl B als auch BCPL sind typenlose Sprachen, während C ein vollständiges System an Datentypen mitbringt.

II. Kernmerkmale

1) Vielfältige Datentypen

Im Vergleich zu seiner Vorgängersprache B bietet C eine breite Auswahl an Datentypen.

Grundtypen: Zeichen, Ganzzahlen unterschiedlicher Größe, Gleitkommazahlen (Dezimalzahlen)

Abgeleitete Typen: Zeiger, Arrays, Strukturen und Unions. Mit Zeigern lassen sich Speicheradressen hardwareunabhängig direkt verwalten.

Regel: Operatoren lassen sich zu Ausdrücken kombinieren; Ausdrücke wie Zuweisungen oder Funktionsaufrufe können eigenständige Programm-Anweisungen darstellen.

2) Vollständige Programmflusssteuerung

C unterstützt bedingte Verzweigungen (if-else), Mehrfachauswahl (switch), zwei Arten von Schleifen (while/for prüfen die Bedingung vor der Ausführung, do prüft sie nach der Ausführung) sowie das vorzeitige Verlassen einer Schleife (break) und weitere Konstrukte. Mit diesen Flusssteuerungsanweisungen lassen sich komplexe Programmabläufe realisieren.

3) Funktionen

Eine Funktion ist eine zusammengefasste, benannte Abfolge fest definierter Arbeitsschritte. Rufen Sie einfach ihren Namen auf, dann läuft die gesamte Schrittfolge automatisch ab.

Ein Alltagsbeispiel zur Verdeutlichung:

Nehmen wir an, „Brot backen“ ist eine Funktion.

Sie müssen nicht jedes Mal die gesamte Vorgehensweise neu aufschreiben: Teig kneten → formen → backen im Ofen.

Rufen Sie einfach „Brot backen“ auf, dann läuft der gesamte Ablauf automatisch – das nennt man einen Funktionsaufruf.

Wenn Sie zweimal Brot backen wollen, rufen Sie die Funktion „Brot backen“ einfach zweimal auf.

Übertragen wir das Konzept auf C:

Die Funktion printf bündelt alle Schritte, um Text auf dem Bildschirm anzuzeigen. Schreiben Sie lediglich printf("Hallo") – Sie müssen nicht jede einzelne Bildschirmsteuerung manuell programmieren.

Funktionen können alle gängigen Datentypen zurückgeben: Ganzzahlen, Strukturen, Zeiger und mehr.

Es unterstützt rekursive Aufrufe (eine Funktion ruft sich selbst auf). Lokale Variablen innerhalb einer Funktion werden bei jedem Aufruf neu erstellt; Sie dürfen keine Funktionen in anderen Funktionen verschachtelt definieren, Variablen lassen sich aber innerhalb einzelner Codeblöcke deklarieren.

Der Quellcode eines Projekts kann auf mehrere .c-Dateien aufgeteilt und separat kompiliert werden.

Variablen besitzen drei Gültigkeitsbereiche: nur innerhalb einer Funktion, global beschränkt auf eine einzelne Datei oder sichtbar im gesamten Programm.

4) Der Präprozessor

Vor dem eigentlichen Kompiliervorgang führt der Präprozessor vorbereitende Aufgaben aus: Massenersetzungen per Makro, Einbinden externer Quellcodedateien und bedingtes Kompilieren einzelner Codeabschnitte.

Der Präprozessor verarbeitet Befehle, die nicht zur eigentlichen Sprachsyntax von C gehören, noch vor der Kompilierung. Diese Hilfswerkzeuge dienen dazu, die Entwicklungsarbeit zu vereinfachen und die Effizienz zu steigern – vor allem durch Makros. Wir gehen darauf in späteren Kapiteln detailliert ein.

III. Eine schlanke Sprache mit niedrigem Abstraktionsgrad

Der Begriff „niedriger Abstraktionsgrad“ ist hier abwertungsfrei zu verstehen: C arbeitet nur mit den grundlegenden Elementen des Computers: Zeichen, Zahlen und Speicheradressen. Es nutzt direkt die hardwareseitig integrierte Rechenlogik, wodurch es extrem schnell ausgeführt wird.

Mit anderen Worten: Im Gegensatz zu vielen anderen Sprachen greift C tief in die inneren Mechanismen des Computers ein – es erlaubt die direkte Verwaltung von Speicheradressen und sogar die Steuerung von Hardwarekomponenten.

Nur wenige eingebaute Funktionen; komplexe Fähigkeiten werden über Bibliotheken realisiert

C bietet keine nativen eingebauten Mittel für Zeichenketten, Arrays, Sammlungen, Dateilesen/-schreiben oder Ein-/Ausgabeoperationen:

Sie können keine gesamte Zeichenkette oder Array in einem einzigen Schritt verarbeiten; nur Strukturen lassen sich als Ganzes kopieren.

Es gibt keine automatische Speicherverwaltung oder Garbage Collection – der Entwickler muss den Speicher manuell reservieren und freigeben.

Es existieren keine fest eingebauten Schlüsselwörter wie read/write; Bildschirmausgabe und Tastatureingabe werden ausschließlich durch Aufruf von Bibliotheksfunktionen realisiert.

C unterstützt nur einfache Single-Thread-Abläufe, keine nativen Mittel für Mehrfachverarbeitung, parallele Vorgänge, Synchronisation oder Coroutinen.

Eine Bibliothek ist einfach eine Sammlung vorgefertigter Funktionen, geschrieben in C oder anderen Sprachen. Entwickler können diese fertigen Funktionen aufrufen, um Funktionen umzusetzen, ohne grundlegende Logiken von Grund auf neu programmieren zu müssen.

Zwar erfordern viele Aufgaben den Aufruf von Bibliotheken, aber die Sprache selbst ist kompakt mit wenigen Regeln. Dadurch ist sie leicht zu erlernen und vollständig verständlich zu beherrschen.

IV. Standardisierung von C: ANSI C (1988)

Eine einheitliche Norm war unbedingt nötig, als C weltweit verbreitet wurde: Zahlreiche Entwickler und Hersteller entwickelten eigene abweichende Varianten der Sprache, sodass Syntax und Verhalten zwischen Plattformen uneinheitlich waren. Ein spezialisiertes Normungsgremium wurde gegründet, um universelle, einheitliche Regeln festzulegen – vergleichbar mit den Normen für USB-Schnittstellen oder Stromsteckdosen.

ANSI = American National Standards Institute

Erläuterung

Das American National Standards Institute ist eine private amerikanische Normungsorganisation. Es erstellt keine Software und schreibt keinen Quellcode, sondern legt einheitliche Spezifikationen für alle Branchen fest: Industrie, Elektronik, Informatik und Programmiersprachen.

Was ist ANSI C?

1983 gründete ANSI einen Ausschuss zur Vereinheitlichung der C-Syntax. Ende 1988 wurde die erste offizielle Sprachspezifikation veröffentlicht, bekannt als ANSI C (auch C89 genannt).

V. Ergänzung zur ANSI-Norm: Die Standardbibliothek

Die Norm führte eine universelle Standardbibliothek ein, die plattformübergreifende Hilfsfunktionen für Dateizugriff, formatierte Ein-/Ausgabe, Speicherreservierung, Zeichenkettenverarbeitung und mehr bereitstellt – nutzbar über standardisierte Header-Dateien.

Die eigentliche C-Sprachsyntax ist bewusst minimal gehalten und deckt nur Grundelemente wie Variablen, Bedingungen, Schleifen, Funktionen und Zeiger ab. Es gibt keine nativen eingebauten Funktionen für Textausgabe, Tastatureingabe, Dateiverwaltung, mathematische Berechnungen oder Zeichenkettenverarbeitung.

Die ANSI-C-Spezifikation definiert eine universelle Sammlung von Hilfsfunktionen, die mit allen Compilern auf allen Betriebssystemen kompatibel sind – diese Werkzeugsammlung heißt die Standardbibliothek.

Um Bibliotheksfunktionen zu nutzen, binden Entwickler Header-Dateien mit der Anweisung #include Dateiname.h ein.

Beispiele:

#include <stdio.h> // Ein-/Ausgabebibliothek: printf (Textausgabe), scanf (Lesen von Benutzereingaben)
#include <stdlib.h> // Speicherreservierung, Programmende, Zufallszahlengenerierung
#include <string.h> // Kopieren und Vergleichen von Zeichenketten
#include <math.h> // Mathematische Funktionen wie sin(), sqrt()Code-Sprache: HTML, XML (xml)

Vor der ANSI-Norm funktionierten Ausgabefunktionen auf UNIX und Windows unterschiedlich, sodass Code beim Wechsel des Betriebssystems Fehler verursachte. Seit Einführung der Standardbibliothek läuft Code wie printf("hallo") unverändert auf Windows, Linux und macOS. Das senkte den Arbeitsaufwand für Entwickler drastisch und beschleunigte die weltweite Verbreitung von C.

Mit welchen Sprachen wurde die Standardbibliothek entwickelt?

Der Großteil der Bibliotheksfunktionen ist in C implementiert, ein kleiner Teil greift auf Assembler und andere Niedrigsprachen zurück.

Funktionen ohne direkte Hardware- oder Betriebssysteminteraktion, wie die Zeichenkettenkopierfunktion strcpy, mathematische Berechnungen oder Speicherkopien, sind nahezu vollständig in reinem C geschrieben.

Vorgänge, die direkt mit Hardware oder dem Betriebssystemkern interagieren, lassen sich nicht allein mit C umsetzen. Hier benötigt man ergänzende Niedrigsprachen, vor allem Assembler.

VI. Portabilität und Typsicherheit

Derselbe Quellcode kann mit geringen oder gar keinen Änderungen auf verschiedenen Betriebssystemen kompiliert und als ausführbare Datei ausgeführt werden.

Nach dem Lesen dieser Einführung sollten Sie ein grundlegendes Verständnis von C erworben haben. Sollten einzelne Konzepte noch unklar sein, machen Sie sich keine Sorgen: Reine Textbeschreibungen sind oft schwer nachvollziehbar. Wir erläutern jedes Thema in den folgenden Kapiteln anhand praktischer Codebeispiele Schritt für Schritt.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert