ZADÁNÍ BAKALÁŘSKÉ PRÁCE

Název: Transpilátor z jazyka PHP do jazyka Go Student: Lukáš Simulík Vedoucí: Ing. Radomír Polách Studijní program: Informatika Studijní obor: Teoretická informatika Katedra: Katedra teoretické informatiky Platnost zadání: Do konce zimního semestru 2021/22

Pokyny pro vypracování

Nastudujte jazyky PHP a Go a principy týkající se konstrukce překladačů. Navrhněte, analyzujte a implementujte transpilátor projektů z jazyka PHP do jazyka Go. Transpilátor přeloží veškeré základní řídící konstrukce, standardní operátory, oblasti platnosti proměnných a také další nezbytné konstrukce jazyka PHP a také detekuje těžko přeložitelné konstrukce a upozorní na potřebné ruční úpravy výsledného kódu. Implementovaný transpilátor testujte na jednoduchých projektech. Seznam odborné literatury

Dodá vedoucí práce.

doc. Ing. Jan Janoušek, Ph.D. doc. RNDr. Ing. Marcel Jiřina, Ph.D. vedoucí katedry děkan

V Praze dne 28. února 2020

Bakal´aˇrsk´apr´ace

Transpil´atorz jazyka PHP do jazyka Go

Luk´aˇsSimul´ık

Katedra teoretick´einformatiky Vedouc´ıpr´ace:Ing. Radom´ırPol´ach

4. ˇcervna2020

Podˇekov´an´ı

Dˇekujipanu inˇzen´yrovi Pol´achovi za n´avrhy, jak´ymzp˚usobem pˇrev´adˇet kon- strukce jazyka PHP do Go, a tipy, jak´ymzp˚usobem tento projekt d´alrozˇs´ıˇrit. Rovnˇeˇzdˇekujipanu inˇzen´yrovi Bohusl´avkovi za postˇrehy pˇrirealizaci transpi- l´atorua objeven´ımprojekt˚u,zab´yvaj´ıc´ıse pˇreklademdo jazyka Go.

Prohl´aˇsen´ı

Prohlaˇsuji,ˇzejsem pˇredloˇzenoupr´acivypracoval samostatnˇea ˇzejsem uvedl veˇsker´epouˇzit´einformaˇcn´ızdroje v souladu s Metodick´ympokynem o dodrˇzo- v´an´ıetick´ych princip˚upˇripˇr´ıpravˇevysokoˇskolsk´ych z´avˇereˇcn´ych prac´ı. Beru na vˇedom´ı,ˇzese na moji pr´acivztahuj´ıpr´ava a povinnosti vypl´yvaj´ıc´ı ze z´akona ˇc.121/2000 Sb., autorsk´ehoz´akona, ve znˇen´ıpozdˇejˇs´ıch pˇredpis˚u. V souladu s ust. § 2373 odst. 2 z´akona ˇc.89/2012 Sb., obˇcansk´yz´akon´ık,ve znˇen´ıpozdˇejˇs´ıch pˇredpis˚u,t´ımto udˇelujinev´yhradn´ıopr´avnˇen´ı(licenci) k uˇzit´ı t´etomoj´ıpr´ace,a to vˇcetnˇevˇsech poˇc´ıtaˇcov´ych program˚u,jeˇzjsou jej´ısouˇc´ast´ı ˇcipˇr´ılohoua veˇsker´ejejich dokumentace (d´alesouhrnnˇejen D´ılo“), a to vˇsem ” osob´am,kter´esi pˇrej´ıD´ılouˇz´ıt.Tyto osoby jsou opr´avnˇeny D´ılouˇz´ıtjak´ymkoli zp˚usobem, kter´ynesniˇzujehodnotu D´ılaa za jak´ymkoli ´uˇcelem(vˇcetnˇeuˇzit´ı k v´ydˇeleˇcn´ym´uˇcel˚um).Toto opr´avnˇen´ıje ˇcasovˇe,teritori´alnˇei mnoˇzstevnˇe neomezen´e.Kaˇzd´aosoba, kter´avyuˇzijev´yˇseuvedenou licenci, se vˇsakzava- zuje udˇelitke kaˇzd´emu d´ılu, kter´evznikne (byt’ jen zˇc´asti)na z´akladˇeD´ıla, ´upravou D´ıla,spojen´ımD´ılas jin´ymd´ılem,zaˇrazen´ımD´ıla do d´ılasouborn´eho ˇcizpracov´an´ımD´ıla(vˇcetnˇepˇrekladu)licenci alespoˇnve v´yˇseuveden´em roz- sahu a z´aroveˇnzpˇr´ıstupnitzdrojov´yk´odtakov´ehod´ılaalespoˇnsrovnateln´ym zp˚usobem a ve srovnateln´em rozsahu, jako je zpˇr´ıstupnˇenzdrojov´yk´odD´ıla.

V Praze dne 4. ˇcervna2020 ...... Cesk´evysok´euˇcen´ıtechnick´evˇ Praze Fakulta informaˇcn´ıch technologi´ı © 2020 Luk´aˇsSimul´ık.Vˇsechna pr´ava vyhrazena. Tato pr´ace vznikla jako ˇskoln´ı d´ılo na Cesk´emvysok´emuˇcen´ıˇ technick´em v Praze, Fakultˇeinformaˇcn´ıch technologi´ı.Pr´ace je chr´anˇenapr´avn´ımipˇredpisy a mezin´arodn´ımi´umluvamio pr´avuautorsk´ema pr´avech souvisej´ıc´ıchs pr´avem autorsk´ym.K jej´ımuuˇzit´ı,s v´yjimkoubez´uplatn´ychz´akonn´ychlicenc´ıa nad r´amec opr´avnˇen´ıuveden´ychv Prohl´aˇsen´ına pˇredchoz´ıstranˇe,je nezbytn´ysou- hlas autora.

Odkaz na tuto pr´aci Simul´ık,Luk´aˇs. Transpil´atorz jazyka PHP do jazyka Go. Bakal´aˇrsk´apr´ace. Praha: Cesk´evysok´euˇcen´ıtechnick´evˇ Praze, Fakulta informaˇcn´ıch techno- logi´ı,2020. Abstrakt

Pr´acese zab´yv´atvorbou programu, kter´ypˇrev´ad´ıprojekty pro skriptovac´ıja- zyk PHP do jazyka Go. Popisuje historii PHP a jeho v´yvoj, rozeb´ır´azp˚usoby, kter´ymilze k´odpˇrev´adˇet a zrychlovat. Popisuje jiˇzexistuj´ıc´ıprojekty zab´yvaj´ı- c´ıse touto problematikou. Zahrnuje popis konstrukce kompil´atorua jeho jed- notliv´eˇc´asti.Popisuje realizaci n´astroje, zp˚usoby testov´an´ı,a srovn´av´av´ykon p˚uvodn´ıhoˇreˇsen´ıs nov´ym,pˇreloˇzen´ym.Analyzuj´ıse zp˚usoby, jak´ymiˇslojed- notliv´ekonstrukce zdrojov´ehojazyka pˇrev´estdo c´ılov´eho.

Kl´ıˇcov´a slova transpil´ator,jazyk Go, jazyk PHP, kompilovan´yjazyk, dy- namick´yjazyk, webov´atechnologie

Abstract

The thesis deals with the creation of a program which converts projects for the PHP scripting language into the Go language. Describes the history of PHP and its development, discusses ways how to convert and speed up code. Describes existing projects dealing with this issue. Includes a description of the design and its individual parts. Describes implementation of the tool, methods of testing, and compares the performance of the original

vii solution with the translated one. Methods how the individual constructions could be translated were analyzed.

Keywords transpiler, Go language, PHP language, compiled language, dy- namic language, web technology

viii Obsah

Uvod´ 1

1 PHP 3 1.1 Historie WWW ...... 3 1.2 Historie PHP ...... 4

2 Zp˚usoby zrychlov´an´ı k´odu 5 2.1 Transpilace ...... 5 2.2 Jin´yinterpret ...... 6 2.3 JIT kompil´ator ...... 6

3 Projekty zabyvaj´ ´ıc´ı se upravou´ PHP 7 3.1 Phalanger ...... 7 3.1.1 PeachPie ...... 8 3.2 P9 ...... 9 3.3 Project Zero ...... 9 3.4 Quercus ...... 10 3.5 HipHop Compiler for PHP ...... 10 3.6 HipHop Virtual Machine ...... 11 3.7 Hack ...... 13 3.8 PHP 7.1...... 13

4 Konstrukce kompil´atoru 17 4.1 Lexik´aln´ıanal´yza ...... 18 4.2 Syntaktick´aanal´yza ...... 19

5 Realizace 21 5.1 Poˇzadavky ...... 21 5.2 Lexik´aln´ıa syntaktick´aanal´yzaPHP ...... 22 5.3 Struktura ...... 22

ix 5.4 Konflikty v n´azvech ...... 23 5.4.1 Promˇenn´e...... 24 5.4.2 Funkce ...... 24 5.4.3 N´avˇest´ı ...... 24 5.5 Rozsah platnosti promˇenn´e ...... 24 5.6 Vedlejˇs´ıefekty pˇr´ıkaz˚u...... 26 5.7 Break a continue ...... 27 5.8 Asociativn´ıpole ...... 27 5.9 Glob´aln´ıpromˇenn´e ...... 28 5.10 Funkce a promˇenn´ypoˇcetargument˚u...... 28 5.11 Vkl´ad´an´ıskript˚u ...... 29 5.12 SQL ...... 29 5.13 Generov´an´ık´odu ...... 31 5.14 Testov´an´ıa porovn´av´an´ıv´ykonu ...... 31 5.14.1 Testov´an´ı ...... 31 5.14.2 Porovn´av´an´ıv´ykonu ...... 32

Z´avˇer 35

Bibliografie 37

A Seznam pouˇzitych´ zkratek 41

B Obsah pˇriloˇzen´eho CD 43

x Seznam obr´azk˚u

3.1 Zlepˇsen´ıpoˇct˚upoˇzadavk˚uza sekundu a ˇcasodezvy napˇr´ıˇcverzemi PHP [5] ...... 14 3.2 Porovn´an´ıPHP 7.0 a HHVM 3.10.1 [28] ...... 15

4.1 Struktura kompil´atoru[31] ...... 17

5.1 Pˇr´ıkladneoˇcek´avan´ehochov´an´ı ...... 26 5.2 SQL pˇripojen´ıv PHP s definovan´ymn´avratov´ymtypem ...... 30 5.3 Skript pouˇzit´ypro porovn´av´an´ıˇcasu ...... 32

xi

Uvod´

Transpilace je procesem, ve kter´emse pˇrev´ad´ı zdrojov´yk´odz jednoho do druh´eho.Jde o ud´alostve svˇetˇeinternetov´ych technologi´ıvelmi rozˇs´ıˇrenou. Jde rozdˇelitdo dvou kategori´ı,podle m´ıstapouˇzit´ı. Prvn´ı z nich souvis´ı se zobrazov´an´ım na stranˇeklienta, s internetov´ym prohl´ıˇzeˇcem.M´ıstotoho, aby program´atorpouˇz´ıval jazyk prohl´ıˇzeˇce, pracuje s jin´ym,kter´ym´avˇetˇs´ımoˇznosti,lepˇs´ıstrukturu, kratˇs´ımz´apisem,nebo ob- sahuje konstrukce zn´am´ez jin´ych jazyk˚u. Castoˇ si jsou oba jazyky velmi podobn´e, nov´ynˇejak´ymzp˚usobem vych´az´ı z p˚uvodn´ıho. Toto rozhodnut´ı pouˇz´ıvat jinou technologii s sebou nese probl´emv podobˇenutnosti k´odpˇrekl´a- dat do oˇcek´avan´epodoby. Nemus´ıj´ıtpouze o rozˇs´ıˇren´ımoˇznost´ıjazyka po- moc´ınov´ehodialektu, jde i o zpˇetnoukompatibilitu. Jazyky se vyv´ıjej´ı,ale ne vˇsechni pouˇz´ıvaj´ınejnovˇejˇs´ıprohl´ıˇzeˇce. Druh´akategorie souvis´ıse stranou serveru a tou se bude zab´yvat i tato pr´ace.Jedny z nejrozˇs´ıˇrenˇejˇs´ıch jazyk˚uv t´etooblasti maj´ıdvˇev´yznamn´evlast- nosti. Je velmi jednoduch´ev nich program napsat a zmˇenu jde okamˇzitˇevidˇet, protoˇzejsou interpretovan´e.To s sebou nese dvˇenev´yhody. Kv˚uliinterpretu nejsou tolik v´ykonn´e,zdroj se totiˇzmus´ıpokaˇzd´epˇrekl´adat.Nejde o jedinou vˇeczpomaluj´ıc´ı bˇeh,jazyky jsou tak´eˇcastovelmi dynamick´e,datov´etypy promˇen´ych se mohou mˇenitkaˇzdouchv´ıli. Tato vlastnost zjednoduˇsujepsan´ı,ale sniˇzuje rychlost bˇehu a zp˚usobuje, ˇzekontrola nad programem je niˇzˇs´ı.Kv˚ulitomu se zvyˇsujeˇsance,ˇzese program nebude chovat tak, jak m´a.Projekt˚una zrychlen´ık´oduvzniklo velk´emnoˇzstv´ı. Nepˇr´ımose zab´yvaj´ıvˇsemiprobl´emy interpretovan´ych jazyk˚u. Tato pr´acese bude zab´yvat skriptovac´ımjazykem PHP. Patˇr´ımezi ty nej- rozˇs´ıˇrenˇejˇs´ıa m´avˇsechny neduhy zm´ınˇen´ev´yˇse.Pr´acese bude kr´atcezab´yvat vznikem tohoto jazyka, ˇc´asteˇcnˇeproto, aby byly obh´ajeny nˇekter´ajeho imple- mentaˇcn´ırozhodnut´ı.Jazyk je kritizov´anpro nˇekter´ejeho vlastnosti, vˇetˇsina z nich je ale d´ana historicky, jeho p˚uvodn´ımz´amˇerem. Dalˇs´ımbodem bude pops´an´ızp˚usob˚u,jak ke zrychlen´ıjazyka m˚uˇzedoj´ıt.

1 Uvod´

Nejd˚uleˇzitˇejˇs´ımze vˇsech bude transpilace, kaˇzd´yprojekt ji v nˇejak´em´ıˇreob- sahuje. Prac´ıˇreˇs´ıc´ıtuto problematiku je hned nˇekolik, nˇekter´ez nich budou zm´ınˇeny zde. U pˇrevodu konstrukc´ıposlouˇz´ıjako inspirace pro implementaci vlastn´ıhoˇreˇsen´ı.Posledn´ımkrokem pˇredrealizac´ıje popis jednotliv´ych ˇc´ast´ı pˇrekladaˇce,coˇzje koncept, kter´ymse cel´apr´acezab´yv´a. C´ılemt´etopr´acebude pˇrev´estvybranou mnoˇzinu konstrukc´ınach´azej´ıc´ı se v jazyce PHP a pˇrev´estje do jazyka Go tak, aby se nezmˇenilv´ysledek, a pokud moˇznovylepˇsilyjeho vlastnosti – rychlost bˇehu programu a ˇcas odezvy, pokud bude spuˇstˇenjako server. Ke zrychlen´ıbude doch´azetjen d´ıky zmˇenˇetechnologie, optimalizace se nebudou prov´adˇet,struktura programu by mˇelab´ytco nejv´ıcepodobn´azdrojov´emu skriptu. Pˇrev´adˇetse bude jen k´od splˇnuj´ıc´ı dan´epoˇzadavky, mezi nˇenapˇr´ıklad patˇr´ı jednoznaˇcnostdatov´eho typu v dan´emm´ıstˇeprogramu. Testov´an´ımse zkontroluje ´uspˇeˇsnostpˇrev´adˇen´ı. Pr´acebude m´ıtcelou ˇradoupˇr´ıklad˚u,u kter´ych budou pops´any d˚uvody, proˇc jdou pˇrev´est,ˇcinikoliv. Uspˇeˇsnostse´ nebude dokazovat pouze na pˇr´ıkladech, dojde k pokus˚um o pˇreloˇzen´ıjiˇzfunguj´ıc´ıch projekt˚u.

2 Kapitola 1

PHP

Kapitola se bude zab´yvat histori´ıwebov´ych technologi´ı,chronologicky pop´ıˇse jejich v´yvoj po pˇr´ıchod PHP. Zmiˇnujese o p˚uvodn´ımz´amˇerutohoto jazyka.

1.1 Historie WWW

V roce 1989 se v laboratoˇr´ıch CERN objevuje n´avrhprojektu, kter´yve sv´em n´azvunese dvˇev´yznamn´efr´aze.Jsou jimi WorldWideWeb a HyperText. C´ılem bylo obej´ıt omezen´ı spojen´as hielarchick´ymuspoˇr´ad´an´ım soubor˚u.Nebylo totiˇzmoˇzn´ese jednoduch´ymzp˚usobem dostat na jin´ysoubor, aniˇzby se muselo celou stromovou strukturou znovu proch´azet.Podle Tima Bernerse- Leeho m´a Stromov´astruktura praktick´ev´yhody v pojmenov´an´ıkaˇzd´ehouzlu ” unik´atn´ımjm´enem.Na druhou stranu ale neumoˇzˇnujesyst´emupopsat re´aln´y svˇet.“ [1, pˇrekladautora] Odpovˇed´ına tento probl´emmˇely b´ytodkazy. D´ıky nim p˚ujdel´epe popsat vztah mezi jednotliv´ymidokumenty, mohou mezi nimi vzniknout cyklick´evazby, d´atjim stejnou v´ahu nehledˇena um´ıstˇen´ıve stromu a tak podobnˇe. Z´adostseˇ odloˇzilaa znovu se zaˇcneˇreˇsitv kvˇetnu pˇr´ıst´ıhoroku. Pro im- plementaci byly pouˇzity dvˇenov´etechnologie, HyperText Markup Language a HyperTextTransfer Protocol. Obˇetyto technologie st´aleexistuj´ıa jsou d´ale vyv´ıjeny konsorciem W3C, kter´epro nˇez´aroveˇnvyd´av´ai standardy [2]. Do listopadu 1993 nebyla tato technologie pˇr´ıliˇspopul´arn´ı,coˇzbylo zapˇr´ıˇce- nˇenoniˇzˇs´ıatraktivitou prohl´ıˇzeˇc˚uHTML str´anek.Zmˇenapˇriˇslas grafick´ym webov´ymprohl´ıˇzeˇcemMosaic. Jde o projekt NCSA patˇr´ıc´ı pod univerzitu Illinois. Uspˇechu´ vdˇeˇc´ı za implementaci vˇec´ı, kter´edo t´edoby ˇz´adn´yjin´y prohl´ıˇzeˇcnemˇel, jde napˇr´ıklado ikony, z´aloˇzky,poutav´euˇzivatelsk´eprostˇred´ı ” – to udˇelalo software jednoduch´ympro pouˇz´ıvan´ıa l´akav´ei pro osoby, kter´e nejsou technicky zamˇeˇren´e“ [3, pˇrekladautora]. Poˇzadavky na schopnosti str´anekse neust´alezvˇetˇsovaly, dalˇs´ımkrokem bylo zaˇr´ıdit,aby byly interaktivn´ı.Pro to ze zaˇc´atkuslouˇzilo Common Ga- teway Interface – CGI. Jedn´ase o prostˇredn´ıkamezi serverem a programem

3 1. PHP generuj´ıc´ıstr´anku. D´ıkytomu se rozˇs´ıˇrily moˇznosti,jak odpovˇed’ bude vypa- dat, jiˇznemuselo j´ıto kopii HTML str´ankyuloˇzenouna serveru [4].

1.2 Historie PHP

CGI bylo jedn´ımz d˚uvod˚u,proˇcse objevil projekt, pojmenovan´yjako Perso- ” nal Home Pages“. Byl naps´anRasmusem Lerdorfem a jeho c´ılembylo vytvoˇrit velmi jednoduch´yˇsablonovac´ısyst´em,kter´ybude vypadat jako HTML, jen bude m´ıtnav´ıcp´arovou znaˇcku,kter´ase nahrad´ıdynamick´ymobsahem [5]. Do t´edoby programy na druh´estranˇeCGI byly napsan´ev C nebo v Perl, a mˇely podobu standardn´ıho programu, bylo proto tˇeˇzk´erozpoznat, ˇzev´ysledkem bude HTML v´ystup[6]. Ke vzniku tohoto syst´emu doˇslov roce 1994 a nyn´ıje zn´ampod zkratkou PHP“. Veˇsker´ev´ypoˇcty se mˇelyprov´adˇetv jin´emjazyce, autorovou viz´ı ” bylo pouˇz´ıvat jazyk C, vytvoˇrilproto rozhran´ıpro komunikaci mezi tˇemito dvˇemajazyky. V porovn´an´ıs p˚uvodn´ımz´amˇerema vzhledem jazyka dnes je vidˇet,ˇzese zamˇeˇren´ızmˇenilo,moˇznostijazyka se zvˇetˇsily. PHP jiˇznen´ızn´am´e t´ım,ˇzeby bylo ˇsablonovac´ımjazykem, vykreslov´an´ıa v´ypoˇcty jsou spojen´e dohromady [5]. Tato zmˇenapostaven´ıjazyka zp˚usobila,ˇzese v nˇem objevuj´ıkonstrukty, kter´ejsou pro jin´ejazyky se stejn´ymzamˇeˇren´ımneobvykl´e.Vˇetˇsinaz nich bude zm´ınˇenav kapitole 5, protoˇzes nimi c´ılov´yjazyk neum´ıpracovat.

4 Kapitola 2

Zp˚usoby zrychlov´an´ık´odu

Tato kapitola pop´ıˇsezp˚usoby, jak´ymilze jiˇzexistuj´ıc´ıprogramy zrychlit. Ot´az- ka rychlosti je spojena s PHP od jeho vzniku. Skripty v jazyce Perl byly nˇekolikan´asobnˇerychlejˇs´ıneˇzty v PHP, ale d´ıkyspr´avn´yma rychl´ymrozhod- nut´ımtento jazyk nakonec nad konkurentem zv´ıtˇezil[5]. Zp˚usoby se od sebe liˇs´ıvelikost´ız´asahu do p˚uvodn´ıstruktury a velikost´ı zrychlen´ı.

2.1 Transpilace

Kompil´atorje program, kter´ypˇrevede programovac´ıjazyk do strojov´ehok´odu nebo do form´atuCLI. Jde o standardizovan´yform´atnez´avisl´yna zdrojov´em k´odu.Podporuje objektovˇeorientovan´eprogramov´an´ı,generick´edatov´etypy. C´ılem je m´ıt k´odnez´avisl´yna platformˇe,ke spuˇstˇen´ı programu staˇc´ı m´ıt syst´em,kter´ytento form´atum´ızpracovat a spustit [7]. T´ımto zp˚usobem na- pˇr´ıkladfunguje .NET Framework od spoleˇcnostiMicrosoft [8]. Transpil´atorje speci´aln´ıpˇr´ıpadkompil´atoru,kter´ypˇrev´ad´ızdrojov´yk´od mezi dvˇemavysoko´urovˇnov´ymiprogramovac´ımijazyky. Tento proces se po- uˇz´ıv´anapˇr´ıkladpro pˇrevod ze starˇs´ıhojazyka do nov´eho.Dalˇs´ımd˚uvodem je modernizace jiˇzexistuj´ıc´ıhok´odu,pouˇz´ıv´an´ınov´ych funkc´ıa tak podobnˇe. Dalˇs´ımd˚uvodem m˚uˇze b´ytoptimalizace zdrojov´ehok´odu.Jde o s´eriitransfor- mac´ı,rozdˇelen´edo nˇekolika krok˚upodle jejich n´aroˇcnosti. V prvn´ıch f´az´ıch se odstran´ınepouˇzit´epromˇenn´e,nevykonateln´ebloky k´odua tak podobnˇe.Pak pˇrijdena ˇraduodstraˇnov´an´ızbyteˇcn´ych pˇriˇrazov´an´ıi kdyˇzhodnota je jasnˇe dan´akonstantou, ´upravy cykl˚ua ˇr´ıd´ıc´ıch konstrukc´ı,ˇciaplikov´an´ı znalost´ı o argumentech funkce [9].

5 2. Zp˚usoby zrychlovan´ ´ı kodu´

2.2 Jin´yinterpret

Dalˇs´ımze zp˚usob˚ujak vylepˇsitˇcasje pouˇzit´ımjin´ehointerpretu pro dan´y jazyk. Tento zp˚usobbude ze vˇsech nejm´enˇepouˇz´ıvan´y.D´anoje to zejm´ena t´ım,ˇzeprobl´emrychlosti to neum´ıˇreˇsittak dobˇrejako jin´ezmiˇnovan´evarianty. Je zde st´aleprobl´emse zpomalen´ım,kter´ysi s sebou nese kaˇzd´yinterpret. I pˇresto interprety vznikaj´ı,jejich vyuˇzit´ıale nen´ıurˇcenopro fin´aln´ıprodukt. Slouˇz´ık jednoduˇsˇs´ımu testov´an´ı,je moˇzn´esledovat v´ysledn´yk´odv re´aln´em ˇcasev pˇr´ıpadˇetranspilace a d´ıkytomu snadnˇeji objevovat chyby [10], [11].

2.3 JIT kompil´ator

Aktu´alnˇenej´uspˇeˇsnˇejˇs´ımzp˚usobem je pouˇzit´ımJIT kompil´atoru.Jde o zkratku pro just-in-time“, term´ındo ˇceˇstiny nepˇrekl´adan´y.Pro program to znamen´a ” odkl´ad´an´ıkompilace, k prvn´ımu pˇrekladufunkce do strojov´ehok´odudojde aˇz kdyˇzje poprv´evol´ana.Pˇridalˇs´ımvol´an´ıt´etofunkce se jiˇzbude pouˇz´ıvat va- rianta pˇreloˇzen´a,ˇcasstr´aven´yvol´an´ımfunkce tak bude mnohon´asobnˇemenˇs´ı [12]. Pokud se funkce vol´aˇcasto,bude doch´azetk dalˇs´ım´uprav´amk´odu.Opti- malizace se odkl´ad´a,protoˇzekdyby se kaˇzd´afunkce volala jen jednou, m´ıstoke zrychlen´ıby doˇslo ke zpomalen´ı.C´ılemje zachovat vlastnosti podobn´ebˇeˇzn´ym kompil´ator˚um,uˇzivatel nesm´ına ˇcasepoznat, ˇzese prov´ad´ıoptimalizace. Dojde k optimalizac´ımpodobn´ymtˇem,co lze prov´adˇetbˇehemtranspilace zm´ınˇen´ev sekci 2.1. Protoˇzec´ılem je strojov´yk´od,mohou se ve funkc´ıch prov´adˇetdalˇs´ı´upravy, naruˇsuj´ıc´ıp˚uvodn´ıv´yznam.Mezi nˇepatˇr´ıodstranˇen´ı zapouzdˇrov´an´ı,bˇeˇzn´epro objektovˇeorientovan´eprogramov´an´ı,nebo sn´ıˇzen´ı pˇr´ıstup˚udo tabulky virtu´aln´ımetod. Oproti statick´emu kompil´atorum´atento velkou v´yhodu v podobˇevˇetˇs´ıhomnoˇzstv´ıinformac´ıo prostˇred´ıve kter´em se program vykon´av´a.D´ıkytomu se m˚uˇzel´epe pˇrizp˚usobita optimalizovat kvalitnˇejidan´ydruh probl´emu. Optimalizace se prov´ad´ıv nˇekolika f´az´ıch. Jsou k tomu dva d˚uvody. Prvn´ımz nich je snaha pˇr´ıliˇsnezpomalit prvn´ıkompilaci. Druh´ymje ten fakt, ˇzeoptimalizace nemus´ıb´ytvˇzdy´uspˇeˇsn´aa m˚uˇzedoj´ıtke zhorˇsen´ıvlastnost´ı.Kompil´atorm´aproto schopnost prov´esti inverzn´ıpostup k optimalizaci [13].

6 Kapitola 3

Projekty zab´yvaj´ıc´ıse ´upravou PHP

Upravou´ PHP se zab´yvalo velk´emnoˇzstv´ıprojekt˚u.Vˇetˇsinaz nich nˇejak´ym zp˚usobem ˇreˇsilprobl´emdynamick´eho typov´an´ı.Sekce budou obsahovat po- uˇzitoutechnologii, popis, jak´eprobl´emy se pˇripˇrevodu ˇreˇsily, a jak. V kapitole jsou dvˇesekce, kter´ese probl´ememdynamick´ehotypov´an´ı pˇr´ımo nezab´yvaj´ı. Jde o novˇejˇs´ı verzi interpretu PHP a jeden nov´yjazyk, kter´ym´askriptovac´ıjazyk za inspiraci. Protoˇze vˇsechny transpil´atoryˇreˇs´ı stejn´e probl´emy, zp˚usoby, jak´ymje vyˇreˇsily, slouˇz´ıjako inspirace pro vlastn´ıˇreˇsen´ı.

3.1 Phalanger

Tento projekt si jako c´ılovou technologii vybral prostˇred´ı.NET. Skripty se pˇrekl´adaj´ıdo CLI, coˇzje form´at,kter´yse na t´etoplatformˇepouˇz´ıv´a.Efektivity se dosahuje zmˇenoutechnologie, ta um´ıprov´adˇetdalˇs´ıoptimalizace. Text, co nen´ıve funkci, nebo je mimo znaˇcky znaˇc´ıc´ıoblast PHP skriptu, se pˇreloˇz´ıjako statick´ametoda. Rozhran´ıa tˇr´ıdynapsan´ev PHP se definuj´ı jako nov´etypy v CLI. Funkce a pˇr´ıkazyse pˇreloˇz´ıjako jeden velk´ystatick´ytyp CLI. Tento typ obsahuje vˇsechny statick´emetody, vˇcetnˇetextu mimo skript. Mimo tuto strukturu se nav´ıcdefinuje kontext ve kter´emse skript pr´avˇe ted’ nach´az´ı,obsahuje informace o stavu, ve kter´emse nach´azej´ır˚uzn´epro- mˇenn´e,dynamick´akonfigurace a dalˇs´ı. Kaˇzd´afunkce m´ak tˇemto ´udaj˚um pˇr´ıstup. Stejnˇejako PHP umoˇzˇnuj´ıdynamick´edeklarace funkc´ıa tˇr´ıd.Kaˇzd´ade- klarace m´asvoji verzi. S touto strukturou je moˇzn´eprov´adˇetredeklarace, ˇc´ımˇz by se pak liˇsiliod p˚uvodn´ıhojazyka, tak se toto chov´an´ızak´azalo,m˚uˇzese prov´estjen jedna takov´adeklarace a ta bude aktivn´ıpo celou dobu trv´an´ıpro- gramu. C´ılov´yjazyk dynamicky deklarovat neum´ı,proto se generuj´ıvˇsechny

7 3. Projekty zabyvaj´ ´ıc´ı se upravou´ PHP verze, pro pˇr´ıstupk poˇzadovan´everzi se pouˇz´ıv´ahaˇsovac´ıtabulka. Tabulka nen´ıpokaˇzd´epotˇreba,ta m´aopodstatnˇen´ıjen u dynamick´ych deklarac´ı. Proto kdyˇzexistuje jen jedna verze funkce, jde pro vol´an´ıfunkc´ıa vytv´aˇren´ıobjekt˚u pouˇz´ıvat pr´avˇejedna existuj´ıc´ıdefinice. Tento krok se provede bˇehemkompi- lace [14, s. 33]. Pˇr´ıkaz include se pˇreloˇz´ıjako funkce eval. To m´anev´yhodu v podobˇe ˇcasov´en´aroˇcnostia slab´ekontroly nad skriptem, m˚uˇzepˇrin´estbezpeˇcnostn´ı riziko. Pokud vol´an´ıpˇr´ıkazujde pˇrev´estdo statick´epodoby a k´odza t´ımto pˇr´ıkazemjde rovnˇeˇzstaticky zpracovat, od funkce eval se ustoup´ıa k´odse na dan´em´ıstovloˇz´ıstejn´ymzp˚usobem, jak´ymto dˇel´aPHP. Lok´aln´ıpromˇenn´ese ukl´adaj´ına z´asobn´ık,toto pravidlo ale vˇzdyneplat´ı. I k lok´aln´ıpromˇenn´ymse nˇekdybude pˇristupovat pomoc´ıtabulky. To nast´av´a napˇr´ıkladu vykon´av´an´ıfunkce eval a pˇr´ıkazu include. Glob´aln´ıpromˇenn´ese d´avaj´ıdo haˇsovac´ıtabulky, mohou se totiˇzkdykoli zmˇenita bˇehemkompilace jeˇstˇenemus´ıani existovat. Nepˇr´ım´evol´an´ıv PHP reprezentovan´e promˇennou ” promˇenn´ych“ se ˇreˇs´ı pˇrep´ınaˇcemhledaj´ıc´ım shodu. Pokud se zde nenajde, hled´ase v haˇstabulce. Nepˇr´ım´evol´an´ıtak nemus´ızp˚usobovat probl´emy. Tento zp˚usobhled´an´ıse mus´ıprov´adˇetu kaˇzd´emetody, je to zp˚usoben´emagick´ymi funkcemi __get a __set. To nedeklarovan´ympoloˇzk´amd´av´anov´yv´yznam. Anal´yzatyp˚use neprov´ad´ı, typ se tu reprezentuje jen dvˇemazp˚usoby. Jde o obecn´yobjekt a referenci, kter´ase pouˇz´ıv´anapˇr´ıklad u glob´aln´ıch promˇenn´ych. Jde o obaluj´ıc´ıtyp, obsahuje objekt obsahuj´ıc´ıhodnotu promˇenn´e [14, s. 34]. Pro kaˇzdoumetodu vznikaj´ıdvˇepˇret´ıˇzen´evarianty, liˇs´ıc´ıse sv´ympouˇzit´ım. Jedna slouˇz´ıpro pˇr´ıpadkdy je vˇsezn´am´ebˇehemkompilace, druh´a,se stejn´ym pˇredpisem, s argumenty pˇr´ımo nepracuje – volaj´ıc´ı argumenty um´ıst´ı na z´asobn´ıka funkce si je zpracuje, zkontroluje [14, s. 32 – 34]. Starˇs´ı verze PHP podporovaly neobvykl´edeklarace metod, mohly b´yt napˇr´ıkladabstraktn´ıa statick´ez´aroveˇn,priv´atn´ıa abstraktn´ı.Tyto definice v p´at´everzi zaˇcalymizet [15], pˇrekladaˇcsi s nimi ale um´ıporadit pomoc´ı dodateˇcn´ych atribut˚uv CLI. Zkompilovan´etˇr´ıdyjde pouˇz´ıtv jin´ych technologi´ıch pouˇz´ıvaj´ıc´ıstejnou platformu, staˇc´ısplnit dan´erozhran´ı.Jde pouˇz´ıti pˇrevr´acen´ypostup, jeˇstˇe v nezkompilovan´emPHP jde pouˇz´ıtknihovny z .NET [14, s. 35 – 36]. Toto ˇreˇsen´ıdos´ahlov testovac´ıch pˇr´ıpadech v´ıceneˇzdvojn´asobn´ehozrych- len´ıoproti referenˇcn´ımverz´ımPHP [14, s. 37].

3.1.1 PeachPie

Phalanger jiˇznen´ıd´ale vyv´ıjen,jeho pokraˇcovatelem je PeachPie. M´apodobn´e c´ılejako pˇredch˚udce,tedy zakomponov´an´ıC# modul˚udo PHP. Stejnˇejako pˇredt´ım se k´odpˇrekl´ad´ado vnitˇrn´ı struktury pro .NET, jde ale tak´ecel´y projekt zpracovat do jazyka C# nebo Visual Basic.

8 3.2. P9

Pro kompilov´an´ıpouˇz´ıvaj´ıprojekt [16]. Ten si dal za c´ılzjednoduˇsit generov´an´ık´odu,transformace, tvorbu dom´enovˇespecifick´ych jazyk˚u.Nab´ız´ı tak´eprostˇredkypro syntaktickou a s´emantickou anal´yzu[17].

3.2 P9

Jde o pr´aci,kter´apro svoji implementaci pouˇz´ıv´ajiˇzexistuj´ıc´ıframework – kompil´atorod IBM. Pro ten se daj´ınapsat gener´atoryk´odua optimaliz´ator. V´ysledn´yk´odje urˇcen pro Java Virtual Machine. Kompil´atoru pˇred´avaj´ı vlastn´ıstrukturu k´odu, prov´adˇej´ıs n´ıdalˇs´ıoptimalizace, ale optimalizace spe- cifick´epro Java se nepouˇz´ıvaj´ı.Zrychlen´ıse dosahuje za pouˇzit´ıJIT kompilace [18, s. 121 – 123]. Datov´ymtyp˚umse dala struktura, nyn´ı se rozliˇsuj´ı tˇriz´akladn´ı druhy. Prvn´ımz nich jsou primitivn´ıdatov´etypy, dalˇs´ıjsou objekty a dalˇs´ısamo- statnou skupinu tvoˇr´ıdalˇs´ıtˇeˇzko identifikovateln´estruktury, mezi kter´epatˇr´ı objekty zab´yvaj´ıc´ı se datab´azov´ympˇripojen´ım, prac´ı se souborem a dalˇs´ı. S t´ımto rozdˇelen´ımjsou v´ıcekonkr´etn´ıneˇzPHP a d´ıkytomu ˇsetˇr´ıpamˇet´ı, alokace jsou v´ıcekonkr´etn´ı. Co jednotliv´ez´akladn´ıoperace vykon´avaj´ıje d´anoprav´yma lev´ymope- randem. Toto komplikovan´epˇretˇeˇzov´an´ıoper´ator˚ubr´an´ıvytvoˇren´ıjedn´ein- strukce pro kompil´ator,proto se vˇsechny takov´eoperace pˇrevedly na pomocn´e funkce. Pˇr´ıkaz include v PHP vkl´ad´ak´odna dan´em´ıstoa um´ıpracovat s pro- mˇenn´ymi,kter´ese pˇredt´ımto pˇr´ıkazem objevily. Zde to pˇrevedli do podoby vol´an´ıfunkce pˇrizachov´an´ıp˚uvodn´ıhochov´an´ı,k tˇemto promˇenn´ymm´ak´od pˇr´ıstupa vˇsemaj´ıpod kontrolou [18, s. 124]. V pˇrekl´adan´emjazyce je moˇzn´ese k promˇenn´edostat nˇekolika zp˚usoby, interpret pro vˇsechny pouˇz´ıv´astejn´yzp˚usob, a t´ım je asociativn´ı pole. To s sebou nese probl´emy v podobˇeˇcasov´en´aroˇcnosti,zde se toto zpomalen´ıˇreˇs´ı komplikovanˇejˇs´ıstrukturou. Lok´aln´ıpromˇenn´ena z´asobn´ıkuse indexuj´ı.Je snahou jednotliv´epˇr´ıstupy d´alev k´odunaj´ıthned v tomto indexu. Pokud se neuspˇeje,pouˇz´ıv´ase stejn´atechnika jakou m´ainterpret, tedy asociativn´ıpole [18, s. 124]. Pro P9 jde napsat rozˇsiˇruj´ıc´ıknihovny, bylo vytvoˇrenorozhran´ı,pˇreskter´e knihovny mohou komunikovat [18, s. 125]. Zrychlen´ıoproti interpretu PHP se liˇs´ıpodle pouˇzit´ı,na mal´ych testovac´ıch skriptech jde aˇzo desetin´asobn´ezlepˇsen´ı,u webov´ych aplikac´ıjde o hodnotu mezi dvaceti aˇztˇricetiprocenty [18, s. 125 – 128].

3.3 Project Zero

Projekt vznikl pod z´aˇstitouspoleˇcnostiIBM. Zab´yval se spojen´ımjazyku PHP s jazykem Java. M´avlastnosti interpretu a JIT kompil´atoru:Project Zero je

9 3. Projekty zabyvaj´ ´ıc´ı se upravou´ PHP pro PHP interpretem, jednotliv´eelementy tohoto skriptovac´ıjazyka vid´ıjako tˇr´ıdy v Java. Ty si pak pˇrevede do sv´evnitˇrn´ı reprezentace a nakonec se zkompiluje do form´atupro virtu´aln´ıstroj Java bˇeˇzn´y– bytek´od. V nˇekter´ych oblastech se od PHP liˇs´ı. Napˇr´ıklad zde neexistuj´ı super- glob´aln´ıpromˇenn´e– pro z´ısk´an´ıhodnot se bude pouˇz´ıvat funkce get(), kter´a je souˇc´ast´ıprostˇred´ıZero. Rozˇs´ıˇren´ıpro PHP jsem pˇreps´anado jazyku Java a stejnˇejako standadn´ı interpret pro PHP i tento umoˇzˇnujepˇridatrozˇs´ıˇren´ı.Mohou b´ytnaps´any v C nebo v Java [19], [20]. Jak´ehozrychlen´ı dos´ahlv porovn´an´ı s p˚uvodn´ımˇreˇsen´ım nen´ı zn´amo, hlavn´ımc´ılem bylo umoˇznitpouˇz´ıvat prostˇredkyz obou jazyk˚uz´aroveˇn.

3.4 Quercus

Quercus stejnˇejako Zero pˇrich´az´ıs interpretem PHP a velk´ymmnoˇzstv´ım rozˇs´ıˇren´ı.Obˇetechnologie jde volnˇekombinovat, PHP skript ale automaticky zaˇcnepouˇz´ıvat lepˇs´ıˇreˇsen´ı poch´azej´ıc´ı z Java, napˇr´ıklad efektivnˇejˇs´ı pr´ace s datab´azov´ymipˇripojen´ımi. Quercus pro nˇekter´eaplikace dos´ahlzrychlen´ı,uv´ad´ıse, ˇzeaˇzˇctyˇrn´asobn´e [21].

3.5 HipHop Compiler for PHP

Tento projekt od spoleˇcnostiFacebook se zab´yv´atranspilac´ıPHP do kom- pilovan´eho,staticky typovan´ehojazyka, v tomto pˇr´ıpadˇeC++. Zrychlen´ıje z´ısk´anoomezen´ımdynamick´ych kontrol typ˚ua d´ıkyoptimalizac´ım,kter´eum´ı kompil´atorprov´adˇet[11, s. 576]. Pˇrev´adˇej´ıvˇetˇsinu konstrukc´ıPHP, nepodporuj´ıse funkce eval, protoˇze pˇrin´aˇs´ıbezpeˇcnostn´ıriziko, a neprov´ad´ıse implicitn´ıpˇrevod mezi ˇc´ıseln´ymi datov´ymitypy, pokud m´adoj´ıt k pˇreteˇcen´ı[11, s. 577 – 578]. C´ılemje pˇrev´estpokud moˇznoco nejvˇetˇs´ımnoˇzstv´ık´odudo statick´epo- doby, kde se nebudou muset ˇreˇsitprobl´emy dynamick´ehotypov´an´ı.Dosahuje toho t´ım,ˇzeagresivn´ımzp˚usobem se snaˇz´ıtypy odvodit. U primitivn´ıch da- tov´ych typ˚uje tento proces velmi ´uspˇeˇsn´y.D´ıkytomu bude velk´emnoˇzstv´ı funkc´ımoˇzn´evolat bez kontrol na datov´ytyp [11, s. 578 – 579]. Vˇse,co nelze jasn´ymzp˚usobem pˇrev´est, bude uloˇzenodo nˇejak´etabulky. Pro funkci pˇrij´ımaj´ıc´ı vˇetˇs´ı mnoˇzstv´ı datov´ych typ˚use vygeneruj´ı vˇsechny moˇzn´ekombinace a dostane unik´atn´ıjm´eno. Tabulka zaˇr´ıd´ı,aby se pouˇzilata spr´avn´a.Konstanty definovan´eza bˇehu programu a glob´aln´ıpromˇenn´erovnˇeˇz nejde udˇelatstaticky, budou uloˇzeny v tabulce glob´aln´ıch symbol˚u.Ta obsa- huje nav´ıcstatick´epromˇenn´eve tˇr´ıd´ach a informaci o jejich dostupnosti – zda byl do skriptu vloˇzensoubor pomoc´ıpˇr´ıkazu include. Lok´aln´ıpromˇenn´e nemoˇzn´eodvodit staticky rovnˇeˇzskonˇc´ıv tabulce. Ta m´aale menˇs´ırozsah,

10 3.6. HipHop Virtual Machine n´aleˇz´ı pouze dan´efunkci. Pˇr´ıstup k dynamick´epromˇenn´eznamen´ahledat v tabulk´ach lok´aln´ıch a glob´aln´ıch symbol˚u.Nejednoznaˇcn´etypy tu je dalˇs´ı tabulka, ta namapuje n´azvypoloˇzekk hodnot´am[11, s. 581]. Pokud nˇeconejde zavolat staticky – vytv´aˇretobjekty, vkl´adatskripty s nedefinovan´ymn´azvem – jsou na m´ıstˇejeˇstˇevyvol´avac´ıtabulky. Chov´an´ı je podobn´einterpretu PHP, vˇsese ale tvoˇr´ıbˇehemkompilace, d´ıkyprocesu statick´eanal´yzy. Aby se zachovalo p˚uvodn´ıchov´an´ı,simuluje se dynamick´enaˇc´ıt´an´ısou- bor˚u.T´ımto zp˚usobem funkce class_exists a podobn´emaj´ıv c´ılov´emjazyce st´alev´yznam.Zkompilovan´yprogram o vˇsech tˇr´ıd´ach jiˇzv´ı,ale protoˇze jeˇstˇe neprobˇehl include, pˇredst´ır´a,ˇzetˇr´ıdaneexistuje. Kompil´atorse skl´ad´az ˇsestiˇc´ast´ı.Prvn´ıvytvoˇr´ıabstraktn´ısyntaktick´y strom pro zdrojov´esoubory. V dalˇs´ım kroku se strom projde, zjist´ı se, co vˇseje definov´anoa kolikr´at.Pro unik´atn´ıkonstrukce bude moˇzn´epozdˇejivy- tvoˇritl´epe optimalizovan´yk´od.Vytvoˇr´ıse graf z´avislost´ı.S touto informac´ı bude moˇzn´eparalelizovat. Tˇret´ımbodem je proveden´ıprvn´ıch jednoduch´yop- timalizac´ı.Ignoruj´ıse datov´etypy, odstraˇnuj´ıse zbyteˇcn´avol´an´ıfunkc´ıv PHP pouˇz´ıvan´ekv˚ulirozd´ıln´ymverz´ıminterpreta, miz´ınepouˇzit´efunkce. Zp˚usoby, jak´ymilze ˇretˇezcespojovat se pˇrev´ad´ına jeden unifikovan´y.Dalˇs´ımkrokem je odvozen´ıdatov´ych typ˚u. C´ımv´ıcekonkr´etn´ı,t´ımlepˇs´ı,budeˇ se prov´adˇet bˇehembˇehu programu menˇs´ımnoˇzstv´ıkontrol. Pak pˇrich´az´ıdalˇs´ıoptimali- zace, kter´ese nedaly bez typ˚uprov´est.Posledn´ımbodem je k´odvygenerovat. Kaˇzd´atˇr´ıdabude ve vlastn´ımsouboru. Kaˇzd´ysoubor bude obsahovat funkci podobn´e main, kter´ase zavol´abˇehemvkl´ad´an´ısouboru [11, s. 579 – 581]. Oproti p˚uvodn´ımu ˇreˇsen´ıje zde v´ıceneˇzpˇetin´asobn´ezrychlen´ı,u nˇekter´ych ´ulohje zrychlen´ıv´ıceneˇzdvou set n´asobn´e[11, s. 582 – 584]. O tomto projektu se na sv´emblogu zm´ınili autor PHP. Uv´ad´ı,ˇzezrychlen´ı neˇreˇs´ıvˇsechny probl´emy spojen´es generov´an´ımstr´anek.V´ypoˇcetn´ıv´ykon nen´ı to, co webov´estr´ankyzdrˇzuje, jde sp´ıˇso mnoˇzstv´ıdotaz˚una server, zpoˇzdˇen´ı kv˚ulidatab´azov´emu pˇripojen´ıa dalˇs´ıprobl´emy, kter´etranspilace nevyˇreˇs´ı[22]. Pro projekt se pouˇz´ıv´azkratka HPHPc“ – HipHop compiler. Aby se ” bˇehemtestov´an´ıneztratila v´yhoda interpretovan´ehojazyka, vznikl pro tento projekt i interpret, HPHPi“. Je ˇsestkr´atpomalejˇs´ıneˇzkompil´ator,v nˇekter´ych ” pˇr´ıpadech je proto horˇs´ı neˇzp˚uvodn´ı interpret. Jeho pouˇzitelnostje proto velmi n´ızk´a,nav´ıcse chov´ajinak neˇzkompilovan´averze [23, s. 778].

3.6 HipHop Virtual Machine

Jde o dalˇs´ız projekt˚uspoleˇcnostiFacebook zab´yvaj´ıc´ıse probl´ememrychlosti PHP. I pˇresto, ˇzev´ysledkyHPHPc byly velice dobr´e,st´aletu byly limitace spojen´es vˇetˇs´ımmnoˇzstv´ımkomplikovan´ych operac´ıv pˇr´ıpadech, kdy datov´y typ nebylo moˇzn´eodvodit. Nezn´am´etypy zp˚usobuj´ı, ˇzekompilace nebude

11 3. Projekty zabyvaj´ ´ıc´ı se upravou´ PHP

schopn´anikdy typ odvodit a pr˚uchody programem nejsou jednoznaˇcn´e,coˇz br´an´ıdalˇs´ımoptimalizac´ım[23, s. 778]. Jde o virtu´aln´ıstroj chovaj´ıc´ıse jako z´asobn´ıkov´ypoˇc´ıtaˇc,kter´ym´avlastn´ı mnoˇzinu pˇr´ıkaz˚u– instrukˇcn´ısadu. Pˇripom´ın´aproto CLI. Pro tuto vnitˇrn´ı strukturu se pouˇz´ıv´aoznaˇcen´ı HHBC“, HipHop ByteCode. HHVM pracuje ” s vˇetˇs´ıznalost´ıprogramu. Frontend virtu´aln´ıhostroje pˇrevede PHP do HHBC a vˇsed´aleˇreˇs´ıJIT kompil´ator. Zn´aaktu´aln´ıhodnoty, proto dok´aˇzevytv´aˇret k´odjasnˇedefinovan´y,datov´ytyp je vˇzdyzn´ama d´ıky tomu lze k´odd´ale zrychlit [23, s. 778 – 779]. Bytek´odobsahuje kromˇesady pˇr´ıkazu jeˇstˇemetadata, kter´epom´ahaj´ı zak´odovat funkce a tˇr´ıdy. Obsahuj´ıˇc´ıslaˇr´adku,tabulky k´oduj´ıc´ıidentifik´atory, mapov´an´ına zdrojov´esoubory a dalˇs´ıd˚uleˇzit´einformace pro to, aby mohl stroj fungovat. Vˇetˇsinouje k´odbez typ˚u,odkazuje se na vˇetˇsinu konstrukc´ın´azvy. Reference z PHP se snaˇz´ıeliminovat. Absence datov´ych typ˚uzp˚usobuje,ˇze vol´an´ıfunkce je tˇeˇzk´e,mus´ıse pˇredn´ımprov´estdva kroky. Identifikuje se volaj´ıc´ı,zjist´ıse, zda funkce existuje, a jak vypadaj´ıjej´ıargumenty, co s nimi bude dˇelat. Druh´ymkrokem je rozpoznat, co se bude pˇred´avat referenc´ı,a co hodnotou [23, s. 779 – 780]. Odvozov´an´ıtyp˚uprob´ıh´aza bˇehu a pˇredpokl´ad´ase jejich sv´azanost s ar- gumenty funkce, nebo ˇzese nemˇen´ıv pr˚ubˇehu vykon´av´an´ıtak ˇcasto.K´odse nedˇel´ına statick´ea dynamick´efunkce, tady je dˇelbaa n´asledn´aoptimalizace v´ıckonkr´etn´ı.Doch´az´ık rozkl´ad´an´ına ´useky, kter´ejsou nˇejak´ymzp˚usobem v´yznamn´esv´ymdynamick´ymchov´an´ım.Pro tyto ´usekyse pouˇz´ıv´aoznaˇcen´ı tracelet“. Tracelet je identifikov´anpˇrij´ıman´ymdatov´ymtypem. Pokud typ ” na vstupu je stejn´yjak´y´usekoˇcek´av´a,stroj m˚uˇzeoptimalizovat, nebo nemus´ı nic dˇelat.K rekompilaci dojde pouze tehdy, kdyˇzse typy liˇs´ı.Tyto bloky jde ˇretˇezit,vˇsechny za sebou v ˇradˇebudou stoprocentnˇespecializovan´epro dan´y datov´ytyp. Useky´ jsou mal´e,proto pˇri nutnosti pˇrekompilov´an´ınen´ast´av´a velk´ezdrˇzen´ı.A pokud jiˇzk tomuto kroku dojde, p˚uvodn´ıverze se nezniˇc´ı, takˇzen´avratk pˇredchoz´ımu typu bude rychlejˇs´ı.Mal´e´usekys sebou nesou i jednu nev´yhodu v podobˇemenˇs´ıho mnoˇzstv´ı optimalizac´ı. Je moˇzn´e,ˇze s vˇetˇs´ım mnoˇzstv´ıkontextu by byl k´odv´ykonnˇejˇs´ıneˇzted’, sloˇzen´yz nˇekolika mal´ych blok˚u.Pokud se budou typy mˇenitˇcasto,ˇcasbude podobn´yjako v in- terpretu PHP [23, s. 780 – 782]. HHBC je st´alevysoko´urovˇnov´areprezentace zdrojov´ehok´odu.Neobsaho- val informace o typu, vol´an´ıfunkce je n´aroˇcn´e.Tracelet se proto d´alepˇrev´ad´ı do jeˇstˇeniˇzˇs´ıpodoby, naz´yvan´ejako HHIR“. Jde o typovan´yform´at,kter´y ” um´ıvˇsechny bˇeˇzn´eoptimalizace a nav´ıcovl´ad´aty, kter´ejsou specifick´epro PHP. Je pˇrenosn´y,nez´avisl´yna c´ılov´eplatformˇe.L´epe pracuje s pamˇet´ıneˇz PHP interpret, tvorba tˇr´ıdje ´uspornˇejˇs´ı,a vl´akna um´ımezi sebou dobˇrespo- lupracovat sd´ılen´ımmezipamˇeti[23, s. 782 – 783]. Pro tento projekt nen´ıtˇrebavytv´aˇretinterpret jako tomu bylo u HipHop kompil´atoru.Rozd´ıln´echov´an´ımezi testovac´ıma produkˇcn´ımk´odemtu je, jde ale jen o mnoˇzstv´ıoptimalizac´ı[23, s. 778].

12 3.7. Hack

Zrychlen´ı oproti HPHPc je u nˇekter´ych aplikac´ı v´ıce neˇzdvojn´asobn´e, u komplikovan´ych projekt˚ujde o pades´atiprocentn´ızrychlen´ıoproti bˇeˇzn´emu PHP interpretu [23, s. 785 – 786].

3.7 Hack

Jde o jin´ydruh projektu neˇzty zmiˇnovan´ev´yˇse,kter´ese zab´yvaly prim´arnˇe rychlost´ıvykon´av´an´ı,pˇr´ıpadnˇerozˇs´ıˇren´ımoˇznost´ıjazyka. Hack je jazykem, kter´yzaˇcaljako v´ıcestriktn´ıdialekt PHP. Pˇrechod mezi nimi mˇelb´ytvelmi snadn´ya spousta zdrojov´ych k´od˚uuˇzmˇelab´ytvalidn´ı k´odemnapsan´ymv Hack. Takovou myˇslenkujde napˇr´ıkladpozorovat u Ty- peScript [24]. Pˇrestalpodporovat konstrukce neshoduj´ıc´ıse s myˇslenkou statick´ehoty- pov´an´ı, jiˇznen´ı moˇzn´epouˇz´ıvat konstrukci promˇenn´apromˇenn´ych“. Vˇse ” m˚uˇzeb´ytstaticky typovan´ea mnoˇzinamoˇzn´ych datov´ych typ˚uje velmi velk´a. Typy mohou b´ytgenerick´e,rozsah hodnot rozˇs´ıˇreno hodnotu null. Do jazyku se pˇridalykolekce s rozhran´ımbˇeˇzn´epro jin´ejazyky, typ˚umjde d´atalias. Tvorba anonymn´ıch funkc´ıje jednoduˇsˇs´ı[25]. Zmenˇsilose mnoˇzstv´ıkl´ıˇcov´ych slov. Nˇekter´enemaj´ıalternativu, napˇr´ıklad slovn´ılogick´eoper´atoryse liˇs´ıod standardn´ıch svoj´ıniˇzˇs´ıprioritou. Pˇr´ıkaz ukonˇcuj´ıc´ıcyklus uˇznen´ımoˇzn´epouˇz´ıvat s ˇc´ıslic´ı,nen´ıproto moˇzn´ejedno- duch´ymzp˚usobem ukonˇcitz vnitˇrn´ıhocyklu i vnˇejˇs´ı.Cykly a podm´ınkynen´ı moˇzn´eukonˇcitpomoc´ıkl´ıˇcov´ehoslova sloˇzen´ehoz end“ a n´azvuˇr´ıd´ıc´ıkon- ” strukce. Byly omezeny zp˚usoby, jak´ymilze tˇr´ıdaa funkce definovat. Nelze ji prov´adˇet dynamicky a pˇrestalyse pouˇz´ıvat magick´emetody. Neexistuj´ıtu ˇz´adn´eglob´aln´ıani superglob´aln´ıpromˇenn´e. K´odnem˚uˇzeexis- tovat bez funkce, v k´oduje jasn´ymzp˚usobem definov´anstart, funkce, kter´y cel´yk´odspust´ı,alternativa k funkci main v jin´ych jazyc´ıch [26]. Dalˇs´ımidrobnostmi je respektov´an´ıvelikosti p´ısmenu funkc´ı,inkremen- tuj´ıc´ıa dekrementuj´ıc´ıpˇr´ıkazynovˇenevrac´ıhodnotu, nedaj´ıse proto pouˇz´ıt bˇehemindexaci, pˇriˇrazov´an´ıa dalˇs´ıch operac´ı.To zp˚usobilo,ˇzeoba druhy in- krementace splynuly dohromady, v jazyce ale nad´alez˚ust´avaj´ıobˇevarianty [27].

3.8 PHP 7.1.

Vˇsechny projekty zmiˇnovan´ev´yˇsepracovaly s PHP verze 5. V t´edobˇeinterpret nebyl na takov´e´urovni, jako je dnes, s verz´ı7. Ta je o dva roky mladˇs´ıneˇz posledn´ıprojekt zab´yvaj´ıc´ıse zrychlov´an´ımk´oduv podobˇeHHVM v sekci 3.6. Poˇcetpoˇzadavk˚u,kter´einterpret zpracuje za sekundu, se zdvojn´asobil, zpoˇzdˇen´ımezi ˇz´adost´ıa odpovˇed´ıje dvakr´atmenˇs´ı.N´arokyna pamˇetjsou ˇsestkr´atmenˇs´ı[5].

13 3. Projekty zabyvaj´ ´ıc´ı se upravou´ PHP

Obr´azek3.1: Zlepˇsen´ıpoˇct˚upoˇzadavk˚uza sekundu a ˇcasodezvy napˇr´ıˇcver- zemi PHP [5]

Z tohoto d˚uvodu je proto ot´azkazda pouˇz´ıvat HHVM nebo standardn´ı PHP obt´ıˇznˇejˇs´ıot´azkou na zodpovˇezen´ı.Jiˇzexistuj´ıaplikace, ve kter´ych je virtu´aln´ıstroj od spoleˇcnostiFacebook pˇrekon´an.HHVM je ale st´aleefek- tivnˇejˇs´ına zdroje, dok´aˇzeprov´estv´ıcetransakc´ıza jednotku ˇcasu[28]. Probl´em pˇr´ıch´az´ıs ukonˇcen´ımpodpory pro PHP, nyn´ıbude moˇzn´epouˇz´ıvat jen Hack, ned´ase jiˇzproto d´aletvrdit, ˇzesi pˇr´ımokonkuruj´ı[29]. Nov´averze rovnˇeˇzpˇrid´av´amoˇznostdefinovat n´avratov´etypy funkc´ı.Moˇz- nosti tu nejsou tak rozs´ahl´ejako v jazyce Hack, ve kter´emje napˇr´ıkladmoˇzn´e jasn´ymzp˚usobem popsat vracenou anonymn´ıfunkci. Tato nov´avlastnost bude vyuˇz´ıv´anabˇehemtranspilace u vlastn´ıhoˇreˇsen´ı. Jeden z pl´an˚ujak d´alezrychlit PHP je zaˇc´ıt s pouˇz´ıv´an´ımJIT kompil´atoru. Tento poˇzadavek proˇselhodnocen´ıma objev´ıse ve verzi PHP ˇc´ısloosm. Casyˇ zrychlen´ı se velmi liˇs´ı, u re´aln´ych aplikac´ı jde o hodnoty pod pˇetprocent, skript pouˇz´ıv´an´ypro mˇeˇren´ıv´ykonu m´advojn´asobn´ezrychlen´ı[30].

14 3.8. PHP 7.1.

Obr´azek3.2: Porovn´an´ıPHP 7.0 a HHVM 3.10.1 [28]

15

Kapitola 4

Konstrukce kompil´atoru

Kompil´atorje sloˇzit´ymprogramem, prov´adˇej´ıhned nˇekolik krok˚u.Jeho c´ılem je pˇreˇc´ıstzdrojov´yprogram a pˇrev´estjej do jin´eho,ekvivalentn´ıho.Pom´ah´a tak vyˇreˇsitprobl´emkter´ypˇrineslyvyˇsˇs´ı programovac´ı jazyky. Ty pˇrich´az´ı s vlastn´ımi operacemi aby udˇelalyprogramov´an´ı jednoduˇsˇs´ı a odolnˇejˇs´ı na chyby. Poˇc´ıtaˇcest´alepracuj´ıs bin´arn´ıinformac´ıreprezentuj´ıc´ıstrojov´yk´od a modern´ıjazyky tak nemaj´ıpˇr´ımoureprezentaci pro c´ılov´ypoˇc´ıtaˇc.Kom- pil´atortuto mezeru mezi c´ılov´ymjazykem a strojov´ymjazykem pom´ah´apˇre- klenout, zdroji nav´ıcpˇrid´av´apˇrenositelnost – c´ılemmohou b´ytr˚uzn´earchi- tektury. Kompil´atorpˇrich´az´ıs celou ˇradouoptimalizac´ı.Jsou dvoj´ıhodruhu, prvn´ıskupina upravuje k´odbez znalosti c´ılov´earchitektury, kroky jsou po- dobn´etˇempˇri optimalizaci transpilace v 2.1, tedy redukce zbyteˇcn´ych pˇriˇrazen´ı a dalˇs´ı.Druh´askupina je komplikovanˇejˇs´ı,z´avisl´ena architektuˇre. To pˇrin´aˇs´ı velk´emnoˇzstv´ımoˇznost´ıjak optimalizovat, poˇc´ıtaˇceumoˇzˇnuj´ıprov´adˇetpara- leln´ıv´ypoˇcty a struktura pamˇetina sloˇzitˇejˇs´ıhielarchii [31]. Tato pr´aceoptimalizace neprov´ad´ı,c´ılemje co nejvˇernˇejˇs´ımzp˚usobem za- chytit zdrojov´yk´od.Pr´acez´aroveˇnneimplementuje vˇetˇsinu ze zm´ınˇen´ych kon- strukc´ı,pro anal´yzuzdrojov´ehoskriptu se pouˇz´ıv´aknihovna.

Obr´azek4.1: Struktura kompil´atoru[31]

17 4. Konstrukce kompilatoru´

Dalˇs´ıkapitoly se budou zab´yvat jednotliv´ymiˇc´astmikompil´atorupro re- alizaci zaj´ımav´e,tˇemijsou lexik´aln´ı,syntaktick´aa s´emantick´aanal´yzaspolu s generov´an´ımk´odu.Anal´yzyjsou zaloˇzen´ena teorii automat˚u,proto se pro popis jednotliv´ych ˇc´ast´ıpouˇzijepr´avˇeteorie form´aln´ıch jazyk˚ua gramatik.

4.1 Lexik´aln´ıanal´yza

Lexik´aln´ıanal´yzaje prvn´ıkomponenta kompil´atoru.Pˇrev´ad´ıvstupn´ızdrojov´y k´odreprezentovan´yjednotliv´ymiznaky na ˇc´astipro jazyk bˇeˇzn´e,kter´ymijsou napˇr´ıkladkl´ıˇcov´aslova, aritmetick´eoperace, identifik´atorya dalˇs´ı.Pro jejich konstrukci se pouˇz´ıvaj´ıkoneˇcn´eautomaty [32, s. 2]. Jde o model, jehoˇz´ukolem je rozhodnout, zda vstupn´ıˇretˇezec symbol˚upˇrijme,nebo ne. Vˇsechny sek- vence pˇrijat´eautomatem se nazvou jazykem. Automat se skl´ad´az pˇeti ˇc´ast´ı. Jsou jimi vnitˇrn´ıstavy, vstupn´ısymboly, poˇc´ateˇcn´ıstav a mnoˇzinakoncov´ych stav˚u.Poˇc´ateˇcn´ıa koncov´estavy jsou z podmnoˇziny vnitˇrn´ıch stav˚u.Mezi jednotliv´ymistavy jsou pˇrechody, kter´ejsou definovan´epˇrekladovou funkc´ı. Ta podle aktu´aln´ıhovnitˇrn´ıhostavu a vstupn´ıhosymbolu zmˇen´ıvnitˇrn´ıstav automatu [32, s. 51 – 52]. Pro ´uˇcely anal´yzyje automat celkem dvakr´atupraven. Prvn´ı ´upravou je zmˇenavracen´ehodnoty. M´ıstotoho, aby pouze zodpov´ıdalot´azkuzda je vstupn´ıˇretˇezecz dan´ehojazyka, vrac´ı tokeny“. T´ımto zp˚usobem se ˇretˇezci ” dal nˇejak´ydalˇs´ıv´yznam,jiˇzje zn´amo,zda jde o aritmetickou operaci ˇcijinou komponentu zdrojov´ehok´odu.Pracuje se s dvˇemadruhy token˚u.U liter´aln´ıch je v´yznamjasnˇed´andruhem tokenu, lexik´aln´ıpouze kategorizuj´ıvstupn´ısek- venci, napˇr´ıklad jako ˇc´ıslo. Druh´a´uprava se prov´ad´ıu ukonˇcovac´ıch stav˚u.Automat m´ajen jeden, zde jich bude hned nˇekolik, pro kaˇzd´ytoken jeden. Se zdrojov´ymk´odemse pak nepracuje jako s jednou vstupn´ısekvenc´ı,ale postupnˇese dˇel´ına menˇs´ılogick´e celky. D´ıkytomu se na vstupn´ık´odbude nahl´ıˇzetjako na dlouhou sekvenci token˚u.Pokaˇzd´e,co se nalezne nˇejak´ytoken, se automat spust´ıznovu. Ve vˇetˇsinˇepˇr´ıpad˚use mezery a konce ˇr´adk˚uignoruj´ı,v nˇekter´ych jazyc´ıch se jim ale d´av´avˇetˇs´ıv´yznam,napˇr´ıkladkonec ˇr´adkuv pˇr´ıpadˇejazyka Go znaˇc´ıkonec pˇr´ıkazu.Pokud jazyk podporuje vnoˇrov´an´ıkoment´aˇr˚udo sebe nebo v´ıceslovn´epromˇenn´e,nejde pro pˇrekladpouˇz´ıtkoneˇcn´yautomat, protoˇze nem´aˇz´adnouvnitˇrn´ıpamˇetvhodnou pro poˇc´ıt´an´ıpoˇctuvnoˇren´ı. U anal´yzymohou nastat dva probl´emy. Mohou totiˇzexistovat tokeny, kter´e zaˇc´ınaj´ı stejn´ymiznaky. Vracen´ı prvn´ıho v´yskytu by znamenalo, ˇzeby ne- mohlo vzniknout ˇc´ıslovˇetˇs´ıneˇzdevˇet.Analyz´atorproto bude hledat tu nejdelˇs´ı nejdelˇs´ısekvenci. Pokud se dojde do nˇejak´ehokoncov´ehostavu, pˇredvr´acen´ım tokenu se jeˇstˇezkontroluje, zda nejde sekvenci pomoc´ıpravidla v pˇrechodov´e funkci prodlouˇzit. Tento postup funguje dobˇreu ˇc´ısel,u komplikovanˇejˇs´ıch sekvenc´ıale m˚uˇze nastat stav, kdy jiˇzdalˇs´ıkoneˇcn´ystav neexistuje, a automat pr´avˇeted’ nen´ı

18 4.2. Syntaktick´aanal´yza v jednom z koneˇcn´ych stav˚u.To by vedlo k chybˇev pˇrekladu,i kdyˇztam ne- mus´ıb´yt– jeden z vnitˇrn´ıch stav˚upouˇzit´ych k pˇrekladumohl b´ytukonˇcuj´ıc´ı. Pokud k tomu dojde, m´ıstochyby se vr´at´ınejdelˇs´ısekvence stav˚u,kter´akonˇc´ı pr´avˇetakov´ymstavem [33, s. 59 – 66]. Velk´emnoˇzstv´ı kl´ıˇcov´ych slov spl´yv´as identifik´atory. Je tedy d˚uleˇzit´e nˇekter´ymidentifik´ator˚umd´atvˇetˇs´ıv´yznam.To jde prov´estdvˇemazp˚usoby. Kaˇzd´ekl´ıˇcov´eslovo bude m´ıtspeci´aln´ıpr˚uchod automatem. To je kompliko- van´e,zejm´enav souvislosti s probl´emy zm´ınˇen´ev´yˇse,ˇreˇsen´ıchyby v pˇrekladu. Druh´yzp˚usobje vloˇzitjej do tabulky symbol˚ua po kaˇzd´emn´alezuiden- tifik´atorujej zpracovat. Symbol m´av tabulce informaci o sv´emspeci´aln´ım vyznamu. Tabulka symbol˚uje strukturou, kter´ase pouˇz´ıv´abˇehemcel´ehopro- cesu kompilace, hl´ıd´aredeklarace a dalˇs´ıprobl´emy, pro lexik´aln´ıanal´yzu ne- podstatn´e[31, s. 85 – 86].

4.2 Syntaktick´aanal´yza

Regul´arn´ıgramatika je schopn´apopsat vˇetˇsinu konstrukc´ı,nelze s n´ıale po- psat aritmetick´eoperace. Pro asociativitu a prioritu oper´ator˚use pouˇz´ıv´a bezkontextov´agramatika. Jejich pˇrepisovac´ıpravidla jsou v´ıcekomplexn´ıneˇz u regul´arn´ıch gramatik a to umoˇzn´ıaritmetick´eoperace jednoznaˇcnˇepopsat [32, s. 194]. Pro popis jazyka se v tomto pˇr´ıpadˇepouˇz´ıvaj´ı derivace. Jde o proces, bˇehemkter´ehose netermin´alpˇrep´ıˇse pomoc´ıpravidla na kombinaci termin´al˚u a netermin´al˚u,jak je d´anopravidlem. Sekvence symbol˚udo jazyka patˇr´ı,po- kud existuje takov´aposloupnost derivac´ı,bˇehemkter´ese z poˇc´ateˇcn´ıhosym- bolu vytvoˇr´ıvstupn´ıˇretˇezec.Netermin´alyse pˇrepisuj´ıpomoc´ıpravidel do t´e doby, dokud se ˇretˇezecneskl´ad´apouze z termin´al˚u[32, s. 175]. Derivaˇcn´ıstrom je grafickou reprezentac´ıtohoto procesu. Startovac´ısym- bol je koˇrenemstromu, listy jsou termin´aly, vnitˇrn´ıuzly jsou netermin´aly. Listy ˇcten´ezleva doprava d´avaj´ızpracovan´yˇretˇezec.Abstraktn´ısyntaktick´ystrom je speci´aln´ıvariantou derivaˇcn´ıhostromu vhodn´ehopro uchov´av´an´ızdrojov´eho k´odu.Je jednoduˇsˇs´ı,neobsahuje napˇr´ıkladinformace o vˇsech ˇcten´ych symbo- lech, z´avorky a stˇredn´ıkyjsou v´yznamn´ejen pro spr´avnou formulaci stromu [32, s. 183 – 184], [31, s. 201 – 202]. Ne kaˇzd´agramatika je vhodn´apro pouˇzit´ı v kompil´atoru.Stejnˇejako u lexik´aln´ıanal´yzy, i zde je d˚uleˇzit´ajednoznaˇcnost.Nejednoznaˇcn´agrama- tika je takov´a,kter´apro vstupn´ıˇretˇezecm˚uˇzevˇetˇs´ımnoˇzstv´ırozd´ıln´ych de- rivaˇcn´ıch strom˚u.Tato vlastnost je neˇz´adouc´ı,m˚uˇzev´estk nefunkˇcn´ımprio- rit´amoper´ator˚u,coˇzje jeden z d˚uvod˚u,proˇcse tato gramatika pouˇz´ıv´a[31, s. 203 – 204]. V programovac´ıch jazyc´ıch se pouˇz´ıv´ajedna nejednoznaˇcn´akon- strukce. Jde o podm´ınky, kaˇzd´anemus´ım´ıtalternativn´ıvˇetev,a pokud se podm´ınkydo sebe vnoˇruj´ı,nemus´ıb´ytjasnˇedan´e,ke kter´epodm´ınce blok patˇr´ı. Pracuje se tu proto s pˇredpokladem, ˇzeblok bude patˇritpˇredchoz´ı

19 4. Konstrukce kompilatoru´ podm´ınce[33, s. 101]. Tento probl´emnenast´av´av jazyce Go, kaˇzd´apodm´ınka se mus´ıskl´adatz cel´eho bloku, nejenom jednoho pˇr´ıkazu. Vˇsechny gramatiky nejsou jednoznaˇcn´e,jsou ale zp˚usoby, kter´ymije jed- noznaˇcn´eudˇelat.U parsov´an´ıshora dol˚uje nutn´em´ıtpravidla bez lev´ere- kurze. Pokud symbol v pravidle co nejv´ıcenalevo je stejn´yjako ten pr´avˇeted’ pˇrev´adˇen´y,nen´ımoˇzn´edeterministicky urˇcit,kolik tˇechto pravidel je potˇreba pouˇz´ıt,protoˇzesymbol, podle kter´ehose proces m˚uˇzeˇr´ıdit,se nemˇen´ı.Rekurze lze z pravidel odstranit bez zmˇeny jazyka [31, s. 67]. Pro rozhodov´an´ı, kter´epravidlo m´agramatika pouˇz´ıt, se pouˇz´ıvaj´ı dvˇe pomocn´emnoˇziny. Kaˇzd´ynetermin´altuto dvojici pouˇz´ıv´a.Popisuj´ı jednu z vlastnost´ıpravidel, a tou je prvn´ınetermin´al,kter´yse na lev´estranˇepravi- dla m˚uˇzevyskytnout. V mnoˇzinˇese m˚uˇzenach´azeti pr´azdn´yˇretˇezec.Druh´a mnoˇzinauchov´av´ainformace o termin´alech, kter´ese nach´az´ıza dan´ymneter- min´aln´ımsymbolem na prav´estranˇepravidla. Podle t´etomnoˇziny se rozho- duje v pr´ıpadech, kdy prvn´ız nich obsahuje pr´azn´yˇretˇezec[33, s. 145 – 148]. Mnoˇzny nesm´ıobsahovat konflikty, to by znamenalo, ˇzenejde o determinis- trick´yproces. Stejnˇejako u rekurze, lze prov´adˇet´upravy, aby se nejedno- znaˇcnostodstranila. Parser˚um,kter´epostupuj´ıshora dol˚ua pouˇz´ıvaj´ıtyto mnoˇziny se naz´yvaj´ı LL( k“). Jde o zkratku, prvn´ıznak znaˇc´ı,ˇzese vstup ˇctezleva doprava, druh´y ” znamen´ahled´an´ınejlevˇejˇs´ıderivace. Promˇenn´aud´av´a,kolik netermin´aln´ıch symbol˚use pouˇz´ıv´apro urˇcen´ıpravidla, kter´ebude v dalˇs´ımkroku pouˇzito [31, s. 217 – 226].

20 Kapitola 5

Realizace

Tato kapitola bude zab´yvat konstrukc´ıvlastn´ıhopˇrekladaˇce. Bude rozdˇelena na ˇctyˇricelky. V prvn´ıpop´ıˇsipoˇzadavky na transpil´atora pouˇzit´etechnolo- gie. V dalˇs´ıse zm´ın´ımo pouˇzit´eknihovnˇekter´azjednoduˇsilaproces lexik´aln´ı a syntaktick´eanal´yzyna ´urovni PHP. Tˇret´ıa z´aroveˇnnejvˇetˇs´ız nich se bude zab´yvat probl´emy, na kter´ejsem bˇehemtvorby narazil, a popisuje moˇznosti, jak´ymise tyto komplikace vyˇreˇsili,pˇr´ıpadnˇemohly ˇreˇsit.V´yˇcet bude seˇrazen podle v´yznamnostia ˇcasu,kdy se na tˇeˇzcepˇrevoditelnou konstrukci narazilo. Posledn´ısekce se bude zab´yvat zp˚usobem, jak´ymbyla spr´avnosttranspilace kontrolov´ana.

5.1 Poˇzadavky

Pro konstrukci transpil´atorujsem pouˇzilprogramovac´ıjazyk Go. Jsou pro to celkem dva d˚uvody, nikterak z´avaˇzn´e,dan´ezejm´enaprostˇred´ım,ve kter´em se pohybuji. Jde pro mne o druh´ynejpouˇz´ıvanˇejˇs´ıjazyk, je rovnˇeˇzna druh´e pˇr´ıˇccev pouˇz´ıvanosti ve firmˇe,ve kter´epracuji. Vynech´av´amtu jazyky kter´e se pro psan´ıpˇrekladaˇcenehod´ıjako jsou HTML a CSS. Druh´ymd˚uvodem je pouk´az´an´ına moˇznostitohoto jazyka a ´umysln´evyhnut´ıse PHP, kter´ehose m´atranspil´atorzbavovat. Transpil´atorbude schopn´ypˇreloˇzitvˇsechny z´akladn´ıˇr´ıd´ıc´ıkonstrukce na- ch´azej´ıc´ıse v PHP. Komplikovanˇejˇs´ıkonstrukce budou fungovat pouze v ome- zen´em´ıˇre, kdy jejich implementace byla nepˇr´ımo vyˇzadov´anapro pˇrevod jin´ych konstrukc´ı. U vˇsech v´yraz˚use bude vyˇzadovat, aby bylo moˇzn´eodvodit jejich datov´y typ. Podobn´ykrok se prov´ad´ıu HPHPc, zde je ale nejednoznaˇcnost zak´az´ana a povede k chybˇebˇehempˇrevodu. Nˇekter´ekonstrukce proto nebude moˇzn´e pˇreloˇzitv dan´epodobˇe,budou vyˇzadov´any takov´e´upravy, aby ˇslo jejich vlast- nosti odvodit jiˇzbˇehemtranspilace. Dynamick´evlastnosti jazyka budou zak´az´any, alternativn´ıdefinice funkce dan´epr˚uchodem programu nebude moˇzn´eprov´adˇet.V´yjimkou jsou pˇr´ıkazy

21 5. Realizace pro vkl´ad´an´ıskript˚u. Pˇrekl´adatse bude validn´ıPHP k´odpro verzi 7.1. Tento poˇzadavek je spo- jen s nov´ymivlastnostmi tohoto skriptovac´ıhojazyka, tou nejv´yznamnˇejˇs´ıje moˇznostdefinovat typy argument˚ufunkce a jej´ın´avratov´ytyp. To bude velmi n´apomocn´epro zaˇc´atektranspilace, vyˇzadov´an´ıt´etoinformace zjednoduˇs´ıde- klaraci funkc´ıa d´ıkyn´ıbude skript jednoznaˇcn´y. Jazyk Go je staticky typovan´ya tuto vlastnost do jist´em´ıryoˇcek´av´ami od skriptu. Tohoto omezen´ıse budu moci do jist´em´ıryzbavit aˇzbude transpi- lace pracovat i s koment´aˇri.Ty mohou d´alespecifikovat jak´ehotypu vstup je, PHP je u definice pol´ıvelmi skromn´e,nepopisuj´ıvnitˇrn´ıstrukturu, pouˇz´ıv´ase jen kl´ıˇcov´eslovo array. To je nˇeco, co koment´aˇrum´ıupˇresnit.Lze je pouˇz´ıt i pro inverzn´ıpostup, definice bude m´enˇestriktn´ıa funkce bude moci vra- cet/pˇrij´ımatvˇetˇs´ımnoˇzstv´ıtyp˚u.Je zde tedy velk´yprostor pro dalˇs´ırozˇs´ıˇren´ı transpilace a mohlo by tak doj´ıtke zm´ırnˇen´ıpoˇzadavku na verzi PHP. Druh´ym zp˚usobem vedle koment´aˇr˚uje prov´estvˇetˇs´ımnoˇzstv´ıpr˚uchod˚uprogramem, coˇzje krok, kter´yje moˇzn´epozorovat u HPHPc.

5.2 Lexik´aln´ıa syntaktick´aanal´yzaPHP

Transpil´atorse nezab´yv´akontrolou PHP k´odua jeho pˇrevodem do struk- tury, se kterou se bude d´aledobˇre pracovat. Pro tuto problematiku bylo pouˇzitoextern´ı knihovny, kter´ase t´ımto probl´emem zab´yv´a.Vytv´aˇr´ı abs- traktn´ısyntaktick´ystrom, ve kter´emje kaˇzd´aˇr´ıd´ıc´ıkonstrukce PHP jedno- znaˇcnˇepops´ana.Pokud k´odnen´ısyntakticky validn´ı,je zde moˇznostdostat se ke vˇsemprobl´em˚uma t´ımto zp˚usobem donutit uˇzivatele k´odopravit. Strom obsahuje vˇsechny znaky kter´ebyly souˇc´ast´ızdrojov´ehoskriptu, d´ıkykter´ym bude moˇzn´epracovat s koment´aˇria ponechat p˚uvodn´ıform´atov´an´ıprogramu [34]. Informace o um´ıstˇen´ıprvk˚uv souboru se ignoruj´ı,pro vyps´an´ıprogramu do souboru se pouˇz´ıv´aform´atov´an´ıpro jazyk Go. Pro anal´yzuse pouˇz´ıvaj´ınejnovˇejˇs´ıpravidla, to napˇr´ıkladznamen´a,ˇze fn je kl´ıˇcov´ymslovem [35].

5.3 Struktura

Program se skl´ad´aze tˇr´ıbal´ıˇck˚u,kaˇzd´yz nich pln´ıjeden specifick´y´ukol. Pro pˇreveden´yskript je nejd˚uleˇzitˇejˇs´ıbal´ıˇcek std“, kter´yobsahuje funkce ” simuluj´ıc´ıchov´an´ıPHP. Vˇetˇsinaz nich je definov´anai v Go, ale liˇs´ıse sv´ym pˇredpisema n´avratovou hodnotou. D´alese zde nach´az´ıfunkce reprezentuj´ıc´ı implicitn´ıkonverze, ty c´ılov´yjazyk neprov´ad´ı.Nav´ıcneobsahuje vˇsechny kon- verze jako je tomu v PHP, napˇr´ıklad z bin´arn´ıhodnoty nelze udˇelatˇc´ıslici, bal´ıˇcektoto omezen´ıeliminuje. SQL pˇripojen´ıa asociativn´ıpole se pˇrev´ad´ıdo podoby struktur. Go pˇripojen´ıi asociativn´ıpole implementuje, jeho chov´an´ı a pouˇzit´ıale nen´ıidentick´e. Slouˇz´ıpro zjednoduˇsen´ıpˇrevodu, napˇr´ıkladv PHP

22 5.4. Konflikty v n´azvech se pˇripojen´ık datab´aziprov´ad´ıve dvou kroc´ıch, v Go jen v jednom. Struktura pˇripojen´ık datab´azisimuluje do podoby dvou funkc´ı. Dalˇs´ıbal´ıˇcekslouˇz´ıpro reprezentaci abstraktn´ıhosyntaktick´ehostromu. Pouˇz´ıvaj´ıse tˇridruhy uzl˚u,liˇs´ıse sv´ymischopnostmi, rozhran´ım,kter´emus´ı splˇnovat. Nejjednoduˇsˇs´ım z nich je v´yraznevracej´ıc´ı hodnotu. Do t´etoka- tegorie spad´apˇriˇrazen´ı,inkrementace a dekrementace. Pˇriˇrazen´ım´aale jin´e postaven´ı, v pr˚ubˇehu transpilace se s n´ım pracuje jako s uzlem obsahuj´ıc´ı hodnotu, doch´az´ı k jeho ´uprav´amv pˇr´ıpadˇeˇretˇezen´ı pˇriˇrazen´ı, deklarac´ım v podm´ınk´ach a tak podobnˇe.Dalˇs´ıje v´yraz,kter´ynav´ıcobsahuje informaci o sv´emn´avratov´emtypu. Jde o nejvˇetˇs´ıkategorii, spadaj´ıdo n´ınejjednoduˇsˇs´ı konstrukce jazyka jak´ymijsou bin´arn´ıoperace, volan´efunkce, primitivn´ıda- tov´etypy. Posledn´ız nich jsou bloky. Jde o kontejnery, kter´emohou obsahovat dalˇs´ı,jin´euzly, a mohou obsahovat definice promˇenn´ych. To simuluje chov´an´ı tabulky symbol˚u.Do t´etokategorie spadaj´ıfunkce, ˇr´ıd´ıc´ıkonstrukce, bloky. Pro reprezentaci stromu se pouˇz´ıvaj´ı dalˇs´ı dva uzly, kter´ejsou speci´aln´ım pˇr´ıpademblok˚u.Splˇnuj´ırozhran´ı,ale vˇetˇsinametod neovlivˇnujevnitˇrn´ıstav. Jeden z nich je koˇrenem cel´ehoprojektu, obsahuje informace o vˇsech souborech a glob´aln´ıch promˇenn´ych. Soubor je uzlem obsahuj´ıc´ıinformace o pouˇzit´ych bal´ıˇcc´ıch, vˇsech funkc´ıch, a odkazem na funkci symbolizuj´ıc´ı main. Posledn´ıbal´ıˇcek je pro parser. Ten zdroj pˇrevede do podoby stromu, pouˇzije k nim uzly popsan´ev´yˇse.Jeho souˇc´ast´ı jsou struktury pro pˇrekladn´azv˚u. Dalˇs´ıobsahuje pˇredpisyvˇsech funkc´ı,kter´eje moˇzn´ebˇehempˇrekladupouˇz´ıt. Pouˇz´ıv´ase pro v´ybˇerspr´avn´efunkce a vr´acen´ıjej´ıhopˇredpisu,nav´ıcdo sou- bor˚upodle potˇreby vkl´ad´aodkazy na bal´ıˇcky, aby byl v´ysledekvalidn´ı.Z toho d˚uvodu je velmi ´uzceprov´az´ans obˇemabal´ıˇckyv´yˇse,pˇredpisyfunkc´ıjsou defi- nov´any textovˇepouze tady, proto zmˇenastandardn´ıknihovny m˚uˇzezp˚usobit, ˇzev´ysledn´yprogram nebude fungovat.

5.4 Konflikty v n´azvech

PHP m´aspecifick´yzp˚usobdefinov´an´ıpromˇenn´ych a s funkcemi se v´aˇzejeden probl´emnekonzistence, kter´yskriptovac´ıjazyk ignoruje, ale v c´ılov´emjazyce bude zp˚usobovat probl´emy. K vyˇreˇsen´ıse pouˇzijepˇrekladov´atabulka, kter´a pro fr´aziv PHP najde vhodn´yekvivalent pro Go. Pokud tento n´azevnen´ı voln´y,pˇrid´ase na konec ˇc´ıslice,kter´ase bude navyˇsovat do t´edoby, dokud fr´azenebude unik´atn´ı.Tabulky se od liˇs´ıdefinic´ıkonflikt˚ua mnoˇzinou slov, kter´ymse mus´ıvyh´ybat,projekt pˇrich´az´ıjiˇzs nˇekter´ymipˇreddefinovan´ymi funkcemi a promˇenn´ymi. Go m´avelmi mal´emnoˇzstv´ıkl´ıˇcov´ych slov – dvacet sedm [36]. Krok˚upro nalezen´ıvhodn´ehon´azvuby proto nemˇelob´ytmnoho. C´ıslicev´yˇsejeˇ pˇr´ıliˇs optimistick´a,skuteˇcn´ahodnota nepouˇziteln´ych fr´az´ıje vyˇsˇs´ı,jeˇstˇese budu vyh´ybatn´azv˚umbal´ıˇck˚u,kter´ese budou pouˇz´ıvat. Poˇcetse tak nav´yˇs´ıaˇzna tˇricetpˇetu transpilace do serverov´epodoby.

23 5. Realizace

5.4.1 Promˇenn´e Z´adn´apromˇenn´avˇ PHP nem˚uˇzem´ıtkonflikt v n´azvech, napˇr´ıklads jmenn´ym prostorem, kl´ıˇcov´ymslovem, funkc´ıˇcimakrem. Jedinou v´yjimkou jsou su- perglob´aln´ıpromˇenn´e, tam nˇejak´ykonflikt vznik´a,ale ne na takov´e´urovni, aby program pˇrestalfungovat, jen se zmˇen´ıobsah promˇenn´e.Vˇsechny tyto probl´emy jsou vyˇreˇsen´edolarem na zaˇc´atkun´azvu.To je jedna z vˇec´ı,kter´a v Go nejde aplikovat, promˇenn´anesm´ızaˇc´ınatdolarem. Pˇrekladov´atabulka vr´at´ıspr´avn´yn´azevpromˇenn´e.Konflikty se zaˇcnouobjevovat pr´avˇetehdy, kdyˇzse promˇenn´apojmenuje kl´ıˇcov´ymslovem v Go. K velk´emu mnoˇzstv´ı pˇreklad˚ubude pot´edoch´azetpokud se kl´ıˇcov´eslovo bude vyskytovat v k´odu v´ıcekr´at,jen s pˇrid´an´ımˇc´ıslicena konec fr´azejako pˇr´ıpona.

5.4.2 Funkce Nejtrivi´alnˇejˇs´ımkonfliktem v n´azvuje definov´an´ıfunkce main. Pokud se pro- gram pouˇz´ıv´ajako server, je tu nav´ıc jeˇstˇefunkce obstar´avaj´ıc´ı spouˇstˇen´ı skriptu v podobˇekonzolov´eaplikace. Pro pˇrekladaˇcfunkc´ıto znamen´ajen jedno dalˇs´ıkl´ıˇcov´eslovo, kter´emu se bude muset vyh´ybat.Zaj´ımavˇejˇs´ımcho- v´an´ımje pˇr´ıstupk funkc´ımze strany PHP – nerespektuje se velikost p´ısmen. D´ase proto tvrdit, ˇzenen´ımoˇzn´ejednoznaˇcnˇerozhodnout, jak se funkce jme- nuje. N´azevfunkce bude d´anjej´ıdefinic´ıa t´ımto zp˚usobem se vˇsesjednot´ı. Pˇredvol´an´ımfunkce se proto n´azevfunkce pˇrevede na mal´ap´ısmenaa teprve pak se hled´a,zda je funkce definovan´a.

5.4.3 N´avˇest´ı Konflikty v tˇechto identifik´atorech pro pˇr´ıkaz goto by nemˇelynast´avat, jsou ale transpil´atorumˇeletvoˇreny bˇehemsnahy pˇreloˇzitkl´ıˇcov´aslova continue a break s ˇc´ıseln´ymidentifik´atoremvelikosti skoku. Postup generov´an´ınov´eho n´azvuje nejjednoduˇsˇs´ıze vˇsech, pravidla pro jeho pojmenov´an´ıjsou v obou jazyc´ıch stejn´a.

5.5 Rozsah platnosti promˇenn´e

Snad kaˇzd´ykompilovan´yjazyk v´aˇzeˇzivotnost promˇenn´ek nˇejak´emu bloku. Promˇenn´apro blok o ´uroveˇnn´ıˇzeje nezn´am´aa kaˇzd´ypotomek bloku o t´eto promˇenn´ev´ı,pokud si blok nezadefinuje promˇennous t´ımto n´azvem znovu. V PHP se blokov´edefinice ignoruj´ı,promˇenn´aexistuje i mimo blok. Existuj´ı asi tˇrizp˚usoby, jak toto chov´an´ıpˇrev´estdo Go:

• Toto chov´an´ızak´azat.Pˇr´ıstupnejjednoduˇsˇs´ıa do jist´em´ırykorektn´ı, u sloˇzitˇejˇs´ıch konstrukc´ı se ignorov´an´ı blok˚unemus´ı vyplatit a m˚uˇze nastat, ˇzese k´odnebude chovat korektnˇe,protoˇze promˇenn´aobsahuje nˇecojin´eho,neˇzse oˇcek´av´a.

24 5.5. Rozsah platnosti promˇenn´e

• Kaˇzd´apromˇenn´abude definovan´ana nejniˇzˇs´ı´urovni. T´ımto zp˚usobem bude ve staticky typovan´emkompilovan´emjazyce jasnˇevidˇet,za pro- mˇenn´ese pouˇz´ıv´aa jak´ehodatov´ehotypu jsou. Na druhou stranu se m˚uˇzehezk´yskript st´atv kompilovan´emjazyce st´atneatraktivn´ım,coˇz je nˇeco,co nen´ıˇz´adouc´ı, a prvn´ı zp˚usobm´av tomto pˇr´ıpadˇenavrh: trest´aˇspatn´yk´od,tento i z dobr´ehodˇel´anehezk´y.

• Pouˇz´ıtstejn´yzp˚usobjako PHP, jen pˇreveden´yblokov´ehochov´an´ı.Pokud se nastav´ıpromˇenn´av bloku pro aktu´aln´ıblok nezn´am´y,pod´ıv´ase na vˇsechny ostatn´ıa pokus´ıse definici naj´ıta vyjmout ji tak, aby ji mohl pouˇz´ıvat i on. Rozsah platnosti promˇenn´eproto bude tak velk´y,jak jej vyˇzadujePHP. Pokud by se tento zp˚usobaplikoval na vˇsechny promˇenn´e, mohlo by doj´ıtke stejn´emu chov´an´ıjak´eje definovan´ev druh´empostupu.

Pro transpilaci se pouˇz´ıv´akombinace vˇsech tˇr´ızp˚usob˚u.Jsou pˇr´ıpady, kdy je ignorov´an´ıblok˚uvelmi ˇspatn´e,a t´ımje nastavov´an´ıpromˇenn´ev podm´ınce. V jedn´evˇetvise promˇenn´avytvoˇr´ı,v druh´ene. Nebo se jim nastav´ıjin´ydatov´y typ. To je probl´emneˇreˇsiteln´ybˇehemtranspilace a z toho d˚uvodu se v˚ubec nepˇrekl´ad´a.Pomoc´ıreflexe jde pravou hodnotu promˇenn´ezjistit, ale to by k´od udˇelalovelmi nepˇrehledn´ym.Nav´ıcby mˇelab´ytoprava tohoto chov´an´ıv PHP pomˇernˇejednoduch´a. Pˇresouv´an´ına nejniˇzˇs´ı´uroveˇnse pouˇz´ıv´av pˇr´ıpadˇeglob´aln´ıch promˇenn´ych. Kaˇzd´apromˇenn´a,co nen´ıum´ıstˇen´ave funkci, je glob´aln´ıpromˇennou,je moˇzn´e ji pouˇz´ıvat za pomoci kl´ıˇcov´ehoslova global, nebo k n´ıpˇristoupitpˇressu- perglob´aln´ıpromˇennou – asociativn´ıpole $GLOBALS. Vˇse,co je na nejniˇzˇs´ı ´urovni, neum´ıstˇen´ev dalˇs´ımbloku, bude br´anojako promˇenn´av tomto roz- sahu. V´yjimkou jsou promˇenn´eurˇcen´epro z´ısk´av´an´ıdat z SQL dotaz˚uzm´ınˇen´e v 5.12. Pro vˇsechna jin´aum´ıstˇen´ıpromˇenn´ev k´oduse pouˇz´ıv´atˇret´ızp˚usob.V pr˚u- bˇehu implementace tohoto chov´an´ıjsem objevil celou mnoˇzinu pˇr´ıpad˚u, kdy k vyj´ım´an´ımus´ıdoj´ıt.Bylo to zp˚usoben´em´ympˇr´ıstupem k vytv´aˇren´ınov´ych promˇenn´ych. Jakmile se zadefinovala ve vnoˇren´embloku promˇenn´ase stejn´ym jm´enemale jin´ymdatov´ymtypem, tranpil´atork n´ıpˇristupujejako k nov´e promˇenn´eexistuj´ıc´ıpouze v tomto bloku. Mohly proto nastat pˇr´ıpady, kdy i na prvn´ıpohled validn´ık´odmohl d´avat ˇspatn´ev´ysledky, protoˇzehodnota s dan´ymdatov´ymtypem existovala pouze v rozsahu bloku, jak je reprezen- tov´anov pˇr´ıkladu5.1. Pro vyˇreˇsen´ı t´etonekonzistence se prov´ad´ı zpˇetn´ehled´an´ı i mimo ro- diˇcovsk´ebloky. Pokud se v bloc´ıch dˇr´ıve promˇenn´anach´az´ı, jej´ı deklarace se pˇresunena niˇzˇs´ı´uroveˇn,prvn´ıhospoleˇcn´ehorodiˇcedvou blok˚u.K vyj´ım´an´ı bude doch´azetjen tehdy, kdyˇzse promˇenn´ajeˇstˇeneeditovala. Pˇreps´an´ıpro- mˇenn´ev bloku tento proces zastav´ı. Toto zpˇetn´ehled´an´ınen´ıv porovn´an´ıs blokov´ymvyhled´av´an´ımv´yhodn´e. M´ıstokontroly na v´yskytpromˇenn´ev mapˇeaktu´aln´ıhoprvku a pˇresunu na

25 5. Realizace

$a = 0; { $a = "1"; echo $a; // "1" } echo $a; // "1" $a = 2; echo $a; // 2

Obr´azek5.1: Pˇr´ıkladneoˇcek´avan´ehochov´an´ı

rodiˇcese proces rozˇs´ıˇrilna hled´an´ıve vˇsech bloc´ıch. Spolu s n´ımje spojen probl´empˇred´av´an´ıpromˇenn´ych referenc´ı,nejde prov´estpˇreveden´ına spr´avn´y datov´ytyp a z´ıskatodkaz na promˇennou.V nˇekter´ych pˇr´ıpadech to proto m˚uˇzezp˚usobitchybu bˇehemkompilace.

5.6 Vedlejˇs´ıefekty pˇr´ıkaz˚u

V p˚uvodn´ımjazyce jsou operace, kter´emaj´ıvedlejˇs´ıefekty, ale nemaj´ıpˇr´ımou reprezentaci v c´ılov´emjazyce. To vede ke konstrukc´ım, kter´ese od zdroje v nˇekter´ych pˇr´ıpadech dost liˇs´ı,nˇekter´ez nich jsou zak´azan´epro svoji kom- plikovanost. Nejjednoduˇsˇs´ım pˇr´ıpadem, kter´yse ned´ado nov´ehojazyka pˇrev´est,je pˇriˇrazen´ı.To zde nevrac´ıhodnotu. Z toho d˚uvodu se nedaj´ıˇretˇezita nemohou se pouˇz´ıtv podm´ınk´ach. Go tento probl´emˇreˇs´ıpˇrid´an´ımmoˇznostiinicializace do podm´ınky. Pˇredpis tak bude podobn´yjako u cyklu. Pokud se pˇriˇrazen´ıv podm´ınceobjev´ı,vyjme se a um´ıst´ıse do inicializace. Pˇriˇrazen´ıse odstran´ı,nahrad´ıse jen promˇennou. Tento postup se pouˇz´ıv´ajen u jednoho pˇriˇrazen´ıve v´yrazu, sloˇzitˇejˇs´ıoperace se nezpracov´avaj´ı,vedou k p´aduprogramu, nebo k chybˇebˇehempˇrevodu. Retˇezen´ınaˇ jin´emm´ıstˇeneˇzv ˇr´ıd´ıc´ıch cyklech je moˇzn´e – rozdˇel´ıse na jednotliv´apˇriˇrazen´ı. Dalˇs´ıv´yrazs vedlejˇs´ımefektem je inkrementace a dekrementace. V Go nejde o v´yrazvracej´ıc´ı hodnotu, proto nelze pouˇz´ıvat napˇr´ıklad pro inde- xaci, v operac´ıch a dalˇs´ı.Oba druhy tˇechto operac´ızde spl´yvaj´ıpodobnˇejako v Hack, nedaj´ıse pro tento ´uˇcelpouˇz´ıta vedou k chybˇetranspilace. Aby se chov´an´ızachovalo, musela by se pouˇz´ıtanonymn´ıfunkce. Ta ale nyn´ınen´ı pˇr´ıtomnaa jej´ıimplementace by vedla k moˇzn´ymprobl´em˚umspojen´yms blo- kovou definic´ıpromˇenn´ych.

26 5.7. Break a continue

5.7 Break a continue

Pˇr´ıkazy break a continue mohou nav´ıcobsahovat ˇc´ıseln´yargument, kter´y definuje, kolik cykl˚use pˇreruˇs´ı.Varianty bez ˇc´ıslajsou identick´ev c´ılov´em jazyka, pro ˇc´ıseln´everze se mus´ızvolit jin´areprezentace. Toto chov´an´ı se bude simulovat dvojic´ı goto a n´avˇest´ı. Ty se generuj´ı podle potˇreby, kaˇzd´ys unik´atn´ımn´azvem, kter´yse jiˇznikde jinde nepouˇzije. Z aktu´aln´ıbloku se po rodiˇc´ıch ve stromˇejde k ˇz´adouc´ımu elementu, a za nˇej se um´ıst´ın´azevn´avˇest´ı.

5.8 Asociativn´ıpole

Asi nejpouˇz´ıvanˇejˇs´ıdatovou strukturou ve zdrojov´em jazyce je pole, respektive asociativn´ıpole – mapa. Protoˇzejazyk je dynamicky typovan´y,jsou rozd´ıly mezi tˇemitodvˇemadruhy pro transpilaci takˇrkanerozpoznateln´e.Tato struk- tura m´advˇevlastnosti, kter´enen´ımoˇzn´enˇejak´ymjednoduch´ymzp˚usobem pˇrepsatdo Go. Jde o zachov´av´an´ıpoˇrad´ıvkl´ad´an´ıa jeho vlastnost typick´apro primitivn´ıdatov´ytyp, pˇriˇrazov´an´ımse vytv´aˇr´ınov´ainstance, nejde o pouhou referenci [37]. Mnou vytvoˇren´astandardn´ıknihovna obsahuje struktury, kter´elze inde- xovat stejn´ymzp˚usobem jako tomu je v PHP a uchov´av´apoˇrad´ıvkl´adan´ych prvk˚u.Vyˇzadujese jednoznaˇcnostuchov´avan´ehodatov´ehotypu, m˚uˇzeobsaho- vat jen hodnoty dan´ehotypu. Ve vˇetˇsinˇepˇr´ıpad˚utoto omezen´ınebude limitac´ı, zejm´enaproto, ˇzepro nejkomplikovanˇejˇs´ıpˇrev´adˇenoustrukturu – v´ysledek z SQL dotazu – se pouˇz´ıv´ajin´yzp˚usob.Funkce pouˇz´ıvan´epro pr´acis poli se pˇrev´ad´ıdo metod, transpil´atorvol´an´ıtˇechto funkc´ıpˇrevede do podoby vol´an´ı metody. Kaˇzd´ytyp m´asvoji strukturu, pro jejich generov´an´ıje naps´anprogram. Funguje na jednoduch´emprincipu, doplˇnujena spr´avn´am´ısta n´azevtypu poch´azej´ıc´ız pˇr´ıkazov´ehoˇr´adku. Indexovat se d´ajak´ymkoliv typem, ten se pˇrevede do textov´epodoby. Z desetinn´ych ˇc´ıselse dˇelaj´ıcel´aa navz´ajemse mohou pˇrepisovat stejn´ym zp˚usobem jako je tomu v pˇr´ıpadˇePHP, napˇr´ıkladnen´ırozd´ılmezi indexov´an´ım pomoc´ıbin´arn´ıhodnoty true nebo textu "1". V´ysledn´astruktura je velmi pomal´a.Mapa se pouˇz´ıv´apro indexy pole, hodnota odkazuje na hodnotu v poli udrˇzuj´ıc´ıpoˇrad´ıvkl´adan´ych prvk˚u.Asi nejlepˇs´ıvariantou je snaˇzitse pouˇz´ıv´an´ıt´etostruktury vyhnout. Pokud nebude tˇrebauchov´avat poˇrad´ıvkl´ad´an´ı,pouˇzijese mapa, v pˇr´ıpadech, kdy indexace nen´ıpodstatn´a,se pouˇzijebˇeˇzn´epole. Informace o vzhledu pole by se mohla z´ısk´avat z koment´aˇr˚u.

27 5. Realizace

5.9 Glob´aln´ıpromˇenn´e

Reˇsen´ıglob´aln´ıchˇ promˇenn´ych z 5.5 bylo vhodn´ejen pro pˇreklad k´odu,kter´yse nepouˇz´ıval jako server. Glob´aln´ıpromˇenn´ese v pˇr´ıpadˇeserverov´ehochov´an´ı navz´ajempˇrepisuj´ı,coˇzvede ke ˇspatn´ymv´ysledk˚um,chyb´amz d˚uvodu ne- splnˇen´ıHTTP protokolu ˇcip´ad˚umprogramu. Tento probl´emse obch´az´ıvy- tvoˇren´ımstruktury, kter´avˇsechny glob´aln´ıpromˇenn´eobsahuje. Pˇredkaˇzd´ym pr˚uchodem programu se takov´ainstance struktury vytvoˇr´ı, a bude se pouˇz´ıvat jen ta. Kaˇzd´afunkce, kter´apouˇz´ıv´aglob´aln´ıpromˇenn´e,bude souˇc´ast´ıt´eto glob´aln´ıstruktury. Pˇrekladaˇcnad t´ımto chov´an´ımnem´aabsolutn´ıkontrolu, s metodami se nepracuje pˇr´ımo,jde jen o vloˇzen´ıtextu na dan´em´ısto,nen´ıto podloˇzen´eˇz´adnouvlastnost´ıdatov´ehotypu. Alternativn´ımˇreˇsen´ımje glob´aln´ı kontext pˇred´avat jako argument, zvolil jsem ale prvn´ı variantu, protoˇzese nemˇen´ıargumenty funkce. Nemus´ıse proto upravovat jejich definice a jiˇzexis- tuj´ıc´ıvol´an´ıfunkce z˚ust´avaj´ıstejn´e.Tato varianta jen mˇen´ın´azevfunkce a to lze upravit bˇehemv´ypisu.K poloˇzk´amdatov´estruktury je dobr´ypˇr´ıstup, vytv´aˇr´ıse v koˇrenisyntaktick´ehostromu jako kaˇzd´ajin´apromˇenn´a.Jejich ad- resov´an´ıje ale komplikovan´e,doˇcasnˇese vytvoˇr´ıpromˇenn´as n´azvem sloˇzen´ym ze struktury a poloˇzky, ze kter´ese vytvoˇr´ıv´yraz,kter´yje pouˇz´ıvan´ystejn´ym zp˚usobem jako jin´epromˇenn´e. V PHP je moˇzn´edefinovat glob´aln´ı promˇenn´ekdekoli, tranpil´atortuto moˇznostzakazuje, jen ty na nejniˇzˇs´ı´urovni nenach´azej´ıc´ıse ve funkce se sta- nou glob´aln´ımi.Deklarace pomoc´ı global je zak´az´ana,protoˇzenen´ımoˇzn´e odvodit datov´ytyp, a informace o t´etodeklaraci nep˚ujdez´ıskatbˇehemjed- noho pr˚uchodu stromem nebo by vedla k nejednoznaˇcn´ymv´ysledk˚um.

5.10 Funkce a promˇenn´ypoˇcetargument˚u

Funkce v PHP mohou b´ytdefinovan´es promˇenn´ympoˇctemparametr˚u.Toto chov´an´ınelze do c´ılov´ehojazyka jednoznaˇcnˇepˇrev´est,protoˇzefunkce t´ımto zp˚usobem pouˇz´ıvat nelze. Pokud by se zadefinovala funkce se stejn´ymn´azvem, doˇsloby k chybˇebˇehemkompilace, nehledˇena jin´yz´apisv podobˇemenˇs´ıho poˇctuargument˚u.Funkce tu jsou od sebe rozliˇsov´any pouze sv´ymn´azvem, ne cel´ympˇredpisem. Pokud se bˇehempˇrekladuobjev´ıtato funkce, vygeneruj´ıse vˇsechny jej´ı varianty s unik´atn´ım n´azvem. Um´ıst´ı se do kontejneru se vˇsemifunkcemi, identifikov´any jsou p˚uvodn´ımjm´enem. Kaˇzd´avarianta s kratˇs´ımseznamem argument˚um´astejn´etˇelofunkce, obsahuj´ıvol´an´ıdalˇs´ıfunkce v ˇretˇezci s do- plnˇen´ymargumentem. Pro zavol´an´ıspr´avn´evarianty funkce se provede porovn´an´ıpoˇctuargu- ment˚u,se kter´ymise funkce vol´a,s ´upln´ympoˇctem.Rozd´ıltˇechto dvou ˇc´ısel identifikuje jej´ıum´ıstˇen´ıv poli se vˇsemivariantami funkce.

28 5.11. Vkl´ad´an´ıskript˚u

5.11 Vkl´ad´an´ıskript˚u

Transpil´atorpr´avˇeted’ nepracuje s moˇznost´ıpˇrekl´adatvˇetˇs´ımnoˇzstv´ısou- bor˚u,cel´eadres´aˇre.V´yjimkou jsou soubory dostupn´epomoc´ıpˇr´ıkaz˚u require, require_once, include, include_once, ty se rovnˇeˇzpˇreloˇz´ı,aby vznikl jeden funkˇcn´ıskript. Mezi jednotliv´ymipˇr´ıkazyjsou v PHP rozd´ıly. Ty konˇc´ıc´ına _once lze vloˇzitjen jednou, pojmenovan´e require vyˇzaduj´ı,aby soubor existoval, jinak nastane chyba v pr˚ubˇehu spuˇstˇen´ehoskriptu. Protoˇzedoch´az´ıke kompilaci, probl´emy s neexistenc´ısouboru nemohou nastat. Hlavn´ımd˚uvodem, proˇcby mˇeloj´ıtnˇecovloˇzitjen jednou, je zamezen´ı redeklarac´ı.To ve pˇreveden´emskriptu nenastane, proto ke vˇsempˇr´ıpad˚um pˇristupujiidentick´ymzp˚usobem. Pouˇzit´ıtˇechto v´yraz˚uje pro transpilovan´y program aliasem pro vol´an´ıfunkce obsahuj´ıc´ıveˇsker´ekonstrukce nenach´azej´ıc´ı ve funkc´ı.Stejn´yzp˚usobzvolil projekt P9 (3.2). Oproti referenˇcn´ımu ˇreˇsen´ıse kontext neuchov´av´a,funkce m´aproto pˇr´ıstupjen ke glob´aln´ımpromˇenn´ym. Protoˇzese nepˇrekl´adaj´ıcel´eprojekty, jde o jedin´ysoubor, vkl´adan´yskript mus´ıb´ytjednoznaˇcnˇeidentifikov´anjednoduch´ymtextov´ymˇretˇezcem.Pokud se dan´ysoubor jeˇstˇenepˇreloˇzil,dojde k procesu transpilace. Se spr´avnoupo- sloupnost´ıtˇechto pˇr´ıkaz˚uproto m˚uˇze doj´ıtk tomu, ˇzese pˇreloˇz´ıcel´yadres´aˇr. V´ysledkem cel´ehopˇrekladuje jeden dalˇs´ı soubor, zvˇetˇsen´ı mnoˇziny funkc´ı kter´elze pouˇz´ıta poˇctuglob´aln´ıch promˇenn´ych. Pˇr´ıkazje nahrazen vol´an´ım funkce v dan´emsouboru reprezentuj´ıc´ı main, pˇr´ıkazymimo funkci. Vˇsechny soubory t´ımto zp˚usobem pˇreloˇzen´ebude moˇzn´espustit pomoc´ı star´ehon´azvu.Pokud se program spust´ı jako server, bude skript spuˇstˇen stejn´ymzp˚usobem jak´ymse chov´ainterpret PHP.

5.12 SQL

Pˇrev´adˇen´ıSQL dotaz˚ubylo prov´adˇenovlastn´ım,specifick´ymzp˚usobem, a do transpil´atoruto tak pˇrineslovelk´emnoˇzstv´ıˇr´ıd´ıc´ıch konstrukc´ızab´yvaj´ıc´ıse jen touto problematikou. Jde o prvn´ıpˇr´ıpad, kdy se do k´odupˇrid´av´avlastn´ı anonymn´ıstruktura, jej´ıdefinice se z´ısk´av´az koment´aˇr˚uum´ıstˇen´ych v k´odu. Protoˇzese ve vˇsech pˇr´ıpadech tato nov´astruktura deklaruje, je zak´az´anodo ni pˇriˇrazovat jin´ydatov´ytyp a redeklarovat v r´amcibloku. Vˇsechny pˇr´ıpady nejsou oˇsetˇren´e,m˚uˇzeto proto v´estv chyb´amv kompilaci v´ysledn´ehotranspi- lovan´ehoprogramu. Tvoˇren´ıspojen´ıs datab´az´ıse prov´ad´ıv PHP ve dvou kroc´ıch – nejdˇr´ıve se zadaj´ıpˇrihlaˇsovac´ı´udaje, pak se vybere tabulka. Toto chov´an´ınelze do Go pˇrev´est,protoˇzeobˇeakce se prov´adˇej´ınajednou a tvoˇr´ıse mnoˇzinapˇripojen´ı. Datab´azov´epˇripojen´ıse reprezentuje strukturou ve vlastn´ıknihovnˇe.Prvn´ı funkce mysqli_connect se pˇreloˇz´ıjako konstruktor struktury, aˇzpˇriv´ybˇeru

29 5. Realizace

$link = mysqli_connect("localhost", "root", ""); mysqli_select_db($link, "test");

$r = mysqli_query($link, "SELECT * FROM ‘table‘"); /** @var $a array{id: int, data: string} */ while ($a = mysqli_fetch_array($r, MYSQLI_ASSOC)) { echo "$a[id]: $a[data]"; }

Obr´azek5.2: SQL pˇripojen´ıv PHP s definovan´ymn´avratov´ymtypem tabulky se vytvoˇr´ıdatab´azov´epˇripojen´ı.Po kaˇzd´emv´ybˇerutabulky se nav´ıc zavol´afunkce uzav´ıraj´ıc´ıpˇripojen´ı. Chov´an´ıpˇripojen´ıje podobn´etomu v PHP, jen se vol´an´ıfunkc´ıpˇrev´ad´ı do podoby metody, prvn´ım argumentem bude identifik´atorpˇripojen´ı nebo v´ysledkydotazu. Pro z´ısk´an´ıˇr´adk˚uz SQL dotazu jsem ve vˇsech pˇr´ıpadech pouˇz´ıval jednu z funkc´ı,jej´ıˇzvol´an´ıv´ysledky, dokud jsou, vrac´ıjako asociativn´ı pole. Podporuje i jin´en´avratov´etypy, podporuje se ale jen jedna podoba. Pokud jiˇzv´ysledekˇz´adn´ez´aznamy neobsahuje, vrac´ıse jen bin´arn´ıhod- nota. Pro dynamicky typovan´yjazyk jin´ydruh n´avratov´ehotypu nezp˚usobuje ˇz´adn´yprobl´em,zde tento postup nejde pouˇz´ıt.Pro zjiˇstˇen´ı,zda dotaz jeˇstˇeob- sahuje nˇejak´edalˇs´ıv´ysledky, se proto pouˇz´ıv´ajin´ametoda. Pokud se metoda vracej´ıc´ıv´ysledekz SQL objev´ıv podm´ınk´ach co vyˇzaduj´ıbin´arn´ıhodnotu, pouˇzijese m´ısto tohoto v´yrazuspecializovan´ametoda pro tento ´uˇcel.Metoda se pˇresunedo tˇelaˇr´ıd´ıc´ıkonstrukce. Aby transpil´atormˇel´uplnoukontrolu nad vracen´ymv´ysledkem, mus´ıse n´avratov´etypy SQL dotazu nˇekdedefinovat. Jde o jedin´ybod v pˇrekladu, kter´ynelze vyˇreˇsitjinak neˇzpˇrips´an´ımpomocn´ych fr´az´ıdo p˚uvodn´ıhoskriptu. Pro tento ´uˇcelse pouˇzij´ıkoment´aˇre,s bˇeˇznoustrukturou jak´aje vidˇetu definic promˇenn´ych ve tˇr´ıd´ach 5.2. Tento z´apisse pˇrevede na definici promˇenn´ea ta se bude moci d´alepouˇz´ıtpro z´ısk´an´ıhodnot z dotazu. Pokud je typ promˇenn´e pole, pˇrevede se do podoby anonymn´ıstruktury. Protoˇzese pouˇz´ıv´aextern´ı knihovny, n´azvypromˇenn´ych se tu pˇrev´adˇej´ıdo takov´epodoby, aby byly vidi- teln´ez kaˇzd´ehobal´ıˇcku.V Go funkce a promˇenn´ezaˇc´ınaj´ıc´ıvelk´ymp´ısmenem jsou aliasem pro kl´ıˇcov´eslovo public z jin´ych programovac´ıch jazyk˚u. Na zdrojov´yskript zde nen´ıpoˇzadavek na pojmenov´av´an´ıkl´ıˇc˚uasociativn´ıhopole velk´ymp´ısmenem,k tomuto pˇrevodu bude doch´azetbˇehemtranspilace. Zadefinovan´apromˇenn´abude d´alepouˇz´ıv´anapro z´ısk´av´an´ıdat. Bal´ıˇcek sqlx“ pomoc´ıreflexe v´ysledekum´ıst´ıdo pˇredan´estruktury [38]. ” Koment´aˇrese daj´ıpouˇz´ıti pro definici jin´ych datov´ych typ˚u.D´ıkytomu bude jednoduˇsˇs´ıˇreˇsitrozsah platnosti promˇenn´ych u podm´ınek.

30 5.13. Generov´an´ık´odu

5.13 Generov´an´ık´odu

Kaˇzd´yprvek, kter´yvznikne bˇehemtranspilace, lze nˇejak´ymzp˚usobem vypsat. Ve vˇetˇsinˇepˇr´ıpad˚ujde o postup pˇr´ımoˇcar´y,neovlivnˇen´ykontextem, kter´yse vyˇreˇs´ıaˇzpo cel´emprocesu zpracov´an´ızdrojov´ehoskriptu. Existuj´ızde tˇridruhy uzl˚uv abstraktn´ımsyntaktick´emstromu, jej´ıˇzpo- doba se v pr˚ubˇehu transpilace m˚uˇzemˇenit. Prvn´ımz nich je promˇenn´a.Jej´ıv´ypisje z´avisl´yzp˚usobujej´ıhopouˇz´ıv´an´ı. Pokud v pr˚ubˇehu transpilace bude zmˇenˇenjej´ıtyp, dojde k pˇrevodu na gene- rick´y interface{}, jej´ıpouˇz´ıv´an´ıbude nav´ıcobsahovat pˇretypov´an´ına jasnˇe definovan´ytyp kter´ypromˇenn´av dan´ymoment obsahuje. Dalˇs´ıje funkce, jej´ıˇzvzhled je ovlivnˇempouˇz´ıvan´ymiprostˇredky. Ke zmˇenˇe pˇredpisunedojde tehdy, pokud nepouˇz´ıv´aglob´aln´ı promˇenn´ea bude proto tˇrebaji zmˇenitna metodu. Pokud se skript pˇrev´ad´ı do serverov´epodoby, i v´ypisyzp˚usob´ı,ˇzebude vyˇzadov´anglob´aln´ıkontext. Uzlem pracuj´ıc´ına nejvˇetˇs´ı´urovni abstrakce je inkrementace a dekremen- tace. Pokud je promˇenn´adefinovan´ajako ˇc´ıseln´ydatov´ytyp, vzhled je stejn´y jako u jin´ych programovac´ıch jazyk˚u.Pokud se pracuje s nezn´am´ymdatov´ym typem, pouˇzijese pˇriˇrazen´ı, u kter´ehonenast´av´aprobl´ems pˇretypov´an´ım. Pokud je promˇenn´atextov´ymˇretˇezcem,pouˇzijese rovnˇeˇzpˇriˇrazen´ı,ale m´ısto sˇc´ıt´an´ıse pouˇzijespecializovan´afunkce z m´estandardn´ıknihovny urˇcen´apro tento datov´ytyp. Jde o jeden ze dvou uzl˚u,jehoˇztextov´apodoba m˚uˇzei po ´uspˇeˇsn´etranspilace zp˚usobit,ˇzek´odnebude funkˇcn´ı.Prvn´ımz nich je vol´an´ı funkce pracuj´ıc´ıs argumentem pˇred´avan´ymreferenc´ı.

5.14 Testov´an´ıa porovn´av´an´ıv´ykonu

Tato sekce se bude zab´yvat testov´an´ım chov´an´ı transpil´atorua kontrolou v´ystupu.D´alese bude zkoumat jeho v´ykonnost v porovn´av´an´ı s ˇreˇsen´ım v p˚uvodn´ım jazyce.

5.14.1 Testov´an´ı Testov´an´ı se prov´ad´ı na tˇrech ´urovn´ıch. Na prvn´ı z nich se prov´ad´ı jedno- duch´ekontroly zda se vytv´aˇr´ıvˇsechny logick´eprvky pouˇz´ıvan´ev kompil´atoru spr´avnˇe,nastaven´ırodiˇc˚u,spr´avn´ypoˇcetpromˇenn´ych v pr´azdn´emprojektu a tak podobnˇe. Dalˇs´ıkontrola se zab´yv´akontrolou v´ystupu z programu. Jde o textov´epo- rovn´av´an´ıv´ystupuz kompil´atoru a oˇcek´avan´ymv´ystupem. To pomohlo odha- lit komplikovanˇejˇs´ıkonstrukce, pro kter´eje porovn´av´an´ına ´urovni prvk˚upˇr´ıliˇs komplikovan´e.T´ımto zp˚usobem se odhalovaly probl´emy spojen´es vyj´ıman´ım promˇenn´ych aby splˇnovaly blokov´edeklarace. Oba zp˚usoby v´yˇse se nezab´yvaly v´ystupem transpilovan´ehoprogramu. Pro to slouˇz´ıposledn´ızp˚usob,kter´yse skl´ad´aze tˇr´ıd´ılˇc´ıch ˇcinnost´ı.Prvn´ı

31 5. Realizace

$start = microtime(true);

$c = 0; for ($i = 0; $i < 10; $i++) { for ($j = 0; $j < 32000; $j++) { for ($k = 0; $k < 32000; $k++) { $c++; if ($c > 50) { $c = 0; } } } }

$end = microtime(true); $time = $end - $start; printf("Execution time of script = %f sec.\n", $time);

Obr´azek5.3: Skript pouˇzit´ypro porovn´av´an´ıˇcasu z nich spust´ıinterpretr PHP se zdrojov´ymsouborem a jeho v´ysledeksi uloˇz´ı pro pozdˇejˇs´ıporovn´av´an´ı.V dalˇs´ımkroku se soubor zpracuje transpil´atorem a spust´ıse i ten. Stejnˇejako u PHP, i zde se uloˇz´ıjeho v´ysledeka porovn´ase s v´ystupem zdroje. Porovn´av´an´ıje ˇcasovˇenejn´aroˇcnˇejˇs´ı,ale je schopn´eodha- lit velk´emnoˇzstv´ıprobl´em˚u,kter´epˇredchoz´ızp˚usoby nezvl´adlykv˚uliabsenci kompilace.

5.14.2 Porovn´av´an´ıv´ykonu Zkouˇsen´ı v´ykonnost´ı nov´ehoˇreˇsen´ı bylo prov´adˇenocelkem dvˇemazp˚usoby, liˇs´ıc´ıse zp˚usobem, jak´ymbyl program spuˇstˇen.Pro ˇcasovˇen´aroˇcn´eoperace se pouˇz´ıvalo konzolov´ehochov´an´ı,bez spouˇstˇen´ıserveru. Pro jednoduˇsˇs´ıvˇeci byl pouˇzitprogram Apache HTTP server benchmarking tool [39]. Ten pomohl odhalit probl´emy spojen´ese soubˇehemu glob´aln´ıch promˇenn´ych zm´ınˇen´ev 5.9. Protoˇze pro porovn´av´an´ı bˇeh˚uprogramu nen´ı jeden poˇc´ıtaˇc s velk´ym mnoˇzstv´ıjin´ych spuˇstˇen´ych proces˚udobr´ymtestovac´ımprostˇred´ım,spouˇstˇely se skripty, u kter´ych byla ˇcasov´an´aroˇcnostˇr´adovˇevyˇsˇs´ı,nemohlo proto j´ıt o jeden ˇspatn´ybˇehskriptu. Interpretovan´apodoba skriptu 5.3 trvala v pr˚umˇerusto ˇsedes´atsekund, transpilovan´averze je desetkr´atrychlejˇs´ı.U jin´ych test˚u,napˇr´ıkladcyklick´e pˇriˇrazov´an´ı do textov´ehoˇretˇezcenebo ˇrazen´ı pole, je pˇreveden´yskript po-

32 5.14. Testov´an´ıa porovn´av´an´ıv´ykonu malejˇs´ı.Probl´emy s asociativn´ımpolem lze vyˇreˇsitjejich lepˇs´ıimplementac´ı, nebo je v˚ubec nepouˇz´ıvat – adresov´an´ıtypick´epro mapy nen´ıvˇzdypouˇz´ıv´ano. Probl´emy spojen´es ˇretˇezciby byly ˇreˇsen´epodobn´ymzp˚usobem. Retˇezcejsouˇ v PHP editovateln´e,nevytv´aˇr´ıse kopie, proto pr´aces nimi v porovn´an´ıs na- ivn´ıimplementac´ıv Go tak rychl´a.S vˇetˇs´ıznalost´ık´oduby se m´ıstoˇretˇezc˚u mohly pouˇz´ıvat specializovan´estruktury, kter´ekopie nevytv´aˇr´ı.Jejich vyuˇzit´ı zp˚usob´ı,ˇzeskript se vykon´av podobn´em ˇcase,rozd´ılje zhruba desetiprocentn´ı ve prospˇech transpilovan´everze. Apache benchmarking tool byl pouˇzitpro ˇcasovˇem´enˇen´aroˇcn´eoperace, kde v´ystupem byla HTML str´anka.Pro jej´ıtvorbu se neprov´ad´ıvelk´emnoˇzstv´ı v´ypoˇct˚u.C´ılembylo vyzkouˇset,jak se server bude chovat pˇrizpracov´av´an´ı vˇetˇs´ıhomnoˇzstv´ıpoˇzadavk˚unajednou. Aby v´ysledkybyly pokud moˇznoco nejv´ıce izolovan´e,nepouˇz´ıv´ase datab´aze,pracuje se jen s GET parametry. Pr´aces t´ımto n´astrojem byla zkomplikov´anarozd´ıln´ymchov´an´ımserver˚upˇri zahlcen´ıpoˇzadavky. Transpilovan´averze poˇzadavky odm´ıt´a,integrovan´yPHP server zpracov´av´avˇsechny, coˇzvedlo k neporovnateln´ymv´ysledk˚um. Pro porovn´av´an´ıse pouˇzilskript, kter´yvyp´ıˇsedo tabulky GET parame- try, kl´ıˇci hodnotu. K vyˇreˇsen´ı tohoto probl´emu byla pouˇzitvlastn´ı defi- nice asociativn´ıhopole a cyklus, tud´ıˇzvlastn´ıˇreˇsen´ıv nˇejak´eomezen´em´ıˇre ovlivˇnujev´ysledn´yˇcas.Pokud se synchronnˇespust´ısto tis´ıcpoˇzadavk˚u,ˇcasy jsou obdobn´e.Pokud bude poˇzadavk˚uparalelnˇepades´at,ˇcasje dvakr´atlepˇs´ı u transpilovan´everze.

33

Z´avˇer

C´ılembylo pˇrev´estvybranou mnoˇzinu konstrukc´ınach´azej´ıc´ıse v jazyce PHP a pˇrev´estje do jazyka Go tak, aby se nezmˇenilv´ysledek.K optimalizac´ım nedoch´azelo,struktura programu z˚ustalapokud moˇzno co nejv´ıcepodobn´a p˚uvodn´ımu skriptu. Vˇsechny funkcionality bˇeˇzn´epro staticky typovan´yjazyk byly pˇrevedeny, zkompilovan´yprogram pˇripom´ın´achov´an´ıinterpretu PHP. Vˇetˇsinadynamic- k´ehochov´an´ıje zak´az´ana,nelze proto napˇr´ıkladdefinovat funkce v pr˚ubˇehu programu nebo pouˇz´ıvat promˇennoupromˇenn´ych“. Hodnota null v pˇreve- ” den´emjazyce neexistuje, pˇredpokl´ad´ase, ˇzeje vˇsedefinovan´e.Ze stejn´eho d˚uvodu jde funkce isset a unset pouˇz´ıvat jen u pol´ı.Vkl´ad´an´ıskript˚ulze prov´adˇetkdekoli, mus´ım´ıtale podobu jednoduch´ehotextov´ehoˇretˇezce,aby doˇslok pˇreloˇzen´ı.U promˇenn´ych se vyˇzadujejednoznaˇcn´eurˇcen´ıdatov´eho typu, jinak transpilace konˇc´ıne´uspˇechem. Serverov´echov´an´ım´azjednoduˇsen´y pˇr´ıstupke GET parametr˚um,kaˇzd´yz nich bude jednoduch´ymtextov´ymˇretˇez- cem, nep˚ujdeo pole, jak k tomu m˚uˇzepˇrispr´avn´empojmenov´an´ıkl´ıˇcedoj´ıt. Lze transpilovat SQL pˇripojen´ı, coˇzje jeden z bod˚u,co do z´akladn´ıch konstrukc´ınepatˇr´ı,jde o rozˇsiˇruj´ıc´ıknihovnu pro interpretr. K implementaci doˇslo,aby bylo moˇzn´ekompletnˇepˇrev´estjiˇzexistuj´ıc´ıprojekt. U nˇekter´ych aplikac´ı dojde aˇzk desetin´asobn´emu zrychlen´ı. Projekt je pˇripraven na pˇrid´av´an´ıdalˇs´ıch funkc´ıobsaˇzen´ych v PHP, kter´ejeˇstˇenejsou implementovan´e. Pˇreveden´yzdrojov´yk´odumoˇzˇnujeodhalit konstrukce, kter´ese daj´ıop- timalizovat. Mezi ty hlavn´ı patˇr´ı datab´azov´epˇripojen´ı, kter´elze v c´ılov´em jazyce ve vˇetˇsinˇepˇr´ıpad˚uprov´estjen jednou. Byla pops´anahistorie PHP a jeho v´yvoj. Byly zm´ınˇeny zp˚usoby, jak´ymi lze interpretovan´yjazyk zrychlit. Popsaly se projekty zab´yvaj´ıc´ıse touto pro- blematikou. Pˇredimplementac´ıtranspil´atorudoˇslok popisu jeho konstrukce. Pr´acese d´alem˚uˇzevyv´ıjetnˇekolika smˇery. Hlavn´ımc´ılembude rozˇs´ıˇrit moˇznostipˇrekladu,ted’ se zcela ignoruj´ıjmenn´eprostory, ve standardn´ıkni- hovnˇenejsou funkce pro autentifikaci. D´alechyb´ıpˇrekladtˇr´ıd.V´ysledn´yk´od

35 Zav´ erˇ nimi pracuje, neum´ıje ale zpracovat. Dalˇs´ımzp˚usobem jak projekt upravit, je pˇrid´an´ıdalˇs´ıhoc´ılov´ehojazyka. Pr´avˇeted’ na to transpil´atornen´ıv˚ubec pˇripraven, pˇredt´ımto krokem bude nutn´eprov´est´upravu ve v´ypisua vnitˇrn´ı reprezentaci zdrojov´ehok´odu.

36 Bibliografie

1. BERNERS-LEE, Tim. HyperText and CERN [online]. 1989 [cit. 2020-05- 01]. Dostupn´ez: https://www.w3.org/Administration/HTandCERN. txt. 2. W3C. STANDARDS [online] [cit. 2020-03-29]. Dostupn´ez: https:// www.w3.org/standards. 3. SUPERCOMPUTING APPLICATIONS (NCSA) AT THE UNIVER- SITY OF ILLINOIS, National Center for. NCSA MOSAIC™ [online] [cit. 2020-04-23]. Dostupn´e z: http : / / www . ncsa . illinois . edu / enabling/mosaic. 4. D. ROBINSON, K. Coar. The Common Gateway Interface (CGI) Ver- sion 1.1 [online]. RFC Editor, 2004 [cit. 2020-04-23]. Dostupn´ez DOI: 10.17487/RFC3875. RFC. RFC Editor. 5. LERDORF, Rasmus. 25 Years of PHP (by the Creator of PHP) [online]. 2019 [cit. 2020-04-23]. Dostupn´ez: https://www.youtube.com/watch? v=wCZ5TJCBWMg. 6. KOSEK, Jiˇr´ı. 1. Uvod.´ In: PHP – tvorba interaktivn´ıchinternetov´ych aplikac´ı [online]. 1999, s. 17–22 [cit. 2020-04-23]. ISSN 80-7169-373-1. Do- stupn´ez: https://www.kosek.cz/php/php-tvorba-interaktivnich- internetovych-aplikaci.pdf. 7. INTERNATIONAL, ECMA. I.6 Overview of the Common Language In- frastructure. In: Standard ECMA-335 - Common Language Infrastructure (CLI) [online]. 2010 [cit. 2020-04-23]. Dostupn´ez: http://www.ecma- international.org/publications/standards/Ecma-335.htm. 8. (CLR) overview. In: Docs [on- line]. 2019 [cit. 2020-04-20]. Dostupn´ez: https://docs.microsoft. com/en-us/dotnet/standard/clr.

37 Bibliografie

9. LOVEMAN, David B. Program Improvement by Source-to-Source Trans- formation. J. ACM. 1977, roˇc.24, ˇc.1, s. 121–125. ISSN 0004-5411. Do- stupn´ez DOI: 10.1145/321992.322000. 10. Introduction. In: Trustworthy [online]. John Wiley & Sons, Ltd, 2010, kap. 1, s. 4 [cit. 2020-04-17]. ISBN 9780470593387. Dostupn´ez: https://onlinelibrary.wiley.com/doi/pdf/10.1002/9780470593387. 11. ZHAO, Haiping et al. The HipHop Compiler for PHP. SIGPLAN Not. [online]. 2012, roˇc.47, ˇc.10, s. 575–586 [cit. 2020-04-15]. ISSN 0362-1340. Dostupn´ez DOI: 10.1145/2398857.2384658. 12. Trustworthy Optimizations. In: Trustworthy Compilers [online]. John Wiley & Sons, Ltd, 2010, kap. 6, s. 170–173 [cit. 2020-04-17]. ISBN 9780470593387. Dostupn´ez: https://onlinelibrary.wiley.com/doi/ pdf/10.1002/9780470593387. 13. Runtime, JIT, and AOT Compilation. In: Trustworthy Compilers [on- line]. John Wiley & Sons, Ltd, 2010, s. 203–211 [cit. 2020-04-17]. ISBN 9780470593387. Dostupn´ez: https://onlinelibrary.wiley.com/doi/ pdf/10.1002/9780470593387. 14. BENDA, Jan; MATOUSEK, Tomas; PROSEK, Ladislav. Phalanger: Com- piling and running PHP applications on the Microsoft .NET platform. .NET Technologies 2006 [online]. 2006, s. 31–38 [cit. 2020-04-15]. Do- stupn´ez: http://oot.zcu.cz/NET_2006/Papers_2006/!Proceedings_ Full_Papers_2006.pdf. 15. PHP 5 ChangeLog. In: PHP [online]. 2019 [cit. 2020-04-20]. Dostupn´ez: https://www.php.net/ChangeLog-5.php. 16. PEACHPIE. Use cases [online] [cit. 2020-04-23]. Dostupn´ez: https : //www.peachpie.io/usecases. 17. SDK, The .NET Compiler Platform [online]. 2017 [cit. 2020-04-23]. Do- stupn´ez: https://docs.microsoft.com/en- us/dotnet/csharp/ roslyn-sdk. 18. TATSUBORI, Michiaki; TOZAWA, Akihiko; SUZUMURA, Toyotaro; TRENT, Scott; ONODERA, Tamiya. Evaluation of a Just-in-Time Com- piler Retrofitted for PHP. SIGPLAN Not. [online]. 2010, roˇc.45, ˇc.7, s. 121–132 [cit. 2020-04-23]. ISSN 0362-1340. Dostupn´ez DOI: 10.1145/ 1837854.1736015. 19. SLATTERY, Ed; TAYLOR, Judy. Get started with Project Zero and PHP. In: developerWorks [online]. 2007 [cit. 2020-04-17]. Dostupn´ez: https:/ /www.ibm.com /developerworks/web/ tutorials/wa- pz- php/wa-pz-php-pdf.pdf.

38 Bibliografie

20. NICHOLSON, Rob. Project Zero. In: international PHP 2007 conference [online]. 2007 [cit. 2020-04-17]. Dostupn´ez: https://www.ibm.com/ developerworks/collaboration/uploads/phpblog/zeroPHPforIPC. pdf. 21. quercus: php in java. In: Caucho [online] [cit. 2020-04-17]. Dostupn´ez: https://www.caucho.com/resin-3.1/doc/quercus.xtp. 22. RASMUS, Lerdorf. Rasmus’ Toys Blog. HipHop PHP - Nifty Trick? [on- line]. 2010 [cit. 2020-05-13]. Dostupn´ez: https://toys.lerdorf.com/ hiphop-php-nifty-trick. 23. ADAMS, Keith; EVANS, Jason; MAHER, Bertrand; OTTONI, Guilherme; PAROSKI, Andrew; SIMMERS, Brett; SMITH, Edwin; YAMAUCHI, Owen. The Hiphop Virtual Machine. SIGPLAN Not. [online]. 2014, roˇc.49, ˇc.10, s. 777–790 [cit. 2020-04-15]. ISSN 0362-1340. Dostupn´ez DOI: 10.1145/2714064.2660199. 24. Migrating from JavaScript. TypeScript [online]. 2020 [cit. 2020-05-13]. Dostupn´ez: https : / / www . typescriptlang . org / docs / handbook / migrating-from-javascript.html. 25. VERLAGUET, Julien; MENGHRAJANI, Alok. Hack: a new program- ming language for HHVM. In: Facebook Engineering [online]. 2014 [cit. 2020-04-17]. Dostupn´ez: https://engineering.fb.com/developer- tools/hack-a-new-programming-language-for-. 26. PHP, Differences from [online] [cit. 2020-04-17]. Dostupn´ez: https:// github.com/facebookarchive/hack-langspec/blob/master/spec/ 23-differences-from-php.md. 27. EXPRESSIONS; INCREMENTING, Operators: DECREMENTING [on- line] [cit. 2020-04-17]. Dostupn´ez: https://docs.hhvm.com/hack/ expressions-and-operators/incrementing-and-decrementing. 28. ARSENAULT, Cody. PHP 7 vs HHVM - Which One Should You Use? In: KeyCDN [online]. 2014 [cit. 2020-05-13]. Dostupn´ez: https://www. keycdn.com/blog/php-7-vs-hhvm. 29. EMMOTT, Fred. HHVM. Ending PHP Support, and The Future Of Hack [online]. 2018 [cit. 2020-05-13]. Dostupn´ez: https://hhvm.com/ blog/2018/09/12/end-of-php-support-future-of-hack.html. 30. STOGOV, Dmitry; SURASKI, Zeev. PHP RFC: JIT. In: PHP [online]. 2019 [cit. 2020-05-13]. Dostupn´ez: https://wiki.php.net/rfc/jit.

39 Bibliografie

31. AHO, Alfred V.; LAM, Monica S.; SETHI, Ravi; ULLMAN, Jeffrey D. 1. Introduction. In: Compilers: Principles, Techniques, and Tools (2nd Edition) [online]. USA: Addison-Wesley Longman Publishing Co., Inc., 2006, s. 1–23 [cit. 2020-04-12]. ISBN 0321486811. Dostupn´ez: http:// ce.sharif.edu/courses/94-95/1/ce414-2/resources/root/Text% 20Books/Compiler%20Design/Alfred%20V.%20Aho,%20Monica%20S. %20Lam,%20Ravi%20Sethi,%20Jeffrey%20D.%20Ullman-Compilers% 20-%20Principles,%20Techniques,%20and%20Tools-Pearson_Addison% 20Wesley%20(2006).pdf. 32. HOPCROFT, John E.; MOTWANI, Rajeev; ULLMAN, Jeffrey D. Intro- duction to automata theory, languages, and computation [online]. 3rd ed. Pearson/Addison Wesley, 2007 [cit. 2020-04-12]. ISBN 9780321455369. Dostupn´ez: http://ce.sharif.edu/courses/94- 95/1/ce414- 2/ resources/root/Text%20Books/Automata/John%20E.%20Hopcroft, %20Rajeev%20Motwani,%20Jeffrey%20D.%20Ullman-Introduction% 20to%20Automata%20Theory,%20Languages,%20and%20Computations- Prentice%20Hall%20(2006).pdf. 33. BARRETT, William A. Compiler Design [online]. 2000 [cit. 2020-04-12]. Dostupn´ez: http://citeseerx.ist.psu.edu/viewdoc/download? doi=10.1.1.462.9894&rep=rep1&type=pdf. 34. SLIZOV, Vadym. PHP Parser [software]. Dostupn´etak´ez: https:// github.com/z7zmey/php-parser. 35. MORRISON, Levi; WEINAND, Bob. PHP. PHP RFC: Arrow Functions [online]. 2014 [cit. 2020-05-13]. Dostupn´ez: https://wiki.php.net/ rfc/arrow_functions. 36. LANGUAGE, The Go Programming. The Go Programming Language Specification [online]. 2020 [cit. 2020-04-23]. Dostupn´ez: https://golang. org/ref/spec. 37. Arrays. PHP [online] [cit. 2020-05-18]. Dostupn´ez: https://www.php. net/manual/en/language.types.array.php. 38. MOIRON, Jason. sqlx [software]. Dostupn´etak´ez: https://github. com/jmoiron/sqlx. 39. APACHE. ab - Apache HTTP server benchmarking tool - Apache HTTP Server Version 2.4 [software]. Dostupn´etak´ez: https://httpd.apache. org/docs/2.4/programs/ab.html.

40 Prˇ´ıloha A

Seznam pouˇzit´ychzkratek

PHP PHP: Hypertext Preprocessor

AST Abstract syntax tree

JIT just-in-time

HPHPc HipHop compiler

HPHPi HipHop interpreter

HHVM HipHop Virtual Machine

HHBC HipHop bytecode

HHIR HipHop intermediate representation

WWW World Wide Web

SQL Structured Query Language

CGI Common Gateway Interface

CLI Common Language Infrastructure

NCSA National Center for Supercomputing Applications

41

Prˇ´ıloha B

Obsah pˇriloˇzen´ehoCD

/ thesis.pdf...... text pr´aceve form´atuPDF src thesis ...... zdrojov´aforma pr´aceve form´atuLATEX php2go...... zdrojov´ek´odyimplementace examples ...... pˇr´ıklady readme.md ...... popis jednotliv´ych pˇr´ıklad˚u cli server benchmark dist...... kompilovan´etranspil´atorypro r˚uzn´earchitektury

43