- Компилирането трансформира изходния код в изпълним машинен код.
- Компилаторът извършва лексикален, синтактичен и семантичен анализ.
- Има AOT, JIT, кръстосани компилатори и транспилатори.
- Компилираният код е по-бърз от интерпретирания код.
Ако сте се впуснали в света на програмирането, вероятно сте чували термина „ компилиране “. Тази концепция е фундаментална за разработката на софтуер, тъй като определя процеса, чрез който изходният код, написан на език за програмиране, се трансформира във формат, който компютърът може да изпълни.
Разбирането какво означава компилиране и как работи компилаторът е от съществено значение за всеки програмист, който иска да оптимизира своя код и да разбере по-добре как работят езиците за програмиране. По-долу обясняваме подробно какво включва този процес, видовете компилатори, които съществуват, и основните разлики между компилиран и интерпретиран код.
Какво представлява компилирането?
Компилирането е процес на преобразуване на изходния код от език за програмиране на високо ниво (като C++, Java или Rust) в двоичен код или машинен код, който процесорът на компютъра може директно да изпълни.
Изходният код е написан на език, който хората могат да четат и разбират, но компютрите могат да интерпретират само двоичен код. Следователно е необходима специфична програма, наречена компилатор, за да преобразува изходния код в изпълним код. Ако искате да научите повече по тази тема, можете да се консултирате с нашето ръководство за концепциите и разликите между компилатори и интерпретатори.
Какво е компилатор и как работи?
Компилаторът е програма, специализирана в преобразуването на изходния код в обектен код или изпълним код. Този процес на преобразуване се състои от няколко фази :
1. Предварителна обработка
Преди компилирането изходният код преминава през фаза на предварителна обработка, където макросите се разширяват, необходимите файлове се включват и се правят други модификации, преди да се генерира кодът, който всъщност се компилира.
2. Лексикален анализ
Компилаторът сканира изходния код и го разделя на токени , които са най-малките единици за значение в езика за програмиране, като ключови думи, идентификатори и оператори.
3. Синтактичен анализ
В тази фаза структурата на кода се проверява за правилна според граматиката на езика за програмиране. Ако има синтактични грешки, компилаторът ще ги открие и ще каже на програмиста къде са, за да могат да бъдат коригирани.
4. Семантичен анализ
Компилаторът проверява дали операциите и изразите в кода имат логически смисъл. Той проверява дали променливите и функциите са добре дефинирани и дали се изпълняват валидни операции. Това е от решаващо значение, за да се гарантира, че кодът ви се компилира без проблеми.
5. Генериране на междинен код
След проверка на синтаксиса и семантиката на кода, компилаторът генерира междинен код , опростено представяне, което може да бъде оптимизирано преди окончателното преобразуване в машинен код.
6. Оптимизация на кода
На този етап компилаторът подобрява генерирания код, за да го направи по- ефективен и да намали консумацията на памет и времето за обработка.
7. Генериране на машинен код
Накрая, междинният код се преобразува в машинен код, специфичен за архитектурата на процесора на компютъра. Тази част от процеса е жизненоважна, за да се гарантира, че програмата ще функционира правилно на хардуера.
8. Свързване
Генерираният обектен код се комбинира с библиотеки и други модули, необходими за създаването на крайния изпълним файл. Интересно е как се управляват тези библиотеки и за това може да бъде полезен специализиран компилатор, като например тези, които можете да намерите в нашия раздел за компилатори за езика C.
Видове компилатори
Съществуват различни типове компилатори в зависимост от тяхната работа и предназначение:
- AOT (Ahead-Of-Time) компилатори: Те компилират целия код, преди да го изпълнят. Примери: GCC, Clang.
- JIT (Just-In-Time) компилатори: Те компилират кода по време на изпълнение, за да подобрят производителността. Примери: JVM за Java, V8 за JavaScript. За по-задълбочено разбиране на този тип предлагаме нашето ръководство за Компилатори точно навреме.
- Кръстосани компилатори: Те генерират изпълним код за платформа, различна от тази, която изпълняват. Ако се интересувате, можете да прочетете за Кръстосани компилатори в детайли.
- Транспилатори: Те трансформират код от един език на високо ниво в друг, като TypeScript в JavaScript.
Компилиран код срещу интерпретиран код
Една от основните разлики в изпълнението на програмата е дали кодът се компилира или интерпретира :
- Компилиран код: Превежда се напълно преди стартиране и обикновено е по-бързо. Пример: C, C++.
- Интерпретиран код: Превежда се ред по ред по време на изпълнение, което улеснява преносимостта, но намалява производителността. Пример: Python, JavaScript.
Практически пример за компилация
Да предположим, че пишете програма на C:
#включи int main() { printf("Здравей, свят!\n"); връщане 0; }
За да компилирате този код с GCC в терминал, трябва да изпълните:
gcc програма.c -o програма
В цялата статия ние проучихме процеса на компилиране в дълбочина, от неговата дефиниция до значението му в разработването на софтуер. Докато интерпретираните езици предлагат гъвкавост, компилираните езици се отличават със своята ефективност. Разбирането как работи компилаторът и фазите на процеса е от ключово значение за подобряване на нашите умения като програмисти.