Kompiliavimas yra C kalbos šaltinio kodo konvertavimo į mašininį kodą procesas. Kadangi C yra vidutinio lygio kalba, jai reikalingas kompiliatorius, kuris konvertuotų ją į vykdomąjį kodą, kad programa galėtų būti paleista mūsų kompiuteryje.
C programa kompiliavimo metu pereina šiuos etapus:

Kompiliavimo procesas C
Kaip kompiliuoti ir paleisti C programą?
Pirmiausia mums reikia kompiliatoriaus ir kodo rengyklės, kad galėtume kompiliuoti ir paleisti C programą. Žemiau pateiktas pavyzdys yra Ubuntu mašina su GCC kompiliatoriumi.
1 veiksmas: sukurkite C šaltinio failą
Pirmiausia sukuriame C programą naudodami redaktorių ir išsaugome failą kaip failo pavadinimas.c
Python kelio nustatymas
$ vi filename.c>
Galime parašyti paprastą Hello world programą ir ją išsaugoti.
2 veiksmas: kompiliavimas naudojant GCC kompiliatorių
Mes naudojame šią komandą terminale, norėdami sudaryti failovardas.c šaltinio failą
$ gcc filename.c –o filename>
GCC kompiliatoriui galime perduoti daug instrukcijų, skirtų įvairioms užduotims, pavyzdžiui:
- Parinktis -Siena įgalina visus kompiliatoriaus įspėjamuosius pranešimus. Ši parinktis rekomenduojama norint sukurti geresnį kodą.
- Parinktis -o naudojama nurodyti išvesties failo pavadinimą. Jei šios parinkties nenaudosime, sugeneruojamas išvesties failas pavadinimu a.out.
Jei mūsų C programoje klaidų nėra, bus sugeneruotas C programos vykdomasis failas.
javascript visuotinis kintamasis
3 veiksmas: programos vykdymas
Po kompiliavimo sugeneruojamas vykdomasis failas ir mes paleidžiame sugeneruotą vykdomąjį failą naudodami toliau pateiktą komandą.
$ ./filename>
Programa bus vykdoma, o išvestis bus rodoma terminale.
Kas vyksta kompiliavimo procese?
Kompiliatorius konvertuoja C programą į vykdomąjį failą. Yra keturi etapai, kad C programa taptų vykdomąja programa:
- Išankstinis apdorojimas kompiliacijos surinkimo susiejimas
Vykdydami toliau pateiktą komandą, mes gauname visus tarpinius failus dabartiniame kataloge kartu su vykdomuoju.
reakcijos lentelė
$gcc -Wall -save-temps filename.c –o filename>
Toliau pateiktoje ekrano kopijoje rodomi visi sugeneruoti tarpiniai failai.
Tarpiniai failai
Pažiūrėkime po vieną, kas yra šiuose tarpiniuose failuose.
1. Išankstinis apdorojimas
Tai pirmasis etapas, per kurį perduodamas šaltinio kodas. Šis etapas apima:
- Komentarų pašalinimas
- Makrokomandų išplėtimas
- Įtrauktų failų išplėtimas.
- Sąlyginis kompiliavimas
Iš anksto apdorota produkcija saugoma failo pavadinimas.i . Pažiūrėkime, kas yra failo name.i viduje: naudojant $vi failo pavadinimas.i
Aukščiau pateiktame išvestyje šaltinio failas užpildytas daugybe informacijos, tačiau galiausiai mūsų kodas išsaugomas.
apurva padgaonkar
- printf dabar yra a + b, o ne add(a, b), nes makrokomandos išsiplėtė.
- Komentarai nubraukiami. Trūksta #include, o matome daug kodo. Taigi antraštės failai buvo išplėsti ir įtraukti į šaltinio failą.
2. Sudarymas
Kitas žingsnis yra sukompiliuoti failąname.i ir sukurti; tarpinis sukompiliuotas išvesties failas failo pavadinimas.s . Šis failas yra surinkimo lygio instrukcijose. Peržiūrėkime šį failą naudodami $nano failo pavadinimas.s terminalo komanda.
Surinkimo kodo failas
Momentinė nuotrauka rodo, kad ji yra surinkimo kalba, kurią surinkėjas gali suprasti.
3. Surinkimas
Šioje fazėje failovardas.s imamas kaip įvestis ir paverčiamas į failo pavadinimas.o surinkėjas. Šiame faile yra mašinos lygio instrukcijos. Šiame etape tik esamas kodas konvertuojamas į mašinos kalbą, o funkcijų iškvietimai, tokie kaip printf(), neišsprendžiami. Pažiūrėkime šį failą naudodami $vi failo pavadinimas.o
java matematikos klasė
Dvejetainis kodas
4. Susiejimas
Tai yra paskutinė fazė, kurios metu visi funkcijų iškvietimai susiejami su jų apibrėžimais. Linker žino, kur įgyvendinamos visos šios funkcijos. Linker taip pat atlieka tam tikrą papildomą darbą, į mūsų programą prideda papildomo kodo, kurio reikia programai paleidžiant ir baigiantis. Pavyzdžiui, yra kodas, kurio reikia norint nustatyti aplinką, pavyzdžiui, perduoti komandinės eilutės argumentus. Šią užduotį galima lengvai patikrinti naudojant $ dydžio failo pavadinimas.o ir $ dydžio failo pavadinimas . Naudodamiesi šiomis komandomis žinome, kaip išvesties failas padidėja iš objekto failo į vykdomąjį failą. Taip yra dėl papildomo kodo, kurį Linker prideda prie mūsų programos.
Pastaba: GCC pagal numatytuosius nustatymus atlieka dinaminį susiejimą, todėl printf() yra dinamiškai susietas aukščiau esančioje programoje. Norėdami gauti daugiau informacijos apie statinį ir dinaminį susiejimą, žr. šį , šį ir tai.