Transpilátor Z Jazyka PHP Do Jazyka Go Student: Lukáš Simulík Vedoucí: Ing
Total Page:16
File Type:pdf, Size:1020Kb
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 compiler 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.