See also ebooksgratis.com: no banners, no cookies, totally FREE.

CLASSICISTRANIERI HOME PAGE - YOUTUBE CHANNEL
Privacy Policy Cookie Policy Terms and Conditions
C (Programmiersprache) – Wikipedia

C (Programmiersprache)

aus Wikipedia, der freien Enzyklopädie

C
Paradigmen: imperativ, strukturiert
Erscheinungsjahr: 1972
Entwickler: Dennis Ritchie & Bell Labs
wichtige Implementierungen: GCC, MSVC, Borland C, Portland Group, Intel
Einflüsse: B (BCPL,CPL), ALGOL 68, Assembler
Beeinflusste: awk, C++, C#, Objective-C, D, Java, JavaScript, Perl, PHP

C ist eine imperative Programmiersprache, welche Dennis Ritchie in den frühen 1970er Jahren an den Bell Laboratories für das Betriebssystem Unix entwickelte. Seitdem ist es auf vielen Computer-Systemen verbreitet. Die Anwendungsbereiche von C sind universell. Es wird zur System- und Anwendungsprogrammierung eingesetzt. Die grundlegenden Programme aller Unix-Systeme und die Systemkerne vieler Betriebssysteme sind in C programmiert. Zahlreiche Sprachen, wie C++, Objective-C, C#, Java, PHP oder Perl orientieren sich an der Syntax und anderen Eigenschaften von C.

Inhaltsverzeichnis

[Bearbeiten] Überblick

C ist eine Programmiersprache, die auf fast allen Computersystemen zur Verfügung steht. Sie zählt zu den sogenannten prozeduralen Programmiersprachen. Um den Wildwuchs zahlreicher Dialekte einzudämmen, wurde C (wie andere Programmiersprachen auch) mehrfach standardisiert (C89, C95, C99, ISO-C). Abgesehen vom Mikrocontrollerbereich, wo eigene Dialekte existieren, sind die meisten aktuellen PC-/Server-Implementierungen eng an den Standard angelehnt; eine vollständige Implementation aktueller Standards ist (wie in anderen Programmiersprachen auch) aber selten. In den meisten C-Systemen mit Laufzeitumgebung steht auch die genormte Standard C Library zur Verfügung. Dadurch können C-Programme, die keine sehr hardwarenahe Programmierung enthalten, in der Regel gut auf andere Zielsysteme portiert werden. Konzeptionell ist C auf einfache Kompilierbarkeit ausgelegt. Die Compiler erzeugen in der Regel aber auch nur wenig Code zur Gewährleistung der Sicherheit zur Laufzeit der Programme.
Die Verbreitung von C ist hoch, und viele Programmierschnittstellen für Anwendungsprogramme werden in Form von C-Schnittstellen implementiert. Grundkenntnisse der C-Programmierung sollte daher jeder Programmierer besitzen.

[Bearbeiten] Eigenschaften

  • C ermöglicht direkte Speicherzugriffe und sehr hardwarenahe Konstrukte. Es eignet sich daher gut zur Systemprogrammierung. Sollen Programme portierbar sein, dann sollte von diesen Möglichkeiten aber möglichst wenig Gebrauch gemacht werden.
  • Die Flexibilität von C beruht unter anderem darauf, dass nur sehr eingeschränkt Prüfungen zu Speicherzugriffen, Variablentyp, Stacknutzung und ähnlichem durchgeführt werden. Dadurch können die Compiler (anders als z. B. in Pascal) nur sehr eingeschränkt bei der Fehlersuche helfen. Aus dem gleichen Grund ist C für sicherheitskritische Anwendungen (Medizintechnik, Verkehrsleittechnik, Raumfahrt) wenig geeignet.
  • Historisch bedingt existieren in C einige mehrdeutige Konstruktionen. So wird z. B. x=−1 von alten Compilern einmal als die Zuweisung x=(−1) oder als x=x-1 interpretiert. Die Mehrdeutigkeit existiert auch für andere zusammengesetzte Operatoren und lässt sich durch Einfügung eines Leerzeichens vermeiden: x= −1. Die Standardisierung umgeht dieses Problem (statt =- schreibt sie -= vor), so dass die alte Schreibweise nur aus Kompatibilitätsgründen von einigen Compilern beibehalten wird.
  • C enthält einige sicherheitskritische Funktionen; so überschreibt z. B. gets() fremde Speicherbereiche, wenn es auf eine unpassende (zu lange) Eingabe stößt. Der Fehler ist innerhalb von C weder bemerk- noch abfangbar. Um den großen Vorteil von C – die Existenz zahlreicher älterer Quellcodes – nicht zu verlieren, unterstützen auch aktuelle Compiler diese und ähnliche Funktionen.
  • Historisch bedingt existieren in C keine Funktionen zur positionierten Ausgabe. Es existieren jedoch zahlreiche Bibliotheken, die für das jeweilige Zielsystem eine solche Ausgabe ermöglichen.
  • C verwendet im Quellcode einige Sonderzeichen (z. B. {, |, &), die in der Vergangenheit nicht auf allen Zielsystemen zur Verfügung standen. Dies hat dazu geführt, dass C sich auf jenen Systemen nicht verbreiten konnte. C bietet zwar eine Alternativschreibweise über Trigraphen, welche jedoch die Lesbarkeit des Quelltextes enorm verschlechtert.
  • Eine Modularisierung in C erfolgt auf Dateiebene. Eine Datei bildet eine Übersetzungseinheit; intern benötigte Funktionen und Variablen können so vor anderen Dateien verborgen werden. Die Bekanntgabe der öffentlichen Funktionsschnittstellen erfolgt mit sogenannten Headerdateien. Damit verfügt C über ein schwach ausgeprägtes Modulkonzept.[1][2]

Die Programmiersprache C wurde mit dem Ziel entwickelt, eine echte Sprachabstraktion zur Assemblersprache zu implementieren. Es sollte eine direkte Zuordnung zu wenigen Maschineninstruktionen geben, um die Abhängigkeit von einer Laufzeitumgebung zu minimieren. Als Resultat dieses Designs ist es möglich, C-Code auf einer sehr hardwarenahen Ebene zu schreiben, analog zu Assemblerbefehlen. Die Portierung eines C-Compilers auf eine neue Prozessorplattform ist, verglichen mit anderen Sprachen, wenig aufwändig. Der freie GNU-C-Compiler (gcc) ist beispielsweise für eine Vielzahl unterschiedlicher Prozessoren und Betriebssysteme verfügbar. Für den Entwickler bedeutet dies, dass unabhängig von der Zielplattform fast immer auch ein C-Compiler existiert. C unterstützt damit wesentlich die Portierbarkeit von Programmen (sofern der Programmierer auf Assemblerteile im Quelltext und/oder hardwarespezifische C-Konstrukte verzichten kann). Bei Microcontrollern ist C die mit Abstand am häufigsten verwendete Hochsprache.

[Bearbeiten] Geschichte

Die Entwicklung von C ist von der Programmiersprache B beeinflusst, welche Ken Thompson entwickelt hat.

Die Sprachbeschreibung wurde 1972 erstmals publiziert. Im Jahre 1989 wurde die Sprache erstmals standardisiert (C89). Dieser Standard wurde überarbeitet, und 1999 erschien dann der internationale Standard ISO/IEC 9899:1999, der als C99 bekannt ist.

Hauptartikel: Varianten der Programmiersprache C

[Bearbeiten] Sprachdesign

Ein C-Programm wird durch den sogenannten Linker oder Binder aus Objektcode zum ausführbaren Computerprogramm gebunden. Dabei können mehrere Objektcodedateien zu einem Programm zusammengefasst werden. Die Objektcodedateien ihrerseits werden durch den Compiler aus Textdateien erzeugt (übersetzt), die eine Anzahl Funktions- und Variablendefinitionen enthalten. Neben Programmen kann man aber auch noch Bibliotheken erstellen. Diese werden ähnlich wie Programme gebunden oder zu einem Archiv zusammengefasst. Diese Bibliotheken können dann in einem späteren Bindevorgang wiederum zu einem Programm hinzugebunden werden. Auf diese Weise kann man verhindern, dass für jedes zu erzeugende Programm unzählige (in größeren Systemen durchaus hunderte bis tausende) unveränderliche Objektcodedateien immer wieder erneut gebunden werden müssen.

Das Design der Programmiersprache, die Technik des Linkens und verschiedene zu festen Sprachelementen gewordene Funktionen und Festlegungen sind eng mit dem Design Unix-artiger Betriebssysteme verbunden, so die Art und Weise der Signalbearbeitung, die Ein- und Ausgabe mit Standard-Datenströmen (Streams) und das Verfahren des Startens und Beendens eines Programms.

[Bearbeiten] Hallo-Welt-Programm in C

Der folgende Quelltext stellt ein einfaches C-Programm dar, das die Textzeile Hallo Welt!, gefolgt von einem Zeilenumbruch, ausgibt. Dieses Beispiel folgt den Vorgaben des ANSI-C Standards; andere Versionen dieses Programms sind im Artikel Hallo-Welt-Programm beschrieben.

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    printf("Hallo Welt!\n");
    return EXIT_SUCCESS;
}   /* end main() */

[Bearbeiten] Erläuterungen

In der ersten Zeile ermöglicht die Präprozesseranweisung #include <stdio.h> die spätere Verwendung von Funktionen aus der Ein-/Ausgabe-Bibliothek stdio (auch „standard-input/output“ genannt). Diese include-Anweisung veranlasst den Präprozesser, vor der Übersetzung die Headerdatei stdio.h in den Quelltext zu kopieren, die unter anderem eine Deklaration der weiter unten verwendeten Ausgabefunktion printf enthält. In der zweiten Zeile wird die Headerdatei stdlib.h eingebunden, die anstatt eines festen numerischen Werts die symbolische Konstante EXIT_SUCCESS definiert, damit die erfolgreiche Programmausführung dem Aufrufer plattformunabhängig signalisiert werden kann (siehe Zeile 7 des Programms). Include-Anweisungen können zwar an jeder Stelle im Quelltext eingefügt werden, meist werden sie jedoch an den Anfang eines Programmtextes gestellt, um so die Übersichtlichkeit zu erhöhen.

In der vierten Zeile beginnt das eigentliche Programm mit der Definition der Funktion main. Sie ist die Einstiegsfunktion eines C-Programms. main wird automatisch als erste Funktion aufgerufen. Anfang und Ende der Funktion main werden durch die beiden geschweiften Klammern markiert.

Die erste Anweisung innerhalb der Funktion main ruft die Funktion printf auf. Die zweite Anweisung ist die Sprunganweisung return EXIT_SUCCESS;. Diese legt den Rückgabewert von main fest. Damit wird der „Erfolgsstatus“ des ausgeführten Programms zum Ausdruck gebracht. Der Wert EXIT_SUCCESS bedeutet hier fehlerfreie Ausführung.

In der letzten Zeile folgt auf die schließende geschweifte Klammer ein Kommentar, eingeschlossen durch die Zeichenfolgen /* und */. Kommentare werden bei der Übersetzung ignoriert; sie sind erster Linie für den menschlichen Leser gedacht, können aber auch von automatischen Software-Dokumentationswerkzeugen ausgewertet werden.

[Bearbeiten] Programmieren in C

Bei der Programmierung in C ist die Kenntnis und Unterscheidung folgender Konzepte hilfreich:

  • Lexikalische Struktur und Grammatik.
  • Funktionen der Standardbibliothek; sie stehen in der Regel bei standard-konformen Implementationen zur Verfügung; Programme, welche sich auf diese Funktionen beschränken, sind relativ portabel, d. h. sie können ohne größere Änderungen auch auf anderen Implementationen übersetzt und ausgeführt werden. Wegen der Hardwarenähe der Programmiersprache können manche Sprachkonstrukte (z.B. Bitmasken oder Zeigerarithmetik) zu Annahmen über die Byte-Reihenfolge oder Wortbreite führen, was die Portabilität auf andere Prozessoren einschränkt.
  • Funktionen außerhalb der Standardbibliothek, wie z. B. Betriebssystemfunktionen und Grafikfunktionen. Programme, die diese Bibliotheken verwenden, sind nur bedingt portabel.
  • Die Erweiterungen der lexikalischen Struktur und Grammatik.

Die Voreinstellungen fast aller Implementationen beinhalten wesentlich mehr als vom Sprachstandard gefordert. Oft lässt sich eine Implementation durch geeignete Optionen dazu bringen, nur die Standard-Funktionen sichtbar zu machen.

[Bearbeiten] Die Standardbibliothek

Die C-Standardbibliothek ist integraler Bestandteil einer gehosteten C-Implementation. Sie enthält u. a. Makros und Funktionen, welche mittels der Standard-Headerdateien verfügbar gemacht werden. Auf freistehenden Implementationen dagegen kann der Umfang der Standardbibliothek eingeschränkt sein.

[Bearbeiten] Verwendung

Das Haupteinsatzgebiet von C liegt in der Systemprogrammierung, einschließlich der Erstellung von Betriebssystemen und die Programmierung von eingebetteten Systemen. Der Grund liegt in der Kombination von erwünschten Charakteristiken wie Portabilität und Effizienz mit der Möglichkeit Hardware direkt anzusprechen, Type punning zu betreiben und dabei niedrige Anforderungen an die Laufzeitumgebung zu haben.

C wird auch oft dazu benutzt Endbenutzer-Programme zu erstellen.

Wegen der großen Verbreitung von C werden Compiler, Programmbibliotheken und Interpreter anderer höherer Programmiersprachen (wie zum Beispiel die JVM) oft in C implementiert.

C wird als Zwischensprache einiger Implementationen höherer Programmiersprachen verwendet. Dabei wird diese zuerst selbst in C übersetzt, welches dann kompiliert wird. Dieser Ansatz wird entweder dazu verwendet die Portabilität zu erhöhen (C-Compiler existieren für nahezu jede Plattform) oder aus Bequemlichkeit, da kein maschinenspezifischer Codegenerator entwickelt werden muss.
Einige Compiler, die C auf diese Art und Weise benutzen sind EiffelStudio, Esterel, Gambit, der Glasgow Haskell Compiler, einige Lisp-Compiler, Lush, Sather, Squeak und Vala.

C wurde als Programmiersprache und nicht als eine Zielsprache für Compiler entworfen. Es ist daher eine eher schlechte Zwischensprache. Dies führte zu C-basierten Zwischensprachen wie C--.

Auch wird C oft für die Erstellung von Anbindungen (z. B. JNI) genutzt.

[Bearbeiten] Einzelnachweise

  1. Scheler, Stilkerich, Schröder-Preikschat: Komponenten/Module (PDF)
  2. Bertrand Meyer: Objektorientierte Softwareentwicklung. Hanser, Wien, München; Prentice Hall Internat. 1990, S. 406 ISBN 3-446-15773-5.

[Bearbeiten] Literatur

[Bearbeiten] Weblinks

Wikibooks
 Wikibooks: C-Programmierung – Lern- und Lehrmaterialien


aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -