Strokovni; razpravf. Orodje za analizo kompleksnosti programov Viti Podgorelee, Peter Kokol, Janez Brest Fakulteta za elektrotehniko, računalništvo in informatiko Univerza v Mariboru, Smetanova 17, 2000 Maribor vilt.podgorelec@uni-mb.si POVZETEK Pri uresničevanju zahtev po kakovostnih programskih izdelkih se prej ali slej srečamo z uporabo programskih metrik kompleksnosti. Prav tako kot obstaja veliko različnih metrik, imamo na voljo tudi mnogo orodij, ki omogočajo analizo programov z nekaterimi izmed teh metrik. Vendar pa je vsako orodje vezano samo na določene programske metrike, zato moramo za obširnejše analize uporabiti celo vrsto različnih orodij. Želeli smo si okolja, ki bi združevalo vse najbolj uporabljane programske metrike in ker nove metrike tudi sami razvijamo, smo izdelali orodje za analizo kompleksnosti programov, ki ob klasičnih temelji predvsem na novih, bolj splošnih fraktalnih metrikah. ABSTRACT" As we try to fulfill the requirements upon qualify of the software products we cannot avoid the use of the complexity metrics. There is a lot of different metrics and also there are hundreds of tools for analyzing the software with some of those metrics. However, since all tools available are concentrated only on some specific programming metrics, for a comprehensive analysis one has to use a lot of different tools. We wanted to derive an environment that would include all of the mostly used metrics, and since we are also developing new metrics ourselves, we have developed a tool called Software Complexity Analyzer, based besides upon some classical metrics primarily upon new, more general ones. Uvod Če želimo uresničiti zahteve po kakovostnih programskih izdelkih, moramo te izdelke med njihovim razvojem tudi redno analizirati. Eden izmed najbolj pogostih in najbolj uveljavljenih načinov analiziranja programov je uporaba programskih metrik kompleksnosti [3,12], V članku bomo opisali programsko orodje za analizo kompleksnosti programov Software Complexity Analyzer, ki smo ga izdelali za okolje Windows 95 oz. Windows NT. Orodje omogoča analizo programov s pomočjo nekaterih najbolj uporabljanih programskih metrik kompleksnosti in s pomočjo novih fraktalnih metrik, ki smo jih sami razvili [1,6-10]. Poleg same analize programov lahko med seboj primerjamo tudi posamezne programske metrike, kar je v taksnih orodjih izredno pomembno. Z opisanim programom smo uspeli združiti vse pomembnejše metode za analizo kompleksnosti računalniških programov v enovito celoto, ob tem pa smo dodali še lastne fraktalnc metrike. Na ta način bomo lahko s predstavljenim izdelkom nadomestili mnogo posameznih orodij za analiziranje na različnih sistemih, kar bo občutno skrajšalo čas analiziranja programov, prav tako pa ne bo več potrebe po učenju dela z različnimi, ponavadi za uporabnika nič kaj prijaznimi orodji. Ob samem prikazu programskega orodja bomo na kratko predstavili še novo fraktalno metriko a in podati nekaj zgledov, kako lahko to fraktalno metriko uporabimo tudi v nekatere manj običajne namene. Kompleksnost računalniških programov in fraktalne metrike Kompleksnost je težko definirati. Po Morowitzu [TI] si kompleksni sistemi delijo nekatere lastnosti, npr. vsebujejo veliko število elementov in predstavljajo širok prostor različnih možnosti. So večnivojske hierarhije, od katerih ima vsak nivo svoje lastne principe, zakone in kompleksnosti, Gell-Mann ]4] predlaga, da bi morali opraviti mnogo različnih meritev, če bi hoteli zajeti vse naše intuitivne zamisli o tem, kar predstavlja kompleksnost, Druga, bolj konkretna meritev kompleksnosti, ki temelji na generalizaciji entropije [5], je korelacija. To lahko relativno enostavno izračunamo za posebno vrsto sistemov, ki se jih da predstaviti z zaporedjem simbolov. Računalniške programe ponavadi analiziramo s pomočjo računske kompleksnosti, merimo jih z metrikami kompleksnosti [3,12]. Lahko pa pogledamo na program iz drugega zornega kota in si ga predstavljamo 1997 - številka 3 • letnik V ¡qivuhitiilNFORMATIKA JJ Strokovni; razpravf. kot zaporedje simbolov. Tedaj lahko izračunamo daljnosežne korelacije med simboli; torej uporabimo pristop, ki je že bil uspešno uporabljen pri dekodiran-ju DNK [2] in pri analizi pisanih besedil [13]. Ta pristop smo uporabili tudi sami in razvili novo fraktalno metriko, ki temelji na analizi daljnosežnih korclacij zaporedja simbolov - metriko u. V dosedanjem raziskovanju smo pokazali, da daljnosežne korelacije v računalniških programih obstajajo [9], in da je karakteristični koeficient teh korelactj a na neki način skladen z nekaterimi klasičnimi metrikami kompleksnosti, kot npr. Halsteadov volumen, McCabeovo cik-lomatično število, LOC, itd. Prav tako smo pokazali, da lahko v nekem omejenem smislu povežemo a s kvaliteto programa [7,8]. Programsko orodje za analizo kompleksnosti programov Ker smo želeli bolj natančno preveriti naše teoretične izsledke o metriki smo potrebovali program oz. orodje, ki nam bi pri tem pomagalo. Prav tako pa smo želeli imeti na enem mestu zbrane vse tiste klasične metrike, ki smo jih prej uporabljali s pomočjo različnih orodij na različnih sistemih. Kot rezultat teh potreb smo razvili programsko okolje Software Complexity Analyzer, ki poleg vsega naštetega združuje še nekatere dodatne lastnosti. V glavnem želimo analizirati izvorni kod računalniških programov. Zato moramo zagotoviti podporo najrazličnejšim programskim jezikom na čimbolj transparenten način, saj izbira programskega jezika ne sme bistveno vplivati na nadaljnje delo, če naj zagotovimo splošnost. V ta namen vsak programski jezik opišemo z množico atributov, ki jih bomo uporabili pri analizi. Podporo nekaterim programskim jezikom (Pascal, C, C + + , Java, Fortran) smo že zagotovili, ostale pa lahko uporabniki kasneje dodajo še sami. Za analizo novih frak talnih metrik in primerjavo z ostalimi smo dodali še možnost generiranja naključnih, sintaksno pravilnih programov, glede na izbrani programski jezik. Za analizo z metriko« je potrebno programe pretvoriti v model Brownovega gibanja, pri čemer moramo dopustiti možnost izbire načina kodiranja. Iz modela Rrownovega gibanja lahko nato izračunamo re-gresijsko funkcijo, Fourierjevo transformacijo, ipd. Vse te podatke si lahko predstavimo tudi vizualno v obliki grafov funkcij. Vsekakor bomo največkrat merili izvorni kod programov, občasno pa bi si gotovo želeli analizirati tudi podatke kakšne druge vrste, npr. izvršljivi kod prevedenega programa. V ta namen smo zagotovili podporo analizi podatkov v dvojiški obliki in na ta način omogočili analiziranje česarkoli, ne le računalniških programov. Ob metriki a bi radi merili programe tudi z os talini i klasičnimi metrikami kompleksnosti, zato smo dodali možnost analize z nekaterimi najbolj pogosto uporabljanimi programskimi metrikami. Ker imamo podporo programskim jezikom zagotovljeno in s tem poznamo vse njihove osnovne podatke, za računanje teh klasičnih metrik ne bomo potrebovali veliko dodatnih podatkov in je zato celoten proces analize zelo preprost in neutrudljiv. Da nam ne bo treba vedno znova ponavljati istih postopkov in analizirati že analiziranih programov, smo dodali podatkovno bazo, v katero lahko shranjujemo vse potrebne podatke, ki nas o nekem programu zanimajo. Shranjujemo lahko osnovne podatke, kot npr. rezultate opravljenih analiz, dodatne podatke o avtorju programa, času pisanja programa, ipd. ter tudi same programe, ki jih imamo tako pregledno zbrane na enem mestu. Ob izračunih in analizah, ki jih ponuja samo orodje, bi radi včasih opravili tudi nekatere manj uporabljane statistične analize, ali pa dobljene podatke vključili v poročila, izdelana z za to namenjenimi programskimi orodji. Zalo lahko izračunane podatke shranimo v obliki, primerni za nekatere splošne (npr. Excel) ali specializirane programe (npr. SPSS, Statistica). Vse navedene funkcije smo torej združiti v enovito programsko okolje. Omogočiti smo želeii čimbolj preprosto delo, vendar zaradi tega nismo zanemarili funkcionalnosti. Poskušali smo poiskati pravo razmerje med zmogljivostjo in preprosto uporabo, ob tem pa pustiti dovolj prostora za bodoče razširitve. Na sliki 1 si lahko ogledamo delovno okolje programskega orodja Software Complexity Analyzer. te Slika 1: D«lovno okolje programskega orodja Podpora programskim jezikom Pri opisu programskega jezika nas dejansko zanima opis sintakse. Podatke o posameznem programskem jeziku lahko v glavnem razdelimo na tri skupine: "/J,Tni'fl'"INFORMATIKa 1997 številka 3 letnik V ■ osnovni podatki o jeziku (ime, način zapisa komentarjev in znakovnih nizov, ločevanje med velikimi in malimi črkami, ipd.), B Backus-Naurova oblika (DNE) zapisa sintakse jezika, in ■ kategorije jezika. Za opis sintakse jezika uporabljamo nekoliko spremenjeno Backus-Naurovo obliko. Dodali smo namreč nekaj metasimbolov, ki določajo obliko izvornega koda {zamikanje, prehodi v nove vrstice), predvsem pa skrbijo za avtomatsko gerieriranje naključnih programov, Z njimi določamo verjetnosti prehoda v posamezne veje strukture BNF, omejujemo maksimalno dovoljeno globino rekurzije pri razširjanju neterminalov, omejujemo kompleksnost posameznih programskih blokov (npr. izrazov), določamo bližnjice iz rekurzivnih produkcij, ipd. Vse te podatke zapišemo v razširjeno obliko BNF (FBNF, extended BNF), ki se lahko tvori iz osnovne BNF tudi samodejno, v tem primeru pač dobijo parametri določene privzete vrednosti. Za nekatere izmed metrik kompleksnosti moramo poznati pomen besed, ki se pojavljajo v izvornem kodu programa. V ta namen smo vse besede programskega jezika razdelili na šliri kategorije: rezervirane besede, operatorji, simboli in standardne funkcije. Za čimbolj enostavno določanje kategorij besedam jezika smo vpeljali možnost interaktivnega sledenja izvornemu kodu, kjer lahko ob prehodu skozi izvorni kod za vsako nepre-poznano besedo določimo, v katero kategorijo sodi. Sin-taksne lastnosti programskega jezika določamo s pomočjo pogovornega okna na sliki 2. ID Programming language descfiplion J - Ix Geoiidl ] Ftoitrved woids 0OM(StOti Symbols j ttijidMd hjodiom SyrrtflN cokurnj Efemcnl . ....., __ Symbol * i Standad hjriclk**s Undefined words (IDs) J Comments —■ Strngt ZJ P BnW r IWfc r Underfcind ■ ■9i Ml Esarr Enarde. !i [ Si iVs* ebtjnflQ | PROCEDURE TesOnum INTEGER ■. BEGIN IF Inum i»base • 2 runi THEN Wntsti L-Subitjro 1 t Lit Wiilmn JVortive I END, -—- l I1 öle _J i 1 ......... ....... 1 Siika 2: Eden od zavihkov pogovornega okna za opis sintakse programskega jezika Analiza z metriko a Ker je analiziranje programov s klasičnimi metrikami kompleksnosti dobro poznano in je bilo o tem že tudi precej napisanega [3,12], se bomo tukaj omejili predvsem na analizo programov z našo metriko a. 1997 - številka 3 - letnik V Strokovne razhiavf, Osnovni potek izračuna koeficienta a izgleda takole: najprej pretvorimo podatke, ki jih želimo analizirati (ponavadi računalniški program, nt pa nujno), v model Brownovega gibanja. Iz tega modela izračunamo nato regresijsko krivuljo, iz nje pa lahko dobimo vrednost a. Za tvorjenje modela Brownovega gibanja moramo najprej definirati način kodiranja, torej opisati pretvorbo simbolov programa v zaporedje ničel in enic. Na voljo imamo dve možnosti. Za analizo izvornega koda programa (ali kakšnega drugega tekstovnega zapisa) uporabljamo kodirno tabelo, v kateri vsakemu znaku ASCII priredimo ustrezen dvojiški niz. V drugem primeru, ko želimo analizirati poljubne podatke, pa določimo, kalere bite bomo uporabili pri tvorbi modela Brownovega gibanja. ||Q Biownian motion HBE3 I ur 1 " — •it»"* .....E...... A J jT Kj p r vL_ C Z \ k i Jji I | v 'Vi I r ru rra cp 3 T TI i