Програмски преведувач: Разлика помеѓу преработките

[непроверена преработка][непроверена преработка]
Избришана содржина Додадена содржина
с Бот Додава: la:Compilatrum
с Бот: козметички промени
Ред 1:
{{Без извори|датум=ноември 2009}}
[[СликаПодатотека:kompajler.png|right|thumb|300px|Дијаграм на операциите на типичен мултијазичен, мултитаргет компјалер.]]
 
'''Компајлер''' е компјутерски програм (или множество програми) кои го преведуваат текстот напишан во т.н. компјутерски јазик (изворен јазик) во друг компјутерски јазик- целниот јазик. Оргиналниот текст којшто му го даваме на компјутерот да го преведе се нарекува изворен код, додека излезниот код се нарекува објектен код. Обично излезот е во форма со која можат да се процесираат други програми, но може да биде и форма читлива за човекот-текстуална датотека.
Ред 9:
 
== Историја ==
Софтверот за првите компјутери се пишувал во асемблерски јазик многу години. Вишите програмски јазици не беа измислени се додека не се доби поволноста тие да се користат на различни видови CPU (Централна Процесирачка Единица). Многу ограничената меморија на раните компјутери исто така правела многу техничкипрограми за имплементацијата на компајлерот.
 
На крајот на 50тите години, први беа предложени машински-независните јазици. Тогаш се направени неколку експериментални компајлери. Првиот компајлер е напишан од Грејс Хопер, во 1952, за А-0 програмскиот јазик. FORTRAN тимот предводен од Џон Бакус (John Backus) во IBM е најголемиот виновник за претставувањето на првиот комплетен компајлер , во 1957 год.
 
За многу апликации идејата за користење виши програмски јазици беше прифатлива. Огромната функционалност поддржана од новите програмски јазици и зголемената комплексност на компјутерските архитектури направи компајлерите да станат се послоложени.
 
Раните компајлери беа пишувани во асембли јазик. Првиот само-одржувачки компајлер- спосебен да искомпајлира сопствен изворен код од виш програмски јазик- беше креиран од Lisp од Харт и Левин во MIT во 1962 год. Од 70тите години вообичаена практика беше да се имплементира компајлер во јазикот кој го компајлира , иако и Pascal и C беа популарни избори за имплементација на јазикот.
 
 
Ред 26:
 
 
== Компајлер наспроти интерпретер ==
Многу луѓе прават поделба меѓу вишите програмски јазици на компајлирачки јазици и интерпретирачки јазици. Компајлерите и интерпретерите се имплементации на јазици, но самите тие не претставуваат јазици. Категоризирањето обично се рефлектира на најпознатите и најраширените имплементации на јазикот, на пример за BASIC се мисли дека е интерпретирачки јазик, додека за С компајлирачки, и покрај постоењето на BASIC компајлери и С интерпретери.
 
Но постојат и исклучоци, некои спецификации на јазици кажуваат дека во имплементацијата мора да се вклучи функционалноста на компајлерот (Common Lisp) додека други јазици имаат делови кои можат многу лесно да се приспособат на интерпретер, но прават пишувањето на компајлер да биде многу тешко, за пример, SNOBOL4.
 
== Хардвер компајлирање ==
Ред 39:
Компајлер за релативно едноставен јазик напишан од некое лице може да биде многу едноставен софтвер. Но кога изворниот код е голем и комплексен и е потребен квалитетен излез тогаш дизајнот на компајлерот може да се подели во неколку фази или поминувања. Да се раздели работата во фази се мисли дека развојот може подели на мали делови и да се додели на различни лица да ги изработат. Исто така многу е полесно да се замени само еден дел со некоја негова подобрена верзија.
 
Поделбата на компајлирањето како процес беше предложено од Production Quality Compiler-Compiler Project на Carneige Mellon Универзитетот. Овој проект ги внесе термините “преден крај”,” среден крај”(кој ретко се користи) и “заден крај”.
 
Скоро сите помали компајлери имаат најмалку две фази. Но, овие фази обично се разгледуваат какодел од ” предниот” или “задниот крај”. Местото каде овие “краеви” се сретнуваат секогаш било отворено за дебата. “Предниот крај” генерално работи за синтаксичка и семантичка анализа, заедно со преведувањето во понизок јазик од изворниот код.
 
“Средниот крај” обично е наменет за оптимизација на друг вид на код различен од изворниот или машинскиот. “Задниот крај” го зема излезот на средниот крај, и потоа може да направи уште анализи, трансформации и оптимизации кои ќе ги направи за соодветниот компјутер. Потоа генерира код за соодветниот процесор и оперативен систем.
 
Пристапот со разделување на компајлирањето во фази преден/среден/заден крај прави возможно комбинирањето на фазата на предниот крај за различни јазици со фазата-заден крај за различни CPU. Практичен пример за тоа GNU Compiler Collection и Amsterdam Compiler Kit.
Ред 50:
Во фазата Преден крај се анализира изворниот код за да сеизгради интерна репрезентација на програмата, наречена Интермедиална Репрезрнтација или ИР . Исто така се работи со табелата на симболи којашто е податочна структура која секој симбол од изворниот код му ја придава информацијата како локација и тип. Тоа се прави во неколку фази, меѓу кои ги вклучува и следниве:
 
* '''[[Реконструкција на редови|Реконструкција на редовите]]''' - јазиците кои ги категоризираат нивните клучни зборови и дозволуваат празни места меѓу идентификаторите имаат потреба од фаза пред парсирањето, којашто ги конвертира влезните знаци во канонична форма подготвена за парсерот. Top-down рекурзивниот парсер кој користи табела користен во 60тите години чита од изворниот код знак по знак и не му е потребна позебна фаза за токенизирање.
 
* '''[[Лексичка анализа]]''' - го дели изворниот код на мали делови наречени токени. Секој токен неделив дел од програмскиот јазик, на пример може да биде клучен збор, идентификатор, променлива или име на некој симбол. Синтаксата на токените е обично некој регуларен јазик, па со помош на некоја форма за Конечен Автомат за соодветен региларен израз тој токен може да биде препознаен. Софтверот кој се користи за лексичка анализа се нарекува лексер или лексички анализатор.
 
* '''[[Препроцесирање]]''' - некои јазици како например С ја бараат оваа препроцесирачка фаза која поддржува макро супституција. Обично препроцесирањето се случува пред синтаксичката и семантичката анализа, како во примерот со програмскиот јазик С, и обично препроцесорот манипулира со лексички токени одколку со синтаксички форми. Но, постојат и некои јазици, како на пример Scheme, кои поддржуваат макро супституција но, базирана на синтаксички форми.
 
* '''[[Синтаксна анализа|Синтаксната анализа]]''' вклучува парсирање на токените за да се идентификува структурата на програмата. Оваа фаза буквално гради парсирачко дрво, коешто ја заменува линеарната структура на токените структура на дрво според правилата на формалната граматика која што ја дефинира синтаксата на јазикот. Парсирачкото дрво обично се анализира, проширува и трансформира од подоцнежните фази во компајлирањето.
 
* '''[[Семантичка анализа]]'''- е фаза во која компајлерот додава семантички информации на парсирачкото дрво и ја гради табелата на симболи. Оваа фаза врши семантички проверки како што се проверка на типот, одбивање на неточните програми , дефинирање на активностии сигнализира со пораки за внимание. За семантичка анализа обично е потребно цело парсирачко дрво, што значи дека оваа фаза логички следува после фазата за парсирање, и претходи на фазата за генерирање на код.
 
== Заден крај ==
Терминот “Заден крај” често се поистоветува генератор на код поради делумната функционалност на генерирање на асемблерски код. Некои литератури ја користат “Средната фаза” за да ги означат фазите на анализа и оптимизација.
 
Главните процеси се:
 
* '''[[Анализа]]'''-Ова е собирање на информациите од програмата за интермедиална репрезентација дадена од влезот. Типични анализи се: анализа на протокот на податоците, анализа на зависностите , анализа на имињата, анализа на покажувачите и еscape анализата итн. Точноста на анлизите е основна за оптимизацијата.
 
'''[[Оптимизација]]'''- интермедиалната репрезентација на јазикот е трансформирана во некој функционален еквивалент но во побрзи (помали) форми.
Ред 71:
'''[[Генерирање на код]]'''- трансформираниот јазик се преведува во излезен јазик, обично во соодветниот машински. Ова вклучува одлуки за ресурсите и меморијата, како што се која од променливите да се стави во некој од регистрите , потоа планирањето на меморија и селекцијата и распоредот на соодветните машински инструкции заедно со дадените адреси.
 
Постоењето на интерпроцедуралната анализа и оптимизација е вообичаена за компајлерите од IBM, SGI, Intel, Microsoft и Sun Microsystem.