Einführung in die Programmiersprache C - Ein paar Worte zu C ...
Einführung in die Programmiersprache C - Ein paar Worte zu C ...
Einführung in die Programmiersprache C - Ein paar Worte zu C ...
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
E<strong>in</strong>heit<br />
<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C<br />
E<strong>in</strong> <strong>paar</strong> <strong>Worte</strong> <strong>zu</strong> C: Geschichte, Standards, Eigenschaften<br />
Kurs C/C++ Programmierung, WS 2008/2009<br />
Dipl.Inform. R. Spurk<br />
Arbeitsgruppe „Programmierung“<br />
FR 6.2 Informatik<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 1 / 11
K&R-C<br />
Heute gültige C Standards<br />
E<strong>in</strong>stiegs<strong>in</strong>fo: z.B. Varianten der <strong>Programmiersprache</strong> C (Wikipedia)<br />
☞ http://de.wikipedia.org/wiki/Varianten_der_<br />
<strong>Programmiersprache</strong>_C<br />
• K&R-C: . . . <strong>die</strong> Variante, wie sie ursprünglich von den C-Erf<strong>in</strong>dern Brian<br />
W. Kern<strong>in</strong>ghan verfasst wurde<br />
☞ De-facto-Standard ☞ Dokument: 1te Auflage ihres Buches The C<br />
Programm<strong>in</strong>g Language (1978)<br />
• Phase: Weiterverbreitung von C mit Unix ( C Compiler Bestandteil von<br />
Unix (Quellen)), aber auch Ablösung als eigenständiger Compiler. ➩<br />
Dialektbildung ➩ Problem: ger<strong>in</strong>ger werdende Portabilität ➩<br />
Softwarehersteller fordern Normung von C ➩ 1983 Normungs-Beg<strong>in</strong>n<br />
unter ANSI Kommittee X3J11<br />
☞ Ziel, e<strong>in</strong>e „e<strong>in</strong>deutige und masch<strong>in</strong>enunabhängige Def<strong>in</strong>ition der<br />
Sprache C“ <strong>zu</strong> erarbeiten.<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 2 / 11
C89 + C90 „ANSI C“<br />
Heute gültige C Standards<br />
• 1989: Norm ANSI X3.159-1989 Programm<strong>in</strong>g Language C wird<br />
verabschiedet: C89<br />
• 1990: C89 + kle<strong>in</strong>ere Änderungen von der ISO als ISO/IEC 9899:1990<br />
Norm übernommen: C90<br />
☞ bisherige de-facto Eigenschaften genormt, Unklarheiten beseitigt,<br />
aber auch neue Sprachmittel e<strong>in</strong>geführt: z.B.<br />
• Funktions-Prototypen,<br />
• leistungsfähiger Präprozessor,<br />
• neue Schlüsselwörter const, volatile, signed;<br />
• Funktionsumfang sowie Verhalten der Funktionen der <strong>zu</strong> C gehörigen<br />
Bibliotheken normiert;<br />
☞ ANSI/ISO C Standard-Bibliothek: „<strong>die</strong> C Lib“<br />
H<strong>in</strong>weis: GNU Compiler Collection: Standard C Lib ist Bestandteil der glibc<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 3 / 11
Heute gültige C Standards<br />
C95, e<strong>in</strong>e Erweiterung <strong>zu</strong> C90<br />
• Def<strong>in</strong>ition von Standard-Makros <strong>zu</strong>r alternativen Schreibweise von<br />
Operatoren wie z.B. and statt &&;<br />
• Def<strong>in</strong>ition des Standard-Makros __STDC_VERSION__, das durch den<br />
Compiler vor e<strong>in</strong>em Compilierunglauf gesetzt wird/ist, wenn er auf<br />
C90-Standard-Kompatibilität überprüft<br />
• h<strong>in</strong><strong>zu</strong>gefügt: Digraphen;<br />
• verbesserte Unterstüt<strong>zu</strong>ng für Multibyte- und „wide character“-<br />
Zeichensätze <strong>in</strong> <strong>die</strong> C-Bibliotheken;<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 4 / 11
Heute gültige C Standards<br />
C99 (e<strong>in</strong>schl. 3 technischer Korrekturen 2001, 2004 und 2007) „ISO C“<br />
• e<strong>in</strong>ige aus C++ bekannte Erweiterungen nun <strong>in</strong> C;<br />
• Erweiterung: Ganzzahl-Typen um e<strong>in</strong>en m<strong>in</strong>destens 64-Bit breiten Typ<br />
long long;<br />
• Erweiterung: Ganzzahl-Typen um Typen mit vorgegebener M<strong>in</strong>destbreite<br />
wie z.B. <strong>in</strong>t8_t oder u<strong>in</strong>t32_t;<br />
• lokale Felder variabler Größe;<br />
• e<strong>in</strong> boolscher Datentyp _Bool<br />
• Alias-freie Zeiger (Schlüsselwort restrict);<br />
• <strong>in</strong>nerhalb e<strong>in</strong>es Blockes frei plazierbare Deklaration e<strong>in</strong>es Bezeichners<br />
(☞ <strong>in</strong> C90 nur am Blockanfang);<br />
• Inl<strong>in</strong>e-Funktionen (Schlüsselwort <strong>in</strong>l<strong>in</strong>e)<br />
• Verbot des „impliziten <strong>in</strong>t“ sowie Verbot impliziter<br />
Funktionsdeklarationen.<br />
• als Zeilenkommentar nun // <strong>zu</strong>gelassen (wie <strong>in</strong> C++);<br />
• verbesserte Unterstüt<strong>zu</strong>ng für Internationale Zeichensätze;<br />
• . . .<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 5 / 11
Vorteile durch Nut<strong>zu</strong>ng der ANSI/ISO C Standards<br />
Vorteile durch ANSI/ISO C Standards (1)<br />
• C Programm, das <strong>die</strong> von C99 vorgegebenen Vorschriften e<strong>in</strong>hält:<br />
wird C99 kompatibel genannt.<br />
• Eigenschaft C99 kompatibler C Programme: ➞ leichter (C99-) portierbar<br />
☞ D.h. ohne größere Änderungen von e<strong>in</strong>em anderen C99-Compiler auf<br />
e<strong>in</strong>er anderen Masch<strong>in</strong>e <strong>in</strong> e<strong>in</strong>e ablauffähige Version übersetzbar.<br />
• C-Standards zw<strong>in</strong>gen ke<strong>in</strong>en Hersteller, C-Compiler <strong>zu</strong> entwickeln, <strong>die</strong><br />
nur Standard-gemäße Programme übersetzen:<br />
☞ gcc der GNU Compiler Collection akzeptiert e<strong>in</strong>e Unmenge an<br />
C-Spracherweiterungen, <strong>die</strong> nicht den C-Standards entsprechen:<br />
z.B. geschachtelte C-Funktionen, Arithmetik auf void-Po<strong>in</strong>ter und<br />
Funktions-Po<strong>in</strong>ter, . . .<br />
(http://gcc.gnu.org/onl<strong>in</strong>edocs/gcc-4.3.2/gcc/C-Extensions.<br />
html#C-Extensions)<br />
• Nicht portabel programmiert: Hardware-nahe bzw.<br />
Betriebssystem-spezifische Zugriffe;<br />
z.B. bei Aufruf der zwar POSIX-konformen C-Funktion <strong>in</strong>t fork(), weil <strong>die</strong>se nicht<br />
<strong>in</strong> standardisierten C-Bibliothek enthalten ist.<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 6 / 11
C-Standards „legen sich nicht fest“ für alle korrekte C-Sprachkonstruktionen<br />
ANSI/ISO C Standards lassen e<strong>in</strong>iges offen (1)<br />
Das Verhalten bestimmter korrekter C-Sprachkonstruktionen, etwa x/0, ist<br />
durch den Standard nicht festgelegt.<br />
Der Standard unterscheidet aber zwischen:<br />
1 implementierungsabhängigem Verhalten;<br />
2 unspezifiziertem Verhalten;<br />
3 undef<strong>in</strong>iertem Verhalten;<br />
Implementierungsabhängiges Verhalten (für korrekte C-Konstruktion):<br />
• Ergebnis des C-Programms unterscheidet sich von Compiler <strong>zu</strong><br />
Compiler;<br />
• Ergebnis muss vom Compiler-Hersteller festgelegt und <strong>in</strong> begleitender<br />
Compiler-Beschreibung dokumentiert se<strong>in</strong>;<br />
☞ Ergebnis ke<strong>in</strong>esfalls <strong>zu</strong>fällig;<br />
• Beispiel: Verhalten der Bitschiebe-Operation >>, angewendet auf<br />
negative <strong>in</strong>t-Werte:<br />
☞ 2 Alternativen:<br />
• l<strong>in</strong>kes Nachziehen von Nullen („logischer Rechts-Shift“)<br />
• l<strong>in</strong>kes Nachziehen von E<strong>in</strong>sen („arithmetischer Rechts-Shift“)<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 7 / 11
C-Standards „legen sich nicht fest“ für alle korrekte C-Sprachkonstruktionen<br />
ANSI/ISO C Standards lassen e<strong>in</strong>iges offen (2)<br />
Unspezifiziertes Verhalten (für korrekte C-Konstruktion):<br />
• Compiler-Hersteller muss sich für bestimmtes Verhalten entscheiden;<br />
• <strong>die</strong>ses Verhalten muss aber nicht dokumentiert werden;<br />
• Ist f Funkion mit 2 <strong>in</strong>t Parameter, so ist für korrektes Programmstück<br />
b=10; f(b*=3, b+=200);<br />
durch den Standard nicht festgelegt, ob f(30,230) oder f(630,210)<br />
aufgerufen wird.<br />
Undef<strong>in</strong>iertes Verhalten (für korrekte C-Konstruktion):<br />
• es lässt sich nicht voraussagen, welches Verhaltens-Resultat e<strong>in</strong>tritt;<br />
• Beispiel: für den Div-Operator / ist im C-Standard das Verhalten bei<br />
Division durch 0 nicht festgelegt: sogar undef<strong>in</strong>iert.<br />
Möglichkeiten e<strong>in</strong>es Ergebnisses: u.v.<br />
• Programm ignoriert fehlerhafte Division durch 0 und liefert e<strong>in</strong><br />
nicht-def<strong>in</strong>iertes, fehlerhaftes Ergebnis <strong>zu</strong>rück, z.B. Wert 0;<br />
• Programm „stürzt ab“ (zwangsweise Beendigung durch BS);<br />
• Computer „stürzt ab“ (zwangweise Reboot durch Prozessor) und Daten s<strong>in</strong>d<br />
gelöscht;<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 8 / 11
C-Standards „legen sich nicht fest“ für alle korrekte C-Sprachkonstruktionen<br />
Praxis:<br />
• Zur Zeit aktuell: C99 + TC1/2001, TC2/2004, TC3/2007<br />
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf<br />
• z.B. Eigenschaften gcc vs Normungen C89/C90/C99 ? :<br />
• ☞ http://gcc.gnu.org/gcc-4.3/c99status.html<br />
• wohl <strong>die</strong> meisten Neuerungen von C99 im GNU C-Compiler implementiert<br />
(fast alle).<br />
• gcc-Compiler-Optionen für Standard-bezogene<br />
Überset<strong>zu</strong>ngen/Überprüfungen:<br />
• -ansi oder -std=c89 : C89 + GNU C Spracherweiterungen, welche nicht<br />
gegen C89 verstoßen<br />
• allgeme<strong>in</strong> -std=... : Festlegung bzgl. Standards; etwa -std=c99<br />
• . . .<br />
• Wie oben schon erwähnt:<br />
gcc besitzt e<strong>in</strong>e Unmenge an C-Spracherweiterungen,<br />
☞ viele e<strong>in</strong>gesetzt: L<strong>in</strong>uxkern-Implementierung<br />
➞ wie <strong>in</strong> „Ur-Zeiten von Unix und C“: L<strong>in</strong>uxkern ↔ gcc C-Erweiterungen!<br />
• Welche Compiler erfüllen welche Norm ? Wen es <strong>in</strong>teressiert?<br />
☞ http://clc-wiki.net/wiki/C_resources:Compilers<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 9 / 11
Eigenschaften der Programmierspache C<br />
Eigenschaften der Programmierspache C (1)<br />
E<strong>in</strong>e Art „Super-Assembler“<br />
☞ Synthese aus höherer und masch<strong>in</strong>ennaher <strong>Programmiersprache</strong>:<br />
• Konstrukte e<strong>in</strong>er höheren <strong>Programmiersprache</strong>:<br />
Niveau: ➞ Unterstüt<strong>zu</strong>ng für „Strukturierte Programmierung“ (1970er Jahre!):<br />
• Sequenz, Wiederholung, Auswahl (☞ goto-lose Programmierung)<br />
• Datentypkonzept:<br />
e<strong>in</strong>fache Datentypen; <strong>zu</strong>sammengesetzte, problemanpassbare Typen;<br />
• Funktionen mit Parameterübergabe<br />
• masch<strong>in</strong>ennahe Sprachkonstrukte:<br />
• direkter Zugriff <strong>zu</strong> Speicherstellen mittels Zeiger + Adress-Arithmetik;<br />
• Register-Variable, Volatile-Variable, Statische-Variable <strong>in</strong>nerhalb von<br />
Funktionen;<br />
• direkte Manipulation e<strong>in</strong>zelner Bits:<br />
➝ Operatorn für Bitmanipulationen;<br />
➝ Def<strong>in</strong>ition e<strong>in</strong>zelner Bits und Bitgruppen <strong>in</strong>nerhalb von Masch<strong>in</strong>enworten<br />
und Zugriff auf <strong>die</strong>se;<br />
➝ Zeiger-Variablen über Funktionstypen ➞ Aufruf von Funktionen über<br />
Zeiger(-Variable); ( ☞ z.B. Belegung e<strong>in</strong>er Interrupt-Tabelle)<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 10 / 11
Eigenschaften der Programmierspache C<br />
Eigenschaften der Programmierspache C (2)<br />
• C-Quellprogramm trotz masch<strong>in</strong>ennähe portable<br />
• Unterstüt<strong>zu</strong>ng für getrennte Überset<strong>zu</strong>ngse<strong>in</strong>heiten ☞ modulare<br />
Programmierung großer Programmierprojekte;<br />
• Sprachumfang von C kle<strong>in</strong> (z.B. wenig Schlüsselwörter) und<br />
übersichtlich;<br />
• C-Quellprogramme lassen sich sehr kompakt schreiben<br />
☞ Gefahr: schlechte Lesbarkeit, Fehleranfällig;<br />
• ke<strong>in</strong>e vordef<strong>in</strong>ierten Funktionen, z.B. für E<strong>in</strong>gabe/Ausgabe, <strong>in</strong> der<br />
Sprache selbst e<strong>in</strong>gebaut; dafür: Standard-Bibliothek („C-Lib“);<br />
• C-Compiler erzeugen i.a. relativ kompakten und schnellen Objekt-Code;<br />
i.a. e<strong>in</strong> effizienter Zugang <strong>zu</strong>r Assembler-Ebene möglich (z.B.<br />
asm-Inl<strong>in</strong>e-Funktion des gcc)<br />
• C: „ aus der Praxis entstandene und für <strong>die</strong> Praxis geschaffene Sprache“:<br />
• ger<strong>in</strong>gere Exaktheit <strong>in</strong> der Sprachdef<strong>in</strong>ition<br />
• ke<strong>in</strong>e strenge Typkonsistenz (vielfältige automatische Typkonvertierungen,<br />
<strong>die</strong> leicht übersehen werden können, bzw. deren Auswirkungen nicht<br />
bedacht werden);<br />
• vielfältige Fehlermöglichkeiten, <strong>die</strong> vom Compiler nicht erkannt werden.<br />
• ☞ C ist e<strong>in</strong>e Sprache für erfahrene Programmierer, nicht für den Anfänger!<br />
Nach der Philosophie: „Programmierer wissen, was sie tun“.<br />
R. Spurk (Informatik) <strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>die</strong> <strong>Programmiersprache</strong> C WS08/09 11 / 11