26.07.2013 Aufrufe

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 ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!