А преводилац је програм што у преводу значи читљиво од људи изворни код у компјутерски извршни машински код. Да бисте то успешно урадили, људски читљив код мора бити у складу са синтакса правила у којем год програмском језику је написана. Компајлер је само програм и не може да поправи ваш код за вас. Ако погрешите, мораћете да исправите синтаксу или се она неће компајлирати.
Шта се догађа када саставите код?
Сложеност преводиоца зависи од синтаксе језика и колико апстракције тај програмски језик пружа. Компајлер за Ц је много једноставнији од компајлера за Ц ++ или Ц #.
Лексичка анализа
Приликом компајлирања, преводилац прво чита ток знакова из датотеке изворног кода и генерише ток лексичких ознака. На пример, Ц ++ код:
инт Ц = (А * Б) +10;
могу бити анализирани као ови токени:
- упишите "инт"
- променљива „Ц“
- једнако
- лефтбрацкет
- променљива „А“
- пута
- променљива „Б“
- десни брак
- плус
- дословно "10"
Синтактичка анализа
Лексички излаз иде у део синтактичког анализатора преводилаца, који користи граматичка правила да одлучи да ли је унос валидан или не. Осим ако
Променљиве А и Б су претходно декларисани и били су у обиму, преводилац би могао рећи:- 'А': непријављени идентификатор.
Ако су декларирани, али нису иницијализирани. преводилац издаје упозорење:
- локална варијабла 'А' која се користи без иницијализације.
Никада не треба занемарити упозорења преводиоца. Они могу разбити ваш код на чудне и неочекиване начине. Увек исправите упозорења преводиоца.
Један пролаз или два?
Неки програмски језици су написани тако да компајлер може да прочита изворни код само једном и генерише машински код. Пасцал је један такав језик. Многи преводиоци захтевају најмање два пролаза. Понекад је то због прослеђивања декларација функције или часове.
У Ц ++, класа се може декларирати, али не и дефинисати до касније. Компајлер не може да утврди колико меморије треба разреду док не састави тело класе. Пре генерисања исправног машинског кода, он мора поново прочитати изворни код.
Генерирање шифре машине
Под претпоставком да преводилац успешно заврши лексичке и синтактичке анализе, последња фаза је генерисање машинског кода. Ово је компликован процес, посебно са модерним процесорима.
Брзина компајлирања извршни код треба да буде што бржи и може да се јако разликује у складу са квалитетом генерисаног кода и колико је захтевана оптимизација.
Већина компајлера вам омогућава да одредите количину оптимизације - обично познату по брзом уклањању грешака и пуној оптимизацији за објављени код.
Генерација кода је изазовна
Писци преводилаца се суочавају са изазовима приликом писања генератора кода. Многи процесори убрзавају обраду коришћењем
- Упутство за цевовод
- Интерни кеш меморије.
Ако су сва упутства унутар кода петље може да се одржи у Процесори цацхе, тада та петља ради много брже него када ЦПУ мора да добије упутства из главне РАМ-а. ЦПУ кеш меморија је блок меморије уграђене у ЦПУ чип којем се приступа много брже него подацима у главној РАМ меморији.
Кеши и редови
Већина ЦПУ-а има редослед преузимања, где ЦПУ чита упутства у кешу пре него што их изврши. Ако се догоди увјетна грана, ЦПУ мора поново учитати ред. Код треба генерисати да би се то свело на минимум.
Многи ЦПУ-ови имају одвојене делове за:
- Аритметика целих бројева (цели бројеви)
- Аритметика с помичном тачком (фракцијски бројеви)
Ове операције се често могу одвијати паралелно да би се повећала брзина.
Компајлери обично генеришу машински код у датотеке које се тада постављају повезани заједно преко линкер програма.