Кіріспе
Бағдарламалық жасақтаманы әзірлеу құралы. Көп өтімді компилятор – бағдарламаның бастапқы кодын немесе абстрактілі синтаксис ағашын бірнеше рет өңдейтін компилятор түрі. Бұл бір өтімді компилятордан өзгеше, ол бағдарламаны тек бір рет қарастырады. Әрбір өтім алдыңғы өтімнің нәтижесін кіріс ретінде алып, аралық шығыс жасайды. Осылайша, (аралық) код соңғы өтім соңғы кодты шығаратынға дейін, әр өтімде жақсартылады. Көп өтімді компиляторларды кейде кең компиляторлар деп те атайды, себебі өтімдердің ауқымы кең: олар құрастырылып жатқан бағдарламаның шағын бөлігімен ғана емес, толық бағдарламамен "таныса алады". Осы компиляторларға қолжетімді кең ауқым, компиляция уақытын және жадты көп жұмсаудың есесіне, бір өтімді компиляторлардың нәтижесімен салыстырғанда жақсы код жасауға мүмкіндік береді (мысалы, кодтың кіші көлемі, жылдам жұмыс ілеуі). Сонымен қатар, кейбір тілдерді олардың құрылымына байланысты бір өтімде компиляциялау мүмкін емес.
A multi pass compiler is a type of compiler that processes the source code or abstract syntax tree of a program several times. This is in contrast to a one pass compiler, which traverses the program only once. Each pass takes the result of the previous pass as the input, and creates an intermediate output. In this way, the (intermediate) code is improved pass by pass, until the final pass produces the final code. Multi pass compilers are sometimes called wide compilers, referring to the greater scope of the passes: they can "see" the entire program being compiled, instead of just a small portion of it. The wider scope thus available to these compilers allows better code generation (e. g. smaller code size, faster code) compared to the output of one pass compilers, at the cost of higher compiler time and memory consumption. In addition, some languages cannot be compiled in a single pass, as a result of their design.
Лексикалық талдау
Көп өтетін компилятордың бұл кезеңі бастапқы бағдарламадан синтаксистік талдау пайдалана алмайтын немесе түсіндіре алмайтын қажетсіз ақпаратты жоюға арналған. Қажетсіз ақпаратқа түсініктемелер мен бос кеңістіктер жатуы мүмкін. Лексикалық талдау қажетсіз ақпаратты жоюмен қатар, тілдің лексикалық бірліктерін анықтайды. Осы қадам көп өтетін компилятор қолданылса, алдын ала жариялаудың қажеттілігін азайтады. Бұл кезеңде таңбалар тізбегі түр, тип, мән және басқа да атрибуттары бар бірліктерге бөлінеді.
Синтаксис талдауы
Синтаксистік талдау тілдің синтаксистік ережелерін (көбінесе контекстсіз грамматика түрінде) қарастырып, тілдің аралық өрнегін құруға жауапты. Осы аралық өрнектің мысалы абстрактілік синтаксистік ағаш немесе бағытталған ациклдік граф болуы мүмкін.
Кодты құру
Типтік компилятордың соңғы кезеңі бағдарламаның аралық өрнегін орындалатын нұсқаулар жиынтығына (көбінесе ассемблер) айналдырады. Бұл соңғы кезең – компиляцияның машинаға тәуелді жалғыз кезеңі. Компиляцияның осы кезеңінде бағдарламаның тиімділігін арттыратын оңтайландырулар да жүзеге асырылуы мүмкін. Компилятордың басқа кезеңдеріне аралық кодты жасау кезеңі (кодты жасау кезеңінен бұрын болатын) және кодты оңтайландыру кезеңі (бастапқы бағдарлама жазылған кезде, аралық кодты жасау кезеңінен кейін немесе кодты жасау кезеңінен кейін болатын) кіреді.
Көп жолды компиляторлардың артықшылықтары
Машинаға тәуелсіз: Көп өтулердің модульдік құрылымы бар және кодты генерациялау компилятордың басқа қадамдарынан бөлек болғандықтан, осы өтулерді әртүрлі аппараттық құралдарда/машиналарда қайта пайдалануға болады. Көбірек мүмкіндік беретін тілдер: Көп өтулер алдын ала жариялау қажеттілігін жояды, бұл өзара рекурсияны әдемі түрде іске асыруға мүмкіндік береді. Алдын ала жариялауды қажет ететін тілдердің басты мысалдары – C және Pascal, ал Java-да мұндай жариялау қажет емес.