Предобработувач

Во компјутерската наука, **предобработувач** (*предобработувач*) — програма која обработува влезни податоци за да произведи излез кој ќе биде искористен како влез за некоја друга програма.За излезот се вели дека е **предобработен** облик од влезните податоци, која е често употребувана од некои последователни програми какви што се компајлерите. Износот и видот на извршената обработка зависи од природата на предобработувачот; некои предобработувачи се способни само за вршење на релативно едноставни текстуални субституции и макро експанзии, додека други имаат моќ како полноправните програмски јазици.

Чест пример во компјутерското програмирање е обработката врз изворниот код пред следниот чекор на компилација. Во некои компјутерски јазици (пр. C и PL/I) постои фаза на превод позната како предобработка.

## Лексички предобработувачи

Лексичките предобработувачи се најниското ниво на предобработувачи. Тие само бараат лексички анализи, работат на изворниот текст со вршење на едноставна замена на означените секвенци од карактери со други означени секвенци од карактери, според правила дефинирани од корисникот. Тие обично вршат макро супституција, текстуално вклучување на други податотеки, и  условна компилација или инклузија.

### Ц предобработувач

Најчестиот пример за  ова е предобработувачот Ц кој за директиви ги зема линиите што почнуваат со  „#“. Поради тоа што не знае ништо за основниот јазик, неговата употреба беше критикувана и многу од неговите одлики се изградени директно во други јазици. На пример, макроата заменети со агресивно вметнување и шаблони, вклучува време за компајлирање (ова бара зачувување на видот информации во објектниот код, правејќи ја оваа функција невозможна за осовременување во јазик); условното компајлирање е делотворно остварено со ако-тогаш-инаку и со  елиминација на мртвиот  код во некои јазици.

### Други лексички предобработувачи

Другите лексички предобработувачи вклучуваат општа намена m4, најчесто користена во cross-platform build системи како што се аутоконф и GEMA, - отворен изворен макро процесор кој оперира на моделите од контекстот.

## Синтаксички предобработувачи

Синтаксичките предобработувачи беа претставени со јазичното семејство Lisp. Нивната улога е да трансформираат синтаксички дрвја според број на кориснички дефинирани правила. За некои програмски јазици, правилата се напишани со истиот јазик како и програмата (compile-time reflection). Ваков е случајот со Lisp и OCaml. Некои други јазици се потпираат на целосно надворешните јазици за да ги дефинираат трансформациите, како на пример предобработувачите XSLT за  XML, или нивниот статично напишан колега CDuce.

Синтаксичките предобработувачи обично се користат за прилагодување на синтаксата на еден јазик,за проширување на јазик со додавање на нови примитиви, или вградување на Domain-Specific Programing Language во јазик за општа намена.

### Прилагодување на синтаксата

Добар пример за прилагодување на синтаксата е постоењето на две различни синтакси во програмскиот јазик OCaml . Програмите можат да бидат напишани индеферентно користејќи ја „нормалната синтакса“или „ревидираната синтакса“, и може да бидат убаво-испечатени со било која од побараната синтакса.

Слично на тоа, одреден број на програми напишани во OCaml ја прилагодуваат синтаксата на јазикот со додавање на нови оператори.

### Проширување на јазик

Најдобрите примери за проширување на јазик преку макроа се наоѓаат во јазичното семејство Lisp. Додека јазиците, сами по себе, се едноставни динамички напишани функционални јадра, стандардните дистрибуции на Scheme или Common Lisp дозволуваат објектно-ориентирано програмирање, како и статичко пишување. Скоро сите од овие одлики се имплементирани преку синтаксичко предобработка, иако тоа го носи истакнувајќи дека фазата на компајлирање „макро проширување“ се управувани од страна на компајлерот во Lisp. Ова сепак може да се смета за форма на предобработка, бидејќи е потребно место пред другите фази на компајлирање.

Слично на тоа, статички проверено, безбедни регуларни изрази или генерирање на код може да се додадат на синтаксата и семантиката на Ocaml преку макроа, како и преку микро-теми, monads, или транспарентна ХМL манипулација.

### Специјализирање на јазик

Една од необичните одлики на јазичното семејство Lisp е можноста за користење на макроа за да се создаде внатрешен Domain-Specific програмски јазик. Обично, во голем проект заснован на Lisp, еден модул може да биде напишан во различни мини-јазици, еден можеби користејќи дијалект на Lisp заснован на SQL, друг напишан на дијалект специјализиран за убаво печатење, итн. Стандардната библиотека на Common Lisp содржи пример за ова ниво на синтаксичка апстракција во форма на LOOP макро, кој имплементира ‘Algol-like’ минијазик за да опише комплексна итерација, додека сè уште овозможува користење на стандардни Lisp оператори.

предобработувачот на јазикот MetaOCaml обезбедува слични одлики за надворешни Domain-Specific програмски јазици. Овој предобработувач зема опис на  семантиката на јазикот (т.е толкувач) и, со комбинирање на времето за компајлирање и генерирањето на кодот, ја прави таа дефиниција во компајлер за OCaml програмскиот јазик и од тој јазик, или во bytecode или во native code.

## Општонаменски предобработувачи

Повеќето предобработувачи се специјализирани за одредена обработка на податоци (на пример, компајлирање на програмскиот јазик C). Еден предобработувач може да биде промовиран како предобработувач за општа намена, што значи дека не е наменет за одредена употреба или за одреден јазик, и е наменет да се користи за широк спектар на задачи за обработка на податоци.
М4 е веројатно најпознатиот пример за предобработувач за општа намена, иако предобработувачот во C  понекогаш се користи и не-С специфична улога. На пример:
*користење на С предобработувач за обработка во Јаvascript
*користење на М4 или С предобработувач како шаблонски мотор, со HTML генерацијата