ОПТИМИЗУЈУЋИ КОМПАЈЛЕР Структура компајлера Предњи део, до међукода 1
Важна својства одредишне архитектуре Подржане операције Регистри и меморија (Ресурси - операнди) Проточна структура Организација меморије Харвард архитектура Хардверске петље 2
МОДУЛИ КОМПАЈЛЕРА: Preprocesor Leksička analiza Sintaksna analiza Prevođenje u međukod Prevođenje u kanonički oblik Izbor instrukcija Mašinski zavisna optimizacija 3 Izvorni program Preprocesiran program Niz tokena Abstraktna sintaksa Stablo međukoda Stablo međukoda Pseudoasembler Pseudoasembler Postavljanje okvira Okvir Graf toka Graf smetnji Dodeljeni resursi Prilagođen kod Prenosivi objektni kod Mašinski jezik Analiza toka upravljanja Analiza toka podataka Dodela resursa Prilagođavanje koda protočnoj strukturi Generisanje koda Povezivanje
MASx фамилија ДСП-ова (у примерима MASC) Намењен за извршавање програма за обраду сигнала говора и музике (аудио). На пример, коришћен је у првом комерцијално успешном MP3 плејеру 1998. 4
Основне техничке карактеристике (1/2) Дужина бајта овог процесора је 20 бита. У бајтове се смештају подаци у облику непокретног зареза. 4 регистра опште намене, 2 акумулатора Процесор поседује један програмски адресни простор и два адресна простора података. MASC је процесор са проточном обрадом са девет фаза. 4K RAM и 6K ROM интегрисаних са процесором у једном интегрисаном колу, 5
Основне техничке карактеристике (2/2) три магистрале података: програмска (PD) и две за податке (D0 и D1), маскирање и померање података приликом преноса из меморије у ALU и обрнуто, учестаност процесорског такта од 40MHz при напајању од 4,75V-5,5V учестаност процесорског такта је под програмском контролом. 6
Аритметика у непокретном зарезу 1.000 (-1) 0.011 (3/8) Опсег података: [-1, 1) 20 бита 11.101000 << 1 1.101000 [-2048, 2048) 12 бита Акумулатор 0.5 + 0.75-0.3-0.8-0.6-0.4-0.25 + 0.5 = -0.6 0.5 + 0.75 = 1.25 0.5 + 0.75-0.3 = 0.95 0.5 + 0.75-0.3-0.8 = 0.15 0.5 + 0.75-0.3-0.8-0.6 = -0.45 0.5 + 0.75-0.3-0.8-0.6-0.4 = -0.85 0.5 + 0.75-0.3-0.8-0.6-0.4-0.25 = -1.1 0.5 + 0.75-0.3-0.8-0.6-0.4-0.25 + 0.5 = -0.6 7
Фазе проточне обраде Faza X Faza Y Faza Z Faza A Faza B Faza C Faza D Faza E Faza F 8
Пример инструкције: fc0 = dc0 + ac1 * z10 Из инструкције се види да се податак из меморије узима у фази Z (ознака z10), податак из акумулатора 1 у наредној фази A (ознака ac1), податак из акумулатора 0 у фази D (ознака dc0), а резултат се уписује у акумулатор 0 у задњој фази F (ознака fc0). 9
Фазе обраде инструкција које следе инструкцију скока у тренутку скока: Instrukcija Skok Prva iza skoka Druga iza skoka Treća iza skoka Četvrta iza skoka Peta iza skoka Šesta iza skoka Faza protočne obrade D C B A Z Y X 10
Пример уметања NOP инструкција између инструкција постављања и коришћења (очитавања) акумулатора. Посматра се тренутак кад је инструкција очитавања акумулатора у фази Y: Instrukcija CC1 = AC1 XOR AC1 NOP NOP NOP ZR0(15) = YC1 Faza protočne obrade C B A Z Y 11
Харвард архитектура Меморија Захвати Декодирај Изврши 12
Харвард архитектура Меморија Захвати Декодирај Изврши Захвати Декодирај Изврши Захвати Декодирај Изврши 13
Харвард архитектура Меморија Меморија за податке Захвати Декодирај Изврши Захвати Декодирај Изврши Захвати Декодирај Изврши c = a * b 14
Харвард архитектура Меморија Захвати Меморија за податке 1 Меморија за податке 2 Декодирај Изврши Захвати Декодирај Изврши Захвати Декодирај Изврши c = a * b 15
Физички подржане петље Провера услова Тело петље Извши се n пута Тело петље Тело петље Тело петље n пута Тело петље Петље код којих је број итерација познат већ током превођења Петље код којих је број итерација познат пре него што петља почне 16
КОМПАЈЛЕР ЗА ДИЈАЛЕКТ ЦЕА Преводи изворни програмски код у тзв. MAS-like C језику на машински језик. MAS-like C је подскуп стандардног ANSI Це језика, проширен аспектима који одражавају особине физичких компонената процесора MASx. То су пре свега два нова уграђена типа променљивих, означених са dsp20 и dsp32. 17
Лексичка анализа (Скенер) Писање лексичког анализатора (енгл. scanner) представља сложен и грешкама подложан задатак па се из тог разлога користе алати за генерисање лексичког анализатора. Један од најчешће коришћених генератора је flex (енгл. fast lexical analyzer) развијен на Беркли универзитету. 18
Синтаксни анализатор (Парсер) Задужен за проверу редоследа терминалних симбола (тзв.. лексема) у изворном коду програма. Формира стабло синтаксне анализе. За добијање синтаксног анализатора се такође користи одговарајући генератор нпр. byacc (енгл. yet another compiler compiler - yacc), који је такође развијен на Беркли универзитету. Или новији Bison 19
Табела симбола Са директним приступом појединим врстама (енгл. hash). Реализована као Це++ класа CSymbolTable Садржи информацију о свим симболима (променљиве, константе, функције, лабеле, типови података и структуре) из полазног програма. 20
Објекти у табели симбола CSymTabEntry, то је основна класа из које се изводе све класе објеката табеле симбола, CVarEntry, представља променљиву, CArrayEntry, представља вектор, CFuncEntry, преставља функцију, CTypeEntry, представља тип података, CLabelEntry, представља лабелу, CConstEntry, представља константу, CTypeDefEntry, представља дефиницију корисничког типа, и CTypeEnumEntry, представља једну могућу вредност пребројивог типа (enum). 21
Стабло синтаксне анализе Представља све исказе и изразе полазног програма. Чворови су инстанце синтаксних класа, које се још називају и класама апстрактне синтаксе. Постоје две главне групе класа апстрактне синтаксе, прва представља исказе, а друга изразе. 22
Класе апстрактне синтаксе које одговарају исказима Це језика CWhile CDoWhile CFor CEmpty CLabel ClfElse CExprStatement CLoop CGoto CReturn CStatement CSwitch CCase CDefault CContinue CBreak CStatementList CCompound 23
Класе апстрактне синтаксе које одговарају изразима Це језика Unary Binary Ternary CUnary (from Unary) CBinary (from Binary) CTernary (from Ternary) CLmul COperator CExprList CExpression CExprList CEmptyExpr CVarExpr CFieldDotAccess CFieldPtrAccess CListExpr VarAccess CArrayAccess CFuncCall 24
Класе апстрактне синтаксе које одговарају унарним изразима Це језика CDereference CReference CUnPlus CUnMinus CComplement CExp CNot CsizeOf_I CUnary CsizeOf_II CCast CPostDec CPreDec CPostInc CPreInc COffset CAbs 25
бинарни изрази CPlus CTimes CMul CComutative CEq CAnd CEor COr CLogicAnd CLogicOr CEqual CNotEqual CAssign CTimeAssign CBinary CDivAssign CShiftLeft CShiftRight CAsh CLsh CModAssign CAddAssign CShif CNotComutative CAssignment CSubAssign CLShiftAssign CComma CRShiftAssign CGreaterOrEqual CAndAssign CLessOrEqual CRelation CDiv CMod CMinus CEorAssign CGreaterThen CLessThen COrAssign 26
Одређивање типова Примарни задатак овог модула је да одреди типове свих израза из полазног програма. Секундарни задатак ове фазе компајлера је да у случају израза са константама, након што одреди тип израза, одреди и његову вредност. 27
Статичка провера семантике Провера типова свих операнада у изразима, провера броја параметара код позива функције (који мора бити једнак броју параметара у дефиницији функције). и слично. 28
Анализа показивача (1/7) Два опречна захтева Да би се избегла потреба за динамичким дереференцирањем показивача потребно је све променљиве на које показивач може показати сместити у исту меморијску зону података (било D0 или D1). У циљу добијања оптималног кода за бинарне операције потребно је податке (операнде) смештати у различите меморијске зоне. 29
Анализа показивача (2/7) Ограничења смештања Анализа показивача се обавља над стаблом синтаксне анализе. Излаз је низ ограничења за смештање променљивих. Смештање у исту (ознака =) или различите зоне (!=). Ова ограничења се користе касније у фази доделе ресурса променљивама. 30
Анализа показивача (3/7) Анализа исказа доделе вредности Анализирају се операције доделе вредности и бинарне операције. За показивач са леве стране оператора доделе вредности утврђује се његов назив и ниво индирекције: 0 нема индирекције - у показивач се уписује адреса 1 један ниво индирекције - вредност с десне стране оператора доделе вредности се уписује на адресу на коју показује показивач, итд. 31
Анализа показивача (4/7) Анализа исказа доделе вредности Затим се анализира десна страна операције доделе вредности ради одређивања назива променљиве чија адреса или вредност се додељује, као и нивоа индирекције. За сваки овакав пар се генерише по једна релација показује на. Нпр. анализа исказа (у ком су p и q тзв. доминатори): *p = *(q + 4 * i); резултује релацијом (p,1)-(q,1) 32
Анализа показивача (5/7) Анализа исказа доделе вредности За исказ p=q добија се релација (p,0)- (q,0) и означава да показивач p може показивати на све променљиве на које може показивати q (p и q су тзв. алијаси) За исказ p = &q добија се релација (p,0)-(q,-1) где ниво индирекције -1 одговара операцији узимање адресе. 33
Анализа показивача (6/7) Анализа скупова променљивих Након што се скупе све релације, утврђују се скупови променљивих на које показују поједини показивачи. За сваки такав скуп се генеришу ограничења смештања у исту зону података. Нпр. анализом релација: (p,0)-(a,-1) и (p,0)-(b,-1) закључује се да показивач p може да показује на променљиве a и b па се генерише ограничење a=b. 34
Анализа показивача (7/7) Анализа бинарних операција Овај модул компајлера обавља и анализу бинарних операција и генерише ограничење смештања променљивих, које су операнди бинарних операција, у различите зоне података. Нпр. као резултат анализе израза a + b генерише се ограничење a!=b. 35
Физички подржане петље Додатна ограничења које намеће архитектура: Дужина тела петље (код MASC 128) Количина угњеждених петљи (код MASC 1) Минимални и максимални број итерација (код MASC-а мин. 1, макс. 1024) Кашњење почетка петље Преклапање краја угњеждених петљи 36
Откривање петљи које могу бити физички подржане (1/3) Задатак ове фазе је да открије петље из полазног програма које се могу подржати тзв. физичком петљом процесора (енгл. hardware loop). Ради откривања петљи које се могу физички подржати анализирају се чворови исказа петљи (for, while, do_while) у стаблу синтаксне анализе. 37
Откривање петљи које могу бити физички подржане (2/3) Услови: познат је назив и почетна вредност индексне променљиве познат је корак итерације познат је број итерација У коду нема skip и jump инструкција (break и continue су дозвољене) У коду нема инструкција физичке петље У телу петље има мање од 128 инструкција 38
Откривање петљи које могу бити физички подржане (3/3) Ради упрошћења анализе траже се само неки облици услова извршења итерације и корака итерације. Услов извршења петље може имати облик: i < <= >= >!= [(- +] j [)] [ + - * [(- +] k [)] ] i је индекс петље, j и k су целобројне променљиве или константе Корак петље може имати облик: i[++ --] ili [++ --]i ili i [+= -=] c ili i = i [+ -] c i је индекс петље, а c је целобројна константа 39