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

[проверена преработка][проверена преработка]
Избришана содржина Додадена содржина
с Правописна исправка, replaced: кои што → коишто using AWB
Ред 5:
Најзначајна причина поради која би сакале да го преведеме изворниот код е да креираме т.н. извршна програма. Името ’компајлер’ првично се користело за преведување на кодови од вишите програмски јазици во нижи програмски јазици, на пример од асемблерски јазик во машински јазик. Додека програмот којшто преведува од нижи програмски јазици во виши се нарекува декомпајлер.
 
Обично компајлерот ги изведува следниве активности: [[лексичка анализа]], [[предобработка]], [[расчленување (информатика)|расчленување]], [[семантичка анализа]], [[оптимизација на код|оптимизација на кодот]]от, [[создавање на код]].
 
== Историја ==
Софтверот за првите сметачи се пишувал во асемблерски јазик многу години. Вишите програмски јазици не беа измислени сè додека не се доби поволноста тие да се користат на различни видови CPU (Централна Процесирачка Единица). Многу ограничената меморија на раните сметачи исто така правела многу техничкипрограми за имплементацијата на компајлерот.
 
На крајот на 50тите години, први беа предложени машински-независните јазици. Тогаш се направени неколку експериментални компајлери. Првиот компајлер е напишан од Грејс Хопер, во 1952, за А-0 програмскиот јазик. FORTRAN тимот предводен од Џон Бакус (John Backus) во IBM е најголемиот виновник за претставувањето на првиот комплетен компајлер , во 1957 год.
 
За многу апликации идејата за користење виши програмски јазици беше прифатлива. Огромната функционалност поддржана од новите програмски јазици и зголемената комплексност на сметачки архитектури направи компајлерите да станат се послоложени.
Ред 19:
Еден метод кој се користи за разликување на компајлерите е платформата на која се генерира кодот кој ја создава извршната програма.
 
Хостиран компајлер е оној компајлер чиј излез е наменет да работи на истиот тип на сметач и оперативен систем на којшто работи самиот тој. Додека пак излезот на вкрстениот компајлер (cross compiler) е дизајниран да работи на различни платформи. Вкрстените компајлери често се употребуваат за градење на софтвер за вгнездени системи кои штокоишто не се наменети за поддржување на околина за развивање на софтвер.
 
Излезот на компајлерот којшто произведува код за Виртуелна Машина (ВМ) може но не мора да биде извршена на друга платформа.
Ред 47:
Во фазата Преден крај се анализира изворниот код за да сеизгради интерна репрезентација на програмата, наречена Интермедиална Репрезрнтација или ИР . Исто така се работи со табелата на симболи којашто е податочна структура која секој симбол од изворниот код му ја придава информацијата како локација и тип. Тоа се прави во неколку фази, меѓу кои ги вклучува и следниве:
 
* '''[[Реконструкција на редови|Реконструкција на редовите]]те''' - јазиците кои ги категоризираат нивните клучни зборови и дозволуваат празни места меѓу идентификаторите имаат потреба од фаза пред [[расчленување (информатика)|расчленувањето]], којашто ги конвертира влезните знаци во канонична форма подготвена за расчленувачот. Надолниот рекурзивен расчленувач кој користи табела користен во 60тите години чита од изворниот код знак по знак и не му е потребна позебна фаза за токенизирање.
 
* '''[[Лексичка анализа]]''' - го дели изворниот код на мали делови наречени токени. Секој токен неделив дел од програмскиот јазик, на пример може да биде клучен збор, идентификатор, променлива или име на некој симбол. Синтаксата на токените е обично некој регуларен јазик, па со помош на некоја форма за Конечен Автомат за соодветен региларен израз тој токен може да биде препознаен. Софтверот кој се користи за лексичка анализа се нарекува лексер или лексички анализатор.
 
* '''[[Препроцесирање]]''' - некои јазици како например С ја бараат оваа препроцесирачка фаза која поддржува макро супституција. Обично препроцесирањето се случува пред синтаксичката и семантичката анализа, како во примерот со програмскиот јазик С, и обично препроцесорот манипулира со лексички токени одколку со синтаксички форми. Но, постојат и некои јазици, како на пример Scheme, кои поддржуваат макро супституција но, базирана на синтаксички форми.
 
* '''[[Синтаксна анализа|Синтаксната анализа]]''' вклучува расчленување на токените за да се идентификува структурата на програмата. Оваа фаза буквално гради расчленувачко дрво, коешто ја заменува линеарната структура на токените структура на дрво според правилата на формалната граматика која што ја дефинира синтаксата на јазикот. Расчленувачкото дрво обично се анализира, проширува и трансформира од подоцнежните фази во компајлирањето.
 
* '''[[Семантичка анализа]]'''- е фаза во која компајлерот додава семантички информации на расчленувачкото дрво и ја гради табелата на симболи. Оваа фаза врши семантички проверки како што се проверка на типот, одбивање на неточните програми , дефинирање на активностии сигнализира со пораки за внимание. За семантичка анализа обично е потребно цело расчленувачко дрво, што значи дека оваа фаза логички следува после фазата за расчленување, и претходи на фазата за генерирање на код.
 
Ред 69 ⟶ 65:
 
Постоењето на интерпроцедуралната анализа и оптимизација е вообичаена за компајлерите од IBM, SGI, Intel, Microsoft и Sun Microsystem.
 
 
 
== Пример за компајлер ==
Следнава програма презентира многу прост компајлер напишан во C. Овој компајлер компајлира изрази дефинирани со infix нотација во postfix нотација. Овој компајлер користи рекурзивна стратегија, која се препознава по тоа што секоја функција кореспондира со нетерминален симбол во јазичната граматика.
 
 
#include <stdlib.h>
Ред 234 ⟶ 227:
ADD A, B
PUSH A
 
 
 
== Наводи ==
Ред 250 ⟶ 241:
 
{{Нормативна контрола}}
 
[[Категорија:Информатика]]
[[Категорија:Програмски јазици]]