logo

Процес на компилация в c

Какво е компилация?

Компилацията е процес на преобразуване на изходния код в обектен код. Извършва се с помощта на компилатора. Компилаторът проверява изходния код за синтактични или структурни грешки и ако изходният код е без грешки, той генерира обектния код.

Процес на компилация в c

Процесът на компилиране на c преобразува изходния код, взет като вход, в обектен код или машинен код. Процесът на компилиране може да бъде разделен на четири стъпки, т.е. предварителна обработка, компилиране, асемблиране и свързване.

Препроцесорът приема изходния код като вход и премахва всички коментари от изходния код. Препроцесорът приема директивата на препроцесора и я интерпретира. Например ако , директивата е налична в програмата, тогава препроцесорът интерпретира директивата и заменя тази директива със съдържанието на 'stdio.h' файл.

списък за пропускане

Следват фазите, през които нашата програма преминава, преди да бъде трансформирана в изпълнима форма:

    Препроцесор Компилатор Асемблер Линкер
Процес на компилация в c

Препроцесор

Изходният код е кодът, който е написан в текстов редактор и на файла с изходния код е дадено разширение „.c“. Този изходен код първо се предава на препроцесора и след това препроцесорът разширява този код. След разширяване на кода, разширеният код се предава на компилатора.

Компилатор

Кодът, който е разширен от препроцесора, се предава на компилатора. Компилаторът преобразува този код в асемблиращ код. Или можем да кажем, че C компилаторът преобразува предварително обработения код в код за асемблиране.

Асемблер

Асемблерният код се преобразува в обектен код с помощта на асемблер. Името на обектния файл, генериран от асемблера, е същото като изходния файл. Разширението на обектния файл в DOS е '.obj', а в UNIX разширението е 'o'. Ако името на изходния файл е 'hello.c', тогава името на обектния файл ще бъде 'hello.obj'.

Линкер

Основно всички програми, написани на C, използват библиотечни функции. Тези библиотечни функции са предварително компилирани и обектният код на тези библиотечни файлове се съхранява с разширение „.lib“ (или „.a“). Основната работа на линкера е да комбинира обектния код на библиотечните файлове с обектния код на нашата програма. Понякога възниква ситуация, когато нашата програма се позовава на функциите, дефинирани в други файлове; тогава линкерът играе много важна роля в това. Той свързва обектния код на тези файлове с нашата програма. Следователно заключаваме, че работата на линкера е да свърже обектния код на нашата програма с обектния код на библиотечните файлове и други файлове. Резултатът от линкера е изпълнимият файл. Името на изпълнимия файл е същото като изходния файл, но се различава само по техните разширения. В DOS разширението на изпълнимия файл е „.exe“, а в UNIX изпълнимият файл може да бъде именуван като „a.out“. Например, ако използваме функцията printf() в програма, тогава линкерът добавя свързания с нея код в изходен файл.

Нека разберем чрез пример.

здравей.c

 #include int main() { printf('Hello javaTpoint'); return 0; } 

Сега ще създадем блок-схема на горната програма:

Процес на компилация в c

В горната блок-схема се предприемат следните стъпки за изпълнение на програма:

  • Първо, входният файл, т.е. здравей.c, се предава на препроцесора и препроцесорът преобразува изходния код в разширен изходен код. Разширението на разширения изходен код ще бъде здравей.и.
  • Разширеният изходен код се предава на компилатора и компилаторът преобразува този разширен изходен код в код за асемблиране. Разширението на асемблерния код ще бъде здравей.с.
  • След това този асемблерен код се изпраща на асемблера, който преобразува асемблерния код в обектен код.
  • След създаването на обектен код, линкерът създава изпълнимия файл. След това товарачът ще зареди изпълнимия файл за изпълнение.