VYSOK ´
E U ˇ
CEN´I TECHNICK ´
E V BRN ˇ
E
BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA INFORMA ˇ
CN´ICH TECHNOLOGI´I
´
USTAV PO ˇ
C´ITA ˇ
COV ´
E GRAFIKY A MULTIM ´
EDI´I
FACULTY OF INFORMATION TECHNOLOGY
DEPARTMENT OF COMPUTER GRAPHICS AND MULTIMEDIA
SCRIPT PRO ZPRACOV ´
AN´I OBRAZU
DIPLOMOV ´
A PR ´
ACE
MASTER’S THESIS
AUTOR PR ´
ACE
Bc. JI ˇ
R´I ZUZA ˇ
N ´
AK
AUTHOR
VYSOK ´
E U ˇ
CEN´I TECHNICK ´
E V BRN ˇ
E
BRNO UNIVERSITY OF TECHNOLOGY
FAKULTA INFORMA ˇ
CN´ICH TECHNOLOGI´I
´
USTAV PO ˇ
C´ITA ˇ
COV ´
E GRAFIKY A MULTIM ´
EDI´I
FACULTY OF INFORMATION TECHNOLOGY
DEPARTMENT OF COMPUTER GRAPHICS AND MULTIMEDIA
SCRIPT PRO ZPRACOV ´
AN´I OBRAZU
SCRIPT LANGUAGE FOR IMAGE PROCESSING
DIPLOMOV ´
A PR ´
ACE
MASTER’S THESIS
AUTOR PR ´
ACE
Bc. JI ˇ
R´I ZUZA ˇ
N ´
AK
AUTHOR
VEDOUC´I PR ´
ACE
Doc. Dr. Ing. PAVEL ZEM ˇ
C´IK
SUPERVISOR
Zad´
an´ı diplomov´
e pr´
ace
ˇ
Reˇsitel: Zuzaˇn´ak Jiˇr´ı, Bc.
Obor: Poˇc´ıtaˇcov´a grafika a multim´edia T´ema: Script pro zpracov´an´ı obrazu Kategorie: Uˇzivatelsk´a rozhran´ı
Pokyny:
1. Prostudujte z´akladn´ı informace o zpracov´an´ı obrazu a dostupnou literat˚uru na t´ema script jazyky a interpretery script jazyk˚u
2. Navrhnˇete syntax jazyka pro popis operac´ı nad obrazy
3. Implementujte pˇrekladaˇc jazyka do mezik´odu a interpreter (nutno konzultovat) 4. Diskutujte dosaˇzen´e v´ysledky
Literatura:
• ˇZ´ara, J. Beneˇs B. Felker P.: Modern´ı poˇc´ıtaˇcov´a grafika, Computer Press, 1998 • D´ale dle pokyn˚u vedouc´ıho
Pˇri obhajobˇe semestr´aln´ı ˇc´asti diplomov´eho projektu je poˇzadov´ano: • Body 1 a 2 zad´an´ı
Podrobn´e z´avazn´e pokyny pro vypracov´an´ı diplomov´e pr´ace naleznete na adrese http://www.fit.vutbr.cz/info/szz
Technick´a zpr´ava diplomov´e pr´ace mus´ı obsahovat formulaci c´ıle, charakteristiku souˇcasn´eho stavu, teore-tick´a a odborn´a v´ychodiska ˇreˇsen´ych probl´emu a specifikaci etap, kter´e byly vyˇreˇseny v r´amci roˇcn´ıkov´eho a semestr´aln´ıho projektu (30 az 40% celkov´eho rozsahu technick´e zpr´avy).
Student odevzd´a v jednom v´ytisku technickou zpr´avu a v elektronick´e podobˇe zdrojov´y text technick´e zpr´avy, ´
uplnou programovou dokumentaci a zdrojov´e texty programu. Informace v elektronick´e podobˇe budou uloˇzeny na standardn´ım pamˇetov´em m´ediu (disketa, CD-ROM), kter´e bude vloˇzeno do p´ısemn´e zpr´avy tak, aby nemohlo doj´ıt k jeho ztr´atˇe pˇri bˇeˇzn´e manipulaci.
Vedouc´ı: Zemˇc´ık Pavel, doc. Dr. Ing., UPGM FIT VUT Datum zad´an´ı: 28. ´unora 2007
Licenˇ
cn´ı smlouva
Licenˇcn´ı smlouva v kompletn´ım znˇen´ı je uloˇzena v archivu Fakulty informaˇcn´ıch technologi´ı Vysok´eho uˇcen´ı technick´eho v Brnˇe.
V´yˇnatek z licenˇcn´ı smlouvy:
ˇ
Cl´anek 2
Udˇelen´ı licenˇcn´ıho opr´avnˇen´ı
1. Autor touto smlouvou poskytuje nabyvateli opr´avˇnen´ı (licenci) k v´ykonu pr´ava uveden´e d´ılo nev´ydˇeleˇcnˇe uˇz´ıt, archivovat a zpˇr´ıstupnit ke studijn´ım, v´yukov´ym a v´yzkumn´ym ´uˇcel˚um vˇcetnˇe poˇrizov´an´ı v´ypis˚u, opis˚u a rozmnoˇzenin.
2. Licence je poskytov´ana celosvˇetovˇe, pro celou dobu trv´an´ı autorsk´ych a majetkov´ych pr´av k d´ılu.
3. Autor souhlas´ı se zveˇrejnˇen´ım d´ıla v datab´azi pˇr´ıstupn´e v mezin´arodn´ı s´ıti: ihned po uzavˇren´ı t´eto smlouvy
1 rok po uzavˇren´ı t´eto smlouvy 3 roky po uzavˇren´ı t´eto smlouvy 5 let po uzavˇren´ı t´eto smlouvy 10 let po uzavˇren´ı t´eto smlouvy
(z d˚uvodu utajen´ı v nˇem obsaˇzen´ych informac´ı).
4. Nev´ydˇeleˇcn´e zveˇrejˇnov´an´ı d´ıla nabyvatelem v souladu s ustanoven´ım § 47b z´akona c. 111/1998 Sb., v platn´em znˇen´ı, nevyˇzaduje licenci a nabyvatel je k nˇemu povinen a opr´avnˇen ze z´akona.
Abstrakt
Tato pr´ace pojedn´av´a o n´avrhu skriptovac´ıho jazyka, urˇcen´eho pro efektivn´ı zpracov´an´ı obrazu. ´Uvod t´eto pr´ace se zab´yv´a studiem a osvojen´ım si metod n´avrhu pˇrekladaˇc˚u a in-terpret˚u, vˇcetnˇe jejich n´asledn´e aplikace pˇri n´avrhu skriptovac´ıho jazyka a jeho interpretu. Pr´ace d´ale popisuje metody n´avrhu a implementace interpretu, vˇcetnˇe automatizovan´ych metod vyuˇzit´ych pˇri n´avrhu implementovan´eho programu. Dalˇs´ı ˇc´ast pr´ace se zab´yv´a popi-sem struktury a implementace navrˇzen´eho programu, urˇcen´eho pro generov´an´ı pˇrekladaˇce libovoln´eho jazyka, popsan´eho jako vstup tohoto programu. Konec pr´ace podrobnˇeji po-pisuje navrˇzen´y skriptovac´ı jazyk, jehoˇz implementace je zaloˇzena na v´yˇse popsan´ych me-tod´ach.
Kl´ıˇ
cov´
a slova
Skript, skriptovac´ı jazyk, pˇrekladaˇc, interpret, zpracov´an´ı obrazu, lexik´aln´ı anal´yza, syn-taktick´a anal´yza, s´emantick´a anal´yza
Abstract
This thesis deals with design of scripting language, especially specified for effective image processing. Introduction of this thesis is focused on studying and also appropriation of methodology of compilers and interpreters design, include their following application in design of the scripting language and as well its interpreter. Another point of my work is showing the methods of design and implementation of the interpreter including automated methods used in the design of the implemented program. Next part deals with description of structure and implementation of the designed program, intended for generating compiler of any language which is described in input of this program. The conclusion of this work is more detailing description of the scripting language design; its implementation is based on the methods mentioned before.
Keywords
Script, scripting language, compiler, interpreter, image processing, lexical analysis, syntactic analysis, semantic analysis
Citace
Script pro zpracov´
an´ı obrazu
Prohl´
aˇ
sen´ı
Prohlaˇsuji ˇze jsem tuto pr´aci vypracoval samostatnˇe na z´akladˇe uveden´e literatury pod veden´ım vedouc´ıho pr´ace. Uvedl jsem vˇsechny liter´arn´ı prameny a publikace ze kter´ych jsem ˇcerpal.
. . . . Jiˇr´ı Zuzaˇn´ak 22. kvˇetna 2007
Podˇ
ekov´
an´ı
Dˇekuji vedouc´ımu pr´ace Doc. Dr. Ing. Pavlu Zemˇc´ıkovi za veden´ı a cenn´e rady pˇri zpra-cov´an´ı diplomov´e pr´ace.
c
Jiˇr´ı Zuzaˇn´ak, 2007.
Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Vysok´em uˇcen´ı technick´em v Brnˇe, Fakultˇe in-formaˇcn´ıch technologi´ı. Pr´ace je chr´anˇena autorsk´ym z´akonem a jej´ı uˇzit´ı bez udˇelen´ı opr´avnˇen´ı autorem je nez´akonn´e, s v´yjimkou z´akonem definovan´ych pˇr´ıpad˚u.
Obsah
1 Uvod´ 2
2 Skriptovac´ı jazyky 4
2.1 Popis skriptovac´ıch jazyk˚u . . . 4
2.2 Zn´am´e skriptovac´ı jazyky . . . 5
3 Pˇrekladaˇce, kompil´atory a interprety 7 3.1 Uvod do pˇ´ rekladaˇc˚u . . . 7
3.2 Lexik´aln´ı anal´yza . . . 8
3.3 Syntaktick´a anal´yza . . . 10
3.4 Intermedi´arn´ı k´od . . . 10
3.5 Generov´an´ı c´ılov´eho k´odu, interpretace . . . 13
4 Motivace, souˇcasn´y stav pr´ace 14 4.1 Motivace. . . 14
4.2 Souˇcasn´y stav pr´ace . . . 14
4.3 Zhodnocen´ı souˇcasn´eho stavu . . . 15
5 Navrˇzen´y pˇrekladaˇc 16 5.1 Popis souboru definuj´ıc´ıho jazyk . . . 16
5.2 Nalezen´ı koneˇcn´eho automatu . . . 18
5.3 Generov´an´ı rozkladov´e tabulky . . . 20
5.4 Pˇreklad s´emantick´ych podprogram˚u . . . 23
5.5 Intermedi´arn´ı k´od pˇrekladu . . . 23
6 Navrˇzen´y jazyk s´emantick´ych podprogram˚u 26 6.1 Z´akladn´ı popis jazyka . . . 26
6.2 Datov´e typy jazyka . . . 27
6.3 Pˇr´ıkazy jazyka . . . 30
6.4 R´ızen´ı toku programuˇ . . . 32
6.5 Pˇr´ıklad z´apisu operace v jazyce . . . 33
7 Navrˇzen´y jazyk pro zpracov´an´ı obrazu 34 7.1 Z´akladn´ı popis jazyka . . . 34
7.2 Datov´e typy jazyka . . . 35
7.3 R´ızen´ı toku programuˇ . . . 37
7.4 Pˇr´ıklad programu v jazyce . . . 40
Kapitola 1
´
Uvod
Stejnˇe jako projektov´y manaˇz´er ve firmˇe ˇr´ıd´ı sv´e podˇr´ızen´e za ´uˇcelem dokonˇcen´ı projektu, aniˇz pˇresnˇe rozum´ı detail˚um jejich pr´ace, tak skript zapsan´y ve skriptovac´ım jazyku ˇr´ıd´ı spouˇstˇen´ı syst´emov´ych program˚u za ´uˇcelem vykon´an´ı poˇzadovan´e akce. Skript nemus´ı zn´at implementaˇcn´ı detaily jednotliv´ych syst´emov´ych program˚u, postaˇcuje mu znalost rozhran´ı pˇres kter´e program pˇrij´ım´a a vrac´ı data. Takov´y byl p˚uvodn´ı ´uˇcel skriptovac´ıch jazyk˚u, ale v dneˇsn´ı dobˇe jsou jiˇz skriptovac´ı jazyky rozˇs´ıˇren´y t´emˇeˇr v kaˇzd´em odvˇetv´ı informaˇcn´ıch technologi´ı a slouˇz´ı k vykon´av´an´ı velk´eho mnoˇzstv´ı r˚uznorod´ych ´ukol˚u.
Zp˚usob pr´ace skript˚u vˇsak z˚ustal zachov´an, jen jednotkami se kter´ymi skript pracuje jiˇz nemus´ı b´yt nutnˇe jen syst´emov´e programy, ale mohou jimi b´yt napˇr´ıklad samostatn´e funkce, objekty nach´azej´ıc´ı se v nˇejak´em typu enginu, nebo kus hardwaru prov´adˇej´ıc´ı nˇejak´e ope-race. V´yhodou a z´aroveˇn d˚uvodem rychl´eho rozˇs´ıˇren´ı tˇechto jazyk˚u je snadn´e programov´an´ı, debugov´an´ı a ´udrˇzba skript˚u.
Zpracov´an´ı obrazu je ze sv´eho principu vhodn´ym kandid´atem pro realizaci pomoc´ı skrip-tovac´ıho jazyka. Obrazov´e operace, mezi kter´e patˇr´ı napˇr´ıklad: naˇc´ıt´an´ı obrazu, ´uprava ba-rev, r˚uzn´e typy filtr˚u apod. patˇr´ı mezi v´ypoˇcetnˇe n´aroˇcnˇejˇs´ı operace, tvoˇr´ıc´ı mnoˇzinu operac´ı aplikovateln´ych na obraz. Pokud budeme prvky t´eto mnoˇziny povaˇzovat za jednotliv´e na sobˇe nez´avisl´e operace je moˇzn´e vztahy a posloupnost jejich prov´adˇen´ı popsat pr´avˇe skrip-tem. Tento skript pak bude obsahovat posloupnosti prov´adˇen´ı jednotliv´ych operac´ı, jejich n´avaznost a bude umoˇzˇnovat i ˇr´ızen´ı sekvence prov´adˇen´ı operac´ı v z´avislosti na v´ysledc´ıch jednotliv´ych operac´ı.
Tato pr´ace se zab´yv´a n´avrhem skriptovac´ıho jazyka urˇcen´eho pro snadn´y z´apis ope-rac´ı pracuj´ıc´ıch nad obrazov´ymi daty. C´ılem pr´ace je studium metod n´avrhu a konstrukce interpret˚u, a na z´akladˇe nabyt´ych znalost´ı n´avrh skriptovac´ıho jazyka a jeho pˇrekladaˇce, pˇr´ıpadnˇe interpretu. Jsou rozpracov´any pˇrev´aˇznˇe metody n´avrhu a n´avrh interpretovan´ych skriptovac´ıch jazyk˚u. Samotn´a implementace jazyka pro zpracov´an´ı obrazu jeˇstˇe nen´ı do-konˇcena.
Podrobnˇejˇs´ım popis skriptovac´ıch jazyk˚u je obsaˇzen v 2. kapitole nazvan´e Skriptovac´ı jazyky. Nach´az´ı se v n´ı popis d˚uvod˚u vzniku tohoto typu jazyk˚u, porovn´an´ı s kompilovan´ymi jazyky a v´yˇcet nˇekter´ych zn´amˇejˇs´ıch typ˚u skriptovac´ıch jazyk˚u a jejich vyuˇzit´ı.
Kapitola v poˇrad´ı3. nazvan´a Kompil´atory, pˇrekladaˇce a interprety se zab´yv´a teori´ı o n´avrhu a implementaci pˇrekladaˇc˚u, kompil´ator˚u a interpret˚u. Budou v n´ı rozebr´any z´akladn´ı pojmy t´eto teorie, kter´ymi jsou lexik´aln´ı anal´yza, syntaktick´a anal´yza, s´emantick´a anal´yza, intermedi´arn´ı k´od a generov´an´ı c´ılov´eho k´odu. Pojmy popsan´e v t´eto kapitole budou v n´asleduj´ıc´ıch kapitol´ach hojnˇe pouˇz´ıv´any.
a je v poˇrad´ı5. V t´eto kapitole je podrobnˇe rozebr´an pˇr´ıstup k probl´emu, nach´az´ı se zde popis metody, kter´e se vyuˇz´ıvaj´ı k automatizovan´e tvorbˇe pˇrekladaˇc˚u. Mezi tyto metody patˇr´ı nalezen´ı koneˇcn´ych automat˚u, generov´an´ı rozkladov´ych tabulek syntaktick´e anal´yzy a zpracov´an´ı s´emantick´ych podprogram˚u.
6. kapitola s n´azvem Navrˇzen´y jazyk s´emantick´ych podprogram˚u se zab´yv´a (jak vy-pov´ıd´a n´azev) popisem jazyka urˇcen´eho k popisu s´emantick´ych ´ukon˚u v navrhovan´ych ja-zyc´ıch. V t´eto kapitole jsou pops´any d˚uvody k zaveden´ı takov´eho jazyka, popis jeho datov´ych typ˚u, jeho sloˇzitˇejˇs´ı pˇr´ıkazy a ˇr´ızen´ı toku programu tohoto jazyka.
Posledn´ı kapitola v poˇrad´ı7. nazvan´a Navrˇzen´y jazyk pro zpracov´an´ı obrazu, se vˇenuje popisu navrhovan´eho skriptovac´ıho jazyka. V t´eto kapitole se nach´az´ı ucelen´y pohled na ´uˇcel jazyka, popis datov´ych typ˚u jazyka a popis navrhovan´eho zp˚usobu z´apisu toku programu.
Diplomov´a pr´ace navazuje na pr´aci vykonanou v r´amci semestr´aln´ıho projektu. V tomto projektu byly prostudov´any techniky n´avrhu pˇrekladaˇc˚u a interpret˚u, na kter´ych je zaloˇzena kapitola3Pˇrekladaˇce, kompil´atory a interprety. V semestr´aln´ım projektu byl d´ale navrˇzen pˇrekladaˇc a skriptovac´ı jazyk pro pr´aci s obrazem. N´avrh pˇrekladaˇce a skriptovac´ıho jazyka byl v r´amci diplomov´e pr´ace pˇrepracov´an zcela od zaˇc´atku.
Kapitola 2
Skriptovac´ı jazyky
Tato kapitola se zab´yv´a popisem skriptovac´ıch jazyk˚u, d˚uvodem jejich vzniku a oblastmi ve kter´ych se skriptovac´ı jazyky vyuˇz´ıvaj´ı.
2.1
Popis skriptovac´ıch jazyk˚
u
P˚uvodn´ı skriptovac´ı jazyky byly vyvinuty za ´uˇcelem rychl´eho v´yvoje jedno´uˇcelov´ych pro-gram˚u, kter´e ˇreˇsily sloˇzitˇejˇs´ı administrativn´ı ´ulohy v operaˇcn´ım syst´emu. U tˇechto byla d˚uleˇzitˇejˇs´ı rychlost v´yvoje programu1 neˇz efektivita spouˇstˇen´ı2. Tyto jazyky slouˇzily jako jednoduch´y n´astroj spouˇstˇej´ıc´ı mnoˇzstv´ı jin´ych ˇcasto specializovan´ych jedno´uˇcelov´ych pro-gram˚u3 za ´uˇcelem vykon´an´ı nˇejak´e komplexn´ı operace. Pˇr´ıkladem program˚u v takov´ychto jazyc´ıch mohly b´yt inicializaˇcn´ı skripty nˇekter´ych operaˇcn´ıch syst´em˚u, z´alohovac´ı skripty a podobnˇe.
Anglick´y n´azev skript byl odvozen od psan´eho pˇredpis˚u pro divadeln´ı herce, kteˇr´ı jej mˇeli ”interpretovat” tj. pˇredv´adˇet sc´enu popsanou ve skriptech div´ak˚um. Ve svˇetˇe informaˇcn´ıch technologi´ı zastupuje roli herce program kter´y hraje svou roli popsanou ve skriptu, vˇsechny programy vyuˇzit´e ve skriptu tedy nakonec vykonaj´ı poˇzadovanou operaci.
Skriptovac´ı jazyky jsou podmnoˇzinou interpretovan´ych jazyk˚u. Dnes se vˇsak i interpre-tovan´e jazyky ˇrad´ı do skriptovac´ıch jazyk˚u, kde roli jedno´uˇcelov´ych program˚u zastoupily jednotliv´e funkˇcn´ı jednotky spouˇstˇen´e interpretem podle skriptu.
Hlavn´ı rozd´ıl mezi interpretovan´ymi jazyky a kompilovan´ymi jazyky je zp˚usob jak´ym se program spouˇst´ı na v´ypoˇcetn´ı jednotce. Zat´ımco program zapsan´y v kompilovan´em ja-zyku se mus´ı programem nazvan´ym pˇrekladaˇc (angl. compiler) pˇreloˇzit do strojov´eho k´odu c´ılov´e platformy, tak program zapsan´y v interpretovan´em jazyku z˚ust´av´a v p˚uvodn´ı tex-tov´e podobˇe, dokud nen´ı poˇzadov´ano jeho spuˇstˇen´ı. Spouˇstˇen´ı skriptu se ujme program naz´yvan´y interpretaˇcn´ı pˇrekladaˇc (angl. interpret). Interpret m˚uˇze ponechat zdrojov´y pro-gram v p˚uvodn´ı podobˇe a interpretovat pˇr´ıkazy jeden po druh´em, nebo m˚uˇze cel´y zdrojov´y program pˇreloˇzit do struktury, kter´a uˇz sice nebude m´ıt ˇciteln´y textov´y z´apis ale jej´ı spuˇstˇen´ı bude efektivnˇejˇs´ı s moˇzn´ymi optimalizacemi pˇri pˇrekladu.
Interpretovan´e jazyky se mohou povaˇzovat za dalˇs´ı ´uroveˇn abstrakce nad kompilovan´ymi jazyky. Vyˇsˇs´ı ´uroveˇn abstrakce interpretovan´ych jazyk˚u je v´yhodn´a pro program´atora, ten se vˇetˇsinou nemus´ı starat o spr´avu pamˇeti, typ c´ılov´e architektury, nebo dokonce typ
1ˇ
Casto nˇekolik minut.
2ˇ
Casto nˇekolik sekund.
operaˇcn´ıho syst´emu na kter´em bude jeho program spouˇstˇen. Tyto a dalˇs´ı probl´emy jiˇz za nˇej ˇreˇs´ı interpret jazyka. Odst´ınˇen´ı program´atora od hardwarov´e realizace jeho v´ypoˇct˚u je v´yhodn´e i z pohledu bezpeˇcnosti vykon´av´an´ı tˇechto program˚u. Je nemoˇzn´e za pˇredpokladu ˇ
ze interpret je s´am o sobˇe bezpeˇcn´y program napsat skript kter´y by ohrozil hardware, nebo umoˇznil nepovolen´e operace na c´ılov´em stroji. Z tohoto d˚uvodu jsou interpretovan´e jazyky vhodn´e pro nasazen´ı napˇr´ıklad na webov´ych serverech, kde slouˇz´ı k zpracov´an´ı dynamick´ych webov´ych aplikac´ı.
Vyˇsˇs´ı abstrakce interpretovan´ych jazyk˚u nad jazyky kompilovan´ymi m´a vˇsak i nˇekter´e nev´yhodn´e d˚usledky. Program´ator vyuˇz´ıvaj´ıc´ı interpretovan´y jazyk nebude schopn´y s´am optimalizovat sv˚uj k´od nad r´amec jazyka, v nˇekter´ych jazyc´ıch nem˚uˇze rozhodnout v jak´em m´ıstˇe chce pˇridˇelit pˇr´ıpadnˇe uvolnit pamˇet’. Absence ukazatele do pamˇeti tj. nejmocnˇejˇs´ı program´atorsk´e struktury z d˚uvod˚u bezpeˇcnosti je v´ıtan´a, ale na druhou stranu m˚uˇze nˇekomu chybˇet. Je pravidlem ˇze interpretovan´y k´od je pomalejˇs´ı neˇz k´od kompilovan´y. Tyto probl´emy se sice ˇreˇs´ı napˇr. kompilov´an´ım kritick´ych sekc´ı4 v programu do strojov´eho k´odu aktu´aln´ı architektury, ale nikdy nebude moˇzn´e dos´ahnout stejn´e efektivity jako u jazyk˚u kompilovan´ych.
2.2
Zn´
am´
e skriptovac´ı jazyky
Tato ˇc´ast se zab´yv´a struˇcn´ym popisem nˇekter´ych druh˚u skriptovac´ıch jazyk˚u. Job control jazyky a shelly
Prvn´ı skriptovac´ı jazyky nevznikly za ´uˇcelem nahrazen´ı kompilovan´ych jazyk˚u vyˇsˇs´ı ´urovnˇe, ale sp´ıˇse jako n´astroje pro jednoduˇsˇs´ı ´udrˇzbu sloˇzit´ych syst´em˚u. Zjednoduˇsovaly a automa-tizovaly opakuj´ıc´ı se ´ukony, napˇr´ıklad ve spr´avˇe operaˇcn´ıch syst´em˚u. ˇC´ast jazyk˚u anglicky nazvan´a shelly vznikla na platformˇe operaˇcn´ıch syst´emu rodiny Unix, kde je cel´a spr´ava syst´emu v podstatˇe ˇreˇsen´a zpracov´an´ım textov´ych konfiguraˇcn´ıch soubor˚u. Shelly tak´e slouˇz´ı pro komunikaci uˇzivatele s poˇc´ıtaˇcem, kaˇzd´y pˇr´ıkaz zapsan´y uˇzivatelem z kl´avesnice je interpretov´an jako ˇc´ast k´odu skriptu. Do t´eto skupiny patˇr´ı napˇr´ıklad: bash, csh, ksh, tcsh, sh, zsh, Winbatch.
Skriptov´an´ı GUI
Po rozˇs´ıˇren´ı r˚uzn´ych grafick´ych uˇzivatelsk´ych rozhran´ı vznikl nov´y druh specializovan´ych skriptovac´ıch jazyk˚u urˇcen´y pro kontrolu poˇc´ıtaˇce pˇres prvky grafick´eho uˇzivatelsk´eho roz-hran´ı. Skripty operuj´ı se stejn´ymi prvky rozhran´ı tj. tlaˇc´ıtky, v´ybˇery, zatrh´avac´ımi tlaˇc´ıtky atd. jako uˇzivatel. Pouˇz´ıvaj´ı se k automatizaci opakuj´ıc´ıch se akc´ı, nebo napˇr´ıklad k nasta-ven´ı v´ychoz´ıch stav˚u aplikac´ı. Vyuˇzit´ı takov´ych jazyk˚u je podm´ınˇeno podporou v aplikaci obsahuj´ıc´ı ovl´adan´e grafick´e uˇzivatelsk´e rozhran´ı a v operaˇcn´ım syst´emu. Takov´ymto ja-zyk˚um se tak´e ˇr´ık´a makrovac´ı jazyky.
Aplikaˇcnˇe-specifick´e
Jako souˇc´ast nˇekter´ych velk´ych aplikaci figuruj´ı aplikaˇcnˇe-specifick´e skriptovac´ı jazyky. Tyto jsou zamˇeˇreny na ˇr´ızen´ı programovateln´ych souˇc´ast´ı jednotliv´ych aplikac´ı. Jazyky to-hoto druhu jsou navrhov´any pro pouˇzit´ı pouze v jedn´e aplikaci a obvykle neb´yvaj´ı vhodn´e
4 ˇ
pro obecnˇejˇs´ı pouˇzit´ı. Mezi nˇe patˇr´ı napˇr´ıklad i hern´ı skripty pro ˇr´ızeni hern´ıch objekt˚u, kter´e se nemus´ı zab´yvat detailnˇejˇs´ı ´ulohou objektu v enginu. Do t´eto kategorie jazyku patˇr´ı napˇr´ıklad: Action Code Script, AutoLisp, Emacs Lisp, QuakeC, UnrealScript, VBScript.
Dynamick´e webov´e aplikace
D˚uleˇzit´ym typem aplikaˇcnˇe-specifick´ych skriptovac´ıch jazyk˚u jsou jazyky pro implementaci dynamick´ych aplikac´ı v prostˇred´ı internetu. Tyto jazyky jsou specializovan´e na tvorbu dy-namick´ych webov´ych str´anek a jin´ych internetov´ych aplikac´ı a jsou nasazeny na serverech poskytuj´ıc´ıch tyto sluˇzby. Tyto jazyky jsou zvoleny z d˚uvodu bezpeˇcnosti a b´yvaj´ı rozˇs´ıˇreny o prvky pro snadn´y pˇr´ıstup k datab´az´ım apod. Nejmodernˇejˇs´ı webov´e programovac´ı jazyky jsou jiˇz tak sofistikovan´e ˇze jimi lze v urˇcit´ych oblastech nahradit i standardn´ı kompilovan´e programovac´ı jazyky. Do t´eto skupiny jazyk˚u patˇr´ı napˇr´ıklad: ColdFusion, JavaScript, Lasso, Miva, PHP, SMX, XSLT.
Zpracov´an´ı textu
Velk´e mnoˇzstv´ı skriptovac´ıch jazyk˚u bylo prim´arnˇe urˇceno na zpracov´an´ı obyˇcejn´eho textu. Na-rozd´ıl od shell˚u vˇetˇsina z nich nebyla urˇcena pro zpracov´an´ı pˇr´ıkaz˚u zad´avan´ych pˇr´ımo z kl´avesnice, ale sp´ıˇse ke zpracov´an´ı celistv´ych program˚u. Motivace jejich vzniku je vˇsak podobn´a jako u shell˚u tj. snadnˇejˇs´ı spr´ava operaˇcn´ıch syst´emu zaloˇzen´ych na textov´ych konfiguraˇcn´ıch syst´emech. Nˇekter´e z tˇechto jazyk˚u tvoˇr´ı dodnes nejefektivnˇejˇs´ı syst´emy pro zpracov´an´ı textov´ych informac´ı. Velk´e mnoˇzstv´ı rozˇs´ıˇren´ı tˇechto jazyk˚u z nˇekter´ych vytvoˇrilo plnˇe pouˇziteln´e aplikaˇcn´ı jazyky, jako napˇr´ıklad u Perlu. Do t´eto skupiny jazyk˚u patˇr´ı napˇr´ıklad: AWK, Perl, sed, XSLT.
Programovac´ı skriptovac´ı jazyky
Nˇekter´e skriptovac´ı jazyky se navzdory sv´emu p˚uvodn´ımu ´uˇcelu, vyvinuly v plnˇe pouˇziteln´e programovac´ı jazyky pouˇziteln´e pro tvorbu vˇetˇs´ıch aplikac´ı. Tyto tˇeˇz´ı ze sv´e v´yhody rych-lejˇs´ıho v´yvoje aplikace proti kompilovan´ym jazyk˚um, automatick´e spr´avy pamˇeti atd. Pokud program´ator nepotˇrebuje ps´at pˇr´ımo ovladaˇce na hardware, nebo nˇejak´y evoluˇcn´ı algorit-mus tak v´yhoda rychlosti v´yvoje aplikace pˇredˇc´ı nev´yhodu menˇs´ı rychlosti programu. I pˇres to ˇze se vˇetˇsinou pouˇz´ıvaj´ı k tvorbˇe aplikac´ı jako dynamick´e aplikaˇcn´ı jazyky, ˇcasto se oznaˇcuj´ı jako vyspˇelejˇs´ı skriptovac´ı jazyky. Tyto jazyky jejich uˇzivatel´e vˇetˇsinou neoznaˇcuj´ı jako skriptovac´ı jazyky.
Extension/embeddable jazyky
Jazyky z t´eto skupiny jsou vyv´ıjeny za ´uˇcelem nahrazen´ı aplikaˇcnˇe specifick´ych jazyk˚u, tak ˇ
ze se vkl´adaj´ı pˇr´ımo do aplikaˇcn´ıch program˚u. Program´atoˇri vytv´aˇrej´ıc´ı aplikaci v nˇekter´em ze syst´emov´ych jazyk˚u, do t´eto aplikace vloˇz´ı na urˇcit´e m´ısta k´od umoˇzˇnuj´ıc´ı jej´ı ovl´ad´an´ı pomoc´ı skriptovac´ıho jazyka. Jedn´ım ze zn´am´ych pˇr´ıpad˚u takov´eho pouˇzit´ı skriptovac´ıho jazyka je JavaScript vyvinut´y za ´uˇcelem spouˇstˇen´ı v internetov´em prohl´ıˇzeˇci na stranˇe kli-enta. D´ale do t´eto skupiny patˇr´ı jazyky: Ch, ECMAScript, Python, Tcl, RBScript, Windows PowerShell.
Kapitola 3
Pˇ
rekladaˇ
ce, kompil´
atory a
interprety
V angliˇctinˇe se pro pojem pˇrekl´ad´an´ı v oblasti programovac´ıch jazyk˚u pouˇz´ıv´a slovo ”compi-lation”, kter´e m´a sp´ıˇse v´yznam skl´ad´an´ı, nebo shromaˇzd’ov´an´ı. Samotn´y pojem kompil´ator zavedl poˇc´atkem pades´at´ych let Grace Murray Hopper. Pˇreklad se v t´e dobˇe totiˇz prov´adˇel jako skl´ad´an´ı sekvenc´ı podprogram˚u ve strojov´em k´odu, kter´e byly uloˇzeny v knihovnˇe.
Jedn´ım z prvn´ıch skuteˇcn´ych pˇrekladaˇc˚u by dobˇre zn´am´y FORTRAN. Hlavn´ı prioritou tˇechto prvn´ıch pˇrekladaˇc˚u byla vzhledem k mal´e v´ypoˇcetn´ı a pamˇet’ov´e kapacitˇe soudob´ych poˇc´ıtaˇc˚u optimalizace a efektivita pˇrekl´adan´ych algoritm˚u.
S pˇr´ıchodem jazyka Algol 60 nastal zlom v podstatˇe pˇrekladu. Ten zavedl probl´emovˇe orientovan´y pˇr´ıstup, to znamen´a ˇze pˇrekladaˇce jiˇz neslouˇzily jen pro umoˇznˇen´ı pˇrehlednˇejˇs´ıho z´apisu strojov´eho k´odu, ale d˚uleˇzit´ym faktorem se stal ˇreˇsen´y probl´em, kter´emu se pˇrizp˚usobila syntaxe i filosofie jazyka.
Novˇejˇs´ı jazyky mezi kter´e patˇr´ı napˇr´ıklad Pascal, Modulo a Ada jsou vytvoˇreny nez´avisle na c´ılov´e architektuˇre. Dnes se oddˇelen´ı od c´ılov´e architektury umocˇnuje vytv´aˇren´ım tzv. virtu´aln´ıch stroj˚u, kter´e jsou urˇceny ke spouˇstˇen´ı c´ılov´ych aplikac´ı. Posledn´ı popsan´y pˇr´ıstup je charakteristick´y napˇr´ıklad pro platformy Java nebo .NET.
3.1
Uvod do pˇ
´
rekladaˇ
c˚
u
Pˇrekladaˇc je v podstatˇe program realizuj´ıc´ı textov´y procesor umoˇzˇnuj´ıc´ı pouˇz´ıvat programo-vac´ı jazyk pro v´ypoˇcty na poˇc´ıtaˇci. Pˇrekladaˇc naˇc´ıt´a program zapsan´y ve zdrojov´em k´odu, ten zpracuje a zap´ıˇse s´emanticky ekvivalentn´ı k´od ve v´ystupn´ım c´ılov´em jazyce. Kdyˇz je zdrojov´ym jazykem vyˇsˇs´ı programovac´ı jazyk a c´ılov´ym jazykem jazyk symbolick´ych in-strukc´ı naz´yv´ame pˇrekladaˇc kompil´atorem a proces pˇrekladu kompilac´ı. Pˇrekladaˇc, kter´y zdrojov´y k´od nepˇrekl´ad´a do c´ılov´eho jazyka, ale m´ısto toho jej spouˇst´ı a zobrazuje v´ysledky v´ypoˇctu se naz´yv´a interpret, nebo tak´e interpretaˇcn´ı pˇrekladaˇc.
Kompil´atory a interprety tvoˇr´ı d˚uleˇzitou souˇc´ast dneˇsn´ıch poˇc´ıtaˇc˚u a jsou ned´ılnou souˇc´ast´ı prostˇred´ı vˇetˇsiny operaˇcn´ıch syst´em˚u. Techniky jejich n´avrhu a zpracov´an´ı pˇredstavuj´ı st´ale aktivn´ı oblast v´yzkumu. Podstatnou roli ve v´yvoji techniky realizace pˇrekladaˇc˚u sehr´ala teorie form´aln´ıch jazyk˚u a gramatik. V´ysledky t´eto teorie lze vyuˇz´ıt k efektivn´ımu n´avrhu syntaktick´e anal´yzy. Syntaktick´a anal´yza sice tvoˇr´ı jen ˇc´ast problematiky ˇreˇsen´e pˇri tvorbˇe pˇrekladaˇce, ale fakt ˇze syntaktick´a anal´yza m˚uˇze pˇrevz´ıt ˇr´ızen´ı cel´eho pˇrekladaˇce velmi usnadn´ı n´avrh zbyl´ych komponent pˇrekladaˇce.
Proces kompilace je vhodn´e rozdˇelit do v´ıce podproces˚u nazvan´ych f´aze, kde se kaˇzd´a f´aze star´a o pˇrevod jedn´e reprezentace zdrojov´eho k´odu na jinou. Tˇemito f´azemi jsou:
• lexik´aln´ı anal´yza - slouˇz´ı k nalezen´ı lexik´aln´ıch jednotek jazyka ve zdrojov´em pro-gramu. Jedna lexik´aln´ı jednotka odpov´ıd´a napˇr´ıklad identifik´atoru, konstantˇe, oper´atoru, kl´ıˇcov´emu slovu apod. Lexik´aln´ı anal´yza v podstatˇe pˇrev´ad´ı k´od z reprezentace ve zdrojov´em souboru na posloupnost lexik´aln´ıch element˚u.
• syntaktick´a anal´yza - pˇrij´ım´a na vstupu lex´emy1 a prov´ad´ı rozklad programu podle gramatiky jazyka, tzn. buduje derivaˇcn´ı strom zdrojov´eho programu.
• intermedi´arn´ı generov´an´ı k´odu - vyuˇz´ıv´a v´ystupu syntaktick´e anal´yzy a produkuje zdrojov´emu k´odu ekvivalentn´ı posloupnost akc´ı. Hlavn´ı rozd´ıl mezi intermedi´arn´ım k´odem a strojov´ym k´odem produkovan´ym interpretem je ten ˇze intermedi´arn´ı k´od neobsahuje specifikaci ´uloˇziˇst’ promˇenn´ych v pamˇeti ani pouˇzit´e registry.
• optimalizace k´odu - voliteln´a f´aze, kter´a prov´ad´ı optimalizace z pohledu ˇcasov´e a pamˇet’ov´e n´aroˇcnosti nad intermedi´arn´ım k´odem. ˇCasto se implementuje jako souˇc´ast f´aze generov´an´ı intermedi´arn´ıho k´odu.
• generov´an´ı k´odu - generuje v´ysledn´y strojov´y k´od, nebo v pˇr´ıpadˇe interpretu spouˇst´ı intermedi´arn´ı k´od na virtu´aln´ım stroji. Generov´an´ı k´odu v pˇr´ıpadˇe kompil´atoru spoˇc´ıv´a v pˇriˇrazen´ı pamˇet’ov´ych m´ıst dat˚um, urˇcen´ı zp˚usobu pˇr´ıstupu k nim a v´ybˇeru registr˚u pro jednotliv´e operace.
Z popisu f´az´ı pˇrekladaˇce je zˇrejm´e ˇze ˇr´ıd´ıc´ı f´az´ı kompil´atoru je syntaktick´a anal´yza, je hlavn´ı f´az´ı pˇri anal´yze zdrojov´eho k´odu. Pˇri synt´eze c´ılov´eho k´odu m´a hlavn´ı postaven´ı f´aze generov´an´ı intermedi´arn´ıho k´odu.
Dalˇs´ı d˚uleˇzitou ˇc´ast´ı pˇrekladaˇce je tabulka symbol˚u, do t´eto struktury kompil´ator za-znamen´av´a informace z´ıskan´e o objektech programu v pr˚ubˇehu anal´yzy. Tyto informace se z´ısk´avaj´ı na z´akladˇe kontextu v programu, nebo na z´akladˇe deklarac´ı.
Pokud v pr˚ubˇehu kompilace dojde k nalezen´ı chyby ve zdrojov´em k´odu, mˇelo by doj´ıt minim´alnˇe k vyps´an´ı zpr´avy upozorˇnuj´ıc´ı program´atora na chybu. Obecnˇe se vˇsak poˇzaduje aby kompil´ator odhalil pˇri kompilaci pokud moˇzno co nejvˇetˇs´ı mnoˇzstv´ı chyb, proto by mˇela ˇ
c´ast kompil´atoru nazvan´a zpracov´an´ı chyb prov´est takov´e z´asahy aby se pokud moˇzno mohlo pokraˇcovat v kompilaci.
3.2
Lexik´
aln´ı anal´
yza
Lexik´aln´ı anal´yzu v pˇrekladaˇci prov´ad´ı ˇc´ast nazvan´a lexik´aln´ı analyz´ator. Lexik´aln´ı ana-lyz´ator je v podstatˇe jednoduch´y textov´y procesor, kter´y slouˇz´ı k odstranˇen´ı redundantn´ıch informac´ı ze zdrojov´eho souboru, t´ım ˇze nalezne jednotliv´e lexik´aln´ı elementy pˇrekl´adan´eho jazyka. Tyto elementy reprezentuj´ı termin´aln´ı symboly syntaktick´e anal´yzy. Z tohoto d˚uvodu je v´yhodn´e nechat ˇr´ızen´ı (ve smyslu poˇzadavku na nov´y symbol) lexik´aln´ıho analyz´atoru syntaktick´emu analyz´atoru.
1
Tvar v´ystupu lexik´aln´ıho analyz´atoru
V´ystup lexik´aln´ıho analyz´atoru se zapisuje ve tvaru, jenˇz je vhodn´y pro zpracov´an´ı dalˇs´ımi ˇ
c´astmi kompil´atoru. V´ystup se vyznaˇcuje n´asleduj´ıc´ımi vlastnostmi. • neobsahuje z hlediska v´yznamu programu redundantn´ı informace2.
• nejmenˇs´ım nositelem informace jiˇz nen´ı jeden znak3 ale obraz prvku patˇr´ıc´ı do se-znamu syntaktick´ych jednotek jazyka, naz´yvan´y lexik´aln´ı jednotka, nebo tak´e lex´em. • informace o lexik´aln´ı jednotce obsahuje sloˇzku syntaktickou identifikuj´ıc´ı typ lexik´aln´ı jednotky a na sloˇzku s´emantickou specifikuj´ıc´ı jej´ı aktu´aln´ı hodnotu.(napˇr. u lex´emu s typem identifik´ator bude tato hodnota obsahovat n´azev identifik´atoru.).
Lexik´aln´ı jednotky
V kontextu lexik´aln´ı anal´yzy se pro lexik´aln´ı jednotku pouˇz´ıv´a synonymn´ı n´azev symbol, nebo tak´e lex´em. N´azev symbol je odvozen z funkce lexik´aln´ıho analyz´atoru, kter´y na poˇz´ad´an´ı syntaktick´eho analyz´atoru mu pˇred´av´a symboly vstupn´ı vˇety. Rozliˇsuj´ı se dva z´akladn´ı typy symbol˚u.
• jazykovˇe specifick´e ˇretˇezce a znaky(do t´eto skupiny patˇr´ı napˇr´ıklad kl´ıˇcov´e slova pro-gramu, oper´atory apod.).
• ˇretˇezce znak˚u popisuj´ıc´ı napˇr´ıklad identifik´atory, ˇc´ıseln´e nebo ˇretˇezcov´e konstanty apod.
Zat´ımco prvn´ı skupina symbol˚u je plnˇe pops´ana sv´ym typem, tak u druh´e je nutn´e kromˇe typu symbolu zaznamenat i hodnotu symbolu pˇreˇctenou ze vstupn´ıho souboru. Tuto hodnotu m˚uˇze vˇzdy popsat ˇretˇezec kter´y tvoˇr´ı konkr´etn´ı symbol ve zdrojov´em souboru, nebo jiˇz pˇr´ımo hodnota z´ıskan´a z tohoto ˇretˇezce na z´akladˇe znalosti typu symbolu.
Implementace lexik´aln´ıho analyz´atoru
V´ystavba lexik´aln´ıch analyz´ator˚u je zaloˇzena na principu vych´azej´ıc´ım z pˇredpokladu, ˇze lexik´aln´ı jednotky implementovan´eho programovac´ıho jazyka tvoˇr´ı form´aln´ı jazyk typu 3 Chomsk´eho hierarchie. Pak je lze teoreticky popsat regul´arn´ı gramatikou, nebo regul´arn´ım v´yrazem a v podstatˇe mechanicky z´ıskat koneˇcn´y automat, urˇcen´y k rozpozn´an´ı symbol˚u jazyka.
Implementace koneˇcn´eho automatu pro rozpozn´av´an´ı lexik´aln´ıch jednotek tvoˇr´ı j´adro cel´eho analyz´atoru. Kromˇe rozpozn´av´an´ı symbol˚u mus´ı lexik´aln´ı analyz´ator pˇred´avat in-formace o vstupn´ım souboru ostatn´ım jednotk´am pˇrekladaˇce(do tˇechto informac´ı patˇr´ı napˇr´ıklad ˇr´adek ve zdrojov´em souboru na kter´em se pˇreklad pr´avˇe nach´az´ı, nebo text ˇc´asti k´odu ve kter´em se nach´azela chyba apod.).
2
napˇr.: tzv. b´ıl´e m´ısta v k´odu, koment´aˇre apod.
3
3.3
Syntaktick´
a anal´
yza
Syntaktick´y analyz´ator (angl. parser) prov´adˇej´ıc´ı syntaktickou anal´yzu m´a v pˇrekladaˇci v´ysadn´ı postaven´ı. Jeho ´ulohou je analyzovat posloupnost symbol˚u, kter´e produkuje na sv´em v´ystupu lexik´aln´ı analyz´ator, za ´uˇcelem vytvoˇren´ı derivaˇcn´ıho stromu cel´eho pro-gramu.
Z hlediska teorie form´aln´ıch jazyku je vstupn´ım ˇretˇezcem termin´aln´ıch symbol˚u po-sloupnost prvn´ıch sloˇzek lexik´aln´ıch jednotek jak je rozpoznal lexik´aln´ı analyz´ator. Avˇsak na rozd´ıl od teorie form´aln´ıch jazyk˚u a pˇrekladaˇc˚u nen´ı nutn´e aby v´ystupem syntaktick´e anal´yzy byl pˇr´ımo prav´y nebo lev´y rozklad jazyka. Podstatn´a je dekompozice posloupnosti symbol˚u zdrojov´eho programu na fr´aze odpov´ıdaj´ıc´ı netermin´al˚um, z kter´ych jiˇz pˇrekladaˇc ”pozn´a” v´yznam pˇrekl´adan´e vˇety. Hlavn´ı poˇzadavek na takovouto dekompozici ˇretˇezce ter-min´al˚u je deterministick´y pr˚ubˇeh, pokud takov´yto analyz´ator realizuje deterministickou syntaktickou anal´yzu tak nen´ı nutn´e vytv´aˇret explicitn´ı reprezentaci derivaˇcn´ıho stromu analyzovan´e vˇety.
Syntaktick´a anal´yza v sobˇe pochopitelnˇe zahrnuje automatickou kontrolu syntaktick´e spr´avnosti pˇrekl´adan´eho programu. Po odhalen´ı chyby by proto mˇelo n´asledovat zpracov´an´ı t´eto chyby, takov´ym zp˚usobem, aby syntaktick´a anal´yza mohla pokraˇcovat.
Implementace syntaktick´eho analyz´atoru
Tvorba syntaktick´eho analyz´atoru je jedna z nejl´epe teoreticky i prakticky zvl´adnut´ych ob-last´ı problematiky pˇrekladaˇc˚u. Teorie bezkontextov´ych gramatik a jazyk˚u d´av´a k dispozici algoritmy pro konstrukci deterministick´ych analyz´ator˚u a dokonce i prakticky pouˇziteln´e algoritmy pro vytvoˇren´ı konstruktor˚u syntaktick´ych analyz´ator˚u. Velk´y v´yznam v t´eto pro-blematice maj´ı jazyky LL(1) a LALR(1).
3.4
Intermedi´
arn´ı k´
od
Intermedi´arn´ı k´od je k´od sloˇzitost´ı n´aleˇz´ıc´ı mezi zdrojov´y k´od a c´ılov´y k´od. Jeho opod-statnˇen´ı u pˇrekladaˇc˚u tkv´ı v poˇzadavc´ıch na pˇrekladaˇc a efektivnost jeho v´ystupn´ıho k´odu, u kter´eho se poˇzaduje efektivn´ı vykon´av´an´ı programu a tak´e efektivn´ı hospodaˇren´ı s vnitˇrn´ı pamˇet´ı. Z tˇechto d˚uvod˚u mnoh´e pˇrekladaˇce negeneruj´ı v´ystupn´ı k´od pˇr´ımo, ale m´ısto toho vytv´aˇrej´ı meziprodukt pˇrekladu, kter´ym je pr´avˇe intermedi´arn´ı k´od.
Kromˇe toho ˇze tento k´od neobsahuje specifikaci pamˇet’ov´ych m´ıst a pouˇzit´ych registr˚u, je charakterizov´an poˇrad´ım operac´ı, kter´e je jiˇz shodn´e s poˇrad´ım operac´ı v budouc´ım c´ılov´em k´odu. Tuto vlastnost(poˇrad´ı akc´ı) nem´a vˇetˇsina vyˇsˇs´ıch programovac´ıch jazyk˚u. K z´apisu intermedi´arn´ıho k´odu se vyuˇz´ıv´a mnoˇzstv´ı struktur nejˇcastˇeji b´yv´a vyuˇz´ıv´an tzv. 3-adresov´y k´od.
Implementace f´aze generov´an´ı intermedi´arn´ıho k´odu
Pˇri ˇreˇsen´ı probl´emu n´avrhu a implementace f´aze generov´an´ı intermedi´arn´ıho k´odu je d˚uleˇzit´y koncept s´emantick´ych podprogram˚u, kter´y pˇredstavuje strukturalizaci f´aze generov´an´ı in-termedi´arn´ıho k´odu na urˇcit´e logick´e akce spojen´e s pˇrepisovac´ımi pravidly gramatiky.
V pˇr´ıpadˇe ˇze syntaktick´y analyz´ator rozpozn´a urˇcitou syntaktickou konstrukci, kter´a se poj´ı s nˇekter´ym netermin´alem gramatiky, tak s´emantick´y podprogram pˇr´ısluˇsej´ıc´ı k tomuto netermin´alu vykon´a potˇrebn´e s´emantick´e akce. Tyto akce mohou zahrnovat.
op ARG1 ARG2 result
(1) neg c T1
(2) + T1 d T2
(3) * b T2 T3
(4) = T3 a
Tabulka 3.1: Tabulka ˇctveˇric.
• s´emantickou anal´yzu, v jej´ımˇz r´amci pˇrekladaˇc odhal´ı takov´y druh chyb, kter´e nejsou pops´any bezkontextovou gramatikou, jako je napˇr´ıklad nekompatibilita typ˚u ope-rand˚u, duplicita n´avˇeˇst´ı apod.
• generov´an´ı odpov´ıdaj´ıc´ıch pˇr´ıkaz˚u intermedi´arn´ıho k´odu a vyuˇzit´ı v´ysledk˚u s´emantick´e anal´yzy, napˇr. pˇri pˇrevod˚u typ˚u operand˚u.
Syntax´ı ˇr´ızen´e pˇrekladov´e sch´ema
Syntax´ı ˇr´ızen´e pˇrekladov´e sch´ema je sch´ema v nˇemˇz je popis s´emantick´ych akc´ı gener´atoru intermedi´arn´ıho k´odu v bezprostˇredn´ı n´avaznosti na syntaktick´e struktuˇre jazyka. Neexis-tuje vˇsak vˇseobecnˇe rozˇs´ıˇren´y a prakticky pouˇz´ıvan´y formalismus pro z´apis tohoto sch´ematu. Protoˇze vˇetˇsinou existuje velk´e mnoˇzstv´ı r˚uzn´ych druh˚u s´emantick´ych akc´ı, jeˇz znaˇcnˇe z´avisej´ı na charakteru implementovan´ych jazykov´ych prostˇredk˚u, je dosud prakticky nej-pouˇz´ıvanˇejˇs´ım prostˇredkem pro z´apis s´emantick´ych akc´ı programovac´ı jazyk.
Specifikace f´az´ı realizuj´ıc´ıch pˇreklad do intermedi´arn´ıho k´odu pak m˚uˇze sest´avat z v´yˇctu pˇrepisovac´ıch pravidel gramatiky, ke kter´ym lze pˇr´ıpadnˇe automaticky vytvoˇrit pˇr´ısluˇsn´y syntaktick´y analyz´ator a ze souboru pravidl˚um odpov´ıdaj´ıc´ıch podprogram˚u v urˇcit´em vyˇsˇs´ım programovac´ım jazyce, kter´e popisuj´ı s´emantick´e akce. Z tohoto pojet´ı syntax´ı ˇr´ızen´eho pˇrekladu vznik´a pojem s´emantick´eho podprogramu.
Typy intermedi´arn´ıho k´odu
N´avrh a f´aze implementace intermedi´arn´ıho k´odu je z´avisl´a nejen na implementovan´em jazyce, ale tak´e na zvolen´em typu intermedi´arn´ıho k´odu. Seznam typ˚u intermedi´arn´ıho k´odu n´asleduje.
• 3-adresov´y k´od - tento n´azev je ve skuteˇcnosti abstraktn´ım oznaˇcen´ım dvou typ˚u intermedi´arn´ıch k´odu, a to tzv. ˇctveˇric a trojic. ˇCtveˇrice se skl´adaj´ı ze z´aznam˚u o ˇctyˇrech poloˇzk´ach: op, ARG1, ARG2, result, kde prvn´ı oznaˇcuje typ operace, druh´a a tˇret´ı operandy a posledn´ı oznaˇcuje jm´eno v´ysledku. Pˇr´ıklad se nach´az´ı v tabulce 3.1. Reprezentace trojicemi je podobn´a reprezentaci ˇctveˇricemi s t´ım rozd´ılem ˇze m´ısto pouˇz´ıv´an´ı doˇcasn´ych promˇenn´ych k propojen´ı jednotliv´ych operac´ı jsou vyuˇzity od-kazy pˇr´ımo do tabulky trojic, na pozici kde se nach´az´ı v´ypoˇcet jehoˇz v´ysledek se poˇzaduje na m´ıstˇe operandu. Pˇr´ıklad se nach´az´ı v tabulce3.2.
V tabulk´ach je uveden pˇr´ıklad z´apisu n´asleduj´ıc´ıho k´odu: a = b * (-c + d). • syntaktick´y strom - tento zp˚usob reprezentace m´a jistou pˇr´ıbuznost s trojicemi.
Syn-taktick´y strom je abstrakc´ı derivaˇcn´ıho stromu. Koncov´ymi uzly takov´eho stromu jsou operandy a jeho vnitˇrn´ımi uzly jsou oper´atory operuj´ıc´ı nad operandy v jeho listech.
op ARG1 ARG2
(1) neg c
(2) + (1) d
(3) * b (2)
(4) = a (3)
Tabulka 3.2: Tabulka trojic.
Tento zp˚usob z´apisu je moˇzn´e vyhodnotit pr˚uchodem typu postorder cel´ym stromem. Pˇr´ıklad takov´eho stromu je na obr´azku 3.1.
Obr´azek 3.1: Syntaktick´y strom.
• postfixov´a notace - podstatou postfixov´e, nebo tak´e polsk´e notace je um´ıst’ov´an´ı oper´ator˚u za pˇr´ısluˇsn´e operandy. Tato notace, kter´a byla p˚uvodnˇe vytvoˇrena pro reprezentaci v´yraz˚u m´a zn´am´e v´yhody. Jsou jimi jednoznaˇcn´y z´apis operac´ı i bez uˇzit´ı z´avorek a jednoduch´y zp˚usob interpretace s vyuˇzit´ım z´asobn´ıku. Pˇr´ıklad z´apisu v´yrazu v post-fixov´e notaci: a c neg d + b * =.
Optimalizace k´odu
C´ılov´e programy urˇcen´e k ˇcast´emu prov´adˇen´ı by mˇely b´yt rychl´e a mˇely by ˇsetˇrit m´ıstem v pamˇeti. Proto nˇekter´e pˇrekladaˇce jeˇstˇe pˇred f´az´ı generov´an´ı c´ılov´eho k´odu prov´adˇej´ı tzv. op-timalizaci intermedi´arn´ıho k´odu. Tato optimalizace aplikuje urˇcit´e transformace na v´ystupu generov´an´ı intermedi´arn´ıho k´odu, za ´uˇcelem z´ısk´an´ı jeho verze, kter´a povede k menˇs´ımu a rychlejˇs´ımu k´odu.
Term´ın optimalizace v tomto pˇr´ıpadˇe nen´ı adekv´atn´ı z toho d˚uvodu ˇze neexistuje al-goritmick´a cesta, kter´a by vedla k optim´aln´ımu k´odu pro dan´y zdrojov´y program. Proto produkt optimalizuj´ıc´ıho pˇrekladaˇce bude pokud moˇzno menˇs´ı a rychlejˇs´ı k´od, m´alokdy vˇsak k´od optim´aln´ı.
V dneˇsn´ı dobˇe m˚uˇze b´yt f´aze optimalizov´an´ı znaˇcnˇe sloˇzit´a, kromˇe klasick´ych probl´em˚u se musej´ı pot´ykat s probl´emem r˚uzn´ych instrukˇcn´ıch sad(MMX, 3DNow!, SSE, SSE2, hy-perthreading apod.) a tak se f´aze optimalizace v r˚uzn´ych pˇrekladaˇc´ıch liˇs´ı r˚uznou m´ırou propracovanosti.
3.5
Generov´
an´ı c´ılov´
eho k´
odu, interpretace
Tato f´aze pˇrekladu programu se liˇs´ı v z´avislosti na tom zda implementujeme kompil´ator, nebo interpret. Zat´ım co kompil´ator v t´eto f´azi generuje strojov´y k´od z intermedi´arn´ıho k´odu, tak interpret zde spouˇst´ı jednotliv´e pˇr´ıkazy intermedi´arn´ıho k´odu na sv´em virtu´aln´ım stroji.
Generov´an´ı c´ılov´eho k´odu
V t´eto f´azi transformuje pˇrekladaˇc intermedi´arn´ı k´od na strojov´y k´od c´ılov´e architektury. Nejjednoduˇsˇs´ı zp˚usob, kter´ym lze vygenerovat c´ılov´y strojov´y k´od je jednoduch´y pˇrepis pˇr´ıkaz˚u intermedi´arn´ıho k´odu na strojov´e instrukce technikou rozvoje makroinstrukc´ı. Tento pˇr´ıstup ale vˇetˇsinou vede k neefektivn´ımu k´odu, ve kter´em vznik´a pˇr´ıliˇs velk´e mnoˇzstv´ı instrukc´ı pˇr´ıstupu do pamˇeti. Aby se pˇredeˇslo generov´an´ı takov´eho k´odu mus´ı gener´ator pr˚ubˇeˇznˇe uchov´avat informace o obsahu jednotliv´ych registr˚u a pˇristupovat do pamˇeti jen pokud je to nezbytnˇe nutn´e.
Pro n´avrh kvalitn´ıho gener´atoru strojov´eho k´odu je nezbytnˇe nutn´a dobr´a znalost c´ılov´e architektury. Kaˇzd´a architektura obsahuje nˇekolik registr˚u urˇcen´ych pro r˚uzn´e typy ope-rac´ı. Kvalitn´ı gener´ator strojov´eho k´odu by mˇel umˇet vyuˇz´ıt tyto registry co nejefek-tivnˇeji. Tento probl´em je obt´ıˇzn´e ˇreˇsit optim´alnˇe, obvykle se na jeho ˇreˇsen´ı aplikuj´ı r˚uzn´e heuristick´e pˇr´ıstupy. Mezi dalˇs´ı ´ukoly gener´atoru patˇr´ı pokud moˇzno co nejlepˇs´ı vyuˇzit´ı cel´eho instrukˇcn´ıho reperto´aru c´ılov´e architektury. Typick´ymi pˇr´ıklady takov´ych situac´ı jsou napˇr´ıklad pˇriˇc´ıt´an´ı jedniˇcky, nebo n´asoben´ı cel´eho ˇc´ısla mocninou dvou.
ˇ
Casto se m´ısto pˇr´ım´eho generov´an´ı strojov´eho k´odu vol´ı metoda generov´an´ı k´odu v jazyce symbolick´ych instrukc´ı, kter´y se pot´e extern´ım programem pˇreloˇz´ı do strojov´eho k´odu. Tento pˇr´ıstup usnadn´ı f´azi generov´an´ı k´odu, protoˇze se gener´ator nemus´ı zab´yvat detaily mezi kter´e patˇr´ı napˇr´ıklad v´ypoˇcty relativn´ıch adres a adres skok˚u.
Spuˇstˇen´ı k´odu interpretem
Intermedi´arn´ı k´od urˇcen´y k interpretaci b´yv´a ˇcasto zaps´an v postfixov´e notaci. S t´ım rozd´ılem ˇze se z´akladn´ı myˇslenka interpretace v´yrazu v postfixov´e notaci zobecn´ı na cel´y soubor prostˇredk˚u konkr´etn´ıho jazyka. K interpretaci takov´eho k´odu postaˇc´ı n´asleduj´ıc´ı struktury.
• program - zdrojov´y program zapsan´y v postfixov´e notaci, jehoˇz prvky(instrukce) iden-tifikuj´ı operace a operandy.
• z´asobn´ık - vyuˇz´ıvan´y pˇri interpretaci a poskytuj´ıc´ı pracovn´ı pamˇet’.
• tabulka symbol˚u - slouˇz´ıc´ı k uloˇzen´ı z´aznam˚u o objektech, atributem objektu m˚uˇze b´yt i jeho hodnota.
Samotn´a interpretace prob´ıh´a n´asleduj´ıc´ım zp˚usobem. K´od je zpracov´av´an postupnˇe zleva doprava. Pokud interpret naraz´ı na operand tak jej zkop´ıruje na z´asobn´ık. V pˇr´ıpadˇe ˇze naraz´ı na n-arn´ı oper´ator tak naˇcte prvn´ıch n hodnot ze z´asobn´ıku provede nad nimi operaci a v´ysledek uloˇz´ı opˇet na z´asobn´ık. Na z´akladˇe tohoto algoritmu lze jednoduˇse implementovat procesor realizuj´ıc´ı interpretaˇcn´ı f´azi.
Kapitola 4
Motivace, souˇ
casn´
y stav pr´
ace
V t´eto ˇc´asti je pops´ana motivace k v´ybˇeru a ˇreˇsen´ı t´ematu pr´ace, d´ale obsahuje popis jednotliv´ych ˇc´ast´ı, kter´e byly vypracov´any v r´amci projektu. U kaˇzd´e z popisovan´ych ˇc´ast´ı se nach´az´ı popis stavu ve kter´em se nach´az´ı v ˇcase vypracov´an´ı tohoto dokumentu.
4.1
Motivace
T´ema pr´ace jsem zvolil na z´akladˇe vlastn´ıch pokus˚u o implementaci programu pro snadnou manipulaci s obrazem. Tyto znalosti (tj. pˇr´ıstup k problematice zpracov´an´ı obrazu) budou vyuˇzity v n´asleduj´ıc´ı pr´aci na projektu, kter´a bude zahrnovat detailn´ı n´avrh jazyka urˇcen´eho pro zpracov´an´ı obrazu.
Dalˇs´ım d˚uvodem k volbˇe tohoto t´ematu bylo t´ema bakal´aˇrsk´e pr´ace, kter´a se zab´yvala n´avrhem kombinovan´e syntaktick´e anal´yzy aplikovan´e pˇri rozkladu vstupn´ıho ˇretˇezce. Pˇri zpracov´an´ı v´yˇse uveden´eho zad´an´ı jsem z´ıskal z´akladn´ı zkuˇsenosti z oblasti pˇrekladaˇc˚u a interpret˚u, kter´e jsem chtˇel d´ale zuˇzitkovat v t´eto pr´aci.
4.2
Souˇ
casn´
y stav pr´
ace
N´asleduje v´yˇcet jednotliv´ych navrˇzen´ych a implementovan´ych ˇc´ast´ı projektu a popis v jak´e f´azi rozpracov´an´ı se nach´az´ı.
Skripty v jazyce Perl
Skripty pouˇz´ıvan´e pro automatick´e generov´an´ı kontejnerov´ych objekt˚u. Implementaˇcn´ı de-taily popisuj´ıc´ı n´avrh a vyuˇzit´ı tˇechto skript˚u jsou pops´any v pˇr´ıloze. N´avrh a implementace tˇechto skript˚u jsou dokonˇceny a pouˇz´ıvaj´ı se pˇri implementaci n´ıˇze popsan´ych ˇc´ast´ı projektu. Program generuj´ıc´ı pˇrekladaˇc
Tento program tvoˇr´ı velkou ˇc´ast celkov´e pr´ace na projektu. Je urˇcen k automatick´emu ge-nerov´an´ı popisu pˇrekladaˇce na z´akladˇe popisu struktury jazyka pˇrekl´adan´ych program˚u. N´avrh a implementace tohoto programu jsou dokonˇceny. Popis programu se nach´az´ı v kapi-tole5. Navrˇzen´y pˇrekladaˇc. Navrhovan´y skriptovac´ı jazyk je realizov´an jako vstupn´ı soubor tohoto programu.
Souˇc´ast´ı programu je i jazyk urˇcen´y k z´apisu s´emantick´ych podprogram˚u. N´avrh a im-plementace tohoto jazyka jsou jiˇz ˇc´asteˇcnˇe dokonˇceny, ale st´ale doch´az´ı k drobn´ym zmˇen´am,
v z´avislosti na poˇzadovan´e funkcionalitˇe pˇri n´avrhu skriptovac´ıho jazyka. Popis tohoto ja-zyka se nach´az´ı v kapitole 6. Navrˇzen´y jazyk s´emantick´ych podprogram˚u.
Jazyk pro zpracov´an´ı obrazu
Jazyk je zapisov´an jako vstup v´yˇse popsan´eho programu. N´avrh programu a jeho z´apis jeˇstˇe nen´ı kompletnˇe dokonˇcen a z´avis´ı na detailn´ı struktuˇre reprezentovan´ych obraz˚u. Popis dosud navrˇzen´ych ˇc´ast´ı skriptovac´ıho jazyka je pops´an v kapitole 7. Navrˇzen´y jazyk pro zpracov´an´ı obrazu.
4.3
Zhodnocen´ı souˇ
casn´
eho stavu
Byl navrˇzen a implementov´an program generuj´ıc´ı popis pˇrekladaˇce. Jeho implementace splˇnuje poˇzadavky na nˇej kladen´e a je provedena s ohledem na efektivn´ı v´ypoˇcet a inter-pretaci vygenerovan´ym pˇrekladaˇcem. Existuje moˇznost z´apisu zdrojov´eho k´odu vygenero-van´eho pˇrekladaˇce v jazyce C, kter´a vˇsak zat´ım implementuje jen lexik´aln´ı a syntaktickou anal´yzu tohoto pˇrekladaˇce.
S vyuˇzit´ım v´yˇse uveden´eho programu je navrhov´an skriptovac´ı jazyk pro zpracov´an´ı obrazu. Je navrhov´an s ohledem na snadn´e pouˇzit´ı a je snaha v r´amci moˇznost´ı dodrˇzovat z´akladn´ı syntaxi podobnou syntaxi jazyka C.
Kapitola 5
Navrˇ
zen´
y pˇ
rekladaˇ
c
Tato kapitola se zab´yv´a n´avrhem a implementac´ı interpretaˇcn´ıho pˇrekladaˇce. Pˇrekladaˇc je navrˇzen pro zpracov´an´ı libovoln´eho jazyka, popsan´eho vstupn´ım souborem obsahuj´ıc´ım popis lexik´aln´ıch, syntaktick´ych a s´emantick´ych pravidel tohoto jazyka. ´Ukolem pˇrekladaˇce je na z´akladˇe vstupn´ıho zdrojov´eho programu vygenerovat jeho s´emanticky ekvivalentn´ı reprezentaci, kterou bude moˇzn´e jednoduˇse d´ale upravovat, tj. spouˇstˇet na virtu´aln´ım stroji, nebo prov´adˇet nad n´ı dalˇs´ı operace (Optimalizace apod.).
Princip funkce pˇrekladaˇce
Z d˚uvod˚u poˇc´ateˇcn´ı nezkuˇsenosti s n´avrhem a implementac´ı pˇrekladaˇc˚u programovac´ıch jazyk˚u by bylo nevhodn´e implementovat pˇrekladaˇc pˇr´ımo v n´ızko´urovˇnov´em programovac´ım jazyce. Pokud by vyvstal v urˇcit´e f´azi implementace nˇejak´y sloˇzitˇejˇs´ı probl´em, bylo by nutn´e prov´adˇet vˇetˇs´ı z´asahy do k´odu a mohlo by doch´azet k pˇr´ıpadn´emu zan´aˇsen´ı chyb, apod.
Po prostudov´an´ı probl´em˚u n´avrhu a implementace pˇrekladaˇc˚u, dospˇel autor k n´azoru ˇze techniky automatizovan´eho generov´an´ı d˚uleˇzit´ych pod-ˇc´ast´ı pˇrekladaˇce jsou tak pokroˇcil´e a nepˇr´ıliˇs sloˇzit´e na implementaci, ˇze bude snadnˇejˇs´ı vytvoˇrit syst´em vytv´aˇrej´ıc´ı pˇrekladaˇc na z´akladˇe jeho popisu, a samotn´y pˇrekladaˇc navrhnout jako vstupn´ı popis do tohoto syst´emu. Na obr´azku 5.1. je zobrazena struktura implementovan´eho programu, vˇcetnˇe zobrazen´ı postup˚u pˇri vytv´aˇren´ı pˇrekladaˇce a pˇrekladu zdrojov´ych soubor˚u. V n´asleduj´ıc´ıch podkapi-tol´ach se nach´az´ı podrobnˇejˇs´ı popis jednotliv´ych pod-ˇc´ast´ı programu.
5.1
Popis souboru definuj´ıc´ıho jazyk
Podle tohoto vstupn´ıho souboru implementovan´y program vygeneruje strukturu popisuj´ıc´ı pˇrekladaˇc. Tuto strukturu pot´e program vyuˇzije k n´asledn´emu pˇreloˇzen´ı vstupn´ıho zdro-jov´eho souboru. Popis pˇrekladaˇce je potˇreba vygenerovat pouze jednou, tento se m˚uˇze uloˇzit na disk a pˇri pˇrekladu dalˇs´ıho zdrojov´eho souboru pouze naˇc´ıst ze souboru. V n´asleduj´ıc´ı pr´aci na projektu je zahrnuta i myˇslenka generov´an´ı zdrojov´eho programu v jazyce C im-plementuj´ıc´ı pˇrekladaˇc popsan´y generovanou strukturou1.
Form´at souboru definuj´ıc´ıho jazyk
Do tohoto souboru se zapisuje seznam termin´aln´ıch a netermin´aln´ıch symbol˚u syntaktick´e anal´yzy, popis tvaru termin´aln´ıch symbol˚u a s´emantick´e podprogramy jednotliv´ych pravidel.
Obr´azek 5.1: Struktura pˇrekladaˇce.
Z´akladn´ı struktura souboru je zobrazena v tabulce5.1.
N´asleduje vysvˇetlen´ı nˇekter´ych pojm˚u zapsan´ych v t´eto struktuˇre.
• <terminal_id> - tento pojem popisuje identifikaci termin´aln´ıho symbolu, kter´a bude d´ale pouˇz´ıvan´a v seznamu pravidel. Zapisuje se ve tvaru identifik´atoru, jako napˇr. v jazyce C. To znamen´a posloupnost ˇc´ısel, p´ısmen a podtrˇz´ıtek s podm´ınkou ˇze nezaˇc´ın´a ˇc´ıslem.
• <nonterminal_id> - tento element popisuje identifikaci non-termin´aln´ıho symbolu, pro pouˇzit´ı v seznamu syntaktick´ych pravidel. Zapisuje se jako identifik´ator ter-min´aln´ıho symbolu uzavˇreny mezi znaky ‘<’ a ‘>’.
• <regular_expression> - zastupuje regul´arn´ı v´yraz urˇcen´y k popisu tvaru termin´aln´ıho symbolu ve zdrojov´em programu jazyka. Nen´ı to regul´arn´ı v´yraz jak jej zn´ame z te-orie form´aln´ıch jazyk˚u, ale sp´ıˇse zjednoduˇsen´a forma, ve kter´e se mohou pouˇz´ıvat z´astupn´e symboly pro mnoˇzinu znak˚u, iter´ator a z´apis popisuj´ıc´ı v´ybˇer jednoho z mnoˇziny znak˚u. Seznam speci´aln´ıch znak˚u n´asleduje.
– \w - ”white” oznaˇcuje tzv. b´ıl´e znaky mezi kter´e patˇr´ı mezera, tabul´ator a konec ˇr´adku. Vyuˇzije se napˇr´ıklad pˇri oznaˇcov´an´ı termin´al˚u, kter´e syntaktick´y ana-lyz´ator nemus´ı zpracov´avat. To se provede napˇr´ıklad z´apisem \w\w\*.
– \d - ”digit” oznaˇcuje jednu ˇc´ıslici z mnoˇziny 0-9. Slouˇz´ı k definici termin´al˚u popisuj´ıc´ıch ˇc´ıseln´e konstanty, nebo i identifik´atory promˇenn´ych.
init_code: { <semantic_code> } terminals: <terminal_id> {<regular_expression>} ... nonterminals: <nonterminal_id> ... rules:
<nonterminal_id> -> <terminal_id> | <nonterminal_id> ... ->> {
<semantic_code> }
...
Tabulka 5.1: Struktura souboru popisuj´ıc´ıho jazyk.
– \l - ”letter” znaˇc´ı jedno p´ısmeno abecedy z mnoˇzin a-z a A-Z. Slouˇz´ı hlavnˇe k popisu termin´aln´ıch symbol˚u oznaˇcuj´ıc´ıch identifik´atory.
– \! - oznaˇcuje skupinu znak˚u obsahuj´ıc´ı vˇsechny znaky kromˇe znak˚u definovan´eho za t´ımto identifik´atorem.
– \* - popisuje 0-n iterac´ı pˇredch´azej´ıc´ıho znaku. Napˇr´ıklad z´apis "\!"\*" popisuje ˇretˇezec znak˚u.
– \[ a \] - oznaˇcuj´ı z´avorky pro v´ybˇer jednoho znaku, kter´y je v nich obsaˇzen. Pˇr´ıkladem vyuˇzit´ı takov´eho z´apisu je popis termin´alu oznaˇcuj´ıc´ıho identifik´ator \[_\l\]\[_\l\d\]\*.
Podrobnˇejˇs´ı popis vyuˇzit´ı tˇechto v´yraz˚u k rozpozn´av´an´ı termin´al˚u(lex´em˚u) zdro-jov´eho programu bude uveden v podkapitole zab´yvaj´ıc´ı se lexik´aln´ı anal´yzou pˇrekladaˇce. • <semantic_code> - tento symbol zastupuje program zapsan´y v interpretovan´em
ja-zyce, kter´y slouˇz´ı pro definov´an´ı s´emantick´ych operac´ı prov´adˇen´ych pˇri redukci podle pravidla, u kter´eho je tento k´od definov´an. Jedinou v´yjimku tvoˇr´ı k´od zapsan´y za kl´ıˇcov´ym slovem init:, kter´y se spouˇst´ı vˇzdy na zaˇc´atku pˇrekladu. Popis jazyka pro z´apis s´emantick´ych podprogram˚u se nach´az´ı v kapitole 6. nazvan´e Navrˇzen´y jazyk s´emantick´ych podprogram˚u.
Zpracov´an´ım tohoto popisu jazyka z´ısk´a program dostatek informac´ı pro vygenerov´an´ı pˇrekladaˇce schopn´eho zpracovat zdrojov´y soubor zapsan´y v tomto jazyce.
5.2
Nalezen´ı koneˇ
cn´
eho automatu
Tato ˇc´ast se zab´yv´a struˇcn´ym popisem postup˚u vyuˇzit´ych pˇri hled´an´ı koneˇcn´eho automatu rozliˇsuj´ıc´ıho od sebe jednotliv´e termin´aln´ı symboly, popsan´e ve vstupn´ım definiˇcn´ım sou-boru regul´arn´ımi v´yrazy.
0 1 2 3 4 5 6 7 8 9 10 11 < \[ _ \l \] \[ _ \l \d \] \* > 0: ’<’ -> 1 1: ’_’ -> 5 <letter> -> 5 5: ’_’ -> 5 <letter> -> 5 <digit> -> 5 ’>’ -> 12
Tabulka 5.2: Regul´arn´ı v´yraz s mnoˇzinou jeho pˇrechod˚u. ´
Uprava regul´arn´ıch v´yraz˚u
Prvn´ım krokem je pˇrevod regul´arn´ıch v´yraz˚u z textov´e podoby do z´apisu v nˇemˇz jsou speci´aln´ı znaky(tj. znaky kter´e zastupuj´ı mnoˇziny znak˚u jednoduch´ych) stejnˇe jako jed-noduch´e znaky reprezentov´any jedn´ım elementem. Vˇetˇsinou je tento z´apis reprezentov´an polem, ve kter´em je ˇc´ıslem jednoznaˇcnˇe identifikov´an jak jednoduch´y znak, tak i speci´aln´ı znak vˇcetnˇe jeho funkce. V tomto kroku se tak´e zpracuj´ı tzv. escape sekvence zapsan´e v textov´e podobˇe regul´arn´ıho v´yrazu.
V takto vytvoˇren´ych pol´ıch lze pak na z´akladˇe znalosti aktu´aln´ı pozice ve v´yrazu2 nal´ezt n´asleduj´ıc´ı moˇzn´e pˇrechody. Tyto pˇrechody jsou pops´any symbolem, nebo mnoˇzinou symbol˚u, kter´e je prov´adˇej´ı a ˇc´ıslem oznaˇcuj´ıc´ım n´asleduj´ıc´ı pozici ve v´yrazu po proveden´ı tohoto pˇrechodu. Pˇr´ıklad pˇrechod˚u v regul´arn´ım v´yrazu se nach´az´ı v tabulce 5.2.
Schopnost nalezen´ı tˇechto pˇrechod˚u v kaˇzd´em v´yrazu vyuˇzije konstruktor koneˇcn´eho automatu urˇcen´eho k rozpozn´av´an´ı vˇsech termin´aln´ıch symbol˚u jazyka.
Nalezen´ı stav˚u koneˇcn´eho automatu
Algoritmus hledaj´ıc´ı stavy koneˇcn´eho automatu je zaloˇzen na v´yˇse popsan´e schopnosti vytvoˇrit z regul´arn´ıho v´yrazu, seznam pˇrechod˚u se vstupn´ımi znaky v r´amci tohoto v´yrazu.
´
Ukolem takov´eho algoritmu je spojit jednotliv´e pod-automaty vˇsech v´yraz˚u do jednoho celku, urˇcen´eho k jejich rozpozn´av´an´ı tj. koneˇcn´eho automatu lexik´aln´ı anal´yzy.
K tomu bude vyuˇzita struktura zaznamen´avaj´ıc´ı pro kaˇzd´y zpracov´avan´y stav vytv´aˇren´eho automatu mnoˇzinu pod-automat˚u, kter´e reprezentuje, vˇcetnˇe z´aznamu pozic(stav˚u), ve kter´ych se tyto pod-automaty nach´az´ı. D´ale se vyuˇzije struktura implementuj´ıc´ı obyˇcejnou ˇradu, do kter´e se budou vkl´adat popisy stav˚u (popsan´e v´yˇse popsanou strukturou) urˇcen´e k zpracov´an´ı.
Na zaˇc´atku algoritmus vloˇz´ı do t´eto ˇrady stav obsahuj´ıc´ı seznam vˇsech pod-automat˚u vytvoˇren´ych z regul´arn´ıch v´yraz˚u, kter´e budou m´ıt indik´ator pozice nastaven´y na nulu. Samotny algoritmus je implementov´an jako cyklus pracuj´ıc´ı nad ˇradou popis˚u, dokud v ˇradˇe nˇejak´y popis stavu ”ˇcek´a”. V cyklu se popis stavu, kter´y je na ˇradˇe vyzvedne a porovn´a s mnoˇzinou jiˇz zpracovan´ych stav˚u. Pokud se v t´eto mnoˇzinˇe nach´az´ı stejn´y popis stavu, tak to znamen´a ˇze tento stav jiˇz byl zpracov´an a uprav´ı se jen pˇrechody, kter´e vedly k vytvoˇren´ı tohoto nov´eho stavu tak aby smˇeˇrovaly na stav uloˇzen´y v seznamu jiˇz zpracovan´ych. Kdyˇz
se popis stavu v t´eto mnoˇzinˇe nenach´az´ı n´asleduje jeho zpracov´an´ı. Pˇri nˇem se naleznou vˇsechny moˇzn´e pˇrechody z tohoto stavu zaloˇzen´e na moˇzn´ych pˇrechodech v pod-automatech. Je nutn´e vyb´ırat znaky pro n´asleduj´ıc´ı pˇrechod od nejz´akladnˇejˇs´ıch po nejobecnˇejˇs´ı. Po v´ybˇeru znaku pro n´asleduj´ıc´ı pˇrechod je nutn´e znovu zkontrolovat vˇsechny ostatn´ı pˇrechody pod-automat˚u zda neobsahuj´ı pˇrechod se stejn´ym znakem, nebo se znakem obecnˇejˇs´ım, kter´y popisuje i znak pˇrechodu. Na z´akladˇe tˇechto porovn´an´ı se vytvoˇr´ı nov´y seznam pod-automat˚u a jejich pozic popisuj´ıc´ı nov´y stav automatu. Tento novˇe vytvoˇren´y popis stavu se vloˇz´ı do ˇrady. Zpracov´an´ı stavu skonˇc´ı s vyˇcerp´an´ım vˇsech moˇznost´ı pˇrechod˚u vˇsech pod-automat˚u. Tento stav se po zpracov´an´ı vloˇz´ı do mnoˇziny stav˚u automatu a jeho popis se uloˇz´ı do seznamu jiˇz zpracovan´ych stav˚u.
Tento algoritmus v podstatˇe implementuje paralelizaci v´ıce koneˇcn´ych automatu za ´
uˇcelem nalezen´ı odpov´ıdaj´ıc´ıho koneˇcn´eho automatu vhodn´eho k vyuˇzit´ı lexik´aln´ım ana-lyz´atorem jazyka. Automat je reprezentov´an vygenerovanou mnoˇzinou pˇrechodov´ych stav˚u.
5.3
Generov´
an´ı rozkladov´
e tabulky
Rozkladov´a tabulka je jednou ze z´akladn´ıch struktur ˇr´ıd´ıc´ıch syntaktick´y rozklad zdro-jov´eho programu. Protoˇze ve vˇetˇsinˇe pˇrekladaˇc˚u je to pr´avˇe syntaktick´y analyz´ator, kter´y ˇr´ıd´ı rozklad zdrojov´eho programu je tvorba t´eto struktury(syntaktick´e tabulky) stˇeˇzejn´ım krokem tvorby pˇrekladaˇce.
Automatizovan´a tvorba t´eto tabulky je velmi dobˇre pops´ana v mnoha publikac´ıch proto se zde omez´ım jen na struˇcn´y popis z´akladn´ıch krok˚u tohoto postupu.
J´adra rozkladu
Konverze pˇres tzv. j´adra rozkladu je jedna z metod urˇcen´ych pro automatizovanou tvorbu rozkladov´e tabulky. Tato metoda je zaloˇzena na nalezen´ı a pops´an´ı vˇsech moˇzn´ych stav˚u (jader), do kter´ych se m˚uˇze syntaktick´y analyz´ator dostat pˇri rozkl´ad´an´ı zdrojov´eho sou-boru popsan´eho jazyka. Na z´akladˇe vygenerovan´eho seznamu tˇechto jader je moˇzn´e opˇet automatizovan´ym postupem vytvoˇrit poˇzadovanou rozkladovou tabulku.
Metoda hled´an´ı jader rozkladu se dˇel´ı na nˇekolik f´az´ı, kde prvn´ı dvˇe f´aze slouˇz´ı k pˇr´ıpravˇe dat vhodn´ych pro jednoduˇsˇs´ı zpracov´an´ı f´aze posledn´ı. Tˇemito f´azemi jsou, v´ypoˇcet mnoˇziny firsts, v´ypoˇcet mnoˇziny follows a nalezen´ı poˇzadovan´ych jader rozkladu popsan´ych v mnoˇzinˇe kernels. N´asleduj´ıc´ı f´az´ı, kter´a uˇz ale nepatˇr´ı mezi f´aze hledaj´ıc´ı j´adra rozkladu je generov´an´ı samotn´e rozkladov´e tabulky na z´akladˇe nalezen´ych jader rozkladu.
V´ypoˇcet mnoˇziny firsts
Mnoˇzina firsts obsahuje pro kaˇzd´y symbol syntaktick´e anal´yzy, tj. pro kaˇzd´y termin´al a netermin´al seznam symbol˚u, kter´e se mohou vyskytovat na zaˇc´atku liter´alu rozepsan´eho z tohoto symbolu.
Z toho vypl´yv´a ˇze pro termin´aln´ı symboly bude v tomto seznamu jen tento symbol sa-motn´y, protoˇze ˇz´adn´y jin´y liter´al se z nˇej vygenerovat nem˚uˇze. Mnoˇzina first netermin´aln´ıch symbol˚u se nalezne pr˚uchodem pˇres vˇsechny pravidla u kter´ych netermin´al tvoˇr´ı hlavu. V kaˇzd´em kroku pr˚uchodu se do mnoˇziny first tohoto netermin´alu pˇrid´a mnoˇzn´a first prvn´ıho symbolu prav´e strany pravidla.
Z d˚uvodu jednoduch´eho nalezen´ı mnoˇziny first pro termin´aln´ı symboly tyto mnoˇziny nepoˇc´ıt´am dopˇredu ale vypoˇc´ıt´am (pˇriˇrad´ım index termin´alu) aˇz pˇri potˇrebˇe t´eto mnoˇziny
v dalˇs´ım v´ypoˇctu.
Pˇri v´ypoˇctu mnoˇziny first je pro f´azi generov´an´ı jader rozkladu nutn´e ke kaˇzd´emu z´aznamu v mnoˇzinˇe first nˇejak´eho netermin´alu vygenerovat seznam pravidel ze kter´ych vypl´yv´a pˇr´ısluˇsnost tohoto z´aznamu do t´eto mnoˇziny first. Takov´emu seznamu pravidel budeme d´ale ˇr´ıkat mnoˇzina first rules.
V´ypoˇcet mnoˇziny follows
Jak z n´azvu mnoˇziny follows vypl´yv´a obsahuje tato pro kaˇzd´y netermin´al3 seznam symbol˚u kter´e po nˇem mohou n´asledovat v nˇejak´em liter´alu rozepsan´em ze startovac´ıho netermin´alu gramatiky.
Mnoˇzina se opˇet pro netermin´al nalezne pr˚uchodem pˇres vˇsechny pravidla gramatiky jazyka, ale tentokr´ate se netermin´al hled´a v prav´e stranˇe pravidla. Pokud byl netermin´al nalezen z´aleˇz´ı na pozici ve kter´e se v tˇele pravidla nach´az´ı, kdyˇz se nenach´az´ı na posledn´ı pozici pˇrid´a se do jeho mnoˇziny follow mnoˇzina firsts symbolu vpravo od nˇej, v pˇr´ıpadˇe ˇze se nach´az´ı na konci tˇela pravidla pˇrid´a se do jeho mnoˇziny follow mnoˇzina follow netermin´alu tvoˇr´ıc´ıho hlavu pravidla.
Pˇri tomto v´ypoˇctu se uplatn´ı rekurze, protoˇze mnoˇzina follow, kter´a se m´a pˇridat do mnoˇziny follow poˇc´ıtan´eho netermin´alu jeˇstˇe nemus´ı b´yt spoˇc´ıt´ana. Avˇsak u t´eto rekurze si mus´ıme d´at pozor a s kaˇzd´ym vol´an´ım do hloubky pˇred´avat i informace o jiˇz v´yˇse poˇc´ıtan´ych netermin´alech, tyto se uˇz d´ale nesm´ı zanoˇrovat z d˚uvod˚u zacyklen´ı algoritmu. Z d˚uvodu efektivity v´ypoˇctu je vhodn´e mnoˇzinu follow netermin´alu poˇc´ıtan´eho kv˚uli poˇzadavku jin´eho netermin´alu zaznamenat jako spoˇc´ıtanou a v hlavn´ım cyklu pˇres netermin´aly ji jiˇz zbyteˇcnˇe nepoˇc´ıtat. Toto opatˇren´ı m˚uˇze b´yt pouˇzito jen pokud ve v´ypoˇctu mnoˇziny follow nedoˇslo nikde k omezen´ı zanoˇrov´an´ı kv˚uli opakovan´emu zpracov´an´ı nˇekter´eho netermin´alu.
Tato mnoˇzina sehraje kl´ıˇcovou roli pˇri rozhodov´an´ı u kter´ych termin´al˚u na vstupu prov´est redukci podle pravidla gramatiky.
V´ypoˇcet jader rozkladu
J´adro rozkladu je ˇc´asteˇcnˇe analogick´e ke stavu v koneˇcn´em automatu. Je to struktura popi-suj´ıc´ı jeden stav ve kter´em se m˚uˇze nal´ezat syntaktick´y analyz´ator pˇri rozkladu vstupn´ıho ˇretˇezce. V jednom j´adˇre jsou zaznamen´any vˇsechny pravidla ve kter´ych se m˚uˇze analyz´ator ”vyskytovat” pˇri rozkladu, vˇcetnˇe pozic v tˇechto pravidlech, tato skupina se naz´yv´a pravi-dla j´adra rozkladu. Druh´a skupina v j´adˇre se naz´yv´a skupina pˇrechod˚u, ta obsahuje indexy jader ze kter´ych se do tohoto j´adra vstoupilo a se kter´ym elementem (tj. termin´alem nebo i netermin´alem) byl pˇrechod proveden.
Algoritmus v´ypoˇctu jader rozkladu zaˇc´ın´a vytvoˇren´ım prvn´ıho j´adra, kter´e obsahuje pouze prvn´ı pravidlo s iter´atorem na pozici nula, tj. pˇred prvn´ım symbolem tˇela tohoto pravidla, toto novˇe vytvoˇren´e j´adro se vloˇz´ı do dynamick´eho pole, kter´e slouˇz´ı pr´avˇe jako seznam jader rozkladu. Algoritmus proch´az´ı pˇres vˇsechny j´adra rozkladu v tomto dyna-mick´em poli a postupnˇe zpracov´av´a kaˇzd´e j´adro, skonˇc´ı kdyˇz doraz´ı na konec tohoto pole. Pˇri zpracov´an´ı jednoho j´adra se proch´az´ı vˇsechny jeho pravidla. D´ale se pracuje pouze s tˇemi pravidly, kter´e nemaj´ı iter´ator na konci sv´eho tˇela. U takov´eho pravidla se v mnoˇzinˇe first nalezne seznam element˚u, kter´ymi m˚uˇze zaˇc´ınat element nach´azej´ıc´ı se za iter´atorem v pravidle. Pro kaˇzd´y takov´y element se zaˇcne vytv´aˇret nov´e j´adro rozkladu (zat´ım se nevkl´ad´a do pole koncov´ych jader rozkladu).
3
Do tohoto nov´eho j´adra se vloˇz´ı seznam pravidel z mnoˇziny first rules n´aleˇz´ıc´ı k ele-mentu se kter´ym se vytv´aˇr´ı, iter´ator v tˇechto pravidlech bude um´ıstˇen na pozici 1 (tj. za zpracov´avan´ym elementem z mnoˇziny first). D´ale se do seznamu pravidel tohoto j´adra vloˇz´ı pro element odpov´ıdaj´ıc´ı samotn´emu elementu jehoˇz mnoˇzina first byla pouˇzita pravidlo aktu´aln´ıho j´adra, kter´e bylo z´akladem pro vznik nov´eho j´adra, s t´ım ˇze se jeho iter´ator posune o jednu pozici doprava (tj. za zpracov´avan´y element).
Do mnoˇziny pˇrechod˚u nov´eho j´adra se vloˇz´ı pˇrechod ze zpracov´avan´eho j´adra s aktu´alnˇe zpracov´avan´ym elementem z mnoˇziny first.
Po vytvoˇren´ı nov´eho j´adra rozkladu se projdou vˇsechny existuj´ıc´ı j´adra a hled´a se j´adro se shodn´ym seznamem pravidel a jejich iter´ator˚u jako m´a novˇe vytvoˇren´e j´adro, mnoˇzina pˇrechod˚u nehraje roli. Pokud nen´ı takov´e j´adro nalezeno vloˇz´ı se nov´e j´adro do pole jader rozkladu. V pˇr´ıpadˇe ˇze se takov´e j´adro nalezne, pˇrid´a se mnoˇzina pˇrechod˚u nov´eho j´adra do nalezen´eho existuj´ıc´ıho j´adra.
Po dokonˇcen´ı tohoto algoritmu m´ame kompletn´ı mnoˇzinu jader rozkladu odpov´ıdaj´ıc´ı pˇredan´e gramatice.
Generov´an´ı rozkladov´e tabulky
Kaˇzd´e j´adro rozkladu popisuje pr´avˇe jeden stav, ve kter´em se m˚uˇze nal´ezat syntaktick´y analyz´ator pˇri zpracov´an´ı zdrojov´eho textu, proto tak´e rozkladov´a tabulka jej´ıˇz ˇr´adky od-pov´ıdaj´ı jednotliv´ym stav˚um obsahuje pr´avˇe tolik ˇr´adk˚u kolik bylo vypoˇc´ıt´ano jader roz-kladu.
Rozkladov´a tabulka se skl´ad´a ze dvou ˇc´ast´ı, tˇemi jsou tabulka akc´ı a tabulka pˇrechod˚u. Tabulka akc´ı slouˇz´ı syntaktick´emu analyz´atoru k nalezen´ı n´asleduj´ıc´ı akce, kterou by mˇel vykonat, zat´ımco tabulka pˇrechod˚u popisuje do jak´eho stavu se syntaktick´y analyz´ator pˇresune po redukci urˇcit´eho pravidla. Mezi akce nal´ezaj´ıc´ı se v tabulce akc´ı patˇr´ı akce shift a akce reduce.
Tabulka pˇrechod˚u rozkladov´e tabulky se vypln´ı na z´akladˇe mnoˇzin pˇrechod˚u jader roz-kladu. Pokud j´adro obsahuje pˇrechod, kter´y se prov´ad´ı na z´akladˇe netermin´aln´ıho symbolu zap´ıˇse se do tabulky pˇrechod˚u na ˇr´adek stavu z kter´eho pˇrechod pˇrech´az´ı a sloupec neter-min´alu s kter´ym se pˇrech´az´ı index j´adra ve kter´em se tento pˇrechod nach´az´ı.
Akce typu shift se v tabulce akc´ı vyplˇnuj´ı tak´e na z´akladˇe mnoˇzin pˇrechod˚u v j´adrech rozkladu. To znamen´a, pokud j´adro rozkladu obsahuje pˇrechod, kter´y se prov´ad´ı na z´akladˇe termin´aln´ıho symbolu, zap´ıˇse se do rozkladov´e tabulky na ˇr´adek stavu ze kter´eho se pˇrech´az´ı a sloupec termin´aln´ıho symbolu akce shift s indexem j´adra ve kter´em se tento pˇrechod nach´az´ı.
Pro vygenerov´an´ı akc´ı reduce je potˇreba proj´ıt vˇsechny j´adra rozkladu, ve kter´ych se hledaj´ı pravidla, kter´a maj´ı iter´ator za posledn´ım prvkem tˇela pravidla. Pokud se takov´eto pravidlo nalezne proch´az´ı se vˇsechny elementy z mnoˇziny follow hlavy tokov´eho pravidla. Pracuje se pouze s termin´aly, a u kaˇzd´eho z nich se znovu projdou vˇsechny pravidla j´adra z d˚uvodu zjiˇstˇen´ı zda neexistuje nˇejak´e, kter´e by obsahovalo iter´ator pˇred termin´alem z mnoˇziny follow s kter´ym by jsme v tomto pˇr´ıpadˇe chtˇeli pˇredˇcasnˇe redukovat pravidlo. Pokud takov´e pravidlo neexistuje vloˇz´ı se do rozkladov´e tabulky na ˇr´adek aktu´aln´ıho zpra-cov´avan´eho j´adra a sloupec prvku z mnoˇziny follow akce reduce s indexem zpracov´avan´eho pravidla.
V´ysledkem proveden´ı vˇsech tˇechto postup˚u je kompletn´ı rozkladov´a tabulka pˇripraven´a pro pouˇzit´ı syntaktick´ym analyz´atorem. Jej´ı v´ypoˇcet nen´ı jednoduch´y, ale d´ıky nˇemu bude jej´ı pouˇzit´ı pˇri rozkl´ad´an´ı zdrojov´eho k´odu v syntaktick´e anal´yze o to jednoduˇsˇs´ı.