Kompilace je proces převodu zdrojového kódu jazyka C do strojového kódu. Protože C je jazyk střední úrovně, potřebuje kompilátor, který jej převede na spustitelný kód, aby bylo možné program spustit na našem počítači.
Program C prochází během kompilace následujícími fázemi:

Proces kompilace v C
Jak zkompilujeme a spustíme program v C?
Nejprve potřebujeme kompilátor a editor kódu ke kompilaci a spuštění programu C. Níže uvedený příklad je počítač Ubuntu s kompilátorem GCC.
Krok 1: Vytvoření zdrojového souboru C
Nejprve vytvoříme program v jazyce C pomocí editoru a uložíme soubor jako název_souboru.c
regáloví psi
$ vi filename.c>
Můžeme napsat jednoduchý program hello world a uložit ho.
Krok 2: Kompilace pomocí kompilátoru GCC
Pro kompilaci našeho zdrojového souboru filename.c používáme v terminálu následující příkaz
$ gcc filename.c –o filename>
Kompilátoru GCC můžeme předat mnoho instrukcí k různým úkolům, jako jsou:
- Volba -Wall povolí všechny varovné zprávy kompilátoru. Tato možnost se doporučuje pro generování lepšího kódu.
- Volba -o se používá k určení názvu výstupního souboru. Pokud tuto možnost nevyužijeme, vygeneruje se výstupní soubor s názvem a.out.
Pokud v našem programu C nejsou žádné chyby, vygeneruje se spustitelný soubor programu C.
co znamená google
Krok 3: Spuštění programu
Po kompilaci je vygenerován spustitelný soubor a vygenerovaný spustitelný soubor spustíme pomocí níže uvedeného příkazu.
$ ./filename>
Program se provede a výstup se zobrazí na terminálu.
Co je součástí procesu kompilace?
Kompilátor převede program v C na spustitelný soubor. Aby se program C stal spustitelným, existují čtyři fáze:
- Předzpracování Kompilace Sestavení Propojení
Spuštěním níže uvedeného příkazu získáme všechny přechodné soubory v aktuálním adresáři spolu se spustitelným souborem.
co dělá počítač rychlým
$gcc -Wall -save-temps filename.c –o filename>
Následující snímek obrazovky ukazuje všechny vygenerované přechodné soubory.
Mezilehlé soubory
Pojďme se jeden po druhém podívat, co tyto přechodné soubory obsahují.
1. Předzpracování
Toto je první fáze, kterou prochází zdrojový kód. Tato fáze zahrnuje:
- Odstranění komentářů
- Rozšíření maker
- Rozšíření obsažených souborů.
- Podmíněná kompilace
Předzpracovaný výstup je uložen v název_souboru.i . Podívejme se, co je uvnitř filename.i: using $vi název_souboru.i
Ve výše uvedeném výstupu je zdrojový soubor naplněn spoustou a spoustou informací, ale nakonec je náš kód zachován.
hlavní program v Javě
- printf nyní obsahuje a + b namísto add(a, b), protože makra se rozšířila.
- Komentáře jsou odstraněny. Chybí #include místo toho vidíme spoustu kódu. Takže hlavičkové soubory byly rozšířeny a zahrnuty do našeho zdrojového souboru.
2. Kompilace
Dalším krokem je zkompilovat soubor.i a vytvořit soubor; přechodný kompilovaný výstupní soubor název_souboru.s . Tento soubor je v pokynech na úrovni sestavení. Podívejme se na tento soubor pomocí $nano název_souboru.s příkaz terminálu.
Soubor kódu sestavy
Snímek ukazuje, že je v jazyce symbolických instrukcí, kterému assembler rozumí.
3. Montáž
V této fázi je jako vstup použit název souboru.s a přeměněn na něj název_souboru.o pomocí assembleru. Tento soubor obsahuje instrukce na úrovni stroje. V této fázi je do strojového jazyka převeden pouze existující kód a volání funkcí jako printf() nejsou vyřešena. Podívejme se na tento soubor pomocí $vi název_souboru.o
chyba: nelze najít nebo načíst hlavní třídu
Binární kód
4. Propojení
Toto je poslední fáze, ve které se provádí veškeré propojení volání funkcí s jejich definicemi. Linker ví, kde jsou všechny tyto funkce implementovány. Linker také dělá nějakou práci navíc, přidává do našeho programu nějaký extra kód, který je vyžadován při spuštění a ukončení programu. Existuje například kód, který je vyžadován pro nastavení prostředí, jako je předávání argumentů příkazového řádku. Tento úkol lze snadno ověřit pomocí $velikost souboru.o a $velikost souboru . Prostřednictvím těchto příkazů víme, jak se výstupní soubor zvětší z objektového souboru na spustitelný soubor. Je to kvůli extra kódu, který Linker přidává do našeho programu.
Poznámka: GCC ve výchozím nastavení provádí dynamické propojení, takže printf() je dynamicky propojeno ve výše uvedeném programu. Další podrobnosti o statickém a dynamickém propojování naleznete v tomto, tomto a tomto.