Препроцесори

Од Википедија, слободната енциклопедија
Прејди на: содржини, барај

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

Чест пример во компјутерското програмирање е процесирањето врз изворниот код пред следниот чекор на компилација. Во некои компјутерски јазици (пр. 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. Oва сепак може да се смета за форма на препроцесирање, бидејќи е потребно место пред другите фази на компајлирање.

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

Специјализирање на јазик[уреди]

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

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

Препроцесори за општа намена[уреди]

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

  • користење на С препроцесор за процесирање во Јavascript
  • користење на М4 или С препроцесор како шаблонски мотор, со HTML генерацијата