Кіріспе

Басқа бағдарламаға кіріс деректерді өңдейтін бағдарлама. Компьютер ғылымында, алдын ала өңдегіш (немесе алдын ала компилятор) – өзінің кіріс деректерін өңдеп, одан басқа бағдарламаның кірісі ретінде пайдаланылатын нәтиже шығаратын бағдарлама. Нәтиже кіріс деректерінің алдын ала өңделген түрі болып саналады, оны көбінесе компиляторлар сияқты келесі бағдарламалар қолданады. Өңдеудің көлемі мен түрі алдын ала өңдегіштің табиғатына байланысты; кейбір алдын ала өңдегіштер қарапайым мәтіндік алмастырулар мен макро кеңейтулерді ғана жасай алады, ал басқалары толыққанды бағдарламалау тілдерінің мүмкіндіктеріне ие. Компьютерлік бағдарламалаудағы кең таралған мысал – келесі компиляция кезеңінен бұрын бастапқы кодты өңдеу. Кейбір компьютерлік тілдерде (мысалы, C және PL/I) алдын ала өңдеу деп аталатын аударма фазасы бар. Оған макро өңдеу, файлдарды қосу және тілдік кеңейтулер де кіруі мүмкін.

Лексикалық алдын ала өңдеуші

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

C алдын ала өңдеуші

Бұған ең көп таралған мысал – C препроцессоры, ол "#" таңбасымен басталатын жолдарды директивалар ретінде қабылдайды. C препроцессоры кіріс деректері C тілінің синтаксисін қолдануын күтпейді. Кейбір тілдер басқа тәсіл қолданып, ұқсас нәтижелерге қол жеткізу үшін енгізілген тілдік мүмкіндіктерді пайдаланады. Мысалы: макростардың орнына кейбір тілдер белсенді инлайнинг және шаблонды қолданады. Includes орнына кейбір тілдер объектілік кодтағы типтік ақпаратқа сүйенетін компиляция уақытында импорттауды қолданады. Кейбір тілдер шартты компиляцияны жүзеге асыру үшін if-else конструкцияларын және пайдасыз кодты жоюды қолданады.

Басқа лексикалық алдын ала өңдеу құралдары

Басқа лексикалық препроцессорларға жалпы мақсаттағы m4 кіреді, ол көбінесе autoconf сияқты көп платформалы құрастыру жүйелерінде қолданылады, сондай-ақ GEMA – контекстің үлгілерімен жұмыс істейтін ашық кодты макропроцессор.

Синтаксистік алдын ала өңдеуші

Синтаксистік препроцессорлар Lisp тілдер отбасымен бірге енгізілді. Олардың міндеті – пайдаланушы анықтаған бірқатар ережелерге сәйкес синтаксистік ағаштарды түрлендіру. Кейбір бағдарламалау тілдерінде ережелер бағдарламамен бірдей тілде жазылады (компиляция уақытындағы рефлексия). Бұл Lisp және OCaml тілдерінде кездеседі. Ал кейбір тілдер трансформацияларды анықтау үшін толыққанды сыртқы тілді пайдаланады, мысалы, XML үшін XSLT препроцессоры немесе оның статикалық түрде тексерілетін CDuce баламасы. Синтаксистік препроцессорлар көбінесе тілдің синтаксисін өзгерту, жаңа бастауыш элементтерді қосу арқылы тілді кеңейту немесе жалпы мақсаттағы тілдің ішінде салалық арнайы бағдарламалау тілін (DSL) енгізу үшін қолданылады.

Синтаксисті баптау

Синтаксисті жекелендірудің жақсы мысалы – Objective Caml бағдарламалау тілінде екі түрлі синтаксистің болуы. Бағдарламалар "қалыпты синтаксис" немесе "жаңартылған синтаксис" қолданып, қандай да бір айырмашылықсыз жазылуы мүмкін, сондай-ақ талап бойынша кез келген синтаксиспен әдемі форматталуы мүмкін. Сол сияқты, OCaml тілінде жазылған көптеген бағдарламалар жаңа операторларды қосу арқылы тілдің синтаксисін өзгертеді.

Тілді кеңейту

Макролар арқылы тілді кеңейтудің ең жақсы мысалдары Lisp тілдер отбасында кездеседі. Тілдердің өзі қарапайым динамикалық типтелген функционалдық ядро болғанымен, Scheme немесе Common Lisp стандартты таратулары императивті немесе объектіге бағытталған бағдарламалауға, сондай-ақ статикалық типтеуге мүмкіндік береді. Осы мүмкіндіктердің көбісі синтаксистік алдын ала өңдеу арқылы іске асырылады, бірақ компиляцияның "макро кеңейту" кезеңін Lisp-те компилятор басқаратынын атап өткен жөн. Бұл әлі де алдын ала өңдеудің бір түрі болып саналады, себебі ол компиляцияның басқа кезеңдерінен бұрын жүзеге асырылады.

Тілді меңгеру

Lisp тілдер отбасының ерекше қасиеттерінің бірі – ішкі DSL құру үшін макростарды қолдану мүмкіндігі. Көбінесе, ірі Lisp негізделген жобада модуль әртүрлі шағын тілдерде жазылуы мүмкін, мысалы, біреуі Lisp-тің SQL негізделген түрінде, екіншісі GUI немесе әдемі форматтауға арналған түрінде және т.б. Common Lisp стандартты кітапханасы осы деңгейдегі синтаксистік абстракцияның LOOP макросы түріндегі мысалын қамтиды, ол күрделі итерацияны сипаттау үшін Algol сияқты шағын тілді жүзеге асырады, сонымен бірге стандартты Lisp операторларын пайдалануға мүмкіндік береді. MetaOCaml алдын ала процессоры/тілі сыртқы DSL үшін ұқсас мүмкіндіктерді ұсынады. Бұл алдын ала процессор тілдің семантикасын сипаттауды (яғни интерпретаторды) қабылдап, компиляция уақытында интерпретациялау және кодты құруды біріктіре отырып, осы анықтаманы OCaml бағдарламалау тіліне компиляторға айналдырады, ал осы тілден байт-кодқа немесе машиналық кодқа айналдырады.

Жалпы мақсаттағы алдын ала өңдеуші

Көптеген алдын ала өңдеушілер нақты деректерді өңдеу міндетіне арналған (мысалы, C тілін компиляциялау). Алдын ала өңдеуші жалпы мақсатты деп жариялануы мүмкін, яғни ол нақты қолданыс немесе бағдарламалау тіліне бағытталмаған және мәтінді өңдеудің кең ауқымындағы міндеттер үшін қолданылуға арналған. M4 мұндай жалпы мақсатты алдын ала өңдеушінің ең белгілі мысалы болып табылады, бірақ C алдын ала өңдеушісі кейде C-ге қатысты емес рөлдерде де қолданылады. Мысалдар:
JavaScript-ті алдын ала өңдеу үшін C алдын ала өңдеушісін пайдалану. Linux ядросының ішінде құрылғы ағашын өңдеу үшін C алдын ала өңдеушісін пайдалану. M4 (мақаладағы мысалға қараңыз) немесе C алдын ала өңдеушісін HTML құру үшін үлгілік қозғалтқыш ретінде пайдалану. imake, C алдын ала өңдеушісін пайдаланатын интерфейс, X Window System үшін жазылған, бірақ қазір automake пайдасына қолданылмайды. grompp, GROMACS үшін симуляциялық кіріс файлдарына арналған алдын ала өңдеуші (компьютерлік химиядағы кейбір мәселелер үшін жылдам, тегін, ашық кодты бағдарлама), ол топологияны талдау үшін жүйелік C алдын ала өңдеушісін (немесе симуляциялық кіріс файлымен анықталған басқа алдын ала өңдеушіні) шақырады, көбінесе #define және #include механизмдерін қолдана отырып, grompp жұмыс істейтін кезде тиімді топологияны анықтайды.