CS107 C programok fordítása a GCC-vel

Az írás szerzője Chris Gregg, a módosításokat Nick Troccoli végezte

Kattints ide az útmutató videóért.

A CS107-ben használt fordító a “GNU Compiler Collection” (gcc). Ez az egyik legszélesebb körben használt fordítóprogram, amely egyrészt szabad szoftver, másrészt számos különböző számítástechnikai platformon elérhető.

gcc elvégzi a fordítási lépést a program összeállításához, majd más programokat hív meg a program összeállításához és a program összetevőinek összekapcsolásához egy futtatható programmá, amelyet futtathatunk. Mindegyik lépésről tanulni fogunk egy kicsit a CS107 során, de az a szép dolog, hogy a gcc egyetlen paranccsal elő tudja állítani számodra a teljes futtatható (futtatható) programot.

A CS107 során túlnyomórészt Makefile-okat fogunk használni a kódunk lefordítására, összerakására és összekapcsolására, de a Makefile a gcc-t futtatja, hogy elvégezze a munkát. This is just a quick overview on how to compile and run your own programs should you decide to do so without a Makefile.

The simplest way to run gcc is to provide gcc a list of .c files:

$ gcc hello.c$

Note that you do not put header files (.h) into the gcc command: it reads in the header files as it compiles, based on the #include statements inside .c files.

If the program compiled without errors or warnings, you don’t get any output from gcc, and you will have a new file in your directory, called a.out. To run this file, you need to tell the shell to run the file in the current directory, by using ./ before the name:

$ ./a.outHello, World!$

Általában nem akarjuk, hogy a programjainkat a.out nevezzük, ezért megadhatunk egy gcc opciót, -o programName, hogy megmondjuk, mi legyen a futtatható fájl neve:

$ gcc hello.c -o hello$ ./helloHello, World!$

Figyeljen arra, hogy véletlenül se adjon meg olyan futtatható fájlnevet, amely megegyezik a bemeneti fájl nevével – például:

$ gcc hello.c -o hello.c

A myth profilja úgy lett beállítva, hogy a hibát észlelje és ne fordítsa le, így a forrásfájlja érintetlen marad. Sok más Linux rendszeren ez nem így van, ezért légy óvatos! Más rendszereken a GCC felülírná a forrásfájlodat az új futtathatóval.

gcc számos különböző parancssori opciót (zászlókat) fogad el, amelyek megváltoztatják a viselkedését. Az egyik leggyakoribb flag az “optimalizációs szint” flag, -O (nagybetűs ‘o’). gcc képes optimalizálni a kódot különböző helyzetekben.

  1. -O vagy -O1: Optimalizálás. A fordítás optimalizálása valamivel több időt vesz igénybe, és sokkal több memóriát egy nagy függvény esetében. A -O használatával a fordító megpróbálja csökkenteni a kód méretét és a végrehajtási időt, anélkül, hogy a fordítási időt nagymértékben igénybe vevő optimalizálásokat végezne.
  2. -O2: Még jobban optimalizál. A GCC szinte az összes olyan támogatott optimalizálást elvégzi, amely nem jár tér-gyorsasági kompromisszummal. A -O opcióhoz képest ez az opció növeli mind a fordítási időt, mind a generált kód teljesítményét.
  3. -O3: Még tovább optimalizál. -O3 bekapcsolja a -O2 által megadott összes optimalizálást, és további optimalizálásokat is bekapcsol. Gyakran ezt az opciót a legjobb használni.
  4. -O0: Csökkenti a fordítási időt, és a hibakeresés a várt eredményeket hozza. Ez az alapértelmezett.
  5. -Os: Optimalizálás a méretre. -Os engedélyezi az összes -O2 optimalizálást, amely jellemzően nem növeli a kód méretét. Emellett további, a kódméret csökkentését célzó optimalizálásokat is végrehajt.
  6. -Ofast: Figyelmen kívül hagyja a szigorú szabványoknak való megfelelést. engedélyezi az összes -O3 optimalizálást. Olyan optimalizációkat is engedélyez, amelyek nem minden szabványnak megfelelő programra érvényesek.
  7. -Og: Optimalizálja a hibakeresés élményét. -Og olyan optimalizálásokat engedélyez, amelyek nem zavarják a hibakeresést. Ennek kell lennie a választott optimalizálási szintnek a szabványos edit-compile-debug ciklushoz, amely ésszerű szintű optimalizálást kínál, miközben fenntartja a gyors fordítást és a jó hibakeresési élményt. A CS107-ben a -Og-t fogjuk használni hibakereséskor.

Az optimalizálással kapcsolatos további részletekért lásd a man oldal gcc (vagy lásd itt az optimalizálással kapcsolatos további információkat).

Egy másik gyakori flag a -std=gnu99 opció, amely azt mondja a gcc-nek, hogy az “1999-es c szabvány gnu c verzióját” használja. A szabvány olyan szintaxist biztosít, mint például az, hogy egy for ciklus deklarációján belül változót definiálhatunk (pl. for (int i = ...). Ezt a szabványt fogjuk használni a CS107-ben.

A -g flaget is használni fogjuk, amely lehetővé teszi, hogy a debugger, a gdb segítségével pontos sorszámokat kapjunk a kódunkban, amikor futtatjuk azt.

Példa:

$ gcc -std=gnu99 -g -Og loop.c -o loop 

Ha még több információ érdekel a gcc-ről, nézd meg a Stanford Unix programozási eszközök dokumentum 1. szakaszát, valamint a teljes gcc kézikönyvet(GNU).