Kompilācija ir process, kurā C valodas avota kods tiek pārveidots mašīnkodā. Tā kā C ir vidēja līmeņa valoda, tai ir nepieciešams kompilators, lai to pārvērstu izpildāmā kodā, lai programmu varētu palaist mūsu datorā.
C programma kompilācijas laikā iziet šādas fāzes:

Kompilācijas process C valodā
Kā apkopot un palaist C programmu?
Vispirms mums ir nepieciešams kompilators un koda redaktors, lai apkopotu un palaistu C programmu. Zemāk redzamais piemērs ir Ubuntu mašīna ar GCC kompilatoru.
1. darbība. C avota faila izveide
Vispirms mēs izveidojam C programmu, izmantojot redaktoru, un saglabājam failu kā faila nosaukums.c
java uz json objektu
$ vi filename.c>
Mēs varam uzrakstīt vienkāršu programmu hello world un saglabāt to.
2. darbība: kompilēšana, izmantojot GCC kompilatoru
Mēs izmantojam šādu komandu terminālī, lai kompilētu avota failu filename.c
string.valueof
$ gcc filename.c –o filename>
Mēs varam nodot GCC kompilatoram daudz instrukciju dažādiem uzdevumiem, piemēram:
- Opcija -Wall iespējo visus kompilatora brīdinājuma ziņojumus. Šī opcija ir ieteicama, lai ģenerētu labāku kodu.
- Opciju -o izmanto, lai norādītu izvades faila nosaukumu. Ja neizmantojam šo opciju, tiek ģenerēts izvades fails ar nosaukumu a.out.
Ja mūsu C programmā nav kļūdu, tiks ģenerēts C programmas izpildāmais fails.
3. darbība: programmas izpilde
Pēc kompilācijas tiek ģenerēts izpildāmais fails, un mēs palaižam ģenerēto izpildāmo failu, izmantojot tālāk norādīto komandu.
$ ./filename>
Programma tiks izpildīta, un izvade tiks parādīta terminālī.
Kas notiek apkopošanas procesā?
Kompilators pārvērš C programmu izpildāmā failā. Ir četras fāzes, lai C programma kļūtu par izpildāmu:
- Pirmsapstrādes kompilācijas montāžas saistīšana
Izpildot tālāk norādīto komandu, mēs iegūstam visus starpposma failus pašreizējā direktorijā kopā ar izpildāmo failu.
$gcc -Wall -save-temps filename.c –o filename>
Nākamajā ekrānuzņēmumā ir parādīti visi ģenerētie starpfaili.
jfx java apmācība
Starpposma faili
Ļaujiet mums pa vienam redzēt, ko šie starpfaili satur.
atšķirība starp programmu un skriptu
1. Iepriekšēja apstrāde
Šī ir pirmā fāze, kurā tiek nodots pirmkods. Šajā fāzē ietilpst:
- Komentāru noņemšana
- Makro paplašināšana
- Iekļauto failu paplašināšana.
- Nosacīta kompilācija
Iepriekš apstrādātā izvade tiek saglabāta mapē faila nosaukums.i . Apskatīsim, kas atrodas failā filename.i: using $vi faila nosaukums.i
Iepriekš minētajā izvadē avota fails ir piepildīts ar daudz informācijas, taču galu galā mūsu kods tiek saglabāts.
- printf tagad satur a + b, nevis add(a, b), jo makro ir paplašināti.
- Komentāri tiek noņemti. Trūkst #include, tā vietā mēs redzam daudz koda. Tātad galvenes faili ir paplašināti un iekļauti mūsu avota failā.
2. Sastādīšana
Nākamais solis ir kompilēt filename.i un izveidot; starpposma kompilēts izvades fails faila nosaukums.s . Šis fails ir montāžas līmeņa instrukcijās. Apskatīsim šo failu, izmantojot $nano faila nosaukums.s termināļa komanda.
Montāžas koda fails
Momentuzņēmums parāda, ka tas ir montāžas valodā, ko montētājs var saprast.
3. Salikšana
Šajā fāzē faila nosaukums.s tiek ņemts par ievadi un pārvērsts par faila nosaukums.o ko veic montētājs. Šajā failā ir ietvertas mašīnas līmeņa instrukcijas. Šajā fāzē tikai esošais kods tiek pārveidots mašīnvalodā, un funkciju izsaukumi, piemēram, printf(), netiek atrisināti. Apskatīsim šo failu, izmantojot $vi faila nosaukums.o
Sandžejs Duts un
Binārais kods
4. Saistīšana
Šī ir pēdējā fāze, kurā tiek veikta visu funkciju izsaukumu saistīšana ar to definīcijām. Linker zina, kur visas šīs funkcijas tiek īstenotas. Linker arī veic papildu darbu, pievieno mūsu programmai papildu kodu, kas ir nepieciešams, kad programma sākas un beidzas. Piemēram, ir kods, kas nepieciešams vides iestatīšanai, piemēram, komandrindas argumentu nodošanai. Šo uzdevumu var viegli pārbaudīt, izmantojot $size faila nosaukums.o un $size faila nosaukums . Izmantojot šīs komandas, mēs zinām, kā izvades fails palielinās no objekta faila uz izpildāmo failu. Tas ir saistīts ar papildu kodu, ko Linker pievieno mūsu programmai.
Piezīme: GCC pēc noklusējuma veic dinamisku saiti, tāpēc printf () ir dinamiski saistīts iepriekš minētajā programmā. Lai iegūtu plašāku informāciju par statisko un dinamisko saistīšanu, skatiet šo , šo un šo.