Кіріспе

Бағдарламалық жасақтаманы әзірлеу құралы. Көп өтімді компилятор – бағдарламаның бастапқы кодын немесе абстрактілі синтаксис ағашын бірнеше рет өңдейтін компилятор түрі. Бұл бір өтімді компилятордан өзгеше, ол бағдарламаны тек бір рет қарастырады. Әрбір өтім алдыңғы өтімнің нәтижесін кіріс ретінде алып, аралық шығыс жасайды. Осылайша, (аралық) код соңғы өтім соңғы кодты шығаратынға дейін, әр өтімде жақсартылады. Көп өтімді компиляторларды кейде кең компиляторлар деп те атайды, себебі өтімдердің ауқымы кең: олар құрастырылып жатқан бағдарламаның шағын бөлігімен ғана емес, толық бағдарламамен "таныса алады". Осы компиляторларға қолжетімді кең ауқым, компиляция уақытын және жадты көп жұмсаудың есесіне, бір өтімді компиляторлардың нәтижесімен салыстырғанда жақсы код жасауға мүмкіндік береді (мысалы, кодтың кіші көлемі, жылдам жұмыс ілеуі). Сонымен қатар, кейбір тілдерді олардың құрылымына байланысты бір өтімде компиляциялау мүмкін емес.

Лексикалық талдау

Көп өтетін компилятордың бұл кезеңі бастапқы бағдарламадан синтаксистік талдау пайдалана алмайтын немесе түсіндіре алмайтын қажетсіз ақпаратты жоюға арналған. Қажетсіз ақпаратқа түсініктемелер мен бос кеңістіктер жатуы мүмкін. Лексикалық талдау қажетсіз ақпаратты жоюмен қатар, тілдің лексикалық бірліктерін анықтайды. Осы қадам көп өтетін компилятор қолданылса, алдын ала жариялаудың қажеттілігін азайтады. Бұл кезеңде таңбалар тізбегі түр, тип, мән және басқа да атрибуттары бар бірліктерге бөлінеді.

Синтаксис талдауы

Синтаксистік талдау тілдің синтаксистік ережелерін (көбінесе контекстсіз грамматика түрінде) қарастырып, тілдің аралық өрнегін құруға жауапты. Осы аралық өрнектің мысалы абстрактілік синтаксистік ағаш немесе бағытталған ациклдік граф болуы мүмкін.

Кодты құру

Типтік компилятордың соңғы кезеңі бағдарламаның аралық өрнегін орындалатын нұсқаулар жиынтығына (көбінесе ассемблер) айналдырады. Бұл соңғы кезең – компиляцияның машинаға тәуелді жалғыз кезеңі. Компиляцияның осы кезеңінде бағдарламаның тиімділігін арттыратын оңтайландырулар да жүзеге асырылуы мүмкін. Компилятордың басқа кезеңдеріне аралық кодты жасау кезеңі (кодты жасау кезеңінен бұрын болатын) және кодты оңтайландыру кезеңі (бастапқы бағдарлама жазылған кезде, аралық кодты жасау кезеңінен кейін немесе кодты жасау кезеңінен кейін болатын) кіреді.

Көп жолды компиляторлардың артықшылықтары

Машинаға тәуелсіз: Көп өтулердің модульдік құрылымы бар және кодты генерациялау компилятордың басқа қадамдарынан бөлек болғандықтан, осы өтулерді әртүрлі аппараттық құралдарда/машиналарда қайта пайдалануға болады. Көбірек мүмкіндік беретін тілдер: Көп өтулер алдын ала жариялау қажеттілігін жояды, бұл өзара рекурсияны әдемі түрде іске асыруға мүмкіндік береді. Алдын ала жариялауды қажет ететін тілдердің басты мысалдары – C және Pascal, ал Java-да мұндай жариялау қажет емес.