[xpert.press] moderne c-programmierung || c-quelltexte, c-compiler, programm

4
7 C-Quelltexte, C-Compiler, Programm Ein C-Programm oder C-Projekt besteht aus einer oder mehreren Datei(en) mit der Endung .c, aus der/denen ein C-Compiler eine ausführbare Datei (Executable; oft- mals mit der Endung .exe) erzeugt. Eine C-Datei (manchmal auch C-Modul genannt) wird mit einem beliebigen Text- Editor erstellt und muß gültigen C-Quellkode enthalten. Als C-Modul kann eine C-Datei oder eine durch Inkludierung(en) entstandene Datei- Gruppe bezeichnet werden, die als Resultat eine Objekt-Datei ergibt. Der Aufrufname eines C-Compilers lautet vom Unix-Ursprung her: cc cc ist aber nicht der eigentliche Compiler, sondern nur ein Frontprogramm, das die angegebenen Argumente prüft und die diversen Programme des Entwicklungssy- stems (oft mit vielen zusätzlichen Argumenten) jeweils in der richtigen Reihenfolge korrekt aufruft. Auswahl verschiedener Aufrufnamen: cc Standard unter Unix gcc Gnu/Unix icc Intel/Unix CC C++/Unix bcc Borland/DOS bcc32 Borland/Win32 cl Microsoft/DOS Der eigentliche Name eines Compilers kann beispielsweise acomp lauten, der zuge- hörige Optimierer optim, der Preprocessor cpp, etc. H. Schellong, Moderne C-Programmierung, Xpert.press, DOI 10.1007/978-3-642-40058-2_7, © Springer-Verlag Berlin Heidelberg 2013

Upload: helmut

Post on 13-Dec-2016

223 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: [Xpert.press] Moderne C-Programmierung || C-Quelltexte, C-Compiler, Programm

7

C-Quelltexte, C-Compiler, Programm

Ein C-Programm oder C-Projekt besteht aus einer oder mehreren Datei(en) mit derEndung .c, aus der/denen ein C-Compiler eine ausführbare Datei (Executable; oft-mals mit der Endung .exe) erzeugt.

Eine C-Datei (manchmal auch C-Modul genannt) wird mit einem beliebigen Text-Editor erstellt und muß gültigen C-Quellkode enthalten.

Als C-Modul kann eine C-Datei oder eine durch Inkludierung(en) entstandene Datei-Gruppe bezeichnet werden, die als Resultat eine Objekt-Datei ergibt.

Der Aufrufname eines C-Compilers lautet vom Unix-Ursprung her: cc

cc ist aber nicht der eigentliche Compiler, sondern nur ein Frontprogramm, das dieangegebenen Argumente prüft und die diversen Programme des Entwicklungssy-stems (oft mit vielen zusätzlichen Argumenten) jeweils in der richtigen Reihenfolgekorrekt aufruft.

Auswahl verschiedener Aufrufnamen:

cc Standard unter Unix

gcc Gnu/Unix

icc Intel/Unix

CC C++/Unix

bcc Borland/DOS

bcc32 Borland/Win32

cl Microsoft/DOS

Der eigentliche Name eines Compilers kann beispielsweise acomp lauten, der zuge-hörige Optimierer optim, der Preprocessor cpp, etc.

H. Schellong, Moderne C-Programmierung, Xpert.press,DOI 10.1007/978-3-642-40058-2_7, © Springer-Verlag Berlin Heidelberg 2013

Page 2: [Xpert.press] Moderne C-Programmierung || C-Quelltexte, C-Compiler, Programm

44 7 C-Quelltexte, C-Compiler, Programm

Ein beispielhafter Aufruf eines Borland-Compilers:

bcc datei.c

erzeugt eine ausführbare Datei: datei.exeMittels Option -e kann der Name abweichend von *.exe bestimmt werden.

Unter Unix:

cc -odatei datei.c

erzeugt eine ausführbare Datei: datei

Obenstehender Aufruf veranlaßt vier Arbeitsschritte:

Programm Datei-Endung1. C-Preprocessor → .i2. C-Compiler(+Optimierer) → .s/.asm3. Assembler → .o/.obj4. Linker → .exe/.com (oder ohne .eee)

cc kann mittels Optionen so gesteuert werden, daß von hinten gesehen (Linker) einoder zwei oder drei oder alle vier Arbeitsschritte unterlassen werden. Dadurch kannsehr flexibel mit dem Entwicklungssystem gearbeitet werden. Insbesondere funktio-niert auch folgender Aufruf:

cc -O1 -oabc abc1.o abc2.s abc.c -lm

Hier wird abc.c kompiliert und optimiert,eine Exe (abc) erzeugt,abc1.o wird nur vom Linker verarbeitet,abc2.s nur vom Assembler und danach vom Linker,und nur abc.c wird von allen Programmen bearbeitet.Mit -lm wird die Mathe-Library (z. B. /lib/libm.a) dazugelinkt (Die daraus be-nötigten Funktionen).

Die Compiler-Optionen -P oder -E, -S, -c bewirken, daß jeweils nur derPreprocessor → .i,Preprocessor + Compiler → .s oderPreprocessor + Compiler + Assembler → .o arbeiten.Eine Option -syntax (oder ähnlich) ermöglicht bei manchen Compilern, daß nureine Syntax-Prüfung der C-Quelle (datei.c) vorgenommen wird.

Page 3: [Xpert.press] Moderne C-Programmierung || C-Quelltexte, C-Compiler, Programm

7 C-Quelltexte, C-Compiler, Programm 45

Verschiedene Kodierung + Compiler-Vergleich:

Der nachfolgende Kode zeigt zwei verschiedene Lösungsvarianten einer Funktionmit vollkommen identischem Algorithmus. Dadurch soll aufgezeigt werden, wieverschieden ein und dasselbe Problem gelöst werden kann, und wie verschiedeneCompiler darauf reagieren.

int Input(int ityp){register int c;while ( PSnu=0, c= List(ityp), ityp&ITYP_I?++KDOnu:0,

!O[’t’] &&(c<EoF||(ityp&ITYP_I)&&(c>ADD+8&&(!(G.ityp&ITYP_P)||c!=rETURN)||c==EoF&&(O[’I’]|O[’P’])&&(write(2,"Benutze exit" NL,13+NLSZ),--KDOnu, 1))

) );return c;

}

int Input(int ityp){register int c;while ( PSnu=0, c=List(ityp), 1 ) {if (ityp&ITYP_I) ++KDOnu;if ( O[’t’]) break;if ( c>=EoF) {if ( !(ityp&ITYP_I) ) break;if ( c<=ADD+8 || (G.ityp&ITYP_P) && c==rETURN ) {if ( c!=EoF || !(O[’I’]|O[’P’]) ) break;write(2, "Benutze exit" NL, 13+NLSZ);--KDOnu;

}}

}return c;

}

Der Compiler icc von Intel hat als einziger diese beiden Varianten zu vollkom-men identischem Kode kompiliert. Das heißt, die beiden Objektdateien waren gleichgroß und ein byte-weiser Vergleich ergab, daß die Inhalte der beiden Resultatdatei-en vollkommen identisch waren. Das beweist, daß der Intel-Compiler konzeptionellvorzüglich entwickelt wurde.

Andere Compiler hatten um bis zu 60 % unterschiedlich große Dateien produziert.

Page 4: [Xpert.press] Moderne C-Programmierung || C-Quelltexte, C-Compiler, Programm

46 7 C-Quelltexte, C-Compiler, Programm

Test-Schleife: (� 178, 56)

while (--sz >= 0) e[sz]= vla[sz];

Compiler gcc 3.4.3:

dec edx # szjs .L6.p2align 2

.L4:movzx eax, BYTE PTR [esp+edx] # vlamov BYTE PTR e[edx], al # edec edx # szjns .L4

.L6:

Compiler icc 8.1:

lea -1(edx), eaxtestl eax, eaxjl ..B1.9

..B1.2:lea -1(edx), edxcmpl $6, edxjl ..B1.7

..B1.4:movzbl (esp,eax), edxmovzbl -1(esp,eax), ecxmovb dl, e(eax)movzbl -2(esp,eax), edxmovb cl, e-1(eax)movb dl, e-2(eax)movzbl -3(esp,eax), edxmovb dl, e-3(eax)movzbl -4(esp,eax), edxmovb dl, e-4(eax)addl $-5, eaxcmpl $6, eaxjge ..B1.4

..B1.7:movzbl (esp,eax), edxmovb dl, e(eax)decl eaxtestl eax, eaxjge ..B1.7

..B1.9:

Der icc von Intel teilt die Schleife in einen 5er-Pulk und Einzel-Kopie auf. Dergcc (Gnu) wertet das Sign-Flag durch dec aus und aligned die Schleife. Der icc hatu. a. das Pragma #pragma loop count (#), damit er zur Kompilierzeit die realenVerhältnisse berücksichtigen kann.