Za´padoˇceska´ univerzita v Plzni Fakulta aplikovany´ch vˇed Katedra informatiky a vy´poˇcetn´ı techniky
Diplomov´ a pr´ ace Optimalizace a rozˇ s´ıˇ ren´ı porovn´ av´ an´ı OSGi komponent
Plzeˇ n 2012
Zuzana Bureˇsov´a
Prohl´ aˇ sen´ı Prohlaˇsuji, ˇze jsem diplomovou pr´aci vypracovala samostatnˇe a v´ yhradnˇe s pouˇzit´ım citovan´ ych pramen˚ u. V Plzni dne 16. kvˇetna 2012 Zuzana Bureˇsov´a
Abstract The comparator of Java types and OSGi components, which was developed on the Department of Computer Science and Engineering of the University of West Bohemia, can check compatibility of OSGi components and prevent errors from running incompatible components in a component framework. There are many application opportunities of this functionality, but currently only a few superstructural tools are ready for real usage. The goal of this diploma thesis is to spread possibility of real usage of the comparator by two means. The first targets improving comparator usability on performance-limited devices by optimizations of its memory consumption and computation time. Secondly, the work aims at enhancing functionality of the superstructural tools to provide more benefits for users. The implemented enhancement allows manual component difference analysis by providing graphical presentation of the differences.
Obsah ´ 1 Uvod 1.1 V´ ychoz´ı stav . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.2 C´ıl projektu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1.3 Struˇcn´ y pˇrehled . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Komponenty 2.1 Koncept . . . . . . . . . . . . . . . . . . . . . . . . . . ´ 2.1.1 Uvod . . . . . . . . . . . . . . . . . . . . . . . 2.1.2 Komponenta . . . . . . . . . . . . . . . . . . . 2.1.3 Komponentov´ y model . . . . . . . . . . . . . . 2.1.4 Komponentov´ y framework . . . . . . . . . . . . 2.1.5 Probl´emy . . . . . . . . . . . . . . . . . . . . . 2.2 Technologie OSGi . . . . . . . . . . . . . . . . . . . . . 2.2.1 OSGi specifikace . . . . . . . . . . . . . . . . . 2.2.2 OSGi komponenta . . . . . . . . . . . . . . . . 2.2.3 OSGi framework . . . . . . . . . . . . . . . . . ˇ 2.2.4 Zivotn´ ı cyklus OSGi komponenty . . . . . . . . 2.2.5 Aktiv´ ator OSGi komponenty . . . . . . . . . . 2.2.6 Interakce mezi OSGi komponentami . . . . . . 2.3 S´emantick´e verzov´ an´ı a resolving v OSGi . . . . . . . 2.3.1 Resolving . . . . . . . . . . . . . . . . . . . . . 2.3.2 S´emantick´e verzov´an´ı . . . . . . . . . . . . . . 2.3.3 Probl´emy resolvingu a s´emantick´eho verzov´an´ı 2.3.4 Dalˇs´ı probl´emy resolvingu . . . . . . . . . . . .
1 1 2 2
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . .
4 4 4 4 5 6 6 6 6 7 8 9 10 10 10 10 11 11 12
3 Nahraditelnost komponent 3.1 Pouˇzit´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 V´ ysledky a smˇer v´ yzkumu na katedˇre . . . . . . . . . . . 3.2.1 Pouˇzit´ı kompar´atoru pˇri resolvingu . . . . . . . . . 3.2.2 Podpora pro bezpeˇcnou nahraditelnost komponent 3.2.3 Podpora pro spr´avn´e s´emantick´e verzov´an´ı . . . . 3.2.4 Dalˇs´ı n´ amˇety pro pouˇzit´ı kompar´atoru . . . . . . . 3.3 Teorie nahraditelnosti komponent . . . . . . . . . . . . . . 3.3.1 Relace subtypu mezi komponentami . . . . . . . . 3.3.2 Jak lze relaci subtypu zjistit . . . . . . . . . . . . . 3.3.3 Metody ovˇeˇren´ı nahraditelnosti . . . . . . . . . . . 3.4 Kompar´ atory Java tˇr´ıd a OSGi komponent . . . . . . . . 3.4.1 Projekty pro z´ısk´an´ı reprezentace . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
. . . . . . . . . . . .
13 13 13 13 14 14 15 15 15 16 16 16 17
. . . . . . . . . . . . . . . . . .
OBSAH
3.5
3.6
3.7
3.8
3.9
OBSAH
3.4.2 Projekty kompar´ator˚ u z´ıskan´e reprezentace 3.4.3 Z´ avislosti mezi projekty . . . . . . . . . . . 3.4.4 Dalˇs´ı projekty . . . . . . . . . . . . . . . . Architektura kompar´ ator˚ u . . . . . . . . . . . . . . 3.5.1 Reprezentace Java typ˚ u . . . . . . . . . . . 3.5.2 Architektura naˇc´ıt´an´ı reprezentace . . . . . 3.5.3 Architektura kompar´ator˚ u. . . . . . . . . . 3.5.4 Agregace v´ ysledku porovn´an´ı . . . . . . . . Probl´emy a n´ amˇety pro dalˇs´ı pr´aci . . . . . . . . . 3.6.1 Generick´e typy . . . . . . . . . . . . . . . . 3.6.2 Porovn´ av´ an´ı tˇr´ıd . . . . . . . . . . . . . . . 3.6.3 Ovˇeˇrov´ an´ı kompatibility dvou komponent . 3.6.4 Dalˇs´ı nedostatky . . . . . . . . . . . . . . . Implementovan´e opravy a vylepˇsen´ı . . . . . . . . . ´ 3.7.1 Upravy hierarchie Java typ˚ u . . . . . . . . 3.7.2 Pomoc pˇri thread-safety anal´ yze . . . . . . ´ 3.7.3 Upravy struktury v´ ysledk˚ u porovn´an´ı . . . 3.7.4 Vylepˇsen´ı algoritmu porovn´an´ı tˇr´ıd . . . . . Technologie a v´ yvojov´e n´astroje . . . . . . . . . . . 3.8.1 Java . . . . . . . . . . . . . . . . . . . . . . 3.8.2 OSGi . . . . . . . . . . . . . . . . . . . . . 3.8.3 Apache Maven . . . . . . . . . . . . . . . . 3.8.4 Assembla . . . . . . . . . . . . . . . . . . . 3.8.5 Hudson Continuous Integration . . . . . . . Zp˚ usob pr´ ace v t´ ymu . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . . . . . . . .
17 18 18 19 19 19 19 20 21 21 21 21 22 22 23 23 23 23 24 24 24 24 25 25 25
4 Vyuˇ zit´ı kompar´ ator˚ u na mal´ ych zaˇ r´ızen´ıch 27 4.1 Mal´ a zaˇr´ızen´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1.1 Android . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 4.1.2 Vyuˇzit´ı OSGi na platformˇe Android . . . . . . . . . . . . 27 4.1.3 Vyuˇzit´ı kompar´ator˚ u na platformˇe Android . . . . . . . . 28 4.2 Pˇredchoz´ı pr´ ace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 ´ 4.3 Ukol t´eto pr´ ace . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.3.1 Metodika . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 4.4 V´ ykonnostn´ı testy . . . . . . . . . . . . . . . . . . . . . . . . . . 29 ´ cel v´ 4.4.1 Uˇ ykonnostn´ıch test˚ u . . . . . . . . . . . . . . . . . . 29 4.4.2 Vytv´ aˇren´ı v´ ykonnostn´ıch test˚ u . . . . . . . . . . . . . . . 30 4.5 Anal´ yza k´ odu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31 4.5.1 N´ astroje pouˇzit´e pro anal´ yzu kompar´ator˚ u . . . . . . . . 31 4.6 Optimalizace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32 4.6.1 Mˇeˇren´ı efektu optimalizac´ı . . . . . . . . . . . . . . . . . . 32 ´ 4.6.2 Uroveˇ n optimalizace . . . . . . . . . . . . . . . . . . . . . 33 4.7 V´ ykonnost Java aplikac´ı . . . . . . . . . . . . . . . . . . . . . . . 33 4.7.1 Doba v´ ypoˇctu . . . . . . . . . . . . . . . . . . . . . . . . . 33 4.7.2 Spotˇreba pamˇeti . . . . . . . . . . . . . . . . . . . . . . . 34 4.7.3 Garbage kolektor . . . . . . . . . . . . . . . . . . . . . . . 35 4.8 Automatizovan´e metody mˇeˇren´ı v´ ykonnostn´ıch parametr˚ u Java aplikac´ı . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37 4.8.1 Metody mˇeˇren´ı doby v´ ypoˇctu . . . . . . . . . . . . . . . . 37 4.8.2 Metody mˇeˇren´ı spotˇreby pamˇeti . . . . . . . . . . . . . . 38 4
OBSAH
OBSAH
4.8.3 Jak ovl´ adat garbage kolektor . . . . . . . . . . . . . . Implementace mˇeˇren´ı v´ ykonnostn´ıch parametr˚ u kompar´atoru ´ cel implementace . . . . . . . . . . . . . . . . . . . . 4.9.1 Uˇ 4.9.2 V´ ystup testovac´ı aplikace . . . . . . . . . . . . . . . . 4.9.3 Architektura . . . . . . . . . . . . . . . . . . . . . . . 4.9.4 Popis nˇekter´ ych metod d˚ uleˇzit´ ych rozhran´ı . . . . . . 4.9.5 Implementace objekt˚ u typu Tester . . . . . . . . . . . 4.9.6 Implementace objekt˚ u typu PerfTestCase . . . . . . . 4.9.7 Implementace objekt˚ u typu ResultsGatherer . . . . . 4.9.8 Implementace ˇr´ıd´ıc´ıch objekt˚ u . . . . . . . . . . . . . 4.9.9 Pomocn´e tˇr´ıdy a knihovny . . . . . . . . . . . . . . . . 4.9.10 Integrace do Hudsonu . . . . . . . . . . . . . . . . . . 4.9.11 Ovˇeˇren´ı pˇresnosti mˇeˇren´ı . . . . . . . . . . . . . . . . 4.10 Proveden´e optimalizace . . . . . . . . . . . . . . . . . . . . . 4.10.1 Oprava logov´ an´ı . . . . . . . . . . . . . . . . . . . . . 4.10.2 Optimalizace algoritmu porovn´av´an´ı tˇr´ıd . . . . . . . 4.10.3 Optimalizace algoritmu porovn´an´ı seznamu metod . . 4.10.4 Celkov´ y efekt optimalizac´ı . . . . . . . . . . . . . . . . 4.11 Zhodnocen´ı v´ ysledk˚ u . . . . . . . . . . . . . . . . . . . . . . . 4.9
. . . . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . . . .
41 42 42 43 43 44 44 45 45 46 46 47 47 47 48 48 48 49 50
5 Vyuˇ zit´ı kompar´ ator˚ u pˇ ri anal´ yze rozd´ıl˚ u 5.1 C´ıle a pˇr´ınosy . . . . . . . . . . . . . . . . 5.1.1 Grafick´e zobrazen´ı rozd´ıl˚ u . . . . . 5.1.2 Dalˇs´ı moˇzn´e pouˇzit´ı v´ ystupu . . . 5.2 Projekt OBVS . . . . . . . . . . . . . . . 5.2.1 Architektura . . . . . . . . . . . . 5.2.2 Zp˚ usob integrace zobrazen´ı rozd´ıl˚ u 5.3 Technologie . . . . . . . . . . . . . . . . . 5.3.1 HTML . . . . . . . . . . . . . . . . 5.3.2 CSS . . . . . . . . . . . . . . . . . 5.3.3 Javascript . . . . . . . . . . . . . . 5.3.4 JQuery . . . . . . . . . . . . . . . 5.3.5 Treeview . . . . . . . . . . . . . . 5.4 Projekt prezentace rozd´ıl˚ u . . . . . . . . . 5.4.1 V´ ystupy . . . . . . . . . . . . . . . 5.4.2 Implementace . . . . . . . . . . . . 5.4.3 Moˇznosti rozˇs´ıˇren´ı . . . . . . . . . 5.5 Pˇr´ınosy a dalˇs´ı vyuˇzit´ı . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
. . . . . . . . . . . . . . . . .
51 51 51 51 52 52 53 54 54 54 54 55 56 56 56 58 59 61
6 Z´ avˇ er 6.1 Shrnut´ı pr´ ace . . . . . . . . . . . . . . . . 6.2 Pˇr´ınosy . . . . . . . . . . . . . . . . . . . 6.2.1 Pˇr´ınosy pro kompar´ator . . . . . . 6.2.2 Osobn´ı pˇr´ınosy . . . . . . . . . . . 6.3 N´ amˇety pro dalˇs´ı pr´ aci . . . . . . . . . . . 6.3.1 Optimalizace naˇc´ıt´an´ı reprezentace 6.3.2 Nov´e n´ astroje . . . . . . . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
. . . . . . .
62 62 62 62 63 63 63 63
5
´ 1 Uvod 1.1
V´ ychoz´ı stav
Koncept rozdˇelen´ı aplikace na v´ıce komponent, kter´e funguj´ı nez´avisle a komunikuj´ı vz´ ajemnˇe podle dan´ ych pravidel, se v posledn´ıch desetilet´ıch velmi rozˇs´ıˇril. D˚ uvodem je pˇredevˇs´ım vyˇsˇs´ı rychlost v´ yvoje aplikace sloˇzen´e z komponent. Komponenty, podobnˇe jako objektovˇe orientovan´ y pˇr´ıstup, pˇrisp´ıvaj´ı k lepˇs´ı organizaci k´ odu a zapouzdˇren´ı jednotliv´ ych funkˇcnost´ı. Obzvl´aˇst’ pro velk´e aplikace je tato dalˇs´ı u ´roveˇ n ˇclenˇen´ı v´ yhodou, d´ıky kter´e se k´od st´av´a ˇcitelnˇejˇs´ı a udrˇzovatelnˇejˇs´ı. Nejvˇetˇs´ıho urychlen´ı v´ yvoje aplikace lze dos´ahnout pouˇzit´ım jiˇz hotov´ ych ˇc´ ast´ı k´ odu. Pˇri volbˇe komponentov´eho pˇr´ıstupu lze vyuˇz´ıt hotov´ y komponentov´ y framework, kter´ y zajiˇst’uje komponent´am bˇehov´e prostˇred´ı a poskytuje mnoho uˇziteˇcn´ ych sluˇzeb. K dispozici je tak´e velk´e mnoˇzstv´ı hotov´ ych komponent, kter´e je moˇzn´e do aplikace snadno zaˇclenit. Novˇe naprogramovan´e komponenty bude moˇzn´e znovu pouˇz´ıt v budoucnu. V dneˇsn´ı dobˇe jsou n´ aroky na kvalitu aplikac´ı velmi vysok´e, proto je ned´ılnou souˇc´ ast´ı v´ yvojov´eho procesu testov´an´ı. D´ıky komponentov´emu pˇr´ıstupu lze testov´ an´ı v´ yraznˇe urychlit a zjednoduˇsit. Nen´ı nutn´e pˇri kaˇzd´e zmˇenˇe testovat celou aplikaci, ale pouze upravenou komponentu. Po otestov´an´ı komponenty samotn´e je ale nutn´e ovˇeˇrit tak´e jej´ı kompatibilitu s ostatn´ımi komponentami v syst´emu. Pokud by do syst´emu byla vloˇzena nekompatibiln´ı komponenta, hroz´ı p´ ad cel´e aplikace. Proto je riskantn´ı nahradit komponentu za bˇehu syst´emu, aˇckoliv to nˇekter´e komponentov´e frameworky umoˇzn ˇuj´ı. Na Katedˇre informatiky a v´ ypoˇcetn´ı techniky Fakulty aplikovan´ ych vˇed Z´apadoˇcesk´e univerzity v Plzni prob´ıh´a v´ yvoj n´astroj˚ u, kter´e dok´aˇzou kompatibilitu komponent automaticky ovˇeˇrit. V´ yzkum je zamˇeˇren pˇredevˇs´ım na platformu OSGi (Open Services Gateway initiative). Ovˇeˇren´ı prob´ıh´a na z´akladˇe porovn´ an´ı kompletn´ıho rozhran´ı komponenty oproti rozhran´ı vyˇzadovan´emu, nebo oproti rozhran´ı nahrazovan´e komponenty. D´ıky tomu lze dos´ahnout vyˇsˇs´ı spolehlivosti, neˇz jak´e je dosaˇzeno testov´an´ım. Dalˇs´ı v´ yhodou je u ´spora ˇcasu na vytv´ aˇren´ı test˚ u. Tato metoda je tak´e vhodn´a k zajiˇstˇen´ı bezpeˇcn´eho nahrazen´ı komponenty za bˇehu syst´emu. N´ astroje vyv´ıjen´e v r´ amci v´ yzkumu na katedˇre lze rozdˇelit na kompar´ator typ˚ u jazyka Java (JaCC - Java Class Compatibility checker) a kompar´ator OSGi komponent (OBCC - OSGi Bundle Compatibility Checking toolset), kter´ y je nadstavbou n´ astroje JaCC. Kromˇe v´ yvoje tˇechto dvou z´akladn´ıch n´astroj˚ u, kter´e se pouˇz´ıvaj´ı ve formˇe knihoven, se dalˇs´ı v´ yzkumn´e projekty zamˇeˇruj´ı tak´e na jejich re´ aln´e vyuˇzit´ı. Pˇr´ıkladem je n´astroj pro automatick´e verzov´an´ı OSGi komponent nebo integrace kontroly kompatibility do frameworku Apache Felix.
1
´ Uvod
1.2
C´ıl projektu
C´ıl projektu
C´ılem projektu je rozˇs´ıˇrit moˇznosti re´aln´eho vyuˇzit´ı kompar´ator˚ u. K tomu byly zvoleny dva smˇery. Prvn´ım je vyuˇzit´ı kompar´atoru na v´ ykonovˇe omezen´ ych (napˇr. mobiln´ıch) zaˇr´ızen´ıch. Druh´ y smˇer se zamˇeˇruje na rozˇs´ıˇren´ı funkˇcnosti aplikaˇcn´ıch n´ astroj˚ u, d´ıky kter´emu se zv´ yˇs´ı pˇr´ınosy a rozsah moˇzn´eho pouˇzit´ı n´ astroj˚ u pro uˇzivatele. Sloˇzitost aplikac´ı pro mal´ a (mobiln´ı) zaˇr´ızen´ı st´ale roste, proto se i zde dobˇre uplatˇ nuje komponentov´ y pˇr´ıstup. V´ ykonnost tˇechto zaˇr´ızen´ı je ale niˇzˇs´ı neˇz v´ ykonnost bˇeˇzn´ ych poˇc´ıtaˇc˚ u. Aplikace pro mal´a zaˇr´ızen´ı proto mus´ı hospodaˇrit u ´spornˇe s pamˇet´ı, kter´e b´ yv´ a na takov´ ych zaˇr´ızen´ıch m´alo, a pro zajiˇstˇen´ı dostateˇcnˇe rychl´e odezvy je potˇreba optimalizovat tak´e ˇcas v´ ypoˇctu. Prvn´ım u ´kolem t´eto pr´ ace je zmˇeˇrit v´ ykonnost kompar´ator˚ u, analyzovat moˇznosti optimalizac´ı a tyto optimalizace implementovat. Druh´ a ˇc´ ast pr´ ace se zab´ yv´a rozˇs´ıˇren´ım n´astroje pro automatick´e verzov´an´ı OSGi komponent o grafick´e zobrazen´ı rozd´ıl˚ u mezi p˚ uvodn´ı a novˇe verzovanou (upravenou) komponentou. V souˇcasn´e dobˇe nemus´ı b´ yt uˇzivateli jasn´e, z jak´eho d˚ uvodu je nutn´e konkr´etn´ı ˇc´ ast verze zv´ yˇsit. Po implementaci rozˇs´ıˇren´ı budou d˚ uvody jasnˇe patrn´e a snadno dohledateln´e. Uˇzivatel bude moci na prvn´ı pohled zhruba posoudit i kvantitu zmˇen. Zobrazen´ı rozd´ıl˚ u bude d´ale moˇzn´e vyuˇz´ıt i pro dalˇs´ı u ´ˇcely, napˇr´ıklad jako alternativa k n´astroji SVN diff. Kromˇe grafick´eho v´ ystupu uˇziteˇcn´eho pro ˇclovˇeka bude rozˇs´ıˇren´ı obsahovat tak´e strojovˇe ˇciteln´ y v´ ystup ve form´ atu XML.
1.3
Struˇ cn´ y pˇ rehled
V prvn´ı kapitole byly vysvˇetleny d˚ uvody a c´ıl pr´ace. Druh´ a kapitola shrnuje principy komponentov´eho pˇr´ıstupu v programov´an´ı a detailnˇeji se zamˇeˇruje na platformu OSGi. V z´avˇeru kapitoly jsou vysvˇetleny pˇr´ıˇciny nˇekter´ ych probl´em˚ u, kter´e sniˇzuj´ı pˇr´ınosy komponentov´eho pˇr´ıstupu. Tˇret´ı kapitola se zab´ yv´ a v´ yzkumem, kter´ y v´ yˇse popsan´e probl´emy ˇreˇs´ı. Konkr´etnˇe jsou pops´ any projekty kompar´ator˚ u vyv´ıjen´e na Katedˇre informatiky a v´ ypoˇcetn´ı techniky Fakulty aplikovan´ ych vˇed Z´apadoˇcesk´e univerzity v Plzni. Struˇcnˇe pˇredstavena je tak´e teorie nahraditelnosti komponent, ze kter´e projekty vych´ az´ı. Ve ˇctvrt´e kapitole je pops´ ana metodika v´ ykonnostn´ı anal´ yzy a testov´an´ı Java aplikac´ı. Na z´ akladˇe t´eto metodiky byla vytvoˇrena testovac´ı aplikace, kter´a velmi pˇresnˇe mˇeˇr´ı d˚ uleˇzit´e v´ ykonnostn´ı charakteristiky Java aplikace. Metodika a testovac´ı aplikace byly vyuˇzity bˇehem optimalizac´ı kompar´ator˚ u, kter´e jsou pops´ any v z´ avˇeru kapitoly. P´ at´ a kapitola popisuje rozˇs´ıˇren´ı n´astroje pro automatick´e verzov´an´ı OSGi komponent o grafick´e zobrazen´ı rozd´ıl˚ u mezi komponentami. 2
´ Uvod
Struˇcn´y pˇrehled
V z´ avˇeru jsou shrnuty dosaˇzen´e v´ ysledky a pˇr´ınosy pr´ace. D´ale jsou uvedeny tak´e n´ amˇety pro dalˇs´ı pr´ aci.
3
2 Komponenty 2.1 2.1.1
Koncept ´ Uvod
Jak jiˇz bylo ˇreˇceno v u ´vodu pr´ace, pouˇzit´ı komponent pˇri v´ yvoji software pˇrin´ aˇs´ı mnoho v´ yhod. V t´eto kapitole bude koncept komponent (Component-based software engineering, viz [11]) vysvˇetlen podrobnˇeji a budou rozebr´any tak´e jeho probl´emy. Komponentov´ y pˇr´ıstup je zaloˇzen na myˇslence, ˇze tvorba aplikace znamen´a skl´ ad´ an´ı aplikace z jednotliv´ ych nez´avisl´ ych komponent, kter´e jsou bud’ jiˇz hotov´e, nebo jejichˇz v´ yvoj m˚ uˇze prob´ıhat oddˇelenˇe. Ve skuteˇcnosti ale nen´ı moˇzn´e zajistit stoprocentn´ı nez´ avislost komponent. Komponenty mus´ı vz´ajemnˇe spolupracovat, ˇc´ asteˇcn´e nez´ avislosti se dociluje t´ım, ˇze jejich interakce jsou omezen´e. Komponenty mohou mezi sebou komunikovat pouze v r´amci pravidel dan´ ych komponentov´ ym modelem a prostˇrednictv´ım sv´eho rozhran´ı. Existuje mnoho komponentov´ ych model˚ u pro r˚ uzn´e programovac´ı jazyky. Komponentov´ y model standardizuje tvorbu komponent a d´ıky tomu je moˇzn´e pouˇz´ıvat komponenty r˚ uzn´ ych v´ yrobc˚ u. Pro v´ ybˇer konkr´etn´ıho modelu je d˚ uleˇzit´e, aby byl model dostateˇcnˇe obl´ıben´ y a t´ım p´adem bylo k dispozici velk´e mnoˇzstv´ı hotov´ ych komponent. Pouˇzit´ım hotov´ ych komponent se uspoˇr´ı velk´e mnoˇzstv´ı ˇcasu pˇri v´ yvoji a testov´an´ı software. S komponentov´ ym modelem z´ısk´ ame tak´e kvalitn´ı z´ aklad architektury aplikace. Implementac´ı modelu je komponentov´ y framework. Pro nˇekter´e modely je na v´ ybˇer i v´ıce framework˚ u (viz [20]). Program´ ator se tedy nemus´ı zab´ yvat bˇehov´ ym prostˇred´ım a ˇr´ızen´ım komponent, ale zamˇeˇr´ı se pouze na implementaci konkr´etn´ı komponenty.
2.1.2
Komponenta
Kaˇzd´ a komponenta by mˇela implementovat urˇcitou ucelenou funkˇcnost. Podle konceptu potom zmˇena funkˇcnosti aplikace znamen´a pˇrid´an´ı nebo nahrazen´ı nˇekter´e komponenty. Takto vytv´aˇren´e komponenty lze tak´e snadno nez´avisle testovat, protoˇze d´ıky ucelen´e funkˇcnosti jsou interakce s okol´ım minimalizov´any. Na obr´ azku 2.1 je zn´ azornˇen vztah komponenty, jej´ıho rozhran´ı, komponentov´eho modelu a frameworku. Komponenta mus´ı splˇ novat poˇzadavky komponentov´eho modelu. D´ıky tomu m˚ uˇze komponentov´ y framework komponenty ovl´ adat a zprostˇredkov´ avat jejich interakce. Tyto interakce se realizuj´ı pˇrev´aˇznˇe jako sluˇzby. Komponenta m˚ uˇze poskytovat sluˇzby ostatn´ım komponent´am a m˚ uˇze tak´e nˇejak´e sluˇzby vyˇzadovat. Z pohledu frameworku a ostatn´ıch komponent je komponenta pops´ana sv´ ym
4
Komponenty
Koncept
Obr´ azek 2.1: Vztah komponenty, jej´ıho rozhran´ı, komponentov´eho modelu a frameworku. Obr´ azek byl pˇrevzat z [11]
rozhran´ım a pˇr´ıpadnˇe mimofunkˇcn´ımi charakteristikami. Komponenty, kter´e ji vyuˇz´ıvaj´ı, teoreticky neznaj´ı implementaˇcn´ı detaily a nesm´ı se na nˇe spol´ehat. D´ıky tomu je komponenta nahraditeln´a. Ostatn´ı komponenty jsou z´avisl´e pouze na jej´ım rozhran´ı. Komponenta m˚ uˇze implementovat v´ıce r˚ uzn´ ych rozhran´ı. Pro svou funkˇcnost obvykle potˇrebuje sluˇzby jin´e komponenty, kter´a implementuje potˇrebn´e rozhran´ı. Propojen´ı komponent prob´ıh´a pouze na z´akladˇe poˇzadovan´eho rozhran´ı, klientsk´ a komponenta by nemˇela spol´ehat na propojen´ı s nˇejakou konkr´etn´ı komponentou. ˇ ım l´epe jsou splnˇeny popsan´e principy komponentov´eho pˇr´ıstupu, t´ım v´ıce C´ jsou vytvoˇren´e komponenty znovupouˇziteln´e.
2.1.3
Komponentov´ y model
Komponentov´ y model definuje typy komponent a moˇznosti jejich vz´ajemn´ ych interakc´ı a interakc´ı s frameworkem. Specifikace modelu obsahuje tak´e zp˚ usob z´ apisu rozhran´ı. To m˚ uˇze b´ yt pops´ano pomoc´ı programovac´ıho jazyka, speci´aln´ıho jazyka pro definici rozhran´ı (IDL – Interface Definition Language) nebo v jin´em form´ atu (napˇr. manifest v OSGi). Model urˇcuje, co je to komponenta a jak m´a b´ yt pˇripravena ke spuˇstˇen´ı ve frameworku. Komponentou m˚ uˇze b´ yt tˇr´ıda, objekt, bal´ık nebo jin´a ˇc´ast k´odu aplikace. Popis podoby komponenty mus´ı b´ yt dostateˇcnˇe pˇresn´ y, aby byl framework schopen komponentu spustit a d´ale s n´ı pracovat. Pro vz´ ajemnou interakci mezi komponentami definuje model zp˚ usob, jak komponenta m˚ uˇze nab´ıdnout sluˇzby ostatn´ım komponent´am a naopak jak m˚ uˇze z´ıskat sluˇzby od ostatn´ıch komponent. Pro interakci komponenty s frameworkem model specifikuje zp˚ usob spuˇstˇen´ı a n´asledn´eho ˇr´ızen´ı komponenty frameworkem a zp˚ usob vol´ an´ı sluˇzeb frameworku komponentou. 5
Komponenty
2.1.4
Technologie OSGi
Komponentov´ y framework
Komponentov´ y framework je bˇehov´e prostˇred´ı pro komponenty. Obvykle pˇredstavuje kostru aplikace a iniciuje jejich spuˇstˇen´ı po sv´em startu. Framework implementuje konkr´etn´ı komponentov´ y model a vyˇzaduje splnˇen´ı modelu jednotliv´ ymi komponentami. Pokud by komponenta nesplˇ novala model, framework by s n´ı neumˇel pracovat. Pro komponenty je framework nˇeco jako operaˇcn´ı syst´em pro aplikace. Podobnˇe jako operaˇcn´ı syst´em, framework spouˇst´ı nˇekter´e komponenty hned po sv´em startu, jin´e na pˇr´ıkaz uˇzivatele. Framework ˇr´ıd´ı ˇzivotn´ı cyklus komponent, poskytuje mechanismus pro jejich interakce a spravuje sd´ılen´e zdroje. Komponenty mohou volat sluˇzby frameworku, podobnˇe jako aplikace volaj´ı sluˇzby operaˇcn´ıho syst´emu.
2.1.5
Probl´ emy
Existence mnoha komponentov´ ych model˚ u omezuje znovupouˇzitelnost hotov´ ych komponent. Komponentu lze pouˇz´ıt pouze v aplikaci zaloˇzen´e na stejn´em modelu, pro jak´ y byla vytvoˇrena. Rozdrobenost komponent mezi jednotliv´e modely ztˇeˇzuje hled´ an´ı vhodn´e komponenty. Dalˇs´ım probl´emem je riziko nekompatibility po nahrazen´ı komponenty. Nekompatibilita m˚ uˇze v´est k neoˇcek´avan´e funkˇcnosti nebo aˇz k p´adu aplikace. Aby se pˇredeˇslo probl´em˚ um, je nutn´e po nahrazen´ı komponenty celou aplikaci testovat pomoc´ı integraˇcn´ıch test˚ u. Pokud maj´ı b´ yt tyto testy spolehliv´e, zabere jejich vytvoˇren´ı pˇr´ıliˇs mnoho ˇcasu a u ´spora ˇcasu d´ıky komponentov´emu pˇr´ıstupu se sniˇzuje. Nˇekter´e modely se probl´em snaˇz´ı ˇreˇsit pomoc´ı syst´emu verz´ı. Napˇr´ıklad v modelech DCE, CORBA a OSGi je pouˇzito s´emantick´e verzov´an´ı ve form´atu: major.minor.micro. Tento syst´em je ale nespolehliv´ y, protoˇze spr´avn´e urˇcen´ı poskytovan´e i vyˇzadovan´e verze je ponech´ano na program´atorovi. Z tˇechto d˚ uvod˚ u je nahrazen´ı komponenty bez n´asledn´ ych test˚ u nebo do konce za bˇehu syst´emu riskantn´ı.
2.2 2.2.1
Technologie OSGi OSGi specifikace
Technologie OSGi (Open Service Gateway initiative) je komponentov´ y model pro jazyk Java. O jej´ı v´ yvoj a propagaci se star´a skupina s n´azvem OSGi Alliance [9], kter´ a vznikla v roce 1999. Skupina poskytuje nejen specifikaci modelu, ale tak´e referenˇcn´ı implementaci. J´ adrem OSGi specifikace je OSGi framework. Jeho ˇc´asti jsou zobrazeny na 6
Komponenty
Technologie OSGi
obr´ azku 2.2.
Obr´ azek 2.2: Sch´ema OSGi frameworku. Obr´azek byl pˇrevzat z [9]
• Execution environment: specifikace bˇehov´eho prostˇred´ı. OSGi lze pouˇz´ıt na libovoln´e konfiguraci Java 2. • Modules: specifikace naˇc´ıt´an´ı tˇr´ıd (class loading). Pˇri bˇeˇzn´em naˇc´ıt´ an´ı tˇr´ıd v Javˇe existuje pouze jedin´ y prostor tˇr´ıd (classpath). V OSGi m´ a kaˇzd´ a komponenta sv˚ uj vlastn´ı prostor tˇr´ıd. D´ıky tomu je napˇr´ıklad moˇzn´e spustit v jedn´e aplikaci najednou dvˇe tˇr´ıdy se shodn´ ym n´ azvem. Oddˇelen´ım prostor˚ u tˇr´ıd se zajiˇst’uje tak´e izolovanost komponent a jejich bezpeˇcnost. • Life Cycle: specifikace ˇzivotn´ıho cyklu komponent. Komponenty v OSGi lze za bˇehu syst´emu instalovat, spustit, zastavit, obnovit a odinstalovat. Pomoc´ı API frameworku m˚ uˇze tyto operace prov´adˇet nˇekter´ a z komponent. • Service Registry: specifikace interakc´ı komponent pomoc´ı sluˇzeb. Komponenty mohou do syst´emu registrovat nab´ızen´e sluˇzby, po ˇcase je mohou opˇet odregistrovat. V registru sluˇzeb mohou tak´e vyhled´avat sluˇzby ostatn´ıch komponent. V OSGi je sluˇzba reprezentov´ana Java tˇr´ıdou.
2.2.2
OSGi komponenta
Komponenta se v terminologii OSGi naz´ yv´a bundle (viz [40]). Je to obyˇcejn´ y Java archiv (JAR), kter´ y mus´ı nav´ıc obsahovat manifest s popisem komponenty ve formˇe nˇekolika speci´ aln´ıch hlaviˇcek. Manifest komponenty je um´ıstˇen v JAR archivu na obvykl´e cestˇe: META-INF/MANIFEST.MF. Obsah souboru se skl´ ad´ a z jednotliv´ ych ˇr´ adek ve form´atu kl´ıˇc: hodnota“. V n´asleduj´ıc´ım seznamu ” uv´ ad´ım nˇekter´e typick´e hlaviˇcky OSGi manifestu: • Bundle-SymbolicName Tato hlaviˇcka je povinn´ a a ud´av´a n´azev komponenty, kter´ y se pouˇz´ıv´a jako identifik´ ator komponenty ve frameworku. Jako hodnota se obvykle pouˇz´ıv´ a reverzn´ı dom´enov´a notace, jako pro Java bal´ıky.
7
Komponenty
Technologie OSGi
• Bundle-Version Tato hlaviˇcka oznaˇcuje verzi komponenty. Pokud nen´ı specifikov´ana, pouˇzije se defaultn´ı hodnota 0.0.0 . • Bundle-Activator Plnˇe kvalifikovan´e jm´eno tˇr´ıdy, kter´a implementuje rozhran´ı BundleActivator. Aktiv´ ator komponenty je vol´an frameworkem pˇri startu a zastaven´ı komponenty. Jeho implementace nen´ı povinn´a. • Export-Package Seznam exportovan´ ych bal´ık˚ u. Tyto bal´ıky jsou viditeln´e pro ostatn´ı komponenty, kter´e si bal´ıky importuj´ı. Jm´ena bal´ık˚ u se oddˇeluj´ı ˇc´arkou a za jm´enem lze uv´est i verzi bal´ıku. Ta se uv´ad´ı za stˇredn´ık ve form´atu version=verze“. ” • Import-Package Seznam importovan´ ych bal´ık˚ u. Tyto bal´ıky komponenta potˇrebuje pro sv˚ uj bˇeh. Framework se pokus´ı bal´ıky importovat z jin´ ych komponent. Pokud se to nepovede, komponenta nem˚ uˇze b´ yt spuˇstˇena. Form´at z´apisu je stejn´ y jako pro hlaviˇcku Export-Package, ale kromˇe urˇcit´e verze bal´ıku lze uv´est i pˇr´ıpustn´ y rozsah verz´ı (v´ıce v [40]). • Require-Bundle Tuto hlaviˇcku lze pouˇz´ıt k importu vˇsech exportovan´ ych bal´ık˚ u konkr´etn´ı komponenty. Z´ aroveˇ n se vytv´aˇr´ı z´avislost na t´eto konkr´etn´ı komponentˇe (z´ avislost na implementaci). Jej´ı pouˇz´ıv´an´ı nen´ı doporuˇceno, protoˇze se t´ım poruˇsuj´ı z´ akladn´ı principy komponentov´eho pˇr´ıstupu. Pˇr´ıklad jednoduch´eho manifestu: Bundle - Name : Example bundle Bundle - SymbolicName : cz . zcu . kiv . obcc . exampleBundle Bundle - Version : 1.0.0. R123 Bundle - Activator : cz . zcu . kiv . obcc . exampleBundle . Activator Export - Package : cz . zcu . kiv . obcc . exampleBundle Import - Package : cz . zcu . kiv . obcc , org . slf4j . impl ;\ version ="[1.3.1 , 1.4.0)" Bundle - R e q u ir e d Ex e c ut i o nE n v i ro n m en t : JavaSE -1.6
Z uveden´eho manifestu lze vyˇc´ıst, ˇze n´azev komponenty ˇciteln´ y pro ˇclovˇeka je Example bundle“, ve frameworku je bundle identifikov´an n´azvem ” cz.zcu.kiv.obcc.exampleBundle“ a verz´ı 1.0.0.R123“. Komponenta obsahuje ” ” aktiv´ ator a exportuje bal´ık cz.zcu.kiv.obcc.exampleBundle“. Ke sv´emu fungo” v´ an´ı vyˇzaduje bal´ık cz.zcu.kiv.obcc“ v libovoln´e verzi a bal´ık org.slf4j.impl“ ” ” ve verzi vˇetˇs´ı nebo rovn´e 1.3.1 a menˇs´ı neˇz 1.4.0. Komponenta m˚ uˇze bˇeˇzet pouze v prostˇred´ı JavaSE-1.6.
2.2.3
OSGi framework
Pro technologii OSGi existuje mnoho r˚ uzn´ ych implementac´ı komponentov´eho frameworku. Nˇekter´e z nich splˇ nuj´ı OSGi specifikaci kompletnˇe, jin´e pouze z 8
Komponenty
Technologie OSGi
ˇc´ asti. Pˇr´ıklady OSGi framework˚ u: • Apache Felix [10] Open Source projekt, kter´ y se snaˇz´ı implementovat OSGi specifikaci verze 4. Nˇekter´e ˇc´ asti specifikace jeˇstˇe implementovan´e nejsou. • Eclipse Equinox [22] Tak´e Open Source projekt, kter´ y je integrovan´ y s v´ yvojov´ ym prostˇred´ım Eclipse. Splˇ nuje vˇsechny poˇzadavky OSGi specifikace verze 4 a vlastn´ı certifik´ at OSGi Alliance. Framework je typicky moˇzn´e ovl´adat pomoc´ı konzole (Felix, Equinox), nˇekter´e frameworky poskytuj´ı i grafick´e rozhran´ı (Knopflerfish [41]).
2.2.4
ˇ Zivotn´ ı cyklus OSGi komponenty
Po startu aplikace se nejprve rozbˇehne framework, kter´ y n´aslednˇe spust´ı jednotliv´e komponenty. Proces spouˇstˇen´ı komponent nen´ı trivi´aln´ı, komponenta ˇ proch´ az´ı postupnˇe f´ azemi installed, resolved, starting a active. Zivotn´ ı cyklus OSGi komponenty zobrazuje obr´azek 2.3.
ˇ Obr´ azek 2.3: Zivotn´ ı cyklus OSGi komponenty. Obr´azek byl pˇrevzat z Wikipedie. Ve f´ azi installed je komponenta naˇctena ve frameworku z disku. Jeˇstˇe ale nem˚ uˇze pracovat, protoˇze nem´a k dispozici poˇzadovan´e zdroje, definovan´e napˇr´ıklad pomoc´ı hlaviˇcky manifestu Require-Package. Framework mus´ı n´aslednˇe prov´est resolving, coˇz je zjednoduˇsenˇe ˇreˇceno proces prov´az´an´ı import˚ u a export˚ u. Pokud probˇehne resolving u ´spˇeˇsnˇe, dostane se komponenta do f´aze resolved. Nyn´ı jiˇz m´ a k dispozici vˇse, co potˇrebuje pro svou ˇcinnost. Framework ji m˚ uˇze zaˇc´ıt spouˇstˇet. T´ım se komponenta dost´av´a do f´aze starting, ve kter´e je
9
Komponenty
S´emantick´e verzov´ an´ı a resolving v OSGi
spuˇstˇena startovac´ı metoda jej´ıho aktiv´atoru (viz kapitola 2.2.5). Plnˇe spuˇstˇen´a komponenta se dostane do f´ aze active. Komponenta m˚ uˇze b´ yt tak´e zastavena nebo dokonce odinstalov´ana frameworkem nebo jinou komponentou. Bˇehem f´aze stopping je zavol´ana ukonˇcovac´ı metoda aktiv´ atoru a komponenta pˇrejde zpˇet do f´aze resolved. Odtud lze komponentu odinstalovat ze syst´emu (uninstalled).
2.2.5
Aktiv´ ator OSGi komponenty
OSGi komponenta m˚ uˇze obsahovat aktiv´ator, coˇz je tˇr´ıda implementuj´ıc´ı rozhran´ı org.osgi.framework.BundleActivator. Toto rozhran´ı naˇrizuje implementaci metod start a stop, kter´e jsou zavol´any frameworkem pˇri startu a zastavov´an´ı komponenty. Parametrem metod je objekt tˇr´ıdy org.osgi.framework.BundleContext, kter´ y umoˇzn ˇuje interakci komponenty s frameworkem. Plnˇe kvalifikovan´ y n´ azev tˇr´ıdy aktiv´atoru mus´ı b´ yt zaps´ana v manifestu v hlaviˇcce Bundle-Activator.
2.2.6
Interakce mezi OSGi komponentami
Komponenty mohou spolupracovat pomoc´ı sd´ılen´ı Java bal´ık˚ u, kter´e je realizov´ ano zejm´ena pomoc´ı hlaviˇcek manifestu Import-Package a Export-Package. Tˇr´ıdy z importovan´ ych bal´ık˚ u m˚ uˇze komponenta libovolnˇe pouˇz´ıvat. Volnˇejˇs´ı zp˚ usob spolupr´ ace je realizov´an pomoc´ı sluˇzeb. Komponenta m˚ uˇze nab´ızet r˚ uzn´e sluˇzby ostatn´ım komponent´am. Tyto sluˇzby jsou pˇredstavov´any Java objektem a do frameworku jsou registrov´any obvykle pod sv´ ym rozhran´ım, pˇr´ıpadnˇe i tˇr´ıdou. Ostatn´ı komponenty m˚ uˇzou sluˇzbu pomoc´ı tohoto rozhran´ı vyhledat. Registrace a z´ısk´ an´ı sluˇzeb m˚ uˇze prob´ıhat bud’ programovˇe, napˇr´ıklad v metodˇe start aktiv´ atoru komponenty, nebo pomoc´ı XML. Doporuˇcen´ ym zp˚ usobem je deklarace sluˇzeb v XML. Komponenta m˚ uˇze tak´e reagovat na ud´alosti registrace a deregistrace urˇcit´e sluˇzby. D´ıky tomu, ˇze je sluˇzba reprezentov´ana objektem Java tˇr´ıdy, nezp˚ usobuje jej´ı vyuˇz´ıv´ an´ı t´emˇeˇr ˇz´ adn´e reˇzijn´ı n´aklady.
2.3 2.3.1
S´ emantick´ e verzov´ an´ı a resolving v OSGi Resolving
Resolving je proces p´ arov´ an´ı zdroj˚ u poˇzadovan´ ych a poskytovan´ ych jednotliv´ ymi komponentami v syst´emu. Je potˇreba ho prov´est pˇred spuˇstˇen´ım komponent, aby komponenty mˇeli k dispozici veˇsker´e zdroje, kter´e potˇrebuj´ı pro svou
10
Komponenty
S´emantick´e verzov´ an´ı a resolving v OSGi
ˇcinnost. Resolving je u ´kolem frameworku, kter´ y vyhled´av´a pro kaˇzd´ y poˇzadavek nˇejak´ y vyhovuj´ıc´ı zdroj podle dan´ ych pravidel. V OSGi se typicky prov´ ad´ı prov´az´an´ı importovan´ ych a exportovan´ ych bal´ık˚ u. Poˇzadovan´ y bal´ık je vyhled´av´an podle n´azvu a verze, pokud je uvedena, pˇr´ıpadnˇe podle dalˇs´ıch atribut˚ u. Pˇri uveden´ı konkr´etn´ıho ˇc´ısla verze vyhovuje bal´ık s touto verz´ı nebo vyˇsˇs´ı. Verzi lze omezit tak´e na urˇcit´ y rozsah.
2.3.2
S´ emantick´ e verzov´ an´ı
Pravidla pro verzov´ an´ı OSGi komponent [8] jsou d´ana specifikac´ı. Verzov´an´ı se naz´ yv´ a s´emantick´e, protoˇze verze obsahuje nˇekolik sloˇzek s dan´ ym v´ yznamem a d˚ uleˇzitost´ı. Jej´ı form´ at je: major.minor.micro.qualifier“. Prvn´ı tˇri sloˇzky jsou ” ˇc´ısla, posledn´ı sloˇzka m˚ uˇze obsahovat i p´ısmena. D˚ uleˇzitost sloˇzek kles´a zleva doprava a libovoln´ y poˇcet sloˇzek zprava lze vynechat. V´ yznam jednotliv´ ych sloˇzek je n´ asleduj´ıc´ı: • major: sloˇzka s nejvyˇsˇs´ı d˚ uleˇzitost´ı. Jej´ı nav´ yˇsen´ı se prov´ad´ı vˇzdy, kdyˇz dojde k poruˇsen´ı zpˇetn´e kompatibility (napˇr´ıklad smaz´an´ım nebo zmˇenou metody, kter´ a je souˇc´ ast´ı API). Bal´ıky s r˚ uznou verz´ı ve sloˇzce major jsou zcela nekompatibiln´ı. • minor: sloˇzka se stˇredn´ı d˚ uleˇzitost´ı. Navyˇsuje se pˇri zmˇen´ach API, kter´e jsou zpˇetnˇe kompatibiln´ı (napˇr´ıklad pˇrid´an´ı nov´e metody do API). Vyˇzadovan´ y bal´ık je kompatibiln´ı s poskytovan´ ym bal´ıkem, pokud je major sloˇzka verze stejn´ a a minor sloˇzka poskytovan´eho bal´ıku vyˇsˇs´ı nebo rovna vyˇzadovan´emu. • micro: sloˇzka s nejniˇzˇs´ı d˚ uleˇzitost´ı. Jej´ı nav´ yˇsen´ı prob´ıh´a pˇri kaˇzd´em vyd´ an´ı komponenty, kdy nebylo zmˇenˇeno API, ale pouze vnitˇrn´ı implementace. Bal´ıky s verzemi liˇs´ıc´ımi se aˇz ve sloˇzce micro by mˇely b´ yt kompatibiln´ı. • qualifier: sloˇzka, kter´ a se nepouˇz´ıv´a k porovn´an´ı verz´ı, ale pouze k dalˇs´ımu upˇresnˇen´ı verze, napˇr´ıklad ˇc´ıslem SVN revize. Na kompatibilitu bal´ık˚ u by nemˇela m´ıt ˇz´ adn´ y vliv. Pokud dojde k nav´ yˇsen´ı nˇekter´e sloˇzky, vˇsechny m´enˇe d˚ uleˇzit´e sloˇzky kromˇe sloˇzky qualifier se vynuluj´ı.
2.3.3
Probl´ emy resolvingu a s´ emantick´ eho verzov´ an´ı
Framework vyb´ır´ a bal´ıky k prov´az´an´ı zejm´ena podle n´azvu a verze. Tyto informace uv´ ad´ı program´ ator v manifestu importuj´ıc´ı a exportuj´ıc´ı komponenty. Je tedy zodpovˇednost´ı program´atora, aby urˇcil verze spr´avnˇe. Probl´emem je, ˇze program´ ator obvykle mˇen´ı verze pouze na z´akladˇe pocit˚ u a domnˇenek, nemus´ı si uvˇedomit dopad nˇekter´ ych zmˇen k´odu na pˇr´ıpadnou zmˇenu v API. 11
Komponenty
S´emantick´e verzov´ an´ı a resolving v OSGi
D˚ usledkem jsou ˇcast´e chyby s´emantick´ ych verz´ı komponent a bal´ık˚ u. Tyto chyby mohou zp˚ usobit nekompatibilitu komponent, kter´e byly propojeny pˇri resolvingu. To m˚ uˇze v´est k neoˇcek´avan´e funkˇcnosti nebo aˇz k p´adu cel´e aplikace.
2.3.4
Dalˇ s´ı probl´ emy resolvingu
Framework mus´ı nˇekdy ˇreˇsit sloˇzit´e situace, kter´e maj´ı v´ıce moˇzn´ ych ˇreˇsen´ı. Program´ ator si nemus´ı vˇzdy uvˇedomit, jak´e probl´emy mohou tyto situace zp˚ usobit. Kaˇzd´ y framework m˚ uˇze nav´ıc tyto situace ˇreˇsit r˚ uznˇe. Jedn´a se napˇr´ıklad o pˇr´ıpad, kdy pro uspokojen´ı importu je k dispozici v´ıce komponent s odpov´ıdaj´ıc´ım exportem. Jin´e probl´emy mohou nastat, pokud je implementace bal´ıku rozdˇelena mezi v´ıce komponent. Dalˇs´ı nepˇr´ıjemn´e efekty mohou vznikat po aktualizaci nebo odinstalov´an´ı komponenty v bˇeˇz´ıc´ım frameworku. Pokud byly ostatn´ı komponenty na aktualizovanou komponentu nav´ az´any, tyto vazby se nepˇreruˇs´ı okamˇzitˇe. Ve frameworku m˚ uˇze proto nˇejakou dobu existovat star´a i nov´a verze komponenty z´ aroveˇ n. Star´e vazby budou vyuˇz´ıvat starou implementaci, novˇe vznikl´e vazby budou pouˇz´ıvat novou implementaci. To m˚ uˇze zp˚ usobit probl´emy kompatibility. Dalˇs´ım d˚ usledkem je, ˇze aktualizace komponenty se neprojev´ı ihned zmˇenou funkˇcnosti. Aktualizace nebo rozpojen´ı star´ ych vazeb se provede aˇz po aktualizaci cel´eho frameworku.
12
3 Nahraditelnost komponent 3.1
Pouˇ zit´ı
Nahrazovat komponentu v komponentov´e aplikaci je potˇreba z r˚ uzn´ ych d˚ uvod˚ u. ˇ Casto se napˇr´ıklad komponenta nahrazuje za u ´ˇcelem jej´ı aktualizace na novˇejˇs´ı verzi, nebo lze nahrazen´ım upravit funkˇcnost aplikace. V nˇekter´ ych pˇr´ıpadech m˚ uˇze b´ yt ˇz´adouc´ı nahradit komponentu bez pˇreruˇsen´ı bˇehu aplikace. Takov´ y pˇr´ıpad je serverov´a aplikace, kter´a mus´ı fungovat nepˇretrˇzitˇe. Aktualizace takov´e aplikace za bˇehu pˇrispˇeje k dodrˇzen´ı limit˚ u na odst´ avky. Je ovˇsem potˇreba, aby bylo nahrazen´ı bezpeˇcn´e, tj. aby v syst´emu nevznikla nekompatibilita a nedoˇslo k p´adu aplikace. Ovˇeˇren´ı, ˇze nahrazen´ı komponenty za jinou nezp˚ usob´ı probl´emy nebo dokonce p´ ad aplikace, se naz´ yv´ a nahraditelnost komponent. Komponenta je nahraditeln´ a za jinou komponentu, pokud je nov´a komponenta kompatibiln´ı s ostatn´ımi komponentami v syst´emu.
3.2
V´ ysledky a smˇ er v´ yzkumu na katedˇ re
Nahraditelnost´ı komponent se na Katedˇre informatiky a v´ ypoˇcetn´ı techniky Fakulty aplikovan´ ych vˇed Z´ apadoˇcesk´e univerzity v Plzni zab´ yv´a t´ ym pod vedeˇ n´ım Ing. MSc. Pˇremysla Brady, Ph.D. Pr´ace prob´ıhaj´ı v r´amci projekt˚ u GACR (Methods and models for consistency verification of advanced component-based applications, Methods of development and verification of component-based applications using natural language specifications). V r´ amci v´ yzkumu byl vytvoˇren kompar´ator typ˚ u jazyka Java (JaCC - Java Class Compatibility checker) a kompar´ator OSGi komponent (OBCC - OSGi Bundle Compatibility Checking toolset), kter´ y je nadstavbou n´astroje JaCC. Komponenty jsou porovn´ av´ any do hloubky aˇz na u ´roveˇ n metod a ˇclensk´ ych pol´ı Java tˇr´ıd.
3.2.1
Pouˇ zit´ı kompar´ atoru pˇ ri resolvingu
Kompar´ ator lze vyuˇz´ıt pˇri resolvingu v komponentov´em frameworku. Kompar´ator ovˇeˇr´ı kompatibilitu komponent, mezi kter´ ymi se m´a vytvoˇrit vazba. Pokud jsou tyto komponenty nekompatibiln´ı, prov´az´an´ı se v˚ ubec neprovede a aplikaci nebude moˇzn´e spustit. T´ım se chyba odhal´ı okamˇzitˇe a pˇredejde se neoˇcek´avan´ ym probl´em˚ um za bˇehu aplikace. Dalˇs´ı v´ yhodou je moˇznost pouˇzit´ı kompar´atoru pˇri v´ ybˇeru vhodn´e exportuj´ıc´ı komponenty, pokud z´ akladn´ı poˇzadavky (jm´eno, verze, dalˇs´ı atributy) spl13
Nahraditelnost komponent
V´ysledky a smˇer v´yzkumu na katedˇre
n ˇuje komponent v´ıce. V´ ybˇer je pomoc´ı kompar´atoru omezen pouze na kompatibiln´ı komponenty. Kompar´ ator byl jiˇz zkuˇsebnˇe integrov´an do frameworku Apache Felix v r´amci projektu Felix resolver integration (viz [18]). Dalˇs´ım n´amˇetem je rozˇs´ıˇren´ı frameworku o zobrazen´ı d˚ uvod˚ u, proˇc nelze komponenty prov´azat a spustit. Pro tento u ´ˇcel bude moˇzn´e pouˇz´ıt grafick´e zobrazen´ı rozd´ıl˚ u mezi komponentami, kter´e je souˇc´ ast´ı t´eto pr´ ace (kapitola 5).
3.2.2
Podpora pro bezpeˇ cnou nahraditelnost komponent
Dalˇs´ı moˇznost´ı vyuˇzit´ı kompar´atoru je kontrola kompatibility komponent jeˇstˇe pˇred jejich zaveden´ım do frameworku. Souˇc´ast´ı komponentov´e aplikace m˚ uˇze b´ yt komponenta, kter´ a umoˇzn ˇuje rozˇsiˇrov´an´ı a aktualizaci aplikace za bˇehu. Tato komponenta m˚ uˇze fungovat bud’ automaticky, nebo m˚ uˇze b´ yt ovl´ad´ana uˇzivatelem. Pˇred nasazen´ım vybran´e komponenty do frameworku lze vyuˇz´ıt kompar´ator ke kontrole kompatibility s ostatn´ımi komponentami ve frameworku. Kompatibilitu je moˇzn´e kontrolovat dokonce jeˇstˇe pˇred staˇzen´ım vybran´e komponenty z internetu. K tomuto u ´ˇcelu je pˇripravov´ano u ´loˇziˇstˇe komponent, kter´e pomoc´ı kompar´ atoru vytv´aˇr´ı a ukl´ad´a informace o kompatibilitˇe jednotliv´ ych komponent (viz [32]).
3.2.3
Podpora pro spr´ avn´ e s´ emantick´ e verzov´ an´ı
Dalˇs´ım smˇerem pro pouˇzit´ı kompar´atoru je zajiˇstˇen´ı spr´avn´eho s´emantick´eho verzov´ an´ı jednotliv´ ych komponent pˇri jejich vyd´an´ı. Komponentov´ y framework n´ aslednˇe spol´eh´ a standardnˇe jen na ˇc´ısla verz´ı. Pokud by byly spr´avnˇe verzov´any vˇsechny komponenty v syst´emu, probl´emy s kompatibilitou by nemˇely nastat. Aby se pˇredeˇslo chyb´ am, lze ponechat urˇcen´ı verze n´astroji pro automatick´e verzov´ an´ı. Webov´ y n´ astroj pro automatick´e verzov´an´ı je k dispozici na adrese http:// osgi.kiv.zcu.cz/ obvs/ index.html . Uˇzivatel do formul´aˇre zad´a dva soubory, komponentu v p˚ uvodn´ı verzi a upravenou komponentu k overzov´an´ı. N´ astroj pouˇzije kompar´ ator k porovn´an´ı komponent a podle v´ ysledku urˇc´ı verzi podle s´emantick´ ych pravidel pro novou komponentu. N´ astroj pro automatick´e verzov´an´ı lze pouˇz´ıvat tak´e jako plugin do mavenu (viz [35]). Kromˇe automatick´eho verzov´an´ı lze podpoˇrit volbu spr´avn´e verze tak´e pomoc´ı grafick´eho zobrazen´ı rozd´ıl˚ u mezi p˚ uvodn´ı a upravenou komponentou, kter´ ym se zab´ yv´ a kapitola 5 t´eto pr´ace. Grafick´a podoba rozd´ıl˚ u pom˚ uˇze ˇclovˇeku ke spr´ avn´emu urˇcen´ı verze nov´e komponenty.
14
Nahraditelnost komponent
3.2.4
Teorie nahraditelnosti komponent
Dalˇ s´ı n´ amˇ ety pro pouˇ zit´ı kompar´ atoru
Kompar´ ator by bylo moˇzn´e d´ ale vyuˇz´ıt k vyhled´av´an´ı vyhovuj´ıc´ı komponenty na internetu nebo v konkr´etn´ım u ´loˇziˇsti. Podobn´e ˇreˇsen´ı je prezentov´ano v [42]. Pomoc´ı dotazovac´ı komponenty je vyhled´av´ana jin´a komponenta, kter´a je s dotazovac´ı komponentou kompatibiln´ı (nebo t´emˇeˇr kompatibiln´ı). V souˇcasn´e dobˇe by bylo moˇzn´e kompar´ator vyuˇz´ıt pouze k vyhled´an´ı zcela kompatibiln´ıch komponent. N´ amˇetem do budoucna je rozˇs´ıˇren´ı v´ ysledku porovn´ an´ı komponent o kvantifikaci rozd´ıl˚ u. D´ıky tomu by bylo moˇzn´e vyhledan´e komponenty ˇradit podle m´ıry nekompatibility.
3.3
Teorie nahraditelnosti komponent
Aby bylo moˇzn´e urˇcit, zda je komponenta nahraditeln´a za jinou komponentu, je potˇreba definovat poˇzadavky nahraditelnosti. Obecnˇe lze ˇr´ıci, ˇze komponenta je nahraditeln´ a za jinou, pokud toto nahrazen´ı nezp˚ usob´ı nekompatibilitu. Zp˚ usob˚ u, jak´ ymi to lze ovˇeˇrit, je v´ıce. Kompar´atory vyvinut´e na katedˇre ovˇeˇruj´ı nahraditelnost bez nutnosti spuˇstˇen´ı a testov´an´ı komponent. N´asleduj´ıc´ı text popisuje postupy ovˇeˇrov´ an´ı nahraditelnosti implementovan´e v kompar´atorech JaCC a OBCC.
3.3.1
Relace subtypu mezi komponentami
Komponentu lze reprezentovat pomoc´ı element˚ u jej´ıho rozhran´ı. Ty lze rozdˇelit na elementy importovan´e a exportovan´e. Rozhran´ı OSGi komponenty je tvoˇreno informacemi obsaˇzen´ ymi v manifestu, popisech sluˇzeb ve form´atu XML a Java tˇr´ıdami, kter´e jsou dosaˇziteln´e pro ostatn´ı komponenty prostˇrednictv´ım exportovan´ ych bal´ık˚ u. Jednotliv´e tˇr´ıdy je potˇreba reprezentovat aˇz na u ´roveˇ n signatur jejich pol´ı a metod. Kdyˇz m´ ame k dispozici reprezentace dvou komponent, m˚ uˇzeme tyto repre´ celem porovn´an´ı je zjistit vz´ajemn´ zentace mezi sebou porovn´ avat. Uˇ y vztah komponent. Ty mohou b´ yt bud’ zcela nekompatibiln´ı, nebo m˚ uˇze b´ yt nˇekter´a komponenta subtypem (viz [16]) druh´e komponenty. Relaci subtypu si lze pˇredstavit jako relaci pˇredek – potomek v dˇediˇcnosti Java tˇr´ıd, kde potomek je subtypem (nebo specializac´ı) sv´eho pˇredka. Podobnˇe jako princip polymorfismu, kde lze nahradit objekt typovan´ y na pˇredka libovoln´ ym potomkem, lze komponentu A nahradit komponentou B, pokud je komponenta B subtypem komponenty A.
15
Nahraditelnost komponent
3.3.2
Kompar´ atory Java tˇr´ıd a OSGi komponent
Jak lze relaci subtypu zjistit
Zjiˇstˇen´ı relace subtypu mezi komponentami je obt´ıˇzn´e, proto je nutn´e rozdˇelit komponentu na menˇs´ı ˇc´ asti, u kter´ ych se zjiˇstˇen´ı t´eto relace zjednoduˇsuje. Komponenty m˚ uˇzeme rozloˇzit na dostateˇcnˇe jednoduch´e ˇc´asti, aby bylo urˇcen´ı relace trivi´ aln´ı (primitivn´ı Java typy, metody. . . ). Relaci subtypu snadno urˇc´ıme u vˇsech tˇechto ˇc´ ast´ı. Celkov´ y v´ ysledek potom postupnˇe skl´ad´ame z v´ ysledk˚ u d´ılˇc´ıch.
3.3.3
Metody ovˇ eˇ ren´ı nahraditelnosti
Nahraditelnost komponenty A komponentou B lze ovˇeˇrit pomoc´ı zjiˇstˇen´ı relace subtypu mezi komponentami A a B. Pokud je komponenta B subtypem komponenty A, lze komponentu A komponentou B nahradit. Tato z´ akladn´ı metoda je pouˇziteln´a bez znalosti dodateˇcn´ ych informac´ı o prostˇred´ı (kontextu) komponenty, ve kter´em m´a b´ yt nasazena. Pokud tyto informace m´ ame k dispozici, lze je pouˇz´ıt k lepˇs´ımu rozhodnut´ı o nahraditelnosti komponenty za tˇechto konkr´etn´ıch podm´ınek. Tato druh´ a metoda se naz´ yv´a kontextov´a nahraditelnost [15]. M´ısto toho, aby se novˇe pˇrid´ avan´ a komponenta porovn´avala s p˚ uvodn´ı komponentou, porovn´ av´ a se novˇe pˇrid´ avan´ a komponenta se sv´ ym komplementem z´ıskan´ ym z kontextu. Kontextem jsou myˇsleny ostatn´ı komponenty ve frameworku. Z pohledu nahraditelnosti jsou z kontextu zaj´ımav´e pouze komponenty s nˇejakou vazbou na p˚ uvodn´ı komponentu, nebo s potenci´aln´ı vazbou na novou komponentu. Komplement komponenty je ˇc´ast komponenty, kter´a je skuteˇcnˇe vyuˇz´ıv´ana kontextem. Komplement je proto ne´ upln´a reprezentace komponenty. Protoˇze se komplement z´ısk´ av´ a z kontextu, nen´ı nahraditelnost z´avisl´a na p˚ uvodn´ı nahrazovan´e komponentˇe. Ta dokonce nemus´ı v˚ ubec existovat a kontextovou nahraditelnost lze vyuˇz´ıt ˇcistˇe pro u ´ˇcely zjiˇstˇen´ı kompatibility exportuj´ıc´ı a importuj´ıc´ı komponenty. Pokud je komponenta subtypem sv´eho komplementu z´ıskan´eho z kontextu, je s kontextem kompatibiln´ı (p˚ uvodn´ı komponenta je nahraditeln´a touto komponentou v tomto konkr´etn´ım kontextu).
3.4
Kompar´ atory Java tˇ r´ıd a OSGi komponent
V t´eto kapitole budou podrobnˇeji pops´any jednotliv´e projekty kompar´ator˚ u i dalˇs´ıch n´ astroj˚ u, kter´e je vyuˇz´ıvaj´ı. Projekty pˇredstavuj´ı v´ ychoz´ı stav pro tuto pr´ aci. Bˇehem pr´ ace jsem se ale tak´e zapojila do v´ yvoje projekt˚ u. Implementovala jsem nˇekter´ a vylepˇsen´ı a opravy chyb.
16
Nahraditelnost komponent
3.4.1
Kompar´ atory Java tˇr´ıd a OSGi komponent
Projekty pro z´ısk´ an´ı reprezentace
´ Ukolem n´ asleduj´ıc´ıch projekt˚ u je z´ısk´an´ı reprezentace Java typ˚ u nebo OSGi komponent. Reprezentaci je moˇzn´e z´ısk´avat r˚ uzn´ ymi zp˚ usoby. • javatypes [40] Projekt obsahuje zejm´ena datov´e tˇr´ıdy pro uchov´an´ı naˇcten´e reprezentace Java typ˚ u. Kromˇe toho obsahuje tak´e naˇc´ıt´an´ı t´eto reprezentace z bytek´ odu a reflexe, ale tato implementace je nyn´ı jiˇz zastaral´a a novˇe se pouˇz´ıv´ a implementace v projektu javatypes-loader. • javatypes-loader Projekt implementuje v souˇcasn´e dobˇe naˇc´ıt´an´ı reprezentace Java typ˚ uz bytek´ odu. V budoucnu by mˇel obsahovat tak´e naˇc´ıt´an´ı z reflexe. • bundle-types [40] Projekt obsahuje datov´e tˇr´ıdy pro uchov´an´ı reprezentace element˚ u OSGi komponent. • bundle-loader [40] V projektu je implementov´ano naˇc´ıt´an´ı reprezentace element˚ u OSGi komponent. • bundle-parser Projekt naˇc´ıt´ a reprezentaci Java typ˚ u i element˚ u OSGi komponent z kontextu pouˇzit´ım naˇc´ıt´ an´ı z bytek´odu. V budoucnu by mˇel b´ yt nahrazen novou implementac´ı naˇc´ıt´an´ı reprezentace v projektech javatypes-loader a bundle-loader. • bundle-context-loader Projekt naˇc´ıt´ a reprezentaci Java typ˚ u a element˚ u OSGi komponent z kontextu pomoc´ı reflexe. • types-cmp Vˇsechny pˇredchoz´ı projekty z´avis´ı na projektu types-cmp, kter´ y obsahuje z´ akladn´ı rozhran´ı.
3.4.2
Projekty kompar´ ator˚ u z´ıskan´ e reprezentace
N´ asleduj´ıc´ı projekty porovn´ avaj´ı reprezentaci Java tˇr´ıd nebo element˚ u OSGi komponent a zjiˇst’uj´ı relaci subtypu mezi porovn´avan´ ymi komponentami. • javatypes-cmp Kompar´ ator reprezentac´ı Java typ˚ u. • bundle-cmp Kompar´ ator reprezentac´ı element˚ u OSGi komponent.
17
Nahraditelnost komponent
3.4.3
Kompar´ atory Java tˇr´ıd a OSGi komponent
Z´ avislosti mezi projekty
Projekty lze rozdˇelit na ˇc´ ast JaCC (types-cmp, javatypes, javatypes-loader, javatypes-cmp) a OBCC (bundle-types, bundle-loader, bundle-parser, bundlecontext-loader, bundle-cmp). Zjednoduˇsenˇe lze ˇr´ıci, ˇze projekty OBCC z´avis´ı na projektech JaCC a projekty kompar´ator˚ u z´avis´ı na projektech obsahuj´ıc´ıch reprezentaci komponent. Podrobnˇeji zobrazuje z´avislosti mezi projekty diagram 3.1.
Obr´ azek 3.1: Z´ avislosti mezi projekty. Obr´azek z dokumentace projektu OBCC.
3.4.4
Dalˇ s´ı projekty
N´ asleduj´ıc´ı projekty vyuˇz´ıvaj´ı kompar´atory k vytvoˇren´ı re´alnˇe pouˇziteln´e funkcionality. • OBVS (OSGi Bundle Versioning Service) [14] Webov´e rozhran´ı pro automatick´e verzov´an´ı OSGi komponent. • maven-bundle-version-plugin Plugin do Mavenu pro automatick´e verzov´an´ı OSGi komponent.
18
Nahraditelnost komponent
3.5 3.5.1
Architektura kompar´ ator˚ u
Architektura kompar´ ator˚ u Reprezentace Java typ˚ u
Datov´ a struktura naˇcten´e reprezentace Java typ˚ u je inspirov´ana rozhran´ım Java reflexe (bal´ık java.lang.reflection). Oproti rozhran´ı reflexe se struktura trochu liˇs´ı a je zjednoduˇsena. Diagram 3.2 zobrazuje hierarchii Java typ˚ u implementovanou v projektu JaCC.
Obr´ azek 3.2: Hierarchie Java typ˚ u. Obr´azek z dokumentace projektu OBCC.
3.5.2
Architektura naˇ c´ıt´ an´ı reprezentace
Architektura naˇc´ıt´ an´ı reprezentace nen´ı jednotn´a. Je to zp˚ usobeno t´ım, ˇze na jednotliv´ ych projektech pracovalo velk´e mnoˇzstv´ı lid´ı a nebyla stanovena jednotn´ a pravidla. V souˇcasn´e dobˇe se pracuje na sjednocen´ı architektury vytvoˇren´ım nov´eho projektu javatypes-loader, kter´ y v budoucnosti nahrad´ı (spolu s projektem bundle-loader) p˚ uvodn´ı implementace naˇc´ıt´an´ı reprezentace, kter´e jsou roztrouˇsen´e mezi r˚ uzn´ ymi projekty.
3.5.3
Architektura kompar´ ator˚ u
Projekty kompar´ ator˚ u lze rozdˇelit na tˇr´ıdy prov´adˇej´ıc´ı porovn´an´ı a datov´e tˇr´ıdy pro uchov´ an´ı v´ ysledku porovn´ an´ı. Tˇr´ıdy prov´ adˇej´ıc´ı porovn´ an´ı ˇc´asteˇcnˇe kop´ıruj´ı hierarchii reprezentace. Pro kaˇzd´ y reprezentovan´ y typ existuje tˇr´ıda, kter´a dok´aˇze objekty tohoto typu porovnat. Tˇr´ıdy typicky obsahuj´ı jedinou veˇrejnou metodu compare, jej´ıˇz parametry jsou porovn´ avan´e typy a stav porovn´av´an´ı. Metoda vrac´ı v´ ysledek porov19
Nahraditelnost komponent
Architektura kompar´ ator˚ u
n´ an´ı. Instance tˇechto tˇr´ıd nemaj´ı stav, a proto je lze pouˇz´ıvat opakovanˇe a ve v´ıce vl´ aknech. Instance se z´ısk´avaj´ı pomoc´ı tov´arn´ı tˇr´ıdy (viz [25]). Stav porovn´ an´ı je pro vˇsechny tˇr´ıdy prov´adˇej´ıc´ı porovn´an´ı spoleˇcn´ y a je uloˇzen v objektu typu ComparatorState, kter´ y je pˇred´av´an v metod´ach compare. Stav porovn´ an´ı obsahuje historii porovnan´ ych typ˚ u, r˚ uzn´e parametry porovn´an´ı a tov´ arn´ı tˇr´ıdy pro z´ısk´ av´ an´ı kompar´ator˚ u jednotliv´ ych typ˚ u.
3.5.4
Agregace v´ ysledku porovn´ an´ı
Kaˇzd´ a tˇr´ıda prov´ adˇej´ıc´ı porovn´an´ı m´a sv˚ uj specifick´ y algoritmus a k sestaven´ı v´ ysledku pouˇz´ıv´ a v´ ysledky z´ıskan´e od kompar´ator˚ u niˇzˇs´ıch u ´rovn´ı. V´ ysledek porovn´ an´ı se skl´ ad´ a z agregovan´eho rozd´ılu, kter´ y m˚ uˇze nab´ yvat pouze nˇekolika hodnot a vyjadˇruje relaci subtypu. Druhou ˇc´ast´ı je mnoˇzina stejnˇe strukturovan´ ych v´ ysledk˚ u z´ıskan´ ych od kompar´ator˚ u niˇzˇs´ıch u ´rovn´ı, ze kter´ ych je moˇzn´e dohledat d˚ uvody pro souhrnn´ y v´ ysledek. Agregovan´ y rozd´ıl m˚ uˇze nab´ yvat tˇechto hodnot: • UNK: nezn´ am´ y v´ ysledek • NON: shoda • INS: vloˇzen´ı (element je pˇr´ıtomn´ y pouze v nov´e komponentˇe) • DEL: smaz´ an´ı (element je pˇr´ıtomn´ y pouze v p˚ uvodn´ı komponentˇe) • SPE: specializace (element nov´e komponenty je subtypem odpov´ıdaj´ıc´ıho elementu v p˚ uvodn´ı komponentˇe) • GEN: generalizace (element p˚ uvodn´ı komponenty je subtypem odpov´ıdaj´ıc´ıho elementu v nov´e komponentˇe) • MUT: mutace (mezi elemnety neplat´ı relace subtypu v ˇz´adn´em smˇeru) Bˇehem porovn´ an´ı nejdˇr´ıve vznikaj´ı pouze v´ ysledky NON, INS nebo DEL. Ostatn´ı v´ ysledky vznikaj´ı aˇz jejich agregac´ı. Agregace rozd´ıl˚ u se ˇr´ıd´ı podle priorit. Poˇrad´ı v´ ysledk˚ u podle priorit od nejd˚ uleˇzitˇejˇs´ıch po nejm´enˇe d˚ uleˇzit´e: UNK, MUT, INS, SPE, DEL, GEN, NON. Pokud je v agregovan´ ych v´ ysledc´ıch zastoupen rozd´ıl INS nebo SPE z´ aroveˇ n s rozd´ılem DEL nebo GEN, v´ ysledkem je vˇzdy MUT. Agregovat je obvykle potˇreba z´ıskan´a mnoˇzina rozd´ıl˚ u z kompar´ator˚ u na niˇzˇs´ı u ´rovni. V nˇekter´ ych pˇr´ıpadech je ale nutn´e prov´est nejdˇr´ıve inverzi rozd´ılu, protoˇze pro z´ısk´ an´ı relace subtypu je potˇreba z´ıskat opaˇcnou relaci subtypu na niˇzˇs´ı u ´rovni. To se projevuje napˇr´ıklad u parametr˚ u metod. Pokud je klient zvykl´ y volat v p˚ uvodn´ı komponentˇe metodu s parametrem A, mus´ı komponenta, kter´a je subtypem p˚ uvodn´ı komponenty, toto vol´an´ı tak´e umoˇznit. Proto form´aln´ı parametr volan´e metody v p˚ uvodn´ı komponentˇe mus´ı b´ yt subtypem parametru v nov´e komponentˇe (pˇr´ıpadnˇe m˚ uˇze b´ yt samozˇrejmˇe shodn´ y). 20
Nahraditelnost komponent
3.6 3.6.1
Probl´emy a n´ amˇety pro dalˇs´ı pr´ aci
Probl´ emy a n´ amˇ ety pro dalˇ s´ı pr´ aci Generick´ e typy
Bˇehem sv´e pr´ ace na projektech jsem objevila nˇekolik nedostatk˚ u nebo chyb implementace. Prvn´ım a nejz´ asadnˇejˇs´ım je probl´em s generikami v kompar´atoru. Implementace porovn´ av´ an´ı generick´ ych typ˚ u nen´ı dotaˇzen´a a algoritmus ˇcasto konˇc´ı v nekoneˇcn´e smyˇcce. D˚ uvodem je, ˇze kompar´ator nepoˇc´ıt´a s moˇznost´ı cyklick´ ych typ˚ u, jako napˇr´ıklad: class A <E extends List
>
Kompar´ ator je pˇripraven pouze na cykly obyˇcejn´ ych tˇr´ıd, kter´e ˇreˇs´ı zaveden´ım historie porovn´ avan´ ych tˇr´ıd. Pˇred samotn´ ym porovn´an´ım tˇr´ıd je pomoc´ı historie ovˇeˇreno, ˇze porovn´ avan´a dvojice jeˇstˇe nebyla porovn´av´ana, nebo nen´ı porovn´ av´ ana pr´ avˇe ted’ d´ıky rekurzi. Dvojice je ihned vloˇzena do historie a pot´e se provede porovn´ an´ı. Stejn´e ˇreˇsen´ı je potˇreba zav´est pro generick´e typy. Reprezentace generick´ ych typ˚ u je pops´ana v dokumentu [2].
3.6.2
Porovn´ av´ an´ı tˇ r´ıd
Druh´ ym nedostatkem, kter´ y zhorˇsuje funkcionalitu, je absence mechanismu, kter´emu v rozhran´ı Java reflexe odpov´ıd´a metoda isAssignableFrom. Metoda zjiˇst’uje, zda je moˇzn´e objekt pˇretypovat na danou tˇr´ıdu nebo rozhran´ı. Implementace v kompar´ atorech by znamenala hlavnˇe nutnost naˇc´ıtat pˇredky a rozhran´ı tˇr´ıd. Pot´e by bylo moˇzn´e upravit algoritmus porovn´av´an´ı tˇr´ıd, aby se pˇri rozd´ıln´em n´ azvu nevygenerovala automaticky mutace. Pokud by se jedna z porovn´ avan´ ych tˇr´ıd shodovala s nˇekter´ ym pˇredkem tˇr´ıdy druh´e, v´ ysledek porovn´ an´ı by se mohl zlepˇsit na generalizaci nebo specializaci.
3.6.3
Ovˇ eˇ rov´ an´ı kompatibility dvou komponent
Tˇret´ı probl´em je sp´ıˇse koncepˇcn´ıho typu. T´ yk´a se ovˇeˇrov´an´ı kompatibility exportuj´ıc´ı a importuj´ıc´ı komponenty. Uvedu nejdˇr´ıve problematick´ y pˇr´ıklad k´odu v jednotliv´ ych komponent´ ach: Komponenta 1: interface MujInterface { void metoda ( Parametr p ); } Komponenta 2: class MojeImplementace implements MujInterface { void metoda ( Parametr p ) { p . toString (); }
21
Nahraditelnost komponent
Implementovan´e opravy a vylepˇsen´ı
} Komponenta 3: class Parametr { String toString () { return " parametr " ; } }
Tˇr´ıdu Parametr z komponenty 3 importuj´ı obˇe zbyl´e komponenty. Komponenta 2 importuje rozhran´ı MujInterface z komponenty 1. Probl´em nast´av´a pˇri ovˇeˇren´ı kompatibility komponent 1 a 2. Porovn´ an´ı bude prob´ıhat na z´akladˇe naˇcten´e reprezentace komponenty 1 standardn´ım zp˚ usobem a naˇcten´eho komplementu komponenty 1 z kontextu, tj. z komponenty 2. Prvn´ı reprezentace bude obsahovat tˇr´ıdu Parametr, kter´a je pr´ azdn´ a (nejsou dostupn´e zdroje pro naˇcten´ı jej´ı implementace). Druh´a reprezentace bude obsahovat tak´e tˇr´ıdu Parametr, ale nyn´ı vˇcetnˇe jej´ı metody toString(), protoˇze se jedn´ a o naˇc´ıt´an´ı z kontextu (naˇctou se vˇsechny metody, kter´e jsou pouˇzit´e). V´ ysledkem porovn´ an´ı bude, ˇze komponenta naˇcten´a z kontextu je subtypem komponenty naˇcten´e standardn´ım zp˚ usobem, protoˇze obsahuje nav´ıc metodu Parametr.toString(). To znamen´a, ˇze komponenty 1 a 2 budou vyhodnoceny jako nekompatibiln´ı. Komponenta 2 pouˇz´ıv´a metodu, kter´a v komponentˇe 1 chyb´ı. ˇ sen´ım je zaveden´ı ignorovan´ Reˇ ych bal´ık˚ u bˇehem porovn´av´an´ı. Pravdˇepodobnost, ˇze bude implementace bal´ıku rozprostˇrena do v´ıce komponent, je mal´a. Mezi ignorovan´e bal´ıky lze proto zahrnout vˇsechny importovan´e bal´ıky obou komponent, kter´e z´ aroveˇ n nejsou exportovan´e nˇekterou z nich. V´ ysledek porovn´ an´ı tˇr´ıd z tˇechto bal´ık˚ u by mˇel b´ yt vˇzdy NON, protoˇze pˇri importu stejn´e komponenty do obou komponent budou tyto tˇr´ıdy skuteˇcnˇe stejn´e. Porovn´an´ı by se na t´eto u ´rovni mˇelo zastavit, aby nebylo moˇzn´e se dostat na jin´e bal´ıky importovan´ ych komponent.
3.6.4
Dalˇ s´ı nedostatky
D´ ale jsem zjistila, ˇze v kompar´atorech chyb´ı kompletnˇe implementace anotac´ı, implementace naˇc´ıt´ an´ı reprezentace pomoc´ı reflexe je ve velmi nedotaˇzen´em stavu a chyb´ı implementace porovn´av´an´ı v´ yjimek.
3.7
Implementovan´ e opravy a vylepˇ sen´ı
N´ asleduj´ıc´ı opravy a vylepˇsen´ı kompar´ator˚ u jsem implementovala nad r´amec prac´ı popsan´ ych v kapitol´ ach 4 a 5, kter´e jsou j´adrem t´eto diplomov´e pr´ace. U
22
Nahraditelnost komponent
Implementovan´e opravy a vylepˇsen´ı
jednotliv´ ych u ´prav uv´ ad´ım tak´e ˇc´ısla poˇzadavk˚ u v syst´emu spr´avy zmˇen (viz kapitola 3.8.4), kde lze dohledat jejich detailn´ı popis.
3.7.1
´ Upravy hierarchie Java typ˚ u
Bˇehem seznamov´ an´ı se s k´ odem kompar´atoru jsem objevila nˇekter´e nelogiˇcnosti v hierarchii tˇr´ıd reprezentace Java typ˚ u. D´ale jsem upravila implementaci metod toString, kter´ a p˚ uvodnˇe zp˚ usobovala v nˇekter´ ych pˇr´ıpadech nekoneˇcn´e cyklen´ı. Detailn´ı popis proveden´ ych zmˇen lze dohledat v n´astroji pro spr´avu poˇzadavk˚ u pod tˇemito ˇc´ısly poˇzadavk˚ u: JaCC - #105, #89, #122, #89, #123, #125
3.7.2
Pomoc pˇ ri thread-safety anal´ yze
ˇ ep´ Bc. Martin Stˇ anek prov´ adˇel v r´amci oborov´eho projektu thread-safety anal´ yzu, neboli anal´ yzu bezpeˇcnosti kompar´ator˚ u pˇri bˇehu ve v´ıce vl´aknech najednou. Tento u ´kol sv´ ym rozsahem pˇrekraˇcoval rozsah oborov´eho projektu, proto jsem se na pr´ aci tak´e pod´ılela. Prov´ adˇela jsem jak samotnou anal´ yzu ˇc´asti projekt˚ u, tak implementaci nˇekter´ ych n´ asledn´ ych u ´prav. V´ ysledky anal´ yzy lze dohledat v dokumentu [4]. Popis mnou implementovan´ ych u ´prav je v n´astroji pro spr´avu poˇzadavk˚ u pod tˇemito ˇc´ısly poˇzadavk˚ u: JaCC - #114, #42, #119 OBCC - #291, #256, #319
3.7.3
´ Upravy struktury v´ ysledk˚ u porovn´ an´ı
Strukturu v´ ysledk˚ u porovn´ an´ı jsem vylepˇsila o referenci na agregovan´ y v´ ysledek a zaˇcala jsem pracovat tak´e na zjednoduˇsen´ı struktury. Poˇzadavky lze dohledat pod tˇemito ˇc´ısly: JaCC - #120, #158
3.7.4
Vylepˇ sen´ı algoritmu porovn´ an´ı tˇ r´ıd
Vylepˇsila jsem algoritmus porovn´an´ı tˇr´ıd t´ım, ˇze jsem sjednotila zp˚ usob detekce rekurze s ukl´ ad´ an´ım a pouˇz´ıv´ an´ım v´ ysledk˚ u jiˇz porovnan´ ych tˇr´ıd. Protoˇze mˇela tato u ´prava vliv na v´ ykonnost kompar´atoru, je tato zmˇena bl´ıˇze pops´ana v ˇc´asti proveden´ ych optimalizac´ı v kapitole 4.10.2. Poˇzadavky jsou dohledateln´e pod tˇemito ˇc´ısly:
23
Nahraditelnost komponent
Technologie a v´yvojov´e n´ astroje
JaCC - #113, #114
3.8 3.8.1
Technologie a v´ yvojov´ e n´ astroje Java
Vˇsechny projekty jsou psan´e v programovac´ım jazyce Java a pouˇz´ıvaj´ı standardn´ı JDK verze 1.6. Na projektech je potˇreba dodrˇzovat domluven´e konvence. K´od i koment´aˇre by se mˇely ps´ at anglicky a v k´odov´an´ı UTF-8. Kaˇzd´a tˇr´ıda a d˚ uleˇzit´e metody by mˇely b´ yt komentov´ any Javadoc koment´aˇrem. K logov´an´ı by se mˇela vyuˇz´ıvat knihovna SLF4J. Kaˇzd´ y zdrojov´ y soubor by mˇel obsahovat hlaviˇcku s informacemi o licenci. Ve v´ yvojov´em prostˇred´ı Eclipse lze nastavit automatick´e vkl´ad´an´ı t´eto hlaviˇcky v nab´ıdce Window – Preferences – Java – Code Style – Code Templates – Comments – Files. Kromˇe nastaven´ı textu je potˇreba tak´e zaˇskrtnout pod textem automatick´e vkl´ ad´ an´ı komment´aˇr˚ u. Dalˇs´ı konvence jsou d´ any pomoc´ı pravidel pro automatick´e form´atov´an´ı, kter´e lze v Eclipse nastavit v nab´ıdce Window – Preferences – Java – Code Style – Formatter. Pravidla lze st´ahnout z [3]. V projektech by mˇela b´ yt dodrˇzov´ana pravidla pr´ace s v´ yjimkami popsan´a v [1].
3.8.2
OSGi
Projekty kompar´ ator˚ u lze pouˇz´ıt bud’ jako knihovny, nebo tak´e jako OSGi komponenty.
3.8.3
Apache Maven
Maven [21] je n´ astroj pro automatick´ y build. Je alternativou k n´astroj˚ um Ant nebo Make. Na rozd´ıl od nich se nezamˇeˇruje na popis jak se co m´a udˇelat, ale pouze popis poˇzadovan´eho v´ ysledku. Konfigurace build procesu je um´ıstˇena v XML souboru pom.xml. Ten obsahuje typicky identifikaci projektu, z´avislosti a pˇr´ıpadnˇe seznam plugin˚ u, kter´e pˇrid´ avaj´ı dalˇs´ı akce (napˇr´ıklad testov´an´ı). Identifikace projektu je rozdˇelena na ˇc´ ast groupId (identifikace skupiny projekt˚ u), artifactId (identifikace projektu) a version (verze). Projekty a knihovny, na kter´ ych projekt z´avisi (dependencies), se identifikuj´ı 24
Nahraditelnost komponent
Zp˚ usob pr´ ace v t´ymu
tak´e pomoc´ı tag˚ u groupId, artifactId a version. Pomoc´ı tagu scope lze urˇcit, zda bude knihovna vloˇzena do v´ ysledn´eho JAR souboru (compiled), nebo zda bude pouze pˇrid´ av´ ana na classpath pˇri spuˇstˇen´ı (provided). Projekt mus´ı m´ıt pˇredepsanou strukturu (pokud nen´ı pomoc´ı konfigurace zmˇenˇena). Zdrojov´e soubory jsou v adres´aˇri src/main/java a ostatn´ı zdroje v src/main/resources. Pro testy jsou podobnˇe vymezeny adres´aˇre src/test/java a src/test/resources. Build se spouˇst´ı bud’ z pˇr´ıkazov´e ˇr´adky, nebo pomoc´ı grafick´eho rozhran´ı Eclipse (plugin M2Eclipse). Obvykle se pouˇz´ıv´a pˇr´ıkaz: mvn install
Tento pˇr´ıkaz zkompiluje zdrojov´e soubory, zabal´ı pˇreloˇzen´e tˇr´ıdy a zdroje do JAR archivu, spust´ı automatick´e testy a JAR archiv uloˇz´ı do lok´aln´ıho u ´loˇziˇstˇe. Pˇr´ıpadn´e z´ avislosti se snaˇz´ı stahovat z veˇrejn´ ych u ´loˇziˇst’ na internetu. V projektech JaCC a OBCC se pouˇz´ıv´a takzvan´ y rodiˇcovsk´ y POM (parent), kter´ y je um´ıstˇen´ y v trunk/pom. V jsou definovan´e spoleˇcn´e ˇc´asti jednotliv´ ych POM soubor˚ u. Pro build vˇsech projekt˚ u najednou lze pouˇz´ıt takzvan´ y reaktor POM, kter´ y je um´ıstˇen´ y pˇr´ımo v adres´ aˇri trunk. Nejdˇr´ıve je nutn´e spustit mvn install pro JaCC, n´ aslednˇe pro OBCC.
3.8.4
Assembla
Assembla [28] je n´ astroj, kter´ y integruje verzovac´ı syst´em SVN se spr´avou poˇzadavk˚ u. Commit do SVN lze jednoduˇse prov´azat s pˇr´ısluˇsn´ ym poˇzadavkem pomoc´ı uveden´ı koment´ aˇre Re #123“ (pˇr´ıklad pro ˇc´ıslo poˇzadavku 123). SVN ” lze pouˇz´ıvat pomoc´ı libovoln´eho klienta, napˇr´ıklad TortoiseSVN [43]. Projekt JaCC je na adrese http:// www.assembla.com/ spaces/ jacc, projekt OBCC na http:// www.assembla.com/ spaces/ obcc.
3.8.5
Hudson Continuous Integration
Hudson [37] je n´ astroj pro plynulou integraci. Pravidelnˇe zjiˇst’uje, zda v SVN nepˇribyla zmˇena, a pokud ano, spust´ı build projektu a testy. Hudson pro projekty JaCC a OBCC je k dispozici na adrese http:// students. kiv.zcu.cz:8080/ .
3.9
Zp˚ usob pr´ ace v t´ ymu
Na projektech JaCC a OBCC pracovalo v pr˚ ubˇehu t´eto pr´ace nˇekolik lid´ı souˇcasnˇe. Bylo nutn´e synchronizovat nˇekter´e zmˇeny (refactoring) s optimalizacemi 25
Nahraditelnost komponent
Zp˚ usob pr´ ace v t´ymu
a rozˇs´ıˇren´ımi. Aby mohla spolupr´ ace v t´ ymu dobˇre fungovat, je nutn´e svou pr´aci dostateˇcnˇe dokumentovat. To znamen´ a zejm´ena vytv´aˇren´ı z´aznam˚ u v n´astroji pro spr´avu poˇzadavk˚ u a propojov´ an´ı kaˇzd´eho commitu do SVN s poˇzadavkem. Pˇred nahr´ an´ım proveden´ ych zmˇen do SVN je nutn´e ovˇeˇrit, ˇze jsou projekty kompilovateln´e pomoc´ı Mavenu. Proch´azet by mˇely tak´e automatick´e testy (v souˇcasn´e dobˇe proch´ az´ı jen nˇekter´e). V pr˚ ubˇehu pr´ ace se cel´ y t´ ym pracuj´ıc´ı na projektech JaCC a OBCC pravidelnˇe sch´ azel kaˇzd´ ych ˇctrn´ act dn˚ u. Forma sch˚ uzek byla pˇrevzata z metodiky Scrum. V metodice Scrum se tato sch˚ uzka naz´ yv´a daily standup a opakuje se kaˇzd´ y ˇ den. Clenov´ e t´ ymu by mˇeli celou dobu st´at (aby se sch˚ uzka neprodluˇzovala) a kaˇzd´ y pod´ av´ a zpr´ avu o tˇrech bodech: • co jsem dˇelal(a) • co budu dˇelat • co mi br´ an´ı v pr´ aci Sch˚ uzku vede Scrum-master, kter´ y n´aslednˇe ˇreˇs´ı pˇrek´aˇzky ˇclen˚ u t´ ymu. Sch˚ uzka by mˇela b´ yt dlouh´ a zhruba patn´act minut a nemˇely by se na n´ı ˇreˇsit probl´emy. Mˇela by slouˇzit pouze ke vz´ ajemn´emu informov´an´ı o tom, kdo na ˇcem pracuje. Tyto sch˚ uzky ˇc´ asteˇcnˇe pˇredch´az´ı prov´adˇen´ı zbyteˇcn´e nebo opakovan´e pr´ace v d˚ usledku nedostateˇcn´e komunikace mezi ˇcleny t´ ymu.
26
4 Vyuˇzit´ı kompar´ator˚ u na mal´ ych zaˇ r´ızen´ıch 4.1
Mal´ a zaˇ r´ızen´ı
Pouˇz´ıv´ an´ı mal´ ych (v´ ykonovˇe omezen´ ych) zaˇr´ızen´ı, jako jsou chytr´e telefony, PDA nebo tablety, je st´ ale v´ıce obl´ıben´e. Do budoucna lze oˇcek´avat podporu (t´emˇeˇr) standardn´ı Javy na vˇetˇsinˇe mobiln´ıch zaˇr´ızen´ıch. Jiˇz nyn´ı lze pouˇz´ıvat vˇetˇsinu aplikac´ı pro standardn´ı Javu na platformˇe Android.
4.1.1
Android
Android [26] je open-source platforma pro mobiln´ı zaˇr´ızen´ı (chytr´e telefony, navigace, tablety). Skl´ ad´ a se z operaˇcn´ıho syst´emu, ovladaˇc˚ u pro konkr´etn´ı zaˇr´ızen´ı, aplikaˇcn´ıho frameworku a bˇeˇzn´ ych uˇzivatelsk´ ych aplikac´ı. Operaˇcn´ı syst´em je zaloˇzen na j´ adru syst´emu Linux. Aplikaˇcn´ı framework poskytuje rozhran´ı pro uˇzivatelsk´e aplikace v Javˇe. Java na Androidu se m´ırnˇe liˇs´ı od standardn´ı Javy. Virtu´aln´ım strojem je Dalvik virtual machine. Prvn´ı rozd´ıl oproti standardn´ı Javˇe je nutnost pˇrekladu class soubor˚ u do speci´ aln´ıho form´ atu (dex). Mezi dalˇs´ı rozd´ıly patˇr´ı, ˇze Dalvik nepodporuje nˇekter´e speci´ aln´ı knihovny, napˇr´ıklad JAXB nebo DOM pro pr´aci s XML. Program´ ator aplikac´ı m´ a k dispozici Android SDK – soubor knihoven a n´astroj˚ u pro v´ yvoj aplikac´ı. Souˇc´ ast´ı SDK je tak´e velmi dobˇre pouˇziteln´ y simul´ator telefonu. Aplikace jsou psan´e jako komponenty aplikaˇcn´ıho frameworku a v n´azvoslov´ı Androidu se jim ˇr´ık´ a aktivity. Aktivity mezi sebou komunikuj´ı pomoc´ı zpr´ av s n´ azvem intent“. ” Android poskytuje vlastn´ı prostˇredky pro tvorbu uˇzivatelsk´eho rozhran´ı. Obvykle je grafick´e rozhran´ı konfigurov´ano pomoc´ı grafick´eho editoru a je pˇridruˇzeno ke kaˇzd´e aktivitˇe.
4.1.2
Vyuˇ zit´ı OSGi na platformˇ e Android
Aˇckoliv Android poskytuje sv˚ uj vlastn´ı komponentov´ y (aplikaˇcn´ı) framework, m˚ uˇze b´ yt OSGi framework na Androidu tak´e uˇziteˇcn´ y. Existuje mnoho OSGi aplikac´ı, kter´e by se mohly bez vˇetˇs´ıch u ´prav spustit na platformˇe Android. Pokusy pˇren´est OSGi framework na Android se jiˇz objevuj´ı, pˇr´ıkladem je projekt EZdroid [33], kter´ y se zamˇeˇruje na pouˇzit´ı frameworku Apache Felix na platformˇe Android.
27
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
Pˇredchoz´ı pr´ ace
V´ yhodou OSGi komponent je niˇzˇs´ı reˇzie na komunikaci, neˇz jakou maj´ı komponenty Androidu. Komunikace v OSGi prob´ıh´a pomoc´ı vol´an´ı metod. M˚ uˇze to b´ yt tak´e jednoduˇsˇs´ı pro program´atora neˇz pos´ıl´an´ı zpr´av a vazba mezi komponentami je tˇesnˇejˇs´ı. Na druhou stranu, pouˇzit´ı OSGi na Androidu m´a i sv´e nev´ yhody. Napˇr´ıklad nelze jednoduˇse vytv´ aˇret uˇzivatelsk´e rozhran´ı v OSGi komponent´ach pomoc´ı grafick´eho editoru. Komponenty mohou rozhran´ı vytv´aˇret jedinˇe programovˇe, nebo mus´ı b´ yt rozhran´ı souˇca´st´ı frameworku samotn´eho (aktivity, ve kter´e je framework spouˇstˇen).
4.1.3
Vyuˇ zit´ı kompar´ ator˚ u na platformˇ e Android
Pˇri pouˇz´ıv´ an´ı OSGi na Androidu nebo jin´ ych platform´ach pro mal´a zaˇr´ızen´ı vznik´ a tak´e poˇzadavek na moˇznost bezpeˇcn´eho nahrazen´ı nebo aktualizaci komponent. Ovˇeˇren´ı nahraditelnosti ale pˇrin´aˇs´ı nov´e reˇzijn´ı n´aklady na ˇcas bˇehu aplikace i spotˇrebu pamˇeti. Mal´ a zaˇr´ızen´ı jsou mnohem m´enˇe v´ ykonn´a neˇz bˇeˇzn´e poˇc´ıtaˇce a maj´ı velmi omezen´e pamˇet’ov´e zdroje. Pˇr´ıliˇs velk´a reˇzie m˚ uˇze proto snadno zp˚ usobit nepouˇzitelnost takov´eho syst´emu. Aby bylo moˇzn´e na mal´ ych zaˇr´ızen´ıch kompar´atory pouˇz´ıvat, je potˇreba, aby jejich pamˇet’ov´e a ˇcasov´e n´aroky byly pˇrijatelnˇe n´ızk´e.
4.2
Pˇ redchoz´ı pr´ ace
V r´ amci oborov´eho projektu (viz [17]) byl framework Apache Felix upraven pro bˇeh na platformˇe Android. Byla vyuˇzita tak´e integrace kompar´ator˚ u do procesu resolvingu (typov´ a kontrola pˇri resolvingu). Pr´ace mˇela za u ´kol udˇelat jednoduch´ y v´ ykonnostn´ı test kompar´ator˚ u na platformˇe Android. K vyhodnocen´ı v´ ysledk˚ u byly porovn´ av´ any ˇcasy a pamˇet’ spotˇrebovan´a pˇri resolvingu bez typov´e kontroly a s typovou kontrolou. V´ ysledkem pr´ ace je moˇznost spuˇstˇen´ı kompar´ator˚ u na platformˇe Android a orientaˇcn´ı v´ ysledky v´ ykonnostn´ıch test˚ u. Uk´azalo se, ˇze pamˇet’ov´e a ˇcasov´e n´aroky typov´e kontroly nejsou ide´aln´ı. Pˇri testech re´aln´e aplikace doˇslo nˇekolikr´at k vyˇcerp´ an´ı pamˇeti. Relativn´ı n´ar˚ ust pamˇet’ov´ ych i ˇcasov´ ych n´arok˚ u se liˇsil pro ˇ r˚ uzn´e velikosti komponent. Casov´ a n´aroˇcnost resolvingu se s pˇrid´an´ım typov´e kontroly zv´ yˇsila v rozmez´ı 9 aˇz 45 procent, pamˇet’ov´a n´aroˇcnost se zv´ yˇsila o 15 aˇz 64 procent. Pro uˇzivatele to znamen´a zv´ yˇsen´ı doby bˇehu v ˇr´adu des´ıtek sekund.
28
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
4.3
´ Ukol t´eto pr´ ace
´ Ukol t´ eto pr´ ace
´ Ukolem t´eto pr´ ace je zv´ yˇsit pouˇzitelnost kompar´ator˚ u na mal´ ych zaˇr´ızen´ıch sn´ıˇzen´ım jejich n´ arok˚ u na syst´emov´e zdroje. Kompar´atory by mˇeli u ´spornˇe hospodaˇrit s pamˇet´ı a vytv´ aˇret mal´e datov´e struktury. Pr´ace se zamˇeˇr´ı tak´e na kontrolu a pˇr´ıpadnou optimalizaci algoritm˚ u pro sn´ıˇzen´ı ˇcasu prov´adˇen´ı typov´e kontroly.
4.3.1
Metodika
Pˇred samotnou optimalizac´ı je nutn´e vytvoˇrit mechanismus mˇeˇren´ı aktu´aln´ı v´ ykonnosti (ˇcasov´e i pamˇet’ov´e). K tomuto u ´ˇcelu byla vytvoˇrena testovac´ı aplikace, kter´ a produkuje pˇrehledn´ y v´ ystup obsahuj´ıc´ı aktu´aln´ı v´ ysledky i zlepˇsen´ı oproti v´ ysledk˚ um pˇredchoz´ım. N´ aslednˇe je moˇzn´e analyzovat k´od aplikace za u ´ˇcelem nalezen´ı problematick´ ych ˇc´ ast´ı k´ odu a proveden´ı jejich optimalizace. Anal´ yza kompar´ator˚ u prob´ıhala manu´ alnˇe i za pouˇzit´ı programov´ ych n´astroj˚ u (profiler, heap analyser). Efekt optimalizac´ı lze ovˇeˇrit a vyhodnotit pomoc´ı testovac´ı aplikace pro jednotliv´e zmˇeny i pro vˇsechny proveden´e optimalizace. Testovac´ı aplikace byla nasazena do procesu plynul´e integrace (continuous integration), aby mohla b´ yt v´ ykonnost sledov´ ana tak´e pˇri budouc´ıch zmˇen´ach.
4.4
V´ ykonnostn´ı testy
Pomoc´ı v´ ykonnostn´ıch test˚ u [34] lze ovˇeˇrit, jak se testovan´a aplikace chov´a pˇri urˇcit´e z´ atˇeˇzi. D˚ uleˇzit´ ymi hledisky k posouzen´ı v´ ykonnosti aplikace jsou obvykle konzumace pamˇeti, odezva nebo ˇcas v´ ypoˇctu. U serverov´ ych aplikac´ı se ˇcasto mˇeˇr´ı tak´e pr˚ uchodnost – poˇcet zpracovan´ ych poˇzadavk˚ u za jednotku ˇcasu. V´ ykonnostn´ı testy lze vyuˇz´ıt tak´e k mˇeˇren´ı ˇsk´alovatelnosti a spolehlivosti aplikace.
4.4.1
´ cel v´ Uˇ ykonnostn´ıch test˚ u
´ cel v´ Uˇ ykonnostn´ıch test˚ u m˚ uˇze b´ yt n´asleduj´ıc´ı: • Ovˇeˇren´ı, ˇze syst´em splˇ nuje dan´ a v´ykonnostn´ı krit´eria. Specifikace poˇzadavk˚ u na syst´em m˚ uˇze obsahovat kromˇe funkˇcn´ıch poˇzadavk˚ u tak´e poˇzadavky na v´ ykonnost, napˇr´ıklad maxim´aln´ı dobu odezvy na konkr´etn´ı akce uˇzivatele nebo pr˚ uchodnost urˇcit´eho typu poˇzadavk˚ u. V´ ykonnostn´ı poˇzadavky mohou b´ yt dan´e tak´e konfigurac´ı c´ılov´eho zaˇr´ızen´ı, napˇr´ıklad omezen´ım pamˇeti.
29
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
V´ykonnostn´ı testy
• Ovˇeˇren´ı, ˇze syst´em zvl´ adne re´ alnou z´ atˇeˇz. Bˇeˇzn´e funkˇcn´ı testy testuj´ı aplikaci pˇri minim´aln´ı z´atˇeˇzi. Chov´an´ı aplikace pˇri velk´e z´ atˇeˇzi m˚ uˇze b´ yt jin´e. Pokud z´atˇeˇz vzroste nad urˇcitou mez, syst´em nemus´ı b´ yt schopen nˇekter´e poˇzadavky plnit. Proto se pouˇz´ıvaj´ı testy, kter´e simuluj´ı pˇredpokl´adanou re´alnou z´atˇeˇz. Sleduje se, zda syst´em i pˇri t´eto z´ atˇeˇzi splˇ nuje poˇzadovan´e nebo rozumn´e limity odezvy a je schopen poskytovat kompletn´ı funkcionalitu. D´ale je moˇzn´e z´atˇeˇz postupnˇe zvyˇsovat a hledat maxim´aln´ı z´atˇeˇz, kterou je syst´em schopen zvl´adnout. • Porovn´ an´ı 2 syst´em˚ u a urˇcen´ı, kter´y m´ a lepˇs´ı v´ykonnost. V nˇekter´ ych pˇr´ıpadech jsou komponenty syst´emu nebo cel´e aplikace vyb´ır´ any podle v´ ykonnosti. Srovn´an´ı v´ ykonnosti vlastn´ı aplikace s konkurenˇcn´ımi syst´emy lze vyuˇz´ıt k propagaci. • Mˇeˇren´ı aktu´ aln´ı v´ykonnosti a porovn´ an´ı s pˇredchoz´ımi verzemi. Mˇeˇren´ı a porovn´ an´ı r˚ uzn´ ych verz´ı jedn´e aplikace lze vyuˇz´ıt k vyhodnocen´ı efektu optimalizac´ı nebo sledov´an´ı efektu jednotliv´ ych zmˇen na v´ ykonnost. Tento u ´ˇcel vyˇzaduje pˇresnˇejˇs´ı metody mˇeˇren´ı, protoˇze zmˇeny v´ ykonnosti mohou b´ yt mal´e. • Vyhled´ an´ı kritick´ych ˇc´ ast´ı syst´emu (bottleneck). Tento typ test˚ u je zamˇeˇren na vyhled´an´ı m´ıst v k´odu, kde v´ ypoˇcet tr´av´ı nejv´ıce ˇcasu. Tyto m´ısta je vhodn´e n´aslednˇe optimalizovat. K vyhled´an´ı kritick´ ych m´ıst se obvykle pouˇz´ıvaj´ı n´astroje zvan´e profilery. • Monitorov´ an´ı syst´emu. Monitorov´ an´ı se pouˇz´ıv´ a u jiˇz nasazen´ ych syst´em˚ u, proto je poˇzadov´ana n´ızk´ a reˇzie prov´ adˇen´ ych mˇeˇren´ı. Monitorov´an´ım lze odhalit potenci´aln´ı probl´emy vznikl´e napˇr´ıklad zvˇetˇsen´ım dat nad u ´nosnou mez nebo zv´ yˇsen´ım zat´ıˇzen´ı v d˚ usledku vyˇsˇs´ı obl´ıbenosti syst´emu. Na tyto probl´emy lze vˇcas reagovat.
4.4.2
Vytv´ aˇ ren´ı v´ ykonnostn´ıch test˚ u
Implementaci v´ ykonnostn´ıch test˚ u nejv´ıce ovlivˇ nuje jejich u ´ˇcel. Ten rozhoduje o tom, jak velkou reˇzii mohou testy m´ıt, zda je lze opakovat na stejn´ ych datech a ´ cel ovlivˇ jak´e technologie lze pˇri implementaci vyuˇz´ıt. Uˇ nuje tak´e metriky, kter´e je vhodn´e mˇeˇrit. Technologie mˇeˇren´ı, moˇznost opakovatelnosti test˚ u a pˇr´ıpustn´a reˇzie maj´ı z´ asadn´ı dopad na pˇresnost mˇeˇren´ı. Pro nˇekter´e u ´ˇcely je vyˇzadov´ana vysok´a pˇresnost mˇeˇren´ı (porovn´ an´ı p˚ uvodn´ı a optimalizovan´e verze syst´emu), pro jin´e plnˇe postaˇcuj´ı orientaˇcn´ı hodnoty (monitorov´an´ı syst´emu, mˇeˇren´ı pˇri re´aln´e z´atˇeˇzi). Aby mˇely v´ ysledky test˚ u co nejvˇetˇs´ı hodnotu, mˇely by b´ yt testy prov´adˇeny v prostˇred´ı, kter´e se co nejv´ıce bl´ıˇz´ı re´aln´emu. Tak´e testovac´ı data by mˇela odpov´ıdat realitˇe svou velikost´ı i r˚ uznorodost´ı.
30
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
4.5
Anal´yza k´ odu
Anal´ yza k´ odu
Pomoc´ı v´ ykonnostn´ıch test˚ u lze zjistit v´ ykonnostn´ı probl´emy aplikace. N´aslednˇe je nutn´e prov´est anal´ yzu k´ odu, kter´a odhal´ı pˇr´ıˇciny probl´em˚ u a detekuje m´ısta v k´ odu, kter´ a jsou vhodn´ a k optimalizaci. Anal´ yzu lze prov´ adˇet bud’ manu´alnˇe, nebo s pouˇzit´ım nˇejak´eho n´astroje. Pomoc´ı manu´ aln´ı anal´ yzy lze odhalit zejm´ena neefektivn´ı algoritmy nebo nevhodn´e datov´e struktury. Z´ akladn´ım n´ astrojem pro anal´ yzu je profiler. Funkˇcnost profiler˚ u obvykle zahrnuje mˇeˇren´ı ˇcasu v´ ypoˇctu v jednotliv´ ych metod´ach a poˇcet jejich zavol´an´ı. ˇ str´ Cas aven´ y v metodˇe lze rozdˇelit na ˇcas vˇcetnˇe dalˇs´ıch zavolan´ ych metod a ˇ ˇcas bez nich. Casy jsou obvykle zkresleny kv˚ uli reˇzii jejich mˇeˇren´ı. Pro u ´ˇcely anal´ yzy ale toto zkreslen´ı nen´ı podstatn´e. Pomoc´ı profileru lze odhalit metody, kter´e spotˇrebuj´ı nejv´ıce ˇcasu v´ ypoˇctu. Plat´ı zde Paretovo pravidlo, ˇze 80 procent ˇcasu je spotˇrebov´ano ve 20 procentech metod. Na tˇechto 20 procent nejn´aroˇcnˇejˇs´ıch metod m´a smysl se n´aslednˇe zamˇeˇrit pˇri manu´ aln´ı anal´ yze. Dalˇs´ımi uˇziteˇcn´ ymi n´ astroji jsou analyz´atory pamˇeti (heap analyser). S jejich pomoc´ı lze odhalit objekty, kter´e zab´ıraj´ı nejv´ıce pamˇeti, nebo tˇr´ıdy s podezˇrele velk´ ym poˇctem instanc´ı. Na z´akladˇe v´ ysledk˚ u se lze zamˇeˇrit na optimalizaci datov´ ych struktur a uvolˇ nov´ an´ı nepotˇrebn´ ych objekt˚ u. Analyz´ atory pamˇeti obvykle umoˇzn ˇuj´ı zachytit a d´ale analyzovat stav pamˇeti v jednom okamˇziku. Je proto d˚ uleˇzit´e tento okamˇzik vhodnˇe zvolit, aby z´ıskan´e v´ ysledky mˇely dobrou informaˇcn´ı hodnotu. D´ ale jsou k dispozici n´ astroje pro statickou anal´ yzu k´odu. Ty dok´aˇzou odhalit probl´emy zp˚ usoben´e ˇspatnou kvalitou k´odu.
4.5.1
N´ astroje pouˇ zit´ e pro anal´ yzu kompar´ ator˚ u
• Eclipse TPTP Eclipse TPTP [24] je profiler zaloˇzen´ y na v´ yvojov´em prostˇred´ı Eclipse. Jeho uˇzivatelsk´e rozhran´ı je velmi pˇr´ıvˇetiv´e. N´astroj nab´ız´ı velk´e mnoˇzstv´ı pohled˚ u na namˇeˇren´a data, ze kter´ ych jsem vyuˇzila hlavnˇe pˇrehled ˇcasovˇe nejn´ aroˇcnˇejˇs´ıch bal´ık˚ u, tˇr´ıd a metod. Po rozbalen´ı detailu metody se zobraz´ı vˇsechny volan´e metody opˇet seˇrazen´e podle spotˇreby ˇcasu. Nev´ yhodou n´ astroje je v´ yrazn´a reˇzie pˇri mˇeˇren´ı. V´ ypoˇcet, kter´ y bˇeˇznˇe trval nˇekolik stovek milisekund, trval s pouˇzit´ım tohoto n´astroje 14 sekund. Delˇs´ı v´ ypoˇcty nebylo moˇzn´e v˚ ubec analyzovat, protoˇze n´astroj v´ ypoˇcet nezvl´ adl a bylo nutn´e ho restartovat. Celkovˇe se n´ astroj uk´ azal b´ yt velmi uˇziteˇcn´ y a pomohl mi rychle detekovat probl´em vhodn´ y k optimalizaci (viz kapitola 4.10.1). • Eclipse MAT 31
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
Optimalizace
Eclipse MAT (Memory Analyzer) [23] je analyz´ator pamˇeti, kter´ y je tak´e postaven na v´ yvojov´em n´astroji Eclipse. Jeho uˇzivatelsk´e rozhran´ı je pomˇernˇe nepˇrehledn´e. N´ astroj nab´ız´ı ˇsirok´e spektrum pohled˚ u na data vˇcetnˇe moˇznosti vyhled´ av´ an´ı konkr´etn´ıch objekt˚ u. J´a jsem vyuˇzila zejm´ena pˇrehled nejvˇetˇs´ıch konzument˚ u pamˇeti seskupen´ ych podle bal´ık˚ u. N´ astroj analyzuje soubor vygenerovan´ y virtu´aln´ım strojem, kter´ y zachycuje stav pamˇeti v jednom okamˇziku v´ ypoˇctu. Soubor lze vygenerovat programovˇe pouˇzit´ım tohoto k´odu: MBeanServer server = ManagementFactory . getPlatformMBeanServer (); HotSpotDiagnosticMXBean hotspotMBean = ManagementFactory . newPlatformMXBeanProxy ( server , " com . sun . management : type = HotSpotDiagnostic " , HotSpotDiagnosticMXBean . class ); hotspotMBean . dumpHeap ( " heapdump . hprof " , true );
K´ od je specifick´ y pro Oracle HotSpot VM [38] a neobsahuje oˇsetˇren´ı v´ yjimek. Stav pamˇeti je uloˇzen do souboru heapdump.hprof“. ” Tak´e pomoc´ı tohoto n´ astroje se mi podaˇrilo detekovat v´ yznamn´ y probl´em v k´ odu, viz kapitola 4.10.3.
4.6
Optimalizace
Optimalizace jsou u ´pravy syst´emu za u ´ˇcelem zlepˇsen´ı jeho v´ ykonu a sn´ıˇzen´ı n´arok˚ u na syst´emov´e zdroje (pamˇet’, ˇcas). Prov´ad´ı se na z´akladˇe pˇredchoz´ı anal´ yzy k´ odu. Pro vyhodnocen´ı efektu optimalizac´ı je potˇreba m´ıt v´ ykonnostn´ı testy, kter´e mˇeˇr´ı v´ ykonnost jednotliv´ ych verz´ı syst´emu s dostateˇcnou pˇresnost´ı.
4.6.1
Mˇ eˇ ren´ı efektu optimalizac´ı
Pomoc´ı v´ ykonnostn´ıch test˚ u lze srovn´avat jednotliv´e verze syst´emu a sledovat vliv kaˇzd´e zmˇeny na v´ ykonnost. K vyhodnocen´ı jednotliv´ ych zmˇen lze srovnat v´ ykonnost aktu´ aln´ı verze s verz´ı pˇredchoz´ı. D´ıky testov´an´ı syst´emu po kaˇzd´e zmˇenˇe lze odhalit zmˇeny, kter´e zp˚ usobily sn´ıˇzen´ı v´ ykonnosti syst´emu a tyto zmˇeny odstranit. D´ılˇc´ı zmˇeny maj´ı obvykle mal´ y efekt na v´ ykonnost. Celkov´ y efekt optimalizac´ı se proto vyhodnocuje souhrnnˇe pro s´erii zmˇen. K vyhodnocen´ı slouˇz´ı srovn´ an´ı v´ ykonnosti aktu´ aln´ı verze s v´ ykonnost´ı poˇc´ateˇcn´ı (b´azov´e) verze syst´emu. Po dosaˇzen´ı potˇrebn´eho zv´ yˇsen´ı v´ ykonnosti nebo po uzavˇren´ı optimalizaˇcn´ıho cyklu je obvykle poˇc´ ateˇcn´ı verze posunuta na verzi aktu´aln´ı. Optimalizace potom mohou pokraˇcovat v dalˇs´ım cyklu. Bˇehem optimalizaˇcn´ıho cyklu je potˇreba eliminovat zmˇeny funkˇcnosti syst´emu, protoˇze ty mohou m´ıt podstatn´ y
32
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
V´ykonnost Java aplikac´ı
vliv na statistiky v´ ykonnosti. Efekt optimalizac´ı by potom nebylo moˇzn´e vyhodnotit. Poˇc´ ateˇcn´ı verze pro mˇeˇren´ı v´ ykonnosti mus´ı b´ yt vˇzdy posunuta za zmˇeny funkˇcnosti.
4.6.2
´ Uroveˇ n optimalizace
Optimalizace lze prov´ adˇet na r˚ uzn´e u ´rovni: • design Optimalizace na u ´rovni designu aplikace zahrnuj´ı volbu efektivn´ıch algoritm˚ u a vhodn´ ych datov´ ych struktur. Na t´eto u ´rovni lze obvykle dos´ahnout nejvˇetˇs´ıho zlepˇsen´ı v´ ykonnosti. • programov´y k´ od Kvalita programov´eho k´odu m˚ uˇze tak´e ovlivnit v´ ykonnost. Lze ji ovlivˇ nit volbou vhodn´ ych konstrukc´ı programovac´ıho jazyka. Casto je ovˇsem potˇreba udˇelat kompromis mezi v´ ykonnost´ı a ˇcitelnost´ı k´odu. Dneˇsn´ı pˇrekladaˇce nav´ıc pouˇz´ıvaj´ı velmi efektivn´ı metody optimalizace, proto optimalizace na t´eto u ´rovni nen´ı pˇr´ıliˇs efektivn´ı. • kompilace Dneˇsn´ı pˇrekladaˇce dok´ aˇzou v´ ykonnost aplikace v´ yraznˇe zv´ yˇsit. Optimalizace na t´eto u ´rovni m˚ uˇze znamenat zmˇenu pˇrekladaˇce nebo nastaven´ı jeho optimalizaˇcn´ıch parametr˚ u. V´ ysledn´ y rozd´ıl v´ ykonnosti m˚ uˇze b´ yt z´asadn´ı. • bˇeh Interpretovan´e jazyky, jako napˇr´ıklad Java, prov´adˇej´ı kompilaci za bˇehu pomoc´ı tzv. JIT (just-in-time) pˇrekladaˇce. V´ yhodou tˇechto pˇrekladaˇc˚ u je moˇznost vyuˇzit´ı aktu´ aln´ıho vstupu k volbˇe vhodn´ ych optimalizac´ı. Na druhou stranu nen´ı moˇzn´e dos´ahnout v´ ykonnosti nativn´ıch aplikac´ı kv˚ uli reˇzii s poˇc´ ateˇcn´ı interpretac´ı a n´asledn´ ym pˇrekladem. Na t´eto u ´rovni lze optimalizovat aplikaci volbou lepˇs´ıho virtu´aln´ıho stroje nebo nastaven´ım parametr˚ u JIT pˇrekladaˇce.
4.7
V´ ykonnost Java aplikac´ı
Hlavn´ımi v´ ykonnostn´ımi ukazateli jsou doba v´ ypoˇctu a spotˇreba pamˇeti. V t´eto kapitole se zamˇeˇr´ım bl´ıˇze na jejich specifika v Java aplikac´ıch.
4.7.1
Doba v´ ypoˇ ctu
Doba v´ ypoˇctu je obecnˇe ovlivnˇena mnoha faktory, jako je napˇr´ıklad v´ ykonnost hardware, reˇzie operaˇcn´ıho syst´emu nebo zat´ıˇzen´ı syst´emu ostatn´ımi aplikacemi. Z tˇechto d˚ uvod˚ u je jej´ı pˇresn´e mˇeˇren´ı vˇzdy obt´ıˇzn´e. Operaˇcn´ı syst´emy proto
33
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
V´ykonnost Java aplikac´ı
poskytuj´ı prostˇredky k mˇeˇren´ı procesorov´eho ˇcasu spotˇrebovan´eho konkr´etn´ım procesem, kter´ y nˇekter´e tyto vlivy alespoˇ n ˇc´asteˇcnˇe eliminuje. Pro aplikaci v Javˇe je ale z´ısk´an´ı informace o spotˇrebovan´em procesorov´em ˇcase obt´ıˇznˇe dosaˇziteln´ a. Lze ji z´ıskat pomoc´ı propojen´ı s nativn´ı knihovnou, coˇz s sebou nese dalˇs´ı reˇzii. Oproti nativn´ım aplikac´ım je tento ˇcas zkreslen reˇzi´ı virtu´ aln´ıho stroje. K dalˇs´ımu zkreslen´ı doby bˇehu v Javˇe doch´az´ı kv˚ uli ˇcinnosti garbage kolektoru (viz kapitola 4.7.3). Ten se spouˇst´ı z pohledu aplikace nepˇredv´ıdatelnˇe a bˇehem jeho ˇcinnosti je ˇcinnost aplikace obvykle zastavena. Velk´ y vliv na dobu v´ ypoˇctu m´a tak´e JIT kompil´ator, kter´ y prov´ad´ı kompilaci do strojov´eho k´ odu bˇehem v´ ypoˇctu. Na poˇc´atku v´ ypoˇctu shromaˇzd’uje kompil´ ator statistiky, na z´ akladˇe kter´ ych m˚ uˇze prov´est optimalizace k´odu. Potom je postupnˇe prov´ adˇena kompilace, kter´a se projevuje postupn´ ym zrychlov´an´ım opakovan´ ych ˇc´ ast´ı k´ odu. Po urˇcit´e dobˇe kompil´ator pˇrest´av´a pracovat a rychlost opakovan´ ych ˇc´ ast´ı v´ ypoˇctu se ust´al´ı. Moˇznostm´ı mˇeˇren´ı doby v´ ypoˇctu v Javˇe se podrobnˇe zab´ yv´a kapitola 4.8.1.
4.7.2
Spotˇ reba pamˇ eti
V programovac´ıch jazyc´ıch niˇzˇs´ıch u ´rovn´ı, jako je napˇr´ıklad C++, se o alokaci a uvolˇ nov´ an´ı pamˇeti star´ a program´ator. Z pohledu aplikace je proto jej´ı spotˇreba deterministick´ a a opakovateln´a. Naproti tomu v Javˇe se o uvolˇ nov´an´ı pamˇeti star´ a garbage kolektor (viz kapitola 4.7.3). Ten funguje podle sv´ ych algoritm˚ u a z pohledu aplikace zcela nedeterministicky. Opakovan´e proveden´ı stejn´eho algoritmu na stejn´ ych datech m˚ uˇze proto m´ıt r˚ uznou spotˇrebu pamˇeti. Chov´ an´ı garbage kolektoru je dokonce ovlivnˇeno i dostupnou pamˇet´ı. Pokud je pamˇeti m´ alo, bude se kolektor spouˇstˇet ˇcastˇeji a maxim´aln´ı obsazen´a pamˇet’ bude niˇzˇs´ı. Je proto potˇreba jeˇstˇe definovat, co je myˇsleno spotˇrebou pamˇeti“ ” v Javˇe. Kromˇe pamˇeti obsazen´e kv˚ uli ˇcinnosti samotn´e aplikace je dalˇs´ı pamˇet’ obsazena v d˚ usledku ˇcinnosti virtu´aln´ıho stroje. Tento druh pamˇeti by bylo moˇzn´e mˇeˇrit z extern´ı aplikace pomoc´ı prostˇredk˚ u operaˇcn´ıho syst´emu. Pokud se rozhodneme mˇeˇrit pamˇet’ spotˇrebovanou pouze ˇcinnost´ı samotn´e aplikace, m´ame k dispozici prostˇredky virtu´ aln´ıho stroje k mˇeˇren´ı pamˇeti alokovan´e na haldˇe. Obt´ıˇznˇe mˇeˇriteln´ a je pamˇet’ na z´asobn´ıku. Moˇznostmi mˇeˇren´ı spotˇreby pamˇeti v Java aplikaci se podrobnˇe zab´ yv´a kapitola 4.8.2.
34
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
4.7.3
V´ykonnost Java aplikac´ı
Garbage kolektor
ˇ Cinnost garbage kolektoru je jeden z hlavn´ıch faktor˚ u ovlivˇ nuj´ıc´ıch v´ ykonnost aplikac´ı v Javˇe a jej´ı mˇeˇren´ı. Jeho u ´kolem je uvolˇ novat objekty, kter´e uˇz nejsou potˇreba. Z pohledu garbage kolektoru to jsou ty objekty, kter´e jiˇz nejsou dosaˇziteln´e pomoc´ı referenc´ı z bˇeˇz´ıc´ıho programu. Algoritm˚ u pro identifikaci nedosaˇziteln´ ych objekt˚ u je v´ıce a re´alnˇe se pouˇz´ıv´a nˇekolik druh˚ u garbage kolektor˚ u [30]. Nejv´ yraznˇeji lze algoritmy rozdˇelit na: • s´eriov´e S´eriov´e algoritmy vyˇzaduj´ı pozastaven´ı aplikace bˇehem jejich prov´adˇen´ı. Jsou vhodn´e pro vˇetˇsinu aplikac´ı, proto se n´asleduj´ıc´ı text bude zamˇeˇrovat pˇredevˇs´ım na nˇe. • paraleln´ı Paraleln´ı algoritmy funguj´ı paralelnˇe s bˇeˇz´ıc´ı aplikac´ı. Odstraˇ nuj´ı nedeterministick´ a zpomalen´ı aplikace, coˇz m˚ uˇze b´ yt uˇziteˇcn´e u aplikac´ı re´aln´eho ˇcasu nebo aplikac´ı citliv´ ych na zpoˇzdˇen´ı. Jejich pouˇzit´ı m´a ale i sv´e nev´ yhody, jako je napˇr´ıklad niˇzˇs´ı efektivita. V nov´ ych verz´ıch Javy se virtu´aln´ı stroj snaˇz´ı volit optim´aln´ı garbage kolektor, velikost haldy, nastaven´ı JIT pˇrekladaˇc a dalˇs´ı parametry podle typu poˇc´ıtaˇce. Konfiguraci lze vynutit zad´an´ım parametr˚ u virtu´aln´ıho stroje.
Algoritmy garbage kolektoru Algoritmy garbage kolektoru ˇreˇs´ı pˇredevˇs´ım probl´em nalezen´ı nedosaˇziteln´ ych objekt˚ u. Primitivn´ı algoritmus je velmi jednoduch´ y. Kolektor nejprve vytvoˇr´ı seznam pˇr´ımo dosaˇziteln´ ych objekt˚ u (objekty odkazovan´e ze z´asobn´ıku). Potom pomoc´ı proch´ azen´ı grafu tvoˇren´eho referencemi mezi objekty oznaˇc´ı vˇsechny navˇst´ıven´e objekty. Vˇsechny ostatn´ı objekty, kter´e z˚ ustaly neoznaˇcen´e, jsou nedosaˇziteln´e a kolektor je m˚ uˇze uvolnit. Probl´emem tohoto primitivn´ıho algoritmu je jeho ˇcasov´a n´aroˇcnost. Re´aln´e algoritmy se snaˇz´ı pouˇz´ıvat r˚ uzn´e heuristick´e metody ke zv´ yˇsen´ı rychlosti vyhled´ av´ an´ı. D˚ usledkem heuristick´ ych metod je nalezen´ı pouze nˇekter´ ych nepotˇrebn´ ych objekt˚ u. Nepotˇrebn´e objekty mohou proto pˇreˇz´ıt i nˇekolik bˇeh˚ u kolektoru. Z´ akladn´ı heuristickou metodou je zaveden´ı generac´ı objekt˚ u. Tato metoda vych´ az´ı z pozorov´ an´ı, ˇze naprost´a vˇetˇsina objekt˚ u pˇrest´av´a b´ yt potˇrebn´a velmi kr´ atce po sv´em vzniku. Naopak objekty, kter´e pˇreˇzij´ı pˇres urˇcitou ˇcasovou mez, z˚ ust´ avaj´ı obvykle potˇrebn´e jeˇstˇe velmi dlouho. Kolektor se proto zamˇeˇruje zejm´ena na vyhled´ av´ an´ı mezi mlad´ ymi objekty. V praxi se pouˇz´ıvaj´ı tˇri generace objekt˚ u: mlad´a (young), starˇs´ı (tenured) a permanentn´ı (permanent) – obr´azek 4.1 Kolektor vyhled´av´a objekty po jednotliv´ ych generac´ıch, vˇzdy kdyˇz se dan´a generace napln´ı. 35
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
V´ykonnost Java aplikac´ı
Novˇe alokovan´e objekty pˇrib´ yvaj´ı do mlad´e generace. Po naplnˇen´ı mlad´e generace je spuˇstˇena minoritn´ı kolekce (minor collection), kter´a se zamˇeˇruje pouze na mladou generaci. Obvykle je moˇzn´e vˇetˇsinu objekt˚ u uvolnit, ty zbyl´e se pˇresunou do prostoru pˇreˇzivˇs´ıch (souˇc´ast mlad´e generace). Prostory pˇreˇzivˇs´ıch jsou v mlad´e generaci dva, jeden je vˇzdy pr´azdn´ y. Bˇehem prov´ adˇen´ı minoritn´ı kolekce se pˇreˇzivˇs´ı objekty pˇresouvaj´ı do pr´azdn´eho prostoru pˇreˇzivˇs´ıch a p˚ uvodn´ı obsazen´ y prostor pˇreˇzivˇs´ıch se vypr´azdn´ı. Po urˇcit´em mnoˇzstv´ı pˇresun˚ u objektu, nebo pokud je prostor pˇreˇzivˇs´ıch zaplnˇen, je objekt posl´ an do starˇs´ı generace. Po naplnˇen´ı starˇs´ı generace doje k pln´e kolekci (full/major collection). Ta trv´ a d´ele a zab´ yv´ a se objekty v mlad´e i starˇs´ı generaci. Konkr´etn´ı algoritmus vyhled´ av´ an´ı objekt˚ u m˚ uˇze b´ yt pro kaˇzd´ y typ kolekce jin´ y.
Obr´ azek 4.1: Generace objekt˚ u. Obr´azek byl pˇrevzat z [30].
Nastaven´ı garbage kolektoru V´ ykonnost garbage kolektoru je velmi z´avisl´a na velikosti jednotliv´ ych generac´ı. Proto se v r´ amci ˇcinnosti kolektoru tyto velikosti dodateˇcnˇe upravuj´ı, aby mohl ˇ ım je velikost mlad´e generace vyˇsˇs´ı, t´ım je vyˇsˇs´ı kolektor fungovat optim´ alnˇe. C´ tak´e efektivita kolektoru. Na druhou stranu se z´aroveˇ n prodluˇzuj´ı pauzy aplikace pˇri spuˇstˇen´ı kolektoru. Velikost prostoru pˇreˇzivˇs´ıch m´a na v´ ykonnost kolektoru menˇs´ı vliv. Velikost generac´ı a dalˇs´ı konfiguraci chov´an´ı garbage kolektoru lze upravovat pomoc´ı parametr˚ u virtu´ aln´ıho stroje. Nˇekter´e uˇziteˇcn´e parametry: • -verbose:gc Vypisuje informace o kaˇzd´em spuˇstˇen´ı garbage kolektoru. • -XX:+PrintGCDetails, -XX:+PrintGCTimeStamps Rozˇsiˇruje informativn´ı v´ ypisy o ˇcinnosti kolektoru o dalˇs´ı informace.
36
Vyuˇzit´ı Automatizovan´ kompar´ ator˚ u na e metody mal´ych mˇ zaˇ erˇr´ızen´ en´ııch v´ykonnostn´ıch parametr˚ u Java aplikac´ı
• -Xmx Nastavuje maxim´ aln´ı velikost haldy (reserved) a t´ım ovlivˇ nuje maxim´aln´ı velikost generac´ı. • -Xms Nastavuje prvotn´ı a z´ aroveˇ n minim´aln´ı velikost haldy a t´ım ovlivˇ nuje minim´ aln´ı velikost generac´ı. • -XX:MinHeapFreeRation, -XX:MaxHeapFreeRatio Definuje optim´ aln´ı aktu´ aln´ı velikost haldy na z´akladˇe pomˇeru voln´eho a obsazen´eho prostoru. Pˇri kaˇzd´em bˇehu kolektoru m˚ uˇze b´ yt aktu´aln´ı velikost haldy pˇrizp˚ usobena v mez´ıch maxim´aln´ı a minim´aln´ı velikosti. • -XX:NewRatio Pomˇer mlad´e a starˇs´ı generace. • -XX:NewSize, -XX:MaxNewSize Omezen´ı velikosti mlad´e generace zdola a shora. • -XX:SurvivorRatio Upravuje velikost prostoru pro pˇreˇzivˇs´ı. Pokud je pomoc´ı parametr˚ u -Xmx a -Xms nastavena velikost haldy na shodnou (nemˇennou) hodnotu, stane se chov´an´ı garbage kolektoru l´epe pˇredv´ıdateln´e, protoˇze se nebudou prov´adˇet zmˇeny aktu´aln´ı velikosti haldy a generac´ı. Pokud je nastavena velikost mlad´e generace pomoc´ı -XX:NewSize na pˇr´ıliˇs vysokou hodnotu, bude znemoˇznˇeno prov´adˇen´ı minoritn´ı kolekce a kaˇzd´a kolekce bude pln´ a. Vol´ an´ı metody System.gc() napl´anuje vˇzdy plnou kolekci.
4.8
4.8.1
Automatizovan´ e metody mˇ eˇ ren´ı v´ ykonnostn´ıch parametr˚ u Java aplikac´ı Metody mˇ eˇ ren´ı doby v´ ypoˇ ctu
Z´ akladem mˇeˇren´ı doby v´ ypoˇctu je zjiˇstˇen´ı aktu´aln´ıho ˇcasu pˇred v´ ypoˇctem, zjiˇstˇen´ı aktu´ aln´ıho ˇcasu po v´ ypoˇctu a jejich odeˇcten´ı. Jednotliv´e metody se liˇs´ı pouze ve zp˚ usobu, jak´ ym je z´ısk´an aktu´aln´ı ˇcas.
Metody z´ısk´ an´ı aktu´ aln´ıho ˇ casu Nejvhodnˇejˇs´ı by bylo mˇeˇrit dobu v´ ypoˇctu pomoc´ı procesorov´eho ˇcasu, tj. ˇcasu bˇehu procesu na procesoru. Tento ˇcas by mˇel d´avat nejst´alejˇs´ı v´ ysledky pˇri opakov´ an´ı testu, protoˇze nen´ı pˇr´ıliˇs ovlivnˇen ostatn´ımi procesy v syst´emu. V Javˇe je ale probl´em tento ˇcas z´ıskat. Pouˇzit´ım management API dostupn´ ym 37
Vyuˇzit´ı Automatizovan´ kompar´ ator˚ u na e metody mal´ych mˇ zaˇ erˇr´ızen´ en´ııch v´ykonnostn´ıch parametr˚ u Java aplikac´ı
v Javˇe lze sice tento ˇcas z´ıskat, ale pouze s n´ızk´ ym rozliˇsen´ım. Mˇeˇren´ım bylo zjiˇstˇeno rozliˇsen´ı (nejmenˇs´ı interval) 15,6 milisekund. K´od z´ısk´an´ı ˇcasu: long time = ManagementFactory . getThreadMXBean () . getCurrentThreadCpuTime ();
Druhou alternativou je mˇeˇrit re´aln´ y ˇcas, kter´ y lze v Javˇe z´ıskat bud’ v milisekund´ ach, nebo v nanosekund´ach. K´od z´ısk´an´ı ˇcasu v milisekund´ach: long time = System . currentTimeMillis ();
Rozliˇsen´ı tohoto ˇcasu je 1 milisekunda. Pˇresnost pro mˇeˇren´ı kr´atk´ ych u ´sek˚ u je ale omezena kv˚ uli obˇcasn´emu prov´adˇen´ı synchronizace. Nejpˇresnˇejˇs´ı je tˇret´ı zp˚ usob z´ısk´av´an´ı ˇcasu, v nanosekund´ach: long time = System . nanoTime ();
Rozliˇsen´ı tohoto ˇcasu je pouh´ ych 513 nanosekund. Tento zp˚ usob je pˇr´ımo urˇcen pro mˇeˇren´ı kr´ atk´ ych ˇcasov´ ych interval˚ u. Uv´ adˇen´ a rozliˇsen´ı jednotliv´ ych ˇcas˚ u se mohou na r˚ uzn´ ych poˇc´ıtaˇc´ıch liˇsit. Procesorov´ y ˇcas nemus´ı b´ yt podporovan´ y v˚ ubec.
Vybran´ a metoda z´ısk´ an´ı aktu´ aln´ıho ˇ casu Vybran´ a metoda kombinuje v´ yhody procesorov´eho ˇcasu a re´aln´eho ˇcasu v nanosekund´ ach. Z´ akladem je mˇeˇren´ı ˇcasu v nanosekund´ach, kter´e poskytuje v´ ysledky s vysok´ ym rozliˇsen´ım. V´ ysledek je vˇzdy porovn´an s v´ ysledkem z´ıskan´ ym mˇeˇren´ım procesorov´eho ˇcasu. Pokud se v´ ysledky pˇr´ıliˇs liˇs´ı (o nastaven´e procento), je v´ ysledek ignorov´ an a mˇeˇren´ı opakov´ano. T´ım je ˇc´asteˇcnˇe eliminov´an vliv ostatn´ıch proces˚ u v syst´emu.
Metodika mˇ eˇ ren´ı ˇ bude mˇeˇren na delˇs´ıch f´ Cas az´ıch v´ ypoˇctu, konkr´etnˇe u kompar´ator˚ u se bude jednat o f´ azi naˇcten´ı reprezentac´ı a f´azi porovn´an´ı. Pˇresnost mˇeˇren´ı m˚ uˇze ovlivnit tak´e spuˇstˇen´ı garbage kolektoru, proto je nutn´e jeho spuˇstˇen´ı bˇehem mˇeˇren´ı zabr´ anit (popis implementace bude pops´an v kapitole 4.8.3). Pˇred samotn´ ym mˇeˇren´ım je nutn´e nˇekolikr´at v´ ypoˇcet prov´est, aby se eliminoval vliv JIT kompil´ atoru. Druhou moˇznost´ı je JIT kompilaci vypnout pomoc´ı pˇrep´ınaˇce virtu´ aln´ıho stroje -Xint.
4.8.2
Metody mˇ eˇ ren´ı spotˇ reby pamˇ eti
Spotˇreba pamˇeti, podobnˇe jako doba v´ ypoˇctu, bude tak´e mˇeˇrena pro jednotliv´e f´ aze v´ ypoˇctu. Jej´ı mˇeˇren´ı je ale sloˇzitˇejˇs´ı, protoˇze se (obecnˇe) m˚ uˇze bˇehem mˇe38
Vyuˇzit´ı Automatizovan´ kompar´ ator˚ u na e metody mal´ych mˇ zaˇ erˇr´ızen´ en´ııch v´ykonnostn´ıch parametr˚ u Java aplikac´ı
ˇren´e f´ aze nepˇredv´ıdatelnˇe mˇenit. Bude proto nutn´e bl´ıˇze specifikovat, co je pod pojmem spotˇreba pamˇeti“ myˇsleno. ” Aktu´ alnˇ e obsazen´ a pamˇ et’ O trochu jednoduˇsˇs´ım probl´emem je zjiˇstˇen´ı spotˇreby pamˇeti v jednom okamˇziku, neboli zjiˇstˇen´ı aktu´ alnˇe obsazen´e pamˇeti. Metod k jej´ımu z´ısk´an´ı je nˇekolik. Prvn´ım zp˚ usobem je z´ısk´ an´ı obsazen´e pamˇeti prostˇrednictv´ım tˇr´ıdy Runtime: long memory = Runtime . getRuntime (). totalMemory () - Runtime . getRuntime (). freeMemory ();
Tento zp˚ usob nen´ı pˇr´ıliˇs pˇresn´ y (nem´a dostateˇcn´e rozliˇsen´ı). Stejn´ ym probl´emem trp´ı i druh´ y zp˚ usob, kter´ ym je pouˇzit´ı management API Javy: long memory = ManagementFactory . getMemoryMXBean () . getHeapMemoryUsage (). getUsed ();
Uk´ azalo se, ˇze nejlepˇs´ı metodou je z´ısk´an´ı obsazen´e pamˇeti z informac´ı garbage kolektoru dostupn´ ych pˇres management API: com . sun . management . GarbageCollectorMXBean sunBean1 = ( com . sun . management . GarbageCollectorMXBean ) ManagementFactory . g et Ga rb ag eC ol le ct or MX Be ans (). get (1); long memoryBeforeGC = 0; long memoryAfterGC = 0; GcInfo info = sunBean1 . getLastGcInfo (); for ( MemoryUsage e : info . getMemoryUsageBeforeGc (). values ()){ memoryBeforeGC += e . getUsed (); } for ( MemoryUsage e : info . getMemoryUsageAfterGc (). values ()){ memoryAfterGC += e . getUsed (); }
Tento k´ od funguje pouze pro virtu´aln´ı stroj Oracle HotSpot VM [38]. Na zaˇc´ atku je z´ısk´ ana bean tˇr´ıda s informacemi o garbage kolektoru prov´adˇej´ıc´ıho plnou kolekci. (V syst´emu jsou dva kolektory, kolektor na indexu 0 obstar´av´a minoritn´ı kolekci.) Bean tˇr´ıda je pˇretypov´ana na speci´aln´ı rozhran´ı pro HotSpot VM kolektor. D´ıky tomu je moˇzn´e z´ıskat informace o posledn´ı kolekci (GcInfo). Informace obsahuj´ı obsazenou pamˇet’ pro jednotliv´e generace a prostory pˇred a po proveden´ı kolekce. Pro spr´ avnou funkci k´ odu je potˇreba nastavit pouˇzit´ı s´eriov´eho garbage kolektoru. K´ od z´ısk´ a hodnotu obsazen´e pamˇeti v dobˇe pˇred a po spuˇstˇen´ı garbage kolektoru. Pro z´ısk´ an´ı pamˇeti v libovoln´em okamˇziku v´ ypoˇctu staˇc´ı vynutit spuˇstˇen´ı kolektoru v tomto okamˇziku (implementace je pops´ana v kapitole 4.8.3). Dalˇs´ı metoda pouˇz´ıv´ au ´plnˇe jin´ y pˇr´ıstup, neˇz metody pˇredchoz´ı. Z popisovan´ ych metod je tato metoda nejpˇresnˇejˇs´ı, ale tak´e nejn´aroˇcnˇejˇs´ı na implementaci, 39
Vyuˇzit´ı Automatizovan´ kompar´ ator˚ u na e metody mal´ych mˇ zaˇ erˇr´ızen´ en´ııch v´ykonnostn´ıch parametr˚ u Java aplikac´ı
proto nakonec nebyla v t´eto pr´aci pouˇzita. Z´akladem je sledov´an´ı vzniku a z´aniku jednotliv´ ych objekt˚ u a udrˇzov´an´ı souˇctu jejich velikost´ı [39]. Velikost objektu lze napˇr´ıklad zjistit souˇctem velikost´ı vˇsech jeho pol´ı, kter´e lze z´ıskat pouˇzit´ım reflexe. Pˇresnˇejˇs´ıho v´ ysledku lze doc´ılit pouˇzit´ım instrumentace [19]. Sledov´ an´ı vzniku objekt˚ u lze implementovat pomoc´ı aspekt˚ u, kter´e mohou b´ yt nav´ az´ any na vol´ an´ı konstruktoru. Sledov´an´ı z´aniku objekt˚ u lze implementovat pomoc´ı tzv. phantom referenc´ı (pops´ano v kapitole 4.8.3).
Definice spotˇ reby pamˇ eti v´ ypoˇ ctu Nyn´ı je jiˇz vyjasnˇena metoda mˇeˇren´ı obsazen´e pamˇeti v jednom okamˇziku, st´ale je ale v´ıce moˇznost´ı definice spotˇreby pamˇeti cel´eho v´ ypoˇctu nebo jeho f´aze. Nelze bez u ´prav vyuˇz´ıt jednoduch´ y algoritmus mˇeˇren´ı doby v´ ypoˇctu a vypoˇc´ıtat spotˇrebu jen jako rozd´ıl obsazen´e pamˇeti na zaˇc´atku a na konci v´ ypoˇctu. Zmˇeny obsazen´e pamˇeti jsou ovlivnˇeny ˇcinnost´ı garbage kolektoru. I kdyby se jednalo o jazyk bez garbage kolektoru, pro dokonal´ y popis spotˇreby pamˇeti v ˇcasov´em u ´seku je potˇreba funkce, nikoliv jedna hodnota. Funkce je ale nepraktick´ a pro u ´ˇcely vyhodnocen´ı efektu optimalizac´ı. Proto je potˇreba tuto funkci pˇrev´est na jednu nebo nˇekolik hodnot, kter´e ponesou co nejd˚ uleˇzitˇejˇs´ı informace o spotˇrebˇe pamˇeti. Intuitivnˇe je spotˇreba pamˇeti obvykle vn´ım´ana jako minim´aln´ı pamˇet’ potˇrebn´ a pro bˇeh v´ ypoˇctu. Pokud by se jednalo o program v jazyce bez garbage kolektoru, pak by bylo moˇzn´e tuto spotˇrebu definovat jako maximum aktu´alnˇe alokovan´e pamˇeti bˇehem doby v´ ypoˇctu. Spr´ava pamˇeti pomoc´ı garbage kolektoru ale mˇeˇren´ı takov´e spotˇreby t´emˇeˇr znemoˇzn ˇuje a pro praktick´e u ´ˇcely hodnota t´eto informace kles´ a. Pokud bychom se rozhodli ji pˇresto mˇeˇrit, bylo by to moˇzn´e jen s omezenou pˇresnost´ı. Pˇresnost je omezena hlavnˇe z d˚ uvodu velk´e reˇzie garbage kolektoru (nelze ho spouˇstˇet pˇr´ıliˇs ˇcasto) a jeho nepˇredv´ıdateln´eho chov´an´ı (nˇekter´e nedosaˇziteln´e objekty nemus´ı b´ yt pˇri kolekci uvolnˇeny). Pˇresnost by se teoreticky dala zv´ yˇsit nalezen´ım vlastn´ıho mechanismu zjiˇst’ov´an´ı nedosaˇziteln´ ych objekt˚ u. Princip spoˇc´ıv´ a v dostateˇcnˇe ˇcast´em mˇeˇren´ı obsazen´e pamˇeti (napˇr´ıklad na zaˇc´ atku a na konci kaˇzd´e metody) a zavol´an´ı garbage kolektoru vˇzdy, kdyˇz se spotˇreba zv´ yˇs´ı nad urˇcit´ y pr´ah. Po proveden´ı kolekce se pˇr´ıpadnˇe hodnota prahu zv´ yˇs´ı na spotˇrebu pamˇeti po kolekci plus nˇejak´ y krok, kter´ y urˇc´ıme podle poˇzadovan´eho rozliˇsen´ı. K ˇcast´emu mˇeˇren´ı pamˇeti nelze vyuˇz´ıt metodu spojenou s garbage kolektorem. Pokud by n´ am staˇcilo niˇzˇs´ı rozliˇsen´ı, m˚ uˇzeme pouˇz´ıt nˇekterou z prvn´ıch dvou popsan´ ych metod pro mˇeˇren´ı aktu´alnˇe obsazen´e pamˇeti. Pro zlepˇsen´ı rozliˇsen´ı by byla nejvhodnˇejˇs´ı metoda posledn´ı, kter´a vyuˇz´ıv´a aspekty. Pomoc´ı aspekt˚ u by bylo tak´e moˇzn´e zajistit spuˇstˇen´ı mˇeˇren´ı na zaˇc´atku a na konci kaˇzd´e
40
Vyuˇzit´ı Automatizovan´ kompar´ ator˚ u na e metody mal´ych mˇ zaˇ erˇr´ızen´ en´ııch v´ykonnostn´ıch parametr˚ u Java aplikac´ı
metody. Abychom mˇeˇren´ı co nejv´ıce urychlili, m˚ uˇzeme v´ ypoˇcet testovat nˇekolikr´ at a vˇzdy zpˇresnit krok a nastavit pˇresnˇejˇs´ı poˇc´ateˇcn´ı pr´ah. T´ım se sn´ıˇz´ı poˇcet spuˇstˇen´ı garbage kolektoru, coˇz je ˇcasovˇe n´aroˇcn´a operace. Metoda nebyla v t´eto pr´ aci vyuˇzita, zejm´ena kv˚ uli sloˇzitosti jej´ı implementace a d´ıky pouˇzitelnosti n´ asleduj´ıc´ıch popsan´ ych definic spotˇreby pamˇeti. Druhou moˇznost´ı je definovat spotˇrebu pamˇeti jako celkov´e mnoˇzstv´ı alokovan´e pamˇeti v dan´e f´ azi v´ ypoˇctu. I takto definovan´a spotˇreba m´a dobrou informaˇcn´ı hodnotu, protoˇze velikost alokovan´e pamˇeti ovlivˇ nuje ˇcetnost spouˇstˇen´ı garbage kolektoru, a t´ım je ovlivnˇena tak´e doba v´ ypoˇctu. Mˇeˇren´ı t´eto spotˇreby je velmi jednoduch´e za pˇredpokladu, ˇze pˇred v´ ypoˇctem je uvolnˇena veˇsker´a pamˇet’ z pˇredchoz´ıch v´ ypoˇct˚ u a bˇehem v´ ypoˇctu nedojde ke spuˇstˇen´ı garbage kolektoru. Jak toho doc´ılit je pops´ ano v kapitole 4.8.3. Potom staˇc´ı jen zmˇeˇrit aktu´aln´ı obsazenou pamˇet’ na zaˇc´ atku a na konci v´ ypoˇctu a hodnoty odeˇc´ıst. Tˇret´ı definice bere spotˇrebu pamˇeti v´ ypoˇctu jako pamˇet’ obsazenou v´ ypoˇctem vytvoˇren´ ymi datov´ ymi strukturami. Jej´ı mˇeˇren´ı je velmi podobn´e jako v pˇredchoz´ı definici, pouze je po v´ ypoˇctu mˇeˇrena pamˇet’ aˇz po spuˇstˇen´ı garbage kolektoru. Hodnoty spotˇreby podle druh´e a tˇret´ı definice jsou horn´ım a doln´ım odhadem pro spotˇrebu podle prvn´ı definice.
4.8.3
Jak ovl´ adat garbage kolektor
Detekce spuˇ stˇ en´ı garbage kolektoru Spuˇstˇen´ı garbage kolektoru lze sledovat d´ıky informativn´ım v´ ypis˚ um, kter´e lze vynutit zad´ an´ım parametru virtu´aln´ıho stroje (kapitola 4.7.3). Programovˇe lze spuˇstˇen´ı detekovat s vyuˇzit´ım management API: long count = 0; for ( GarbageCollectorMXBean bean : ManagementFactory . g et Ga rb ag eC ol le ct or MX Be an s ()) { count += bean . getCollectionCount (); }
Uveden´ y k´ od zjiˇst’uje celkov´ y poˇcet spuˇstˇen´ı garbage kolektoru od spuˇstˇen´ı aplikace. Pokud se poˇcet pˇred v´ ypoˇctem liˇs´ı od poˇctu po proveden´ı v´ ypoˇctu, doˇslo bˇehem v´ ypoˇctu ke spuˇstˇen´ı garbage kolektoru.
Jak vynutit spuˇ stˇ en´ı garbage kolektoru Zavol´ an´ı metody System.gc() napl´anuje spuˇstˇen´ı garbage kolektoru. Ten je spuˇstˇen asynchronnˇe. Na jeho spuˇstˇen´ı je ale moˇzn´e poˇckat, napˇr´ıklad pomoc´ı phantom referenc´ı. Phantom reference [36] obsahuje referenci na libovoln´ y objekt, kter´a je ignorov´ ana garbage kolektorem. Pokud je objekt dosaˇziteln´ y pouze pomoc´ı phantom 41
Vyuˇzit´ı kompar´ ator˚ Implementace u na mal´ych zaˇ mˇ re´ızen´ ˇren´ııch v´ykonnostn´ıch parametr˚ u kompar´ atoru
referenc´ı, m˚ uˇze b´ yt uvolnˇen. Na ud´alost uvolnˇen´ı objektu lze dokonce reagovat, proto lze tyto reference vyuˇz´ıt k proveden´ı u ´klidov´ ych operac´ı. Tato metoda je implementov´ana v knihovnˇe jlibs [7], kter´a poskytuje jednoduch´e rozhran´ı pro synchronn´ı zavol´an´ı garbage kolektoru: jlibs . core . lang . RuntimeUtil . gc ();
Metodu je tˇreba pouˇz´ıvat opatrnˇe, protoˇze ˇcek´an´ı na garbage kolektor v´ yraznˇe prodluˇzuje dobu v´ ypoˇctu (testu).
Jak zabr´ anit spuˇ stˇ en´ı garbage kolektoru Spolehlivˇe zabr´ anit spuˇstˇen´ı garbage kolektoru nelze, ale m˚ uˇzeme minimalizovat jeho pravdˇepodobnost a pˇr´ıpadn´e spuˇstˇen´ı detekovat. Z´akladem je zajiˇstˇen´ı dostatku voln´e pamˇeti pro v´ ypoˇcet. Pomoc´ı parametr˚ u virtu´aln´ıho stroje -Xms a -Xmx lze nastavit dostateˇcnˇe vysokou hodnotu minim´aln´ı a maxim´aln´ı velikosti pamˇeti. Pomoc´ı parametr˚ u -XX:NewSize a -XX:MaxNewSize podobnˇe nastav´ıme dostateˇcnou velikost mlad´e generace. Pˇred v´ ypoˇctem uvoln´ıme pamˇet’ synchronn´ım zavol´an´ım garbage kolektoru. Po proveden´ı v´ ypoˇctu zkontrolujeme, zda se bˇehem v´ ypoˇctu garbage kolektor nespustil. Pokud ano, ignorujeme v´ ysledek testu a test zopakujeme.
Jak donutit garbage kolektor uvolnit nepotˇ rebnou pamˇ et’ Spuˇstˇen´ı garbage kolektoru (vˇcetnˇe pln´e kolekce) negarantuje uvolnˇen´ı veˇsker´e nedosaˇziteln´e pamˇeti. Experiment´alnˇe jsem nalezla zp˚ usob, jak uvolnit vˇetˇsinu pamˇeti z pˇredchoz´ıch v´ ypoˇct˚ u. Metoda spoˇc´ıv´ a v zaplnˇen´ı veˇsker´e pamˇeti aˇz do vyhozen´ı chyby OutOfMemoryError a n´ asledn´em zavol´ an´ı garbage kolektoru. Pamˇet’ nejprve pln´ım bloky o velikosti 1 MB, pot´e i vˇetˇs´ımi bloky. Fungov´an´ı metody bylo ovˇeˇreno ziskem dostateˇcnˇe pˇresn´ ych v´ ysledk˚ u mˇeˇren´ı spotˇreby pamˇeti (kapitola 4.8.2).
4.9
4.9.1
Implementace mˇ eˇ ren´ı v´ ykonnostn´ıch parametr˚ u kompar´ atoru ´ cel implementace Uˇ
Pro vyhodnocen´ı efektu optimalizac´ı, kter´e jsou u ´kolem t´eto pr´ace, jsem vytvoˇrila aplikaci pro v´ ykonnostn´ı testy kompar´atoru. Efekt prov´adˇen´ ych optimalizac´ı je moˇzn´e sledovat po kaˇzd´e zmˇenˇe k´odu a celkov´ y v´ ysledek je z´ısk´an z porovn´ an´ı v´ ykonnosti koneˇcn´e a poˇc´ateˇcn´ı verze k´odu. Efekt optimalizac´ı lze vyˇc´ıst z pˇrehledn´eho reportu generovan´eho aplikac´ı. 42
Vyuˇzit´ı kompar´ ator˚ Implementace u na mal´ych zaˇ mˇ re´ızen´ ˇren´ııch v´ykonnostn´ıch parametr˚ u kompar´ atoru
Testovac´ı aplikaci jsem integrovala tak´e do procesu plynul´e integrace zajiˇst’ovan´e aplikac´ı Hudson. Spuˇstˇen´ım aplikace na zat´ıˇzen´em serveru se sice zkresluj´ı v´ ysledky doby v´ ypoˇctu, ale pˇresnost mˇeˇren´ı spotˇreby pamˇeti z˚ ust´av´a zachov´ana. V´ ykonnost kompar´ ator˚ u bude moˇzn´e sledovat i v budoucnu po ukonˇcen´ı t´eto pr´ ace.
4.9.2
V´ ystup testovac´ı aplikace
Aplikace generuje dvˇe pˇrehledn´e tabulky (viz kapitola 4.10.4) pro kaˇzdou mˇeˇrenou f´ azi v´ ypoˇctu. Pro u ´ˇcely kompar´ator˚ u byl v´ ypoˇcet rozdˇelen do dvou f´az´ı, na f´ azi naˇcten´ı reprezentace ( loader“) a f´azi porovn´an´ı ( cmp“). ” ” ˇ R´ adky tabulek obsahuj´ı namˇeˇren´e v´ ysledky pro r˚ uzn´e metody mˇeˇren´ı. Aplikace mˇeˇr´ı dobu bˇehu v´ ypoˇctu, celkovou alokovanou pamˇet’ a pamˇet’ obsazenou v´ ysledn´ ymi datov´ ymi strukturami. Prvn´ı tabulka obsahuje absolutn´ı namˇeˇren´e hodnoty v jednotliv´ ych verz´ıch k´ odu. Druh´ a tabulka obsahuje pouze dva sloupce s daty. V´ yznam prvn´ıho sloupce je zlepˇsen´ı aktu´ aln´ı verze oproti verzi pˇredchoz´ı. V´ yznam druh´eho sloupce je zlepˇsen´ı aktu´ aln´ı verze oproti verzi poˇc´ateˇcn´ı. V´ ysledky v tabulk´ ach jsou vypoˇc´ıt´any vˇzdy ze sady test˚ u pomoc´ı jednoduch´ ych statistick´ ych metod. V´ ysledky jednotliv´ ych test˚ u jsou dostupn´e ve form´ atu XML.
4.9.3
Architektura
Aplikace je spouˇstˇena formou JUnit [12] test˚ u. Tento zp˚ usob byl zvolen hlavnˇe z d˚ uvodu snadnˇejˇs´ı integrace do Hudsonu. Proces testov´an´ı nav´ıc m˚ uˇze selhat, kdyˇz nen´ı moˇzn´e doc´ılit dostateˇcn´e pˇresnosti mˇeˇren´ı (napˇr. kv˚ uli ˇspatn´e konfiguraci nebo zat´ıˇzen´ı poˇc´ıtaˇce). V takov´em pˇr´ıpadˇe je vyhozen´ım v´ yjimky doc´ıleno selh´ an´ı unit testu. V procesu testov´ an´ı maj´ı hlavn´ı u ´lohu dva typy objekt˚ u: testovac´ı pˇr´ıpad (PerfTestCase) a tester (Tester). Testovac´ı pˇr´ıpad obsahuje implementaci testovan´eho v´ ypoˇctu. Tester implementuje metodu mˇeˇren´ı, tj. z´ısk´an´ı hodnoty mˇeˇren´e veliˇciny pˇred mˇeˇrenou f´ az´ı v´ ypoˇctu a po n´ı. Tester d´ale rozhoduje o potˇrebn´em poˇctu opakov´ an´ı v´ ypoˇctu kaˇzd´eho testovac´ıho pˇr´ıpadu a o u ´spˇechu nebo ne´ uspˇechu mˇeˇren´ı. Aplikace obsahuje nˇekolik metod mˇeˇren´ı, kter´e jsou implementovan´e jednotliv´ ymi testery. Pomoc´ı ˇr´ıd´ıc´ıho objektu jsou spuˇstˇeny testovac´ı pˇr´ıpady postupnˇe se vˇsemi testery. Testovac´ı pˇr´ıpad informuje testera o poˇc´atku a konci jednotliv´ ych f´ az´ı v´ ypoˇctu. V´ ysledky test˚ u jsou od vˇsech tester˚ u hromadˇeny v objektu typu ResultsGatherer, kter´ y zajiˇst’uje jejich dalˇs´ı zpracov´an´ı a organizaci. Z namˇeˇren´ ych hodnot je napˇr´ıklad vypoˇc´ıt´ an pr˚ umˇer a dalˇs´ı statistick´e u ´daje. 43
Vyuˇzit´ı kompar´ ator˚ Implementace u na mal´ych zaˇ mˇ re´ızen´ ˇren´ııch v´ykonnostn´ıch parametr˚ u kompar´ atoru
4.9.4
Popis nˇ ekter´ ych metod d˚ uleˇ zit´ ych rozhran´ı
• void Tester.startPhase(String phaseName) Touto metodou oznamuje testovac´ı pˇr´ıpad testerovi, ˇze zaˇc´ın´a f´aze v´ ypoˇctu s n´ azvem dan´ ym parametrem phaseName. Tester provede u ´klidov´e operace a zah´ aj´ı mˇeˇren´ı. • void Tester.stopPhase(String message) Touto metodou oznamuje testovac´ı pˇr´ıpad testerovi, ˇze f´aze v´ ypoˇctu konˇc´ı. Zpr´ ava pˇredan´ a parametrem upˇresˇ nuje okolnosti ukonˇcen´ı a je dohledateln´ a v XML v´ ystupu aplikace. Tester z´ısk´a v´ ysledky mˇeˇren´ı. • void Tester.initAccuracyChecking() Impuls od ˇr´ıd´ıc´ıho algoritmu, ˇze m´a tester zah´ajit kontrolu pˇresnosti mˇeˇren´ı. Pˇresnost je mˇeˇrena pro v´ıce jednotliv´ ych mˇeˇren´ı najednou, protoˇze jednotliv´ a mˇeˇren´ı d´ avaj´ı pˇr´ıliˇs mal´e vzorky pro kontrolu pˇresnosti. • boolean Tester.isAccuracyOk() ˇ ıd´ıc´ı algoritmus touto metodou zjiˇst’uje, zda mˇeˇren´ı probˇehlo u R´ ´spˇeˇsnˇe (s dostateˇcnou pˇresnost´ı). • int Tester.getRepeatCount() ˇ ıd´ıc´ı algoritmus touto metodou zjiˇst’uje, kolikr´at je potˇreba kaˇzd´ R´ y testovac´ı pˇr´ıpad s pouˇzit´ım dan´eho testera u ´spˇeˇsnˇe opakovat. R˚ uzn´e testovac´ı metody mohou vyˇzadovat r˚ uzn´e mnoˇzstv´ı poˇr´ızen´ ych dat pro dostateˇcnou pˇresnost mˇeˇren´ı. • void PerfTestCase.run(Tester tester) Testovac´ı pˇr´ıpad v t´eto metodˇe implementuje testovan´ y v´ ypoˇcet. Testera z´ıskan´eho jako parametr metody informuje o jednotliv´ ych f´az´ıch v´ ypoˇctu. • void ResultsGatherer.addResult(String tester, String phaseName, double startVal, double endVal, String message) Metoda slouˇz´ı k pˇred´ an´ı v´ ysledku mˇeˇren´ı testera do objektu hromad´ıc´ıho v´ ysledky. Parametry metody jsou n´azev testera (testovac´ı metody), n´azev f´ aze v´ ypoˇctu, poˇc´ ateˇcn´ı namˇeˇren´a hodnota, koneˇcn´a namˇeˇren´a hodnota, zpr´ ava o zp˚ usobu ukonˇcen´ı v´ ypoˇctu. • void ResultsGatherer.acceptResultsAndReset() Metoda slouˇz´ı ke schv´ alen´ı vˇsech nov´ ych v´ ysledk˚ u mˇeˇren´ı. • void ResultsGatherer.reset() Metoda slouˇz´ı k odstranˇen´ı vˇsech neschv´alen´ ych v´ ysledk˚ u (z d˚ uvodu jejich nepˇresnosti). • void ResultsGatherer.computeStatistics() V´ ypoˇcet statistick´ ych u ´daj˚ u z namˇeˇren´ ych dat.
4.9.5
Implementace objekt˚ u typu Tester
• NanoTester NanoTester implementuje metodu pro mˇeˇren´ı doby v´ ypoˇctu popsanou v 44
Vyuˇzit´ı kompar´ ator˚ Implementace u na mal´ych zaˇ mˇ re´ızen´ ˇren´ııch v´ykonnostn´ıch parametr˚ u kompar´ atoru
kapitole 4.8.1. Maxim´ aln´ı moˇzn´a odchylka re´aln´eho a procesorov´eho ˇcasu je parametrem konstruktoru. D´ıky tomu ji lze vhodnˇe zvolit podle pˇredpokl´adan´e doby v´ ypoˇctu. Dalˇs´ım parametrem konstruktoru je poˇcet opakov´an´ı test˚ u, kter´ y ovlivˇ nuje pˇresnost mˇeˇren´ı a dobu prov´adˇen´ı test˚ u. Konkr´etn´ı nastaven´ı parametr˚ u pro r˚ uzn´e typy sad testovac´ıch pˇr´ıpad˚ u byly zvoleny na z´ akladˇe experiment˚ u s pˇresnost´ı mˇeˇren´ı. • MemoryTester MemoryTester implementuje dvˇe metody mˇeˇren´ı pamˇeti popsan´e v kapitole 4.8.2, mˇeˇren´ı celkov´e alokovan´e pamˇeti a mˇeˇren´ı pamˇeti obsazen´e v´ ysledn´ ymi datov´ ymi strukturami. Metody jsou velmi pˇresn´e dokonce bez nutnosti mnoha opakov´ an´ı testu. Na z´akladˇe experiment˚ u s pˇresnost´ı byl poˇcet opakov´ an´ı zvolen na 20. Odchylka celkov´eho mˇeˇren´ı je niˇzˇs´ı neˇz 0,1 procenta. • NullTester NullTester je tester, kter´ y netestuje, ale slouˇz´ı pouze k opakovan´emu proveden´ı v´ ypoˇctu pˇred samotn´ ym mˇeˇren´ım. Bˇehem t´eto doby se provede JIT kompilace a v´ ysledky n´ asledn´ ych mˇeˇren´ı budou ust´alen´e.
4.9.6
Implementace objekt˚ u typu PerfTestCase
• BigTestCase Tento testovac´ı pˇr´ıpad je urˇcen pro z´ısk´an´ı co nejpˇresnˇejˇs´ıch v´ ysledk˚ u za cenu dlouh´e doby testov´ an´ı. V jednotliv´ ych f´az´ıch se prov´ad´ı najednou naˇcten´ı a porovn´ an´ı nˇekolika komponent, kter´e zajiˇst’uj´ı dostateˇcnou velikost testovac´ıch dat. • MicroTestCase Tento testovac´ı pˇr´ıpad prov´ad´ı naˇcten´ı a porovn´an´ı pouze jedn´e dvojice komponent. Je urˇcen zejm´ena pro testov´an´ı bez JIT pˇrekladaˇce, kter´e trv´a mnohem delˇs´ı dobu.
4.9.7
Implementace objekt˚ u typu ResultsGatherer
• ConsoleResultsGatherer ConsoleResultsGatherer vypisuje v´ ysledky test˚ u do konzole. Je vytvoˇren pouze pro lad´ıc´ı u ´ˇcely. • BufferedResultsGatherer BufferedResultsGatherer je obalovac´ı objekt, kter´ y odstiˇ nuje vnitˇrn´ı ResultsGatherer od nutnosti schvalov´an´ı v´ ysledk˚ u. Neschv´alen´e v´ ysledky jsou uchov´ av´ any v bufferu a po jejich schv´alen´ı jsou pˇreposl´any. BufferedResultsGatherer proto funguje jako dekor´ator (n´avrhov´ y vzor Decorator nebo Wrapper [25]). • StructureResultsGatherer StructureResultsGatherer zajiˇst’uje strukturov´an´ı v´ ysledk˚ u. Vytvoˇren´a struktura je vhodn´ a pro serializaci do XML. V listech stromov´e struktury jsou
45
Vyuˇzit´ı kompar´ ator˚ Implementace u na mal´ych zaˇ mˇ re´ızen´ ˇren´ııch v´ykonnostn´ıch parametr˚ u kompar´ atoru
mnoˇziny souvisej´ıc´ıch mˇeˇren´ı, ze kter´ ych se poˇc´ıtaj´ı statistick´e u ´daje (implementov´ ano tˇr´ıdou ResultSet). Hodnoty jsou nejdˇr´ıve filtrov´any od neobvykl´ ych hodnot (posuzov´ano podle vzd´ alenost´ı od medi´ anu) a n´aslednˇe je ze zbyl´ ych hodnot vypoˇc´ıt´an pr˚ umˇer.
4.9.8
Implementace ˇ r´ıd´ıc´ıch objekt˚ u
• PerfTestsRunner ˇ ızen´ı prov´ R´ adˇen´ı test˚ u m´a na starosti tˇr´ıda PerfTestsRunner. Pˇred spuˇstˇen´ım test˚ u je tˇr´ıda nakonfigurov´ana pomoc´ı sady tester˚ u, sady test˚ u a objektu pro shromaˇzd’ov´ an´ı v´ ysledk˚ u. Pot´e je spuˇstˇeno samotn´e testov´an´ı. Testov´ an´ı prob´ıh´ a postupnˇe se vˇsemi testery. Tester je spuˇstˇen pro s´erii testovac´ıch pˇr´ıpad˚ u a nakonec je vyhodnocena pˇresnost mˇeˇren´ı t´eto s´erie. Pokud nebylo dosaˇzeno dostateˇcn´e pˇresnosti, mus´ı b´ yt mˇeˇren´ı opakov´ano. Maxim´ aln´ı poˇcet souvisl´eho opakov´an´ı testu je nastaven na dostateˇcnˇe vysokou hodnotu, aby za bˇeˇzn´ ych podm´ınek nemohla b´ yt pˇrekroˇcena. Pokud je aplikace ˇspatnˇe nakonfigurov´ana, m˚ uˇze doj´ıt k u ´pln´e nefunkˇcnosti nˇekter´eho testeru a d´ıky omezen´emu limitu nez˚ ustane aplikace v nekoneˇcn´e smyˇcce. Pro zv´ yˇsen´ı pravdˇepodobnosti, ˇze n´asledn´a s´erie bude u ´spˇeˇsn´a, zastav´ı se aplikace po chybˇe na urˇcitou dobu z´avislou na poˇctu pˇredchoz´ıch chyb. Pokud je s´erie u ´spˇeˇsn´ a, jsou z´ıskan´e v´ ysledky akceptov´any. V opaˇcn´em pˇr´ıpadˇe se provede jejich odstranˇen´ı. Kaˇzd´ y tester ud´av´a potˇrebn´ y poˇcet u ´spˇeˇsn´ ych opakov´ an´ı s´erie. • Konkr´etn´ı testovac´ı sc´en´ aˇre Konkr´etn´ı testovac´ı sc´en´aˇr (JUnit test) sestav´ı mnoˇzinu test˚ u a mnoˇzinu tester˚ u. Pˇred spuˇstˇen´ım test˚ u zajist´ı tak´e popis a identifikaci testov´an´ı (SVN revizi, datum). Testovac´ıch sc´en´ aˇr˚ u m˚ uˇze prob´ıhat v´ıce za sebou v r˚ uzn´ ych procesech. V´ ysledky mezi sc´en´ aˇri se pˇred´avaj´ı pomoc´ı serializace a deserializace objektu shromaˇzd’uj´ıc´ıho v´ ysledky. Pomoc´ı tˇr´ıdy PerfTestsRunner je provedeno samotn´e testov´an´ı. N´aslednˇe jsou aktualizovan´e v´ ysledky serializov´any a uloˇzeny. Kromˇe popsan´ ych testovac´ıch sc´en´aˇr˚ u syst´em obsahuje tak´e dva sc´en´aˇre pomocn´e, kter´e zajiˇst’uj´ı inicializaci pˇred testov´an´ım a zpracov´an´ı v´ ysledk˚ u po testov´ an´ı. Inicializace spoˇc´ıv´a ve smaz´an´ı nebo pˇrejmenov´an´ı pˇredchoz´ıho souboru s v´ ysledky. Zpracov´an´ı v´ ysledk˚ u obsahuje v´ ypoˇcet statistick´ ych u ´daj˚ u a vygenerov´an´ı HTML reportu.
4.9.9
Pomocn´ e tˇ r´ıdy a knihovny
• SVNInfo Tˇr´ıda zjiˇst’uje aktu´ aln´ı revizi kompar´atoru v SVN. Ke sv´emu fungov´an´ı potˇrebuje m´ıt moˇznost spustit pˇr´ıkaz svn na pˇr´ıkazov´e ˇr´adce: svn info 46
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
Proveden´e optimalizace
http://svn.assembla.com/svn/jacc/trunk http://svn.assembla.com/svn/obcc/trunk -xml. V´ ystupem programu svn je XML s popisem aktu´aln´ı verze projekt˚ u JaCC a OBCC. Toto XML je parsov´ano pomoc´ı knihovny SAX. • Knihovna Xstream Knihovna Xstream [5] slouˇz´ı pro jednoduchou serializaci (a deserializaci) libovoln´ ych objekt˚ u do XML. Jej´ı pouˇzit´ı je velmi jednoduch´e. K´od serializace: XStream xstream = new XStream ( new StaxDriver ()); xstream . toXML ( objectToSerialize , new FileOutputStream ( storeFile ));
K serializaci se vyuˇz´ıvaj´ı informace o objektu z´ıskan´e z reflexe, proto nemus´ı serializovateln´ y objekt implementovat ˇz´adn´e rozhran´ı. Podobnˇe jednoduch´ y je k´ od deserializace: XStream xstream = new XStream ( new StaxDriver ()); MyObject myObject = ( MyObject ) xstream . fromXML ( storeFile );
Tˇr´ıda objektu mus´ı samozˇrejmˇe odpov´ıdat tˇr´ıdˇe serializovan´eho objektu.
4.9.10
Integrace do Hudsonu
D´ıky spouˇstˇen´ı aplikace jako JUnit testy lze testov´an´ı snadno spouˇstˇet pomoc´ı d´ avkov´ ych skript˚ u a stejn´ ym zp˚ usobem tak´e nakonfigurovat v Hudsonu. Aplikace m´ a definovan´e z´ avislosti na vˇsech testovan´ ych projektech, proto bude testov´ an´ı spuˇstˇeno vˇzdy pˇri zmˇenˇe testovan´eho k´odu. V´ ysledky test˚ u lze prohl´ıˇzet pˇres webov´e rozhran´ı. Hudson umoˇzn ˇuje webov´e prohl´ıˇzen´ı soubor˚ u projektu. V koˇrenov´em adres´aˇri projektu je vygenerov´an soubor report.html s v´ ysledky, kter´ y lze z webov´eho rozhran´ı Hudsonu otevˇr´ıt.
4.9.11
Ovˇ eˇ ren´ı pˇ resnosti mˇ eˇ ren´ı
Pˇresnost mˇeˇren´ı byla ovˇeˇrov´ ana nˇekolikan´asobn´ ym spuˇstˇen´ım test˚ u na stejn´e verzi k´ odu. Z´ıskan´e v´ ysledky pˇresnosti jsou zobrazeny v tabulce 4.2 s v´ ysledky mˇeˇren´ı. Test optimalizovan´ a verze k´odu (t2) byl spuˇstˇen tˇrikr´at po sobˇe. V´ ysledky mˇeˇren´ı pamˇeti se liˇs´ı maxim´ alnˇe o 0,08 procenta, v´ ysledky mˇeˇren´ı doby v´ ypoˇctu maxim´ alnˇe o 0,7 procenta (bez JIT kompilace maxim´alnˇe o 1,6 procenta).
4.10
Proveden´ e optimalizace
Optimalizace proveden´e v r´ amci t´eto pr´ace byly zamˇeˇreny pouze na ˇc´ast porovˇ ast naˇc´ıt´an´ı reprezentace nebylo moˇzn´e n´ an´ı reprezentac´ı OSGi komponent. C´ 47
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
Proveden´e optimalizace
optimalizovat, protoˇze soubˇeˇznˇe prob´ıhal v´ yvoj jej´ı nov´e verze.
4.10.1
Oprava logov´ an´ı
Anal´ yzou v´ ykonnosti pomoc´ı profileru byly odhaleny n´apadnˇe velk´e ˇcasov´e ztr´aty zp˚ usoben´e vol´ an´ım metody toString() bˇehem porovn´an´ı metod. Zamˇeˇrila jsem se proto na zp˚ usob logov´ an´ı v kompar´atoru metod a odhalila jsem v´ yrazn´e nedostatky. Logovac´ı knihovnˇe byl pˇred´av´an vˇzdy kompletnˇe sestaven´ y ˇretˇezec, kter´ y se t´ım p´ adem musel tvoˇrit i pˇri vypnut´em logov´an´ı. Chybu jsem opravila vyuˇzit´ım prostˇredk˚ u logovac´ı knihovny pro form´atov´an´ı ˇretˇezce. Knihovnˇe je pˇred´ an form´atovac´ı ˇretˇezec a pole argument˚ u, nad kter´ ymi knihovna v pˇr´ıpadˇe potˇreby (pouze pˇri zapnut´em logov´an´ı) zavol´a sama metodu toString(). Touto jednoduchou opravou se v´ ysledky test˚ u zlepˇsily na dobˇe v´ ypoˇctu zhruba o 70% a na celkov´e alokovan´e pamˇet’ t´emˇeˇr o 90%.
4.10.2
Optimalizace algoritmu porovn´ av´ an´ı tˇ r´ıd
Manu´ aln´ı anal´ yzou k´ odu jsem zjistila neefektivitu algoritmu porovn´an´ı tˇr´ıd. Pro ukonˇcen´ı rekurze porovn´ an´ı cyklick´e struktury tˇr´ıd se pouˇz´ıv´a historie tˇr´ıd. V p˚ uvodn´ı verzi algoritmus pouˇz´ıval z´asobn´ık pr´avˇe porovn´avan´ ych tˇr´ıd pro detekci a ukonˇcen´ı rekurze a kromˇe toho jeˇstˇe samostatnou historii tˇr´ıd pro ukl´ ad´ an´ı v´ ysledk˚ u porovn´ an´ı tˇr´ıd. Jeˇstˇe pˇred zah´ ajen´ım mˇeˇren´ı efektu optimalizac´ı (v r´amci sv´ ych poˇc´ateˇcn´ıch prac´ı na projektech kompar´ator˚ u) jsem tento algoritmus upravila, aby byla pro oba u ´ˇcely pouˇzita pouze jedna struktura – historie porovnan´ ych tˇr´ıd. Tato optimalizace nen´ı obsaˇzena v namˇeˇren´ ych v´ ysledc´ıch. N´ aslednˇe jsem se pokusila optimalizaci jeˇstˇe vylepˇsit zmˇenou datov´e struktury, ale efekt byl z´ aporn´ y, proto jsem ponechala p˚ uvodn´ı strukturu. Podaˇrilo se mi ale sn´ıˇzit poˇcet vyhled´ av´an´ı tˇr´ıdy v historii, coˇz pˇrineslo efekt na sn´ıˇzen´ı testovan´e doby v´ ypoˇctu pˇribliˇznˇe o 2%.
4.10.3
Optimalizace algoritmu porovn´ an´ı seznamu metod
Bˇehem anal´ yzy objekt˚ u v pamˇeti jsem si vˇsimla nesmyslnˇe vysok´eho poˇctu v´ ysledk˚ u porovn´ an´ı metod. To mˇe dovedlo k z´avˇeru, ˇze je potˇreba optimalizovat algoritmus porovn´ an´ı seznamu metod, ze kter´eho jsou v´ ysledky porovn´an´ı metod vyˇzadov´ any. P˚ uvodn´ı implementace algoritmu byla velmi nepˇrehledn´a a pravdˇepodobnˇe i chybn´ a. Do v´ ysledn´e struktury relevantn´ıch v´ ysledk˚ u porovn´an´ı ukl´adala nˇe-
48
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
Proveden´e optimalizace
kter´e zbyteˇcn´e v´ ysledky. Algoritmus jsem proto kompletnˇe pˇredˇelala. Optimalizace se projevila v testech sn´ıˇzen´ım doby v´ ypoˇctu zhruba o 20% a poklesem velikosti vytvoˇren´ ych datov´ ych struktur o 75%.
Struˇ cn´ y popis nov´ eho algoritmu V pˇr´ıpadˇe metod se nejprve vytvoˇr´ı skupiny metod se stejn´ ym n´azvem a poˇctem parametr˚ u. Kaˇzd´ a skupina je rozdˇelena na dvˇe ˇc´asti reprezentuj´ıc´ı metody jednotliv´ ych porovn´ avan´ ych komponent. V r´amci skupiny je potˇreba porovnat kaˇzdou metodu prvn´ı komponenty s kaˇzdou metodou druh´e komponenty a sestavit celkov´ y v´ ysledek z v´ ysledk˚ u d´ılˇc´ıch. D´ılˇc´ı v´ ysledek je z´ısk´an pro kaˇzdou metodu skupiny tak, ˇze je nalezen nejv´ yhodnˇejˇs´ı rozd´ıl od nˇekter´e metody z opaˇcn´e komponenty (v nejhorˇs´ım pˇr´ıpadˇe se za rozd´ıl zvol´ı odstranˇen´ı, protoˇze metoda v opaˇcn´e komponentˇe chyb´ı). D´ılˇc´ı v´ ysledky pro metody druh´e komponenty je potˇreba obr´ atit. Zjiˇst’ov´ an´ı, zda maj´ı metody stejn´ y n´azev a poˇcet parametr˚ u, jsem upravila na pouˇzit´ı kompar´ atoru (ve smyslu rozhran´ı java.utils.Comparator) m´ısto p˚ uvodn´ı metody ovˇeˇruj´ıc´ı shodu. Algoritmus je spoleˇcn´ y pro metody i konstruktory, u kter´ ych se nesm´ı porovn´avat n´azev, a je implementov´an v abstraktn´ı tˇr´ıdˇe JMemberListComparator. Potomci t´eto tˇr´ıdy inicializuj´ı kompar´ator podle sv´ ych potˇreb. D´ıky nov´e moˇznosti ˇrazen´ı metod bylo moˇzn´e zjednoduˇsit a optimalizovat algoritmus vytv´ aˇren´ı skupin metod se stejn´ ym n´azvem a poˇctem parametr˚ u.
4.10.4
Celkov´ y efekt optimalizac´ı
Celkov´ y efekt optimalizac´ı zachycuj´ı tabulky 4.2, 4.3 a 4.4. Na pouˇzit´ ych testovac´ıch datech byla doba v´ ypoˇctu sn´ıˇzena pˇribliˇznˇe o 86% (bez JIT kompilace o 82%), celkov´ a alokovan´ a pamˇet’ klesla o 94% a velikost v´ ysledn´ ych datov´ ych struktur se sn´ıˇzila o 75%. Namˇeˇren´e hodnoty ˇcasu jsou uvedeny v nanosekund´ach (mˇeˇreno na procesoru Core i7 2,8 GHZ) a hodnoty pamˇeti v bytech. Prvn´ı sloupec hodnot pˇredstavuje stav pˇred optimalizac´ı, dalˇs´ı tˇri sloupce obsahuj´ı mˇeˇren´ı po optimalizaci.
Obr´ azek 4.2: Mˇeˇren´ı efektu optimalizac´ı.
49
Vyuˇzit´ı kompar´ ator˚ u na mal´ych zaˇr´ızen´ıch
Zhodnocen´ı v´ysledk˚ u
Obr´ azek 4.3: Mˇeˇren´ı efektu optimalizac´ı bez JIT kompilace.
Obr´ azek 4.4: Mˇeˇren´ı efektu optimalizac´ı - tabulka zlepˇsen´ı posledn´ıho mˇeˇren´ı oproti mˇeˇren´ı prvn´ımu a pˇredchoz´ımu.
4.11
Zhodnocen´ı v´ ysledk˚ u
Proveden´ım optimalizac´ı se podaˇrilo dos´ahnout v´ yrazn´eho sn´ıˇzen´ı doby bˇehu a spotˇreby pamˇeti porovn´ an´ı reprezentac´ı komponent. Pouˇzit´e n´astroje pro anal´ yzu k´ odu se uk´ azaly jako velmi pˇr´ınosn´e, protoˇze s jejich pomoc´ı byly velmi rychle odhaleny probl´emy v k´ odu vhodn´e k optimalizaci. D´ıky velmi pˇresn´emu mˇeˇren´ı efektu optimalizac´ı pomoc´ı vytvoˇren´e aplikace bylo moˇzn´e posuzovat kaˇzdou zmˇenu k´odu samostatnˇe. Zmˇeny, kter´e nevedly ke zv´ yˇsen´ı v´ ykonnosti, byly na z´ akladˇe ˇspatn´ ych namˇeˇren´ ych v´ ysledk˚ u zam´ıtnuty. Testovac´ı aplikaci bude moˇzn´e d´ale vyuˇz´ıt pro optimalizaci naˇc´ıt´an´ı reprezentace komponent.
50
5 Vyuˇzit´ı kompar´ator˚ u pˇ ri anal´ yze rozd´ıl˚ u 5.1 5.1.1
C´ıle a pˇ r´ınosy Grafick´ e zobrazen´ı rozd´ıl˚ u
Druh´ ym c´ılem pr´ ace bylo rozˇs´ıˇren´ı moˇznost´ı vyuˇzit´ı kompar´atoru. Kompar´ator je moˇzn´e vyuˇz´ıt pro manu´ aln´ı anal´ yzu rozd´ılu mezi komponentami. Za t´ımto u ´ˇcelem byl vytvoˇren grafick´ y v´ ystup, kter´ y pˇrehlednˇe zobrazuje jednotliv´e rozd´ıly. Grafick´ y v´ ystup byl integrov´an do n´astroje pro automatick´e verzov´an´ı (OBVS [14]). Uˇzivatel verzovac´ıho n´ astroje z´ısk´a vysvˇetlen´ı, z jak´ ych d˚ uvod˚ u n´astroj urˇcil konkr´etn´ı s´emantickou verzi.
5.1.2
Dalˇ s´ı moˇ zn´ e pouˇ zit´ı v´ ystupu
Grafick´ y v´ ystup je moˇzn´e d´ ale vyuˇz´ıt k zobrazen´ı rozd´ıl˚ u v k´odu jako alternativa k SVN n´ astroji diff, kter´ y zobrazuje rozd´ıly dvou verz´ı souboru. Pˇr´ıklad v´ ystupu SVN diff (TortoiseSVN) je na obr´azku 5.1.
Obr´ azek 5.1: N´ ahled v´ ystupu n´astroje TortoiseSVN diff Rozd´ıl mezi SVN diff a v´ ystupem pˇripraven´ ym v t´eto pr´aci spoˇc´ıv´a v principu porovn´ an´ı k´ odu. SVN diff porovn´av´a k´od jako prost´ y text, bez jak´ekoliv znalosti jeho struktury. V textu se snaˇz´ı vyhled´avat podobn´e sekvence. V´ ystup zaloˇzen´ y na kompar´atorech zobrazuje rozd´ıly z´ıskan´e porovn´an´ım k´ odu se znalost´ı jeho struktury. Takov´e porovn´an´ı se naz´ yv´a porovn´an´ı zaloˇzen´e
51
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
Projekt OBVS
na modelu (model based). Kompar´atory vytvoˇr´ı model obou komponent a tyto modely mezi sebou porovnaj´ı. Z´ıskan´ y v´ ystup odpov´ıd´ a hloubce modelu. Informace, kter´e nejsou souˇc´ast´ı modelu (napˇr´ıklad k´ od uvnitˇr metod), nejsou porovn´any. V´ yhodou je prezentace pouze podstatn´ ych informac´ı, nev´ yhodou absence detailn´ıch informac´ı. Dalˇs´ı v´ yhodou porovn´ an´ı zaloˇzen´e na modelu je, ˇze se dok´aˇze vypoˇr´adat se zd´ anliv´ ymi zmˇenami typu zmˇena poˇrad´ı metod. Porovn´an´ı zaloˇzen´e na textu tyto zd´ anliv´e zmˇeny oznaˇcuje jako zmˇeny. Naopak nev´ yhodou tohoto typu porovn´ an´ı je moˇznost jeho pouˇzit´ı pouze pro konkr´etn´ı programovac´ı jazyk. Porovn´ an´ı zaloˇzen´e na textu je univerz´aln´ı.
5.2
Projekt OBVS
Projekt OBVS (OSGi Bundle Versioning Service [14]) je n´astroj pro automatick´e verzov´ an´ı OSGi komponent. Pouˇz´ıv´a se prostˇrednictv´ım webov´eho rozhran´ı. Uˇzivatel prostˇrednictv´ım webov´eho formul´aˇre nahraje dvˇe OSGi komponenty, jednu v p˚ uvodn´ı verzi, druhou upravenou a urˇcenou k overzov´an´ı. N´astroj pomoc´ı kompar´ ator˚ u urˇc´ı s´emanticky spr´avnou verzi pro upravenou komponentu. Overzovan´ a komponenta je uˇzivateli nab´ıdnuta ke staˇzen´ı. N´ahled formul´aˇre pro zad´ an´ı komponent je na obr´ azku 5.2. N´ astroj je nasazen na adrese http:// osgi.kiv.zcu.cz/ obvs/ index.html .
Obr´ azek 5.2: N´ ahled rozhran´ı n´astroje OBVS - formul´aˇr pro zad´an´ı komponent.
5.2.1
Architektura
Webov´e rozhran´ı je vytvoˇreno jako standardn´ı J2EE aplikace, kter´a pouˇz´ıv´a servlety a JSP str´ anky. V souˇcasn´e dobˇe prob´ıh´a v´ yvoj nov´eho webov´eho rozhran´ı, kter´e bude zaloˇzeno na technologii Spring. Pro sv´e fungov´an´ı vyuˇz´ıv´a n´astroj kompar´ atory ve formˇe knihoven.
52
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
5.2.2
Projekt OBVS
Zp˚ usob integrace zobrazen´ı rozd´ıl˚ u
Pro technologie integrace je d˚ uleˇzit´e, ˇze souˇcasn´a i budouc´ı verze n´astroje je ps´ ana v Javˇe a k zobrazov´ an´ı pouˇz´ıv´a HTML, CSS a Javascript. Tyto technologie proto byly pouˇzity tak´e k implementaci zobrazen´ı rozd´ıl˚ u. Rozd´ıly se zobrazuj´ı na str´ ance zobrazen´e po overzov´an´ı komponenty, odkud je moˇzn´e overzovanou komponentu st´ ahnout.
Rozhran´ı Grafick´e zobrazen´ı rozd´ıl˚ u bylo implementov´ano jako samostatn´ y projekt (kapitola 5.4) se z´ avislostmi na kompar´atorech. Pro klientsk´ y program poskytuje velmi jednoduch´e rozhran´ı. V´ ystup je generov´an zavol´an´ım jedin´e metody, kter´e je pˇred´ an parametr obsahuj´ıc´ı strukturu v´ ysledku porovn´an´ı. N´avratov´a hodnota je typu String a obsahuje HTML k´od bez HTML hlaviˇcek, aby ho bylo moˇzn´e vloˇzit bez u ´prav do webov´e str´anky. Tagy do HTML hlaviˇcky je moˇzn´e z´ıskat samostatnˇe, opˇet jako String. Tyto tagy obsahuj´ı CSS styly a Javascript potˇrebn´ y pro spr´avn´e zobrazen´ı v´ ystupu. Tagy obsahuj´ı tak´e odkazy na soubory styl˚ u a skript˚ u. Do webov´ ych zdroj˚ u proto byly vloˇzeny potˇrebn´e obr´azky a soubory s nemˇenn´ ymi CSS styly a Javascriptem.
Rizika nekompatibility Vytvoˇren´ y v´ ystup by mˇel b´ yt integrov´an tak´e do nov´e verze n´astroje OBVS, proto byly k omezen´ı rizika nekompatibility na u ´rovni technologi´ı HTML, CSS a Javascriptu pouˇzity preventivn´ı metody. Na u ´rovni HTML vznik´a riziko konfliktu v hodnot´ ach atribut˚ u id a name a v n´azvech tˇr´ıd pro stylov´an´ı. Riziko bylo omezeno volbou dostateˇcnˇe specifick´ ych jmen a n´azv˚ u tˇr´ıd. Atributy id nejsou pouˇz´ıv´ any v˚ ubec. Na u ´rovni CSS hroz´ı zakryt´ı styl˚ u. Bud’ mohou styly str´anky ovlivnit styly zobrazen´ı rozd´ıl˚ u, nebo naopak. Proto jsou pouˇzity dostateˇcnˇe konkr´etn´ı selektory na obou stran´ ach. Na u ´rovni Javascriptu m˚ uˇze doj´ıt k pˇreps´an´ı glob´aln´ıch promˇenn´ ych. V pˇr´ıpadˇe pouˇzit´ı knihovny JQuery je obvykle jedinou glob´aln´ı promˇennou instance knihovny. Pokud by knihovna byla do str´anky vloˇzena dvakr´at, je p˚ uvodn´ı inˇ sen´ım je uloˇzen´ı instance knihovny stance vˇcetnˇe nahran´ ych plugin˚ u ztracena. Reˇ do jin´e promˇenn´e s dostateˇcnˇe sloˇzit´ ym n´azvem pomoc´ı skriptu vloˇzen´eho tˇesnˇe za skript knihovny a plugin˚ u. Vˇzdy pˇred pouˇzit´ım knihovny je instance zkop´ırov´ ana zpˇet do standardn´ı promˇenn´e.
53
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
5.3 5.3.1
Technologie
Technologie HTML
HTML (HyperText Markup Language) je znaˇckovac´ı jazyk pro text propojen´ y odkazy. Je standardn´ım jazykem pro vytv´aˇren´ı webov´ ych str´anek. V souˇcasn´e dobˇe je nejv´ıce rozˇs´ıˇrena jeho verze 4, nejnovˇejˇs´ı verze 5 nem´a zat´ım dostateˇcnou podporu mezi prohl´ıˇzeˇci. HTML m´ a podobnou syntaxi jako XML, ale syntaktick´a pravidla jsou volnˇejˇs´ı (napˇr´ıklad nen´ı nutn´e ps´at ukonˇcovac´ı tagy). Pouˇz´ıt lze omezenou sadu tag˚ u se s´emantick´ ym (napˇr´ıklad <em>) nebo prezentaˇcn´ım (napˇr´ıklad nebo ) v´ yznamem. V´ yborn´ y tutorial technologie HTML je na [45]. N´ astupcem HTML je XHTML (Extensible HyperText Markup Language), kter´e vyˇzaduje dodrˇzen´ı syntaxe XML a odbour´av´a pouˇzit´ı prezentaˇcn´ıch tag˚ u. Stylov´ an´ı a zp˚ usob prezentace m´a b´ yt kompletnˇe pˇresunuta na technologie CSS (kask´ adov´e styly) a Javascript.
5.3.2
CSS
CSS (Cascading Style Sheets - kask´adov´e styly) je technologie pro stylov´an´ı obsahu zapsan´eho ve form´ atu HTML, XHTML nebo XML. Hlavn´ım u ´kolem je oddˇelen´ı vzhledu dokumentu od jeho struktury a obsahu. V prohl´ıˇzeˇc´ıch je bˇeˇznˇe podporov´ ana jejich verze 2. Styly se skl´ adaj´ı z jednotliv´ ych pravidel. Pravidlo obsahuje selektor a blok deklarac´ı. Pomoc´ı selektoru se urˇcuje mnoˇzina element˚ u, na kter´e se pravidlo vztahuje. Blok deklarac´ı popisuje form´atov´an´ı element˚ u. Selektory mohou b´ yt velmi obecn´e (napˇr. pro vˇsechny odstavce) i naprosto ˇ ım je selektor v´ıce konkr´etn´ı, t´ım m´a vyˇsˇs´ı konkr´etn´ı (napˇr. podle id elementu). C´ prioritu. Dalˇs´ı pravidla pro prioritu selektor˚ u vych´az´ı z m´ısta jejich deklarace nebo poˇrad´ı. V´ıce se lze o CSS dozvˇedˇet na [44].
5.3.3
Javascript
Javascript je skriptovac´ı jazyk, kter´ y m´a podobnou syntaxi jako C++ nebo Java. Poskytuje prostˇredky pro objektovˇe orientovan´e programov´an´ı. Pouˇz´ıv´a se zejm´ena na webu, ale st´ ale ˇcastˇeji tak´e pro klasick´e aplikace. Pˇr´ıkladem je projekt Node.js [29], kter´ y pouˇz´ıv´a Javascript na stranˇe klienta i serveru. V´ yznam Javascriptu na webu spoˇc´ıv´a v jeho interpretaci prohl´ıˇzeˇcem na stranˇe klienta. To pˇrin´ aˇs´ı r˚ uzn´e v´ yhody. Javascript umoˇzn ˇuje rychlou odezvu na akce uˇzivatele, napˇr´ıklad kontrolu vyplnˇen´ ych hodnot nebo interaktivn´ı n´apovˇedu. D´ıky interpretaci u klienta nedoch´az´ı tak ˇcasto k poˇzadavk˚ um na server.
54
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
Technologie
T´ım se sniˇzuje zat´ıˇzen´ı serveru i s´ıtˇe. Z pohledu program´ atora pˇrin´aˇs´ı Javascript zaj´ımav´e moˇznosti. Jedn´a se o slabˇe typovan´ y jazyk (weakly-typed), promˇenn´e nemaj´ı pevnˇe urˇcen´ y datov´ y typ. Ke kaˇzd´emu objektu lze pˇristupovat jako k asociativn´ımu poli. Objekty lze mimo jin´e vytv´ aˇret pomoc´ı z´apisu v JSON (JavaScript Object Notation) form´ atu, kter´ y je velmi jednoduch´ y a dobˇre ˇciteln´ y. V kombinaci s funkc´ı eval lze takto vytvoˇrit objekt i z ˇretˇezce v JSON form´atu, coˇz se ˇcasto pouˇz´ıv´a pro komunikaci Javascriptu u klienta se serverem. K´ od v Javascriptu je organizov´an do funkc´ı. Glob´aln´ı kontext je br´an jako funkce, kter´ a se zavol´ a bˇehem naˇc´ıt´an´ı str´anky. Uvnitˇr je moˇzn´e definovat dalˇs´ı funkce, se kter´ ymi lze pracovat tak´e jako s objekty. Z´asadn´ım rozd´ılem oproti jazyk˚ um, jako je napˇr´ıklad Java, je viditelnost promˇenn´ ych. Java pouˇz´ıv´a rozsah na u ´rovni blok˚ u (block-level scoping), zat´ımco Javascript pouˇz´ıv´a rozsah na u ´rovni funkc´ı (function-level scoping). To znamen´a, ˇze promˇenn´a je viditeln´a ze vˇsech vnoˇren´ ych funkc´ı. Podpora Javascriptu v prohl´ıˇzeˇc´ıch je ˇsirok´a, ale v jednotliv´ ych prohl´ıˇzeˇc´ıch se m˚ uˇze liˇsit rozhran´ı pro pˇr´ıstup k element˚ um str´anky (DOM objekt˚ um). Proto je vhodn´e vˇzdy pouˇz´ıvat knihovnu, kter´a program´atora od tˇechto rozd´ıl˚ u odstin ˇuje. Knihovna vˇetˇsinou nav´ıc poskytuje mnoho uˇziteˇcn´ ych funkc´ı. Pˇr´ıkladem takov´e knihovny je JQuery.
5.3.4
JQuery
JQuery [31] je lehk´ a (lightweight) Javascriptov´a knihovna, kter´a je podporov´ana v naprost´e vˇetˇsinˇe prohl´ıˇzeˇc˚ u. Jej´ı v´ yvoj zaˇcal v roce 2006, proto je podporov´ ana i starˇs´ımi prohl´ıˇzeˇci, jako je napˇr´ıklad Internet Explorer verze 6. Knihovna se stala velmi obl´ıbenou a ˇsiroce vyuˇz´ıvanou, proto lze oˇcek´avat jej´ı v´ yvoj a podporu v nov´ ych verz´ıch prohl´ıˇzeˇc˚ u i do budoucna. Knihovna je vyd´ av´ ana pod licenc´ı GPL (GNU General Public License) nebo MIT (Massachusetts Institute of Technology). Lze ji proto svobodnˇe pouˇz´ıvat v libovoln´em projektu. Knihovna poskytuje podporu pro proch´azen´ı a u ´pravy DOM (Document Object Model) objekt˚ u, reakce na ud´alosti (akce uˇzivatele), Ajax (technologie asynchronn´ı komunikace se serverem), animace a mnoho dalˇs´ıho. Dalˇs´ı funkcionalitu lze pˇridat pomoc´ı plugin˚ u, kter´ ych existuje velk´e mnoˇzstv´ı. V´ yhodou knihovny JQuery oproti jin´ ym Javascriptov´ ym knihovn´am a framework˚ um je mal´ a velikost k´ odu, jednoduchost a snadn´e (intuitivn´ı) pouˇzit´ı, svobodn´ a licence, velk´e mnoˇzstv´ı funkcionality (ˇc´asteˇcnˇe poskytovan´e pluginy) a rozˇs´ıˇrenost pouˇzit´ı. Srovn´ an´ı knihoven lze nal´ezt na Wikipedii [6].
55
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
5.3.5
Projekt prezentace rozd´ıl˚ u
Treeview
Treeview je plugin do knihovny JQuery pro zobrazov´an´ı stromov´e struktury. Hlavn´ı funkcionalitou je moˇznost rozbalov´an´ı a zabalov´an´ı (skr´ yv´an´ı) jednotliv´ ych vˇetv´ı struktury. Plugin d´ale zjednoduˇsuje um´ıstˇen´ı ikonek k jednotliv´ ym poloˇzk´ am struktury. ˇ adn´e Struktura mus´ı b´ yt tvoˇrena vnoˇren´ ymi seznamy (tagy , - ). Z´ dalˇs´ı poˇzadavky plugin nevyˇzaduje. Plugin zajiˇst’uje z´akladn´ı stylov´an´ı stromu, kter´e lze jednoduˇse vylepˇsit pomoc´ı vlastn´ıch styl˚ u. Treeview nen´ı jedin´ y plugin pro vytvoˇren´ı stromov´e struktury, ale jeho v´ yhodou oproti ostatn´ım je jeho velmi snadn´e pouˇzit´ı, absence zbyteˇcn´ ych funkc´ı a velmi jednoduch´ y k´ od.
5.4 5.4.1
Projekt prezentace rozd´ıl˚ u V´ ystupy
Pro vytvoˇren´ı grafick´eho zobrazen´ı rozd´ıl˚ u byl zaloˇzen nov´ y projekt s n´azvem obcc-presentation. V´ ystupy generovan´e projektem budou m´ıt ˇsirˇs´ı uplatnˇen´ı, neˇz jen v r´ amci n´ astroje OBVS. Projekt generuje nˇekolik typ˚ u v´ ystupu ve form´atech HTML a XML. Pro integraci do n´ astroje OBVS byl zvolen v´ ystup s n´azvem htmlLimitedDepth (limitovan´ a hloubka). Alternativn´ım HTML v´ ystupem je v´ ystup s n´azvem htmlFlat (ploch´ y nebo line´arn´ı). Oba v´ ystupy se snaˇz´ı pˇrev´est p˚ uvodn´ı rekurzivn´ı strukturu v´ ysledk˚ u porovn´an´ı do l´epe ˇciteln´e podoby.
V´ ystup htmlLimitedDepth Struktura v´ ysledk˚ u porovn´ an´ı m´a charakter stromu z´ıskan´eho algoritmem DFS (Depth-first search). Takov´ a struktura je pro ˇclovˇeka m´alo ˇciteln´a, protoˇze zanoˇren´ı vˇetv´ı stromu nerespektuje intuitivn´ı z´asady zanoˇren´ı element˚ u OSGi komponent a Java typ˚ u. Pˇr´ıstup zvolen´ y pro generov´an´ı v´ ystupu htmlLimitedDepth je snaha o transformaci struktury do stromu s u ´rovnˇemi Java bal´ık – tˇr´ıda – metoda, na kter´ y je uˇzivatel zvykl´ y napˇr´ıklad z v´ yvojov´eho prostˇred´ı. V´ ystup je rozdˇelen na dva samostatn´e stromy. Prvn´ı zobrazuje rozd´ıly na u ´rovni OSGi element˚ u, druh´ y na u ´rovni Java typ˚ u. Nˇekter´e u ´rovnˇe p˚ uvodn´ı struktury jsou vypuˇstˇeny. Strom element˚ u OSGi komponenty obsahuje u ´rovnˇe: komponenta, OSGi bal´ık nebo sluˇzba, Java bal´ık, Java tˇr´ıda (s odkazem do pˇr´ısluˇsn´e vˇetve ve stromu Java typ˚ u). Strom Java typ˚ u obsahuje u ´rovnˇe: Java bal´ık, tˇr´ıda, metody a ˇclensk´ a pole, odkaz na typy parametr˚ u a n´avratov´e hodnoty metod nebo typ pole. Aby byla orientace ve stromech uˇzivateli maxim´alnˇe
56
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
Projekt prezentace rozd´ıl˚ u
usnadnˇena, jsou pouˇzity pro jednotliv´e vˇetve ikony z v´ yvojov´eho prostˇred´ı Eclipse. Rozd´ıly jsou zobrazeny na spoleˇcn´em stromˇe pro obˇe komponenty pomoc´ı rohov´ ych ikon. Tento syst´em je inspirov´an zobrazen´ım rozd´ıl˚ u v aplikaci TortoiseSVN, konkr´etnˇe v n´ astroji diff v kombinaci se zp˚ usobem zobrazov´an´ı zmˇen v souborov´em syst´emu. Strom obsahuje vˇsechny elementy, kter´e jsou obsaˇzeny alespoˇ n v jedn´e z porovn´ avan´ ych komponent. Pokud je element pˇr´ıtomn´ y pouze v prvn´ı komponentˇe, je ve stromu oznaˇcen ˇcervenou ikonou ve tvaru kˇr´ıˇzku (element byl odebr´ an). Pokud je element pˇr´ıtomn´ y pouze ve druh´e komponentˇe, je oznaˇcen modrou ikonou ve tvaru znam´enka plus (element byl pˇrid´an). Pokud je v´ ysledkem porovn´ an´ı na nˇekter´e u ´rovni mutace (MUT), je element oznaˇcen ˇcerven´ ym vykˇriˇcn´ıkem. Ikony pro oznaˇcov´an´ı element˚ u byly pˇrevzaty z programu TortoiseSVN, ve kter´em jsou pouˇzity pro oznaˇcen´ı zmˇen v souborov´em syst´emu. Vˇetve stromu je moˇzn´e zabalovat (skr´ yvat) a rozbalovat. Uˇzivatel m´a d´ıky tomu jak souhrnn´ y pˇrehled o stavu jednotliv´ ych bal´ık˚ u, tak si m˚ uˇze rozbalit i detailn´ı d˚ uvody rozd´ıl˚ u.
V´ ystup htmlFlat V´ ystup htmlFlat pˇrev´ ad´ı rekurzivn´ı strukturu v´ ysledk˚ u do struktury line´arn´ı (ploch´e). Jednotliv´e v´ ysledky jsou prov´az´any se sv´ ym rodiˇcem a potomky pomoc´ı odkaz˚ u. V´ ystup byl inspirov´an profilovac´ım n´astrojem pro Android Traceview [27]. Uˇzivatel se pohybuje po jednotliv´ ych uzlech stromu a m´a moˇznost se pomoc´ı odkazu dostat na rodiˇce uzlu nebo jeho potomky. Zobrazeny jsou vˇzdy jen detaily aktu´ aln´ıho uzlu. U ostatn´ıch uzl˚ u je vidˇet typ elementu (pomoc´ı Eclipse ikony), v´ ysledek porovn´ an´ı (pomoc´ı TortoiseSVN ikony) a n´azev. Vˇsechny uzly jsou zobrazeny pod sebou bez definovan´eho poˇrad´ı a uˇzivatel se m˚ uˇze pˇrepnout do libovoln´eho uzlu. Tento typ v´ ystupu je urˇcen sp´ıˇse pro ladic´ı u ´ˇcely a k pochopen´ı algoritmu porovn´ av´ an´ı. Z tˇechto d˚ uvod˚ u je struktura zachov´ana v p˚ uvodn´ı podobˇe.
XML v´ ystupy Pro oba popsan´e HTML v´ ystupy existuj´ı tak´e jejich alternativy ve form´atu XML. Tyto v´ ystupy jsou urˇceny pro dalˇs´ı strojov´e zpracov´an´ı, ale jsou tak´e dobˇre ˇciteln´e pro ˇclovˇeka d´ıky peˇcliv´emu odsazov´an´ı a odˇr´adkov´an´ı.
57
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
5.4.2
Projekt prezentace rozd´ıl˚ u
Implementace
Architektura Projekt je pouˇz´ıv´ an jako Java knihovna. Rozhran´ı pro pouˇzit´ı knihovny bylo pops´ ano v kapitole 5.2.2. Popsan´e API obsahuje metody pro generov´an´ı vˇsech typ˚ u v´ ystupu. V´ ystupy jsou z´ısk´ av´ any ve formˇe ˇretˇezc˚ u, aby je bylo moˇzn´e vloˇzit do sestavovan´eho HTML nebo XML dokumentu jako jedna z jeho ˇc´ast´ı. HTML v´ ystup se m˚ uˇze odkazovat na dalˇs´ı zdroje (obr´azky, styly, skripty), jejichˇz spr´avn´e um´ıstˇen´ı mus´ı zajistit uˇzivatel nebo klientsk´a aplikace.
Univerz´ aln´ı vizitor V´ ysledek porovn´ an´ı je proch´ azen pomoc´ı jednotn´eho mechanismu, kter´ y je zaloˇzen na n´ avrhov´em vzoru vizitor (visitor pattern) [25]. N´avrhov´ y vzor vizitor je urˇcen k pr˚ uchodu strukturou a k proveden´ı nˇejak´e akce v kaˇzd´em uzlu. Objekty struktury mus´ı obvykle implementovat rozhran´ı obsahuj´ıc´ı metodu visit (Visitor visitor), aby je vizitor mohl navˇst´ıvit. Konkr´etn´ı implementace objekt˚ u mus´ı tuto metodu implementovat a zavolat v n´ı spr´avnou metodu vizitora pro sv´e navˇst´ıven´ı. Vizitor mus´ı obsahovat metody pro navˇst´ıven´ı kaˇzd´eho typu objektu ve struktuˇre. Vizitor implementovan´ y v tomto projektu nevyˇzaduje po objektech struktury implementaci ˇz´ adn´eho speci´ aln´ıho rozhran´ı. Ke sv´emu fungov´an´ı vyuˇz´ıv´a reflexi. Podle typu objektu je schopen nal´ezt pˇr´ısluˇsnou metodu pro navˇst´ıven´ı objektu s´ am. D´ıky tomu nen´ı ani vyˇzadov´ana implementace metod pro vˇsechny typy struktury konkr´etn´ım vizitorem. Konkr´etn´ı vizitor dˇed´ı od tˇr´ıdy UniversalVisitor (implementace inspirov´ana v [13]) a implementuje metody pro navˇst´ıven´ı objekt˚ u potˇrebn´ ych typ˚ u. Metody mus´ı splˇ novat jednotn´ a pravidla pro pojmenov´an´ı, aby byly nalezeny algoritmem vyhled´ av´ an´ı metod, kter´ y je implementov´an ve tˇr´ıdˇe UniversalVisitor. Klient zavol´ a proch´ azen´ı struktury pomoc´ı metody visit (Object object) implementovan´e tˇr´ıdou UniversalVisitor. Tato metoda zavol´a metodu pro tˇr´ıdu objektu, tˇr´ıdu jeho nejbliˇzˇs´ıho pˇredka nebo nejbliˇzˇs´ı rozhran´ı. V´ yhodou t´eto implementace vizitora je moˇznost proch´azen´ı libovoln´e struktury objekt˚ u. V tomoto projektu je toho vyuˇzito k pr˚ uchodu strukturou naˇcten´e reprezentace i strukturou v´ ysledk˚ u porovn´an´ı. Konkr´etn´ı vizitor vytv´aˇr´ı konkr´etn´ı v´ ystup. D´ıky tomu jsou pohromadˇe ˇc´asti v´ ystupu pro vˇsechny typy objekt˚ u struktury.
58
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
Projekt prezentace rozd´ıl˚ u
Algoritmus tvorby v´ ystupu htmlLimitedDepth V´ ystup htmlLimitedDepth je tvoˇren pomoc´ı nˇekolika instanc´ı rekurzivn´ıch vizitor˚ u (RecursiveResult2HTMLVisitor). Prvn´ı vizitor je spuˇstˇen pro koˇrenov´ y v´ ysledek porovn´ an´ı. Vizitor si s´am urˇcuje, zda se maj´ı navˇst´ıvit tak´e potomci v´ ysledku. Kdyˇz je navˇst´ıven v´ ysledek porovn´an´ı tˇr´ıd, je vytvoˇren nov´ y vizitor zaˇc´ınaj´ıc´ı na tomto v´ ysledku. P˚ uvodn´ı vizitor uˇz d´ale do hloubky nepokraˇcuje. Instance vizitor˚ u jsou organizov´any ˇr´ıd´ıc´ı tˇr´ıdou (ResultHTMLController). ˇ ıdic´ı V t´e se postupnˇe nahromad´ı vizitory pro kaˇzdou porovn´avanou tˇr´ıdu. R´ tˇr´ıda zorganizuje vizitory do jednotliv´ ych bal´ık˚ u a spoj´ı vygenerovan´ y v´ ystup.
Klientsk´ aˇ c´ ast Z pohledu serveru je v´ ystup obyˇcejn´ y ˇretˇezec, kter´ y m´a b´ yt vloˇzen do HTML str´ anky. Na klientsk´e stranˇe pˇri interpretaci v prohl´ıˇzeˇci je v´ ystup form´atov´an pomoc´ı HTML, CSS a Javascriptu. Vygenerovan´e HTML obsahuje vnoˇren´e netˇr´ıdˇen´e seznamy. Pomoc´ı Javascriptu, konkr´etnˇe pluginu Treeview knihovny JQuery, jsou seznamy transformov´any do stromu s rozbalovateln´ ymi vˇetvemi. Javascript je tak´e pouˇzit k fin´aln´ım u ´prav´ am struktury, kter´e by bylo obt´ıˇzn´e implementovat na u ´rovni Javy (vizitor˚ u). Pomoc´ı kask´ adov´ ych styl˚ u jsou uzl˚ um struktury pˇriˇrazeny ikony.
V´ ysledn´ a grafick´ a podoba Obr´ azek 5.3 zobrazuje n´ ahled v´ ysledn´e podoby grafick´eho v´ ystupu htmlLimitedDepth. Z obr´ azku je patrn´e, ˇze v nov´e verzi porovn´avan´e komponenty byla smaz´ ana metoda methodPublicReturnNumberParamIntNumber tˇr´ıdy NormalClass z bal´ıku cz.zcu.kiv.obcc.testbundle.normal.
5.4.3
Moˇ znosti rozˇ s´ıˇ ren´ı
HTML v´ ystup by bylo moˇzn´e rozˇs´ıˇrit o dalˇs´ı informace o jednotliv´ ych uzlech. Napˇr´ıklad by mohl b´ yt pˇrid´ an odkaz na javadoc dokumentaci, pokud bude k dispozici. M´ısto webov´eho rozhran´ı n´astroje OBVS by bylo moˇzn´e vytvoˇrit rozhran´ı ve formˇe klientsk´e aplikace, kter´a by pos´ılala komponenty k overzov´an´ı formou webov´ ych sluˇzeb. T´ım by se usnadnilo pouˇzit´ı n´astroje pro uˇzivatele. Grafick´ y v´ ystup by bylo moˇzn´e zaslat do klientsk´e aplikace spolu s overzovanou komponentou.
59
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
Projekt prezentace rozd´ıl˚ u
Obr´ azek 5.3: N´ ahled grafick´eho v´ ystupu htmlLimitedDepth.
60
Vyuˇzit´ı kompar´ ator˚ u pˇri anal´yze rozd´ıl˚ u
5.5
Pˇr´ınosy a dalˇs´ı vyuˇzit´ı
Pˇ r´ınosy a dalˇ s´ı vyuˇ zit´ı
N´ astroj pro automatick´e verzov´an´ı (OBVS) byl rozˇs´ıˇren o grafick´e zobrazen´ı rozd´ıl˚ u mezi komponentami. Uˇzivatel nyn´ı kromˇe overzovan´e komponenty z´ısk´a tak´e vysvˇetlen´ı, proˇc byla urˇcena konkr´etn´ı s´emantick´a verze. D˚ uvody pro nutnost zmˇeny verze lze v grafick´em zobrazen´ı velmi snadno vyhledat. Grafick´ y v´ ystup by bylo moˇzn´e d´ale vyuˇz´ıt i v jin´ ych aplikac´ıch, kde se vyuˇz´ıvaj´ı kompar´ atory. Napˇr´ıklad by bylo moˇzn´e zobrazovat d˚ uvody nekompatibility komponent pˇri resolvingu nebo pokusu o nahrazen´ı komponenty v komponentov´em frameworku. Dalˇs´ım n´ amˇetem je vyuˇzit´ı grafick´eho v´ ystupu pˇri vyhled´av´an´ı komponenty. Grafick´ y v´ ystup poskytuje uˇzivateli orientaˇcn´ı informaci o kvantitˇe rozd´ıl˚ u. Uˇzivatel by se proto mohl l´epe rozhodnout, kterou komponentu vybrat, aby byly u ´pravy nutn´e k obnoven´ı kompatibility co nejmenˇs´ı. Grafick´ y v´ ystup by mohl b´ yt d´ale vyuˇz´ıv´an jako alternativa k SVN n´astroj˚ um. Uˇzivatel by pomoc´ı nˇeho dok´azal snadno vyhledat vˇsechny zmˇeny v rozhran´ı komponenty. V´ ystup by bylo moˇzn´e tak´e pˇripojovat k informac´ım o vydan´e komponentˇe (release notes).
61
6 Z´avˇer 6.1
Shrnut´ı pr´ ace
Sezn´ amila jsem se s konceptem komponent obecnˇe a s komponentov´ ym modelem OSGi. Z´ıskan´e poznatky jsem shrnula v kapitole 2. Prostudovala jsem projekty t´ ykaj´ıc´ı se nahraditelnosti komponent vyv´ıjen´e na Katedˇre informatiky a v´ ypoˇcetn´ı techniky Fakulty aplikovan´ ych vˇed Z´apadoˇcesk´e univerzity v Plzni. V kapitole 3 jsem zpracovala pˇrehled projekt˚ u, v´ yvojov´ ych n´ astroj˚ u a zp˚ usobu pr´ ace na projektech. Popsala jsem tak´e nedostatky a chybˇej´ıc´ı funkce kompar´ atoru. Do pr´ace na projektech jsem se sama zapojila. Kapitolu 3 lze vyuˇz´ıt tak´e jako pˇr´ıruˇcku pro dalˇs´ı studenty, kteˇr´ı na projektech zaˇc´ınaj´ı pracovat. Na z´ akladˇe ruˇcn´ı anal´ yzy k´ odu i mˇeˇren´ı v´ ykonnosti pomoc´ı nˇekolika n´astroj˚ u jsem analyzovala ˇcasovou a pamˇet’ovou n´aroˇcnost implementace kompar´atoru a nalezla kritick´ a m´ısta v k´ odu. Tato m´ısta jsem pomoc´ı vhodn´ ych vylepˇsen´ı optimalizovala. Pro zjiˇstˇen´ı efektu optimalizac´ı jsem vytvoˇrila aplikaci, kter´a mˇeˇr´ı rozd´ıl v´ ykonnosti aktu´ aln´ı verze oproti pˇredchoz´ım verz´ım. Pro pouˇzit´ a testovac´ı data klesla doba bˇehu optimalizovan´eho v´ ypoˇctu porovn´ an´ı zhruba o 88%, velikost vytvoˇren´ ych datov´ ych struktur o 75% a velikost celkov´e alokovan´e pamˇeti bˇehem v´ ypoˇctu o 94%. Mˇeˇren´ı v´ ykonnosti kompar´ator˚ u jsem zapojila do procesu continuous integration, aby bylo moˇzn´e sledovat v´ yvoj v´ ykonnosti i do budoucna. Optimalizovanou implementaci kompar´atoru jsem vyuˇzila k rozˇs´ıˇren´ı n´astroje pro automatick´e verzov´ an´ı OSGi komponent (OBVS). Po overzov´an´ı komponenty jsou graficky zobrazeny rozd´ıly mezi p˚ uvodn´ı a verzovanou komponentou. D´ıky tomu jsou na prvn´ı pohled patrn´e d˚ uvody pro zv´ yˇsen´ı s´emantick´e verze komponenty.
6.2 6.2.1
Pˇ r´ınosy Pˇ r´ınosy pro kompar´ ator
D´ıky sn´ıˇzen´ı pamˇet’ov´ ych a ˇcasov´ ych n´arok˚ u kompar´atoru se zv´ yˇsila pouˇzitelnost kompar´ atoru na v´ ykonovˇe omezen´ ych zaˇr´ızen´ıch. V´ ykonnost m˚ uˇze b´ yt d´ale zlepˇsov´ ana a sledov´ ana d´ıky jej´ımu automatick´emu mˇeˇren´ı. S pouˇzit´ım aplikace pro mˇeˇren´ı v´ ykonnosti lze prov´est dalˇs´ı optimalizace a snadno vyhodnotit jejich pˇr´ınosy. Vytvoˇren´ y grafick´ y v´ ystup zobrazuj´ıc´ı rozd´ıly mezi komponentami m´a ˇsirok´e moˇznosti uplatnˇen´ı. Lze ho napˇr´ıklad vyuˇz´ıt v komponentov´em frameworku pro 62
Z´ avˇer
N´ amˇety pro dalˇs´ı pr´ aci
vysvˇetlen´ı d˚ uvodu nekompatibility. Jin´a uplatnˇen´ı d´avaj´ı prostor pro dalˇs´ı n´amˇety na vyuˇzit´ı kompar´ ator˚ u.
6.2.2
Osobn´ı pˇ r´ınosy
D´ıky t´eto pr´ aci jsem se bl´ıˇze sezn´amila s v´ yhodami a moˇznostmi komponentov´eho pˇr´ıstupu pˇri v´ yvoji aplikac´ı a s technologi´ı OSGi. Pˇri pr´aci na projektech kompar´ ator˚ u jsem poznala r˚ uzn´a u ´skal´ı pr´ace v t´ ymu a nutnost dostateˇcn´e komunikace mezi ˇcleny t´ ymu. V ˇc´ asti pr´ ace zab´ yvaj´ıc´ı se optimalizac´ı kompar´atoru jsem se detailnˇeji sezn´amila s fungov´ an´ım garbage kolektoru a dalˇs´ıch faktor˚ u ovlivˇ nuj´ıc´ıch v´ ykonnost Java aplikace. Tyto znalosti mi mohou pomoci pˇri ˇreˇsen´ı probl´em˚ u v budoucnu. Vytvoˇrenou aplikaci pro mˇeˇren´ı v´ ykonnosti m˚ uˇzu vyuˇz´ıt tak´e pro dalˇs´ı projekty.
6.3 6.3.1
N´ amˇ ety pro dalˇ s´ı pr´ aci Optimalizace naˇ c´ıt´ an´ı reprezentace
Bˇehem t´eto pr´ ace nebylo moˇzn´e optimalizovat ˇc´ast kompar´ator˚ u naˇc´ıtaj´ıc´ı reprezentaci OSGi komponent, protoˇze soubˇeˇznˇe prob´ıhal v´ yvoj jej´ı nov´e verze. Podle v´ ysledk˚ u mˇeˇren´ı je nyn´ı doba bˇehu i spotˇreba pamˇeti pˇri naˇc´ıt´an´ı reprezentace v´ yraznˇe vyˇsˇs´ı, neˇz pˇri n´asledn´em porovn´an´ı. V budoucnu je proto vhodn´e prov´est optimalizace tak´e t´eto ˇc´asti.
6.3.2
Nov´ e n´ astroje
N´ amˇetem do budoucna je vytvoˇren´ı aplikace pro vyhled´av´an´ı komponenty na z´ akladˇe dotazovac´ı komponenty. Syst´em by mohl porovnat potenci´alnˇe vhodn´e komponenty s dotazovac´ı komponentou a seˇradit je podle m´ıry kompatibility. S t´ım souvis´ı nutnost rozˇs´ıˇren´ı v´ ysledku porovn´an´ı komponent o kvantifikaci rozd´ıl˚ u. Uˇzivateli by mohly b´ yt tak´e zobrazeny rozd´ıly rozhran´ı formou implementovan´eho grafick´eho v´ ystupu. Dalˇs´ım n´ amˇetem je vytvoˇren´ı aplikace, kter´a by nahrazovala nebo doplˇ no´ celem aplikace by bylo vala n´ astroj SVN diff pˇri verzov´an´ı OSGi komponent. Uˇ zobrazen´ı pouze takov´ ych rozd´ıl˚ u mezi verzemi OSGi komponenty, kter´e maj´ı vliv na jej´ı rozhran´ı. Uˇzivatel by tak mohl l´epe kontrolovat proveden´e zmˇeny a rozhodovat o vyd´ an´ı komponenty.
63
Seznam zkratek API DOM GPL HTML IDL JaCC JAR JDK JIT JSON MIT OBCC OSGi SDK XHTML XML
Application programming interface Document Object Model GNU General Public License HyperText Markup Language Interface Definition Language Java Class Compatibility checker Java archive Java Development Kit Just-in-time JavaScript Object Notation Massachusetts Institute of Technology OSGi Bundle Compatibility Checking toolset Open Services Gateway initiative Software Development Kit Extensible HyperText Markup Language Extensible Markup Language
64
Literatura [1] Exception Handling Rules. Dokumentace projektu OBCC. http:// www.assembla.com/ spaces/ obcc/ wiki/ ExceptionHandlingRules. [2] JaCC representation tests. Dokumentace projektu JaCC. http:// www.assembla.com/ spaces/ jacc/ documents/ bvV0jCtv4r4kq0eJe5cbLr/ download/ bvV0jCtv4r4kq0eJe5cbLr . [3] OBCC Eclipse code formatter. Dokumentace projektu OBCC. http:// svn.assembla.com/ svn/ obcc/ trunk/ extras/ src/ main/ resources/ obcc/ OBCC-eclipse-src-formatter.xml . [4] Thread-safety analysis results. Dokumentace projektu JaCC. http:// subversion.assembla.com/ svn/ obcc/ documentation/ trunk/ thread-safety-analysis-results.ods. [5] Xstream project, 2011. http:// xstream.codehaus.org/ . [6] Comparison of JavaScript frameworks, 2012. Wikipedia http:// en.wikipedia.org/ wiki/ Comparison of JavaScript frameworks. [7] JLibs project, 2012. http:// code.google.com/ p/ jlibs. [8] OSGi Alliance. Semantic Versioning, Technical Whitepaper, 2010. http:// www.osgi.org/ wiki/ uploads/ Links/ SemanticVersioning.pdf . [9] OSGi Alliance. OSGi Alliance, 2012. http:// www.osgi.org. [10] Apache. Apache Felix, 2011. http:// felix.apache.org. [11] Felix Bachmann et al. Volume II: Technical concepts of component-based software engineering. Technical Report CMU/SEI-2000-TR-008, Software Engineering Institute, Carnegie Mellon University, 2000. [12] Kent Beck, Erich Gamma, and David Saff. JUnit, 2012. http:// www.junit.org/ .
65
LITERATURA
LITERATURA
[13] Jeremy Blosser. Reflect on the Visitor design pattern, 2007. Java World, Infoworld, Inc. http:// www.javaworld.com/ javaworld/ javatips/ jw-javatip98.html . [14] Pˇremysl Brada. Automated Semantic Versioning for OSGi Bundles. OSGi Community Event 29th September 2010. [15] Premysl Brada. Enhanced type-based component compatibility using deployment context information. Electronic Notes on Theoretical Computer Science, 279(2):17–31, December 2011. Proceedings of Formal Approaches to Software Component Applications (FESCA), satellite event of European Conference on Theory and Practice of Software (ETAPS). [16] Premysl Brada and Lukas Valenta. Practical verification of component substitutability using subtype relation. In Proceedings of the 32nd Euromicro Conference on Software Engineering and Advanced Applications, pages 38– 45. IEEE Computer Society Press, 2006. [17] Zuzana Bureˇsov´ a. OBCC performance tests on Android, 2011. Dokumentace projektu OBCC. http:// www.assembla.com/ spaces/ obcc/ wiki/ Performance tests on Android . [18] Zuzana Bureˇsov´ a, Veronika Dudov´a, and Karel Hovorka. Felix resolver integration, 2011. http:// www.assembla.com/ spaces/ obcc/ wiki/ Felix resolver integration. [19] Neil Coffey. Instrumentation: querying the memory usage of a Java object, 2011. http:// www.javamex.com/ tutorials/ memory/ instrumentation.shtml . [20] Ivica Crnkovi´c, S´everine Sentilles, Aneta Vulgarakis, and Michel R.V. Chaudron. A classification framework for software component models. IEEE Transactions on Software Engineering, 37(5):593–615, September/October 2011. [21] The Apache Software Foundation. Apache Maven, 2012. http:// maven.apache.org. [22] The Eclipse Foundation. Eclipse Equinox, 2012. http:// www.eclipse.org/ equinox/ . [23] The Eclipse Foundation. Eclipse Memory Analyzer, 2012. http:// www.eclipse.org/ mat/ . [24] The Eclipse Foundation. Eclipse Test and Performance Tools Platform Project, 2012. http:// www.eclipse.org/ tptp/ . [25] Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. Design Patterns: Elements of Reusable Object-Oriented Software. Addison-Wesley, 1994. [26] Google. Android, 2012. https:// developers.google.com/ android . 66
LITERATURA
LITERATURA
[27] Google. Profiling with Traceview and dmtracedump, 2012. http:// developer.android.com/ guide/ developing/ debugging/ debugging-tracing.html . [28] Assembla Inc. Assembla, 2012. http:// www.assembla.com. [29] Joyent Inc. Node.js, 2012. http:// nodejs.org/ . [30] Sun Microsystems Inc. Tuning Garbage Collection with the 5.0 Java[tm] Virtual Machine, 2003. http:// www.oracle.com/ technetwork/ java/ gc-tuning-5-138395.html . [31] The jQuery Foundation. JQuery, 2012. http:// jquery.com/ . ´ ziˇstˇe komponent podporuj´ıc´ı kontroly kompatibility. Diplo[32] Jiˇr´ı Kuˇcera. Uloˇ mov´ a pr´ ace, Z´ apadoˇcesk´ a univerzita, 2011. [33] Luminis. EZdroid, 2012. http:// www.ezdroid.com. [34] J.D. Meier, Carlos Farre, Prashant Bansode, Scott Barber, and Dennis Rea. Performance Testing Guidance for Web Applications. Microsoft, 2007. [35] Bohdan Mix´ anek. Rozˇs´ıren´ı n´ astroje pro verzov´ an´ı OSGi komponent. Diplomov´ a pr´ ace, Z´ apadoˇcesk´a univerzita, 2011. [36] Oracle. Java SE 6 API Specification: Class PhantomReference, 2011. http:// docs.oracle.com/ javase/ 6/ docs/ api/ java/ lang/ ref/ PhantomReference.html . [37] Oracle. Hudson, 2012. http:// hudson-ci.org/ . [38] Oracle. Java SE HotSpot at a Glance, 2012. http:// www.oracle.com/ technetwork/ java/ javase/ tech/ index-jsp-136373.html . [39] David J. Pearce, Matthew Webster, Robert Berry, and Paul H.J. Kelly. Profiling with AspectJ. Software Practise and Experience, 1(1), 2005. http:// homepages.ecs.vuw.ac.nz/ ˜djp/ files/ SPE05.pdf . [40] Jaroslav Plz´ ak. Z´ısk´ an´ı reprezentace OSGi komponent. Diplomov´a pr´ace, Z´ apadoˇcesk´ a univerzita, 2009. [41] The Knopflerfish Project. Knopflerfish, 2012. http:// www.knopflerfish.org. [42] Naiyana Tansalarak and Kajal Claypool. Finding a needle in the haystack: A technique for ranking matches between components. In Proceedings of 8th International Symposium on Component-Based Software Engineering (CBSE 2005), volume 3489 of Lecture Notes in Computer Science. Springer Verlag, 2005. 67
LITERATURA
LITERATURA
[43] The TortoiseSVN Team. TortoiseSVN, 2012. http:// tortoisesvn.net/ . [44] W3schools. CSS Tutorial, 2012. http:// www.w3schools.com/ html/ . [45] W3schools. HTML Tutorial, 2012. http:// www.w3schools.com/ html/ .
68