ogrodje za merjenje in primerjavo uČinkovitosti …
Post on 30-Oct-2021
8 Views
Preview:
TRANSCRIPT
UNIVERZA V MARIBORU
FAKULTETA ZA ELEKTROTEHNIKO,
RAČUNALNIŠTVO IN INFORMATIKO
Elmedin Dedić
OGRODJE ZA MERJENJE IN PRIMERJAVO UČINKOVITOSTI PROGRAMOV
Diplomsko delo
Maribor, september 2017
OGRODJE ZA MERJENJE IN PRIMERJAVO UČINKOVITOSTI
PROGRAMOV
Diplomsko delo
Študent: Elmedin Dedić
Študijski program: visokošolski študijski program
Informatika in tehnologije komuniciranja
Smer: Tehnologije multimedijskega komuniciranja
Mentor: doc. dr. Matej Šprogar, univ. dipl. inž. rač. in inf.
Lektorica: Lucija Hrženjak, prof. slov. in biol.
i
ZAHVALA
Zahvaljujem se mentorju doc. dr. Mateju
Šprograrju za vse nasvete in usmeritve pri
nastajanju diplomskega dela. Prav tako gre
zahvala tudi mojim najbližjim za potrpežljivost
in spodbudo v času študija.
ii
Ogrodje za merjenje in primerjavo učinkovitosti programov
Ključne besede: kakovost programske opreme, učinkovitost programske opreme, metrike,
merjenje učinkovitosti
UDK: 004.4'2/'6(043.2)
Povzetek
V diplomskem delu se opisuje pojem kakovosti programske opreme in pogled nanjo z
različnih zornih kotov. Zajeto je področje učinkovitosti programske opreme in metrik za
merjenje učinkovitosti programske opreme. Pri praktičnem delu je bila na podlagi
pridobljenega znanja iz programskega jezika C# in razvojnega okolja Visual Studio 2015
izdelana spletna aplikacija, ogrodje za merjenje in primerjavo učinkovitosti programov, ki
uporabniku omogoča merjenje časa izvajanja, števila vrstic kode in zasedenosti pomnilnika
programov, zapisanih v programskem jeziku C#, C++ ali Java. Aplikacija je bila načrtovana
in izdelana po izbranem modelu za razvoj programske opreme.
iii
Framework for programe efficiency measurement and comparison
Key words: software quality, software efficiency, metrics, efficiency measurement
UDK: 004.4'2/'6(043.2)
Abstract
This thesis deals with software quality from several perspectives, including efficiency and
software efficiency metrics. The practical part, which was based on our knowledge of the
C# programming language and the Visual Studio 2015 environment, involved the
development of a web application for measuring and comparing software efficiency, which
enables the user to measure the execution time, count lines of code, and assess memory
space in programs written in C#, C++ or Java programming languages. The application was
designed in line with a selected model for software development.
iv
KAZALO
1 UVOD .................................................................................................................... 1
1.1 Cilji ................................................................................................................................................. 1
2 PROGRAMSKI JEZIKI ............................................................................................... 2
2.1 KAJ JE PROGRAMSKI JEZIK .............................................................................................................. 2
3 ZGODOVINA PROGRAMSKIH JEZIKOV .................................................................... 4
3.1 GENERACIJE PROGRAMSKIH JEZIKOV ............................................................................................. 6
3.1.1 STROJNI JEZIKI .................................................................................................................................. 6
3.1.2 ZBIRNI JEZIKI..................................................................................................................................... 7
3.1.3 VIŠJENIVOJSKI JEZIKI ........................................................................................................................ 8
3.1.4 JEZIKI ČETRTE GENERACIJE ............................................................................................................... 9
3.1.5 JEZIKI PETE GENERACIJE ................................................................................................................... 9
4 KAKOVOST PROGRAMSKE OPREME ..................................................................... 10
4.1 DEFINICIJA KAKOVOSTI ................................................................................................................ 10
4.2 KAKOVOST Z VIDIKA UPORABNIKA, RAZVIJALCA IN UPRAVLJAVCA PROGRAMSKE REŠITVE ......... 11
4.3 ISO/IEC 25010 .............................................................................................................................. 12
4.4 METRIKE ....................................................................................................................................... 14
4.4.1 NOTRANJE IN ZUNANJE METRIKE .................................................................................................. 14
4.5 METRIKE PROGRAMSKE OPREME ................................................................................................. 14
5 UČINKOVITOST PROGRAMSKE OPREME ............................................................... 16
5.1 DEFINICIJA UČINKOVITOSTI .......................................................................................................... 16
5.2 UČINKOVITOST PROGRAMSKE KODE ............................................................................................ 16
5.3 NOTRANJE IN ZUNANJE METRIKE UČINKOVITOSTI ....................................................................... 17
v
5.3.1 METRIKE ŠTEVILA VRSTIC KODE ..................................................................................................... 18
5.3.2 METRIKE ČASOVNEGA OBNAŠANJA ............................................................................................... 18
5.4 ZAHTEVNOST ALGORITMOV ......................................................................................................... 19
6 PREVAJANJE PROGRAMSKIH JEZIKOV .................................................................. 21
6.1 PREVAJALNIK................................................................................................................................ 21
6.1.1 PREVAJALNIK JAVA ......................................................................................................................... 22
6.1.2 PREVAJALNIK C++ ........................................................................................................................... 23
6.1.3 PREVAJALNIK C# ............................................................................................................................. 24
7 SPLETNA APLIKACIJA ZA MERJENJE UČINKOVITOSTI PROGRAMOV ....................... 25
7.1 ANALIZA ....................................................................................................................................... 25
7.2 NAČRTOVANJE ............................................................................................................................. 26
7.3 IMPLEMENTACIJA ......................................................................................................................... 28
7.3.1 ASP .NET MVC ................................................................................................................................ 28
DELO S PODATKI .................................................................................................................... 30
7.3.2 NALAGANJE DATOTEK .................................................................................................................... 31
7.3.3 USTVARI NALOGO .......................................................................................................................... 32
7.3.4 ODDAJ REŠITEV .............................................................................................................................. 33
PREVAJANJE IN PREVERJANJE REŠITEV ................................................................................. 34
MERJENJE ČASA IZVAJANJA, VRSTIC KODE IN ZASEDENOSTI POMNILNIKA .......................... 35
7.3.5 IZPIS MERITEV V TABELO IN REZULTATI MERITEV ......................................................................... 36
7.4 TESTIRANJE .................................................................................................................................. 37
7.4.1 PREVERJANJE PRAVILNOSTI PRENESENEGA ALGORITMA .............................................................. 37
7.5 VZDRŽEVANJE .............................................................................................................................. 38
8 SKLEP .................................................................................................................. 39
9 VIRI IN LITERATURA ............................................................................................. 40
vi
KAZALO SLIK
SLIKA 2.1: PRIMER, KAJ V PRAKSI POMENITA SINTAKSA IN SEMANTIKA ............................................................................... 3
SLIKA 3.1: PRVI ELEKTRONSKI RAČUNALNIK ENIAC ....................................................................................................... 4
SLIKA 3.2: VON NEUMANNOVA ARHITEKTURA RAČUNALNIKA .......................................................................................... 5
SLIKA 3.3: HARVARDSKA ARHITEKTURA RAČUNALNIKA ................................................................................................... 5
SLIKA 3.4: PRIMER VIDEZA KODE STROJNEGA JEZIKA ...................................................................................................... 6
SLIKA 3.5: PRIMER KODE ZBIRNEGA JEZIKA .................................................................................................................. 7
SLIKA 3.6: PREDSTAVNIKI TRETJE GENERACIJE PROGRAMSKIH JEZIKOV ............................................................................... 8
SLIKA 3.7: PRIMERJAVA MED JEZIKOM TRETJE GENERACIJE IN JEZIKOM ČETRTE GENERACIJE ................................................... 9
SLIKA 4.1: FAKTORJI, KI VPLIVAJO NA USPEH OZIROMA NEUSPEH PROJEKTA ...................................................................... 10
SLIKA 4.2: RAZDELITEV STANDARDOV ISO/IEC 25000 ............................................................................................... 12
SLIKA 5.1: RAZVRSTITEV ZAHTEVNOSTI ALGORITMOV................................................................................................... 19
SLIKA 5.2: PRIKAZ VPLIVA ŠTEVILA OPERACIJ IN ŠTEVILA ELEMENTOV NA ČAS IZVAJANJA PRI RAZLIČNIH ALGORITEMSKIH
ODVISNOSTIH .............................................................................................................................................. 20
SLIKA 6.1: VLOGA PREVAJALNIKA ............................................................................................................................ 21
SLIKA 6.2: IZVAJANJE CILJNEGA PROGRAMA ............................................................................................................... 21
SLIKA 6.3: DELOVANJE TOLMAČA ............................................................................................................................ 22
SLIKA 6.4: POSTOPEK USTVARJANJA PROGRAMA V PROGRAMSKEM JEZIKU JAVA ............................................................... 22
SLIKA 6.5: MOŽNOST PRENOSLJIVOSTI APLIKACIJ, NAPISANIH V JAVI, NA RAZLIČNE OPERACIJSKE SISTEME ............................... 23
SLIKA 6.6: PRIMER ZAPISA UKAZA V UKAZNO VRSTICO .................................................................................................. 24
SLIKA 7.1: PRVO OKNO SPLETNE APLIKACIJE ............................................................................................................... 26
SLIKA 7.2: OKNO ZA DODAJANJE NOVE NALOGE ......................................................................................................... 27
SLIKA 7.3: DEFINIRANI MODELI NAŠE SPLETNE APLIKACIJE ............................................................................................. 30
SLIKA 7.4: DEFINIRANI POGLEDI .............................................................................................................................. 30
SLIKA 7.5: DEFINIRANI KRMILNIKI ............................................................................................................................ 30
SLIKA 7.6: FORMA ZA DODAJANJE NOVE NALOGE ........................................................................................................ 32
SLIKA 7.7: PODROBNOSTI NALOGE ........................................................................................................................... 33
SLIKA 7.8: POTEK PREVAJANJA IN PREVERJANJA ODDANIH REŠITEV ................................................................................. 35
SLIKA 7.9: TABELA Z OPRAVLJENIMI MERITVAMI ......................................................................................................... 36
vii
KAZALO TABEL
TABELA 6-1: PRIMER PREVAJANJA PROGRAMA V UKAZNI VRSTICI ................................................................................... 24
TABELA 7-1: PRIMER VPISANIH PODATKOV V DATOTEKO .CSV ........................................................................................ 36
TABELA 7-2: TESTIRANJE PRAVILNOSTI PRENESENE DATOTEKE ALGORITMA ....................................................................... 37
viii
SEZNAM KRATIC
ENIAC – Electronic Numerical Integrator and Calculator, elektronski numerični integrator
in računalo
CPU – Central Processing Unit, centralna procesna enota
CMM – Capability Maturity Model, zmožnostno zrelostni model
JVM – Java Virtual Machine, javin virtualni stroj
API – Application Programming Interface, aplikacijski programski vmesnik
CLOC – Count Lines of Code, štetje števila vrstic kode
ASP.NET – Active Server Pages for .NET
MVC – Model View Controller, vzorec Model Pogled Krmilnik
ADO.NET – ActiveX Data Objects for .NET
LOC – Lines Of Code, število vrstic kode
1
1 UVOD
Vse od prejšnjega stoletja do danes smo priča velikemu vzponu rabe računalniških
tehnologij. Tempo življenja je vse hitrejši, kar se občuti tudi na področju ustvarjanja in rabe
računalniških programov. Ustvarjalci in uporabniki računalniških programov stremijo k čim
manjšim časovnim izgubam pri njihovem delovanju. Za ustvarjanje računalniških
programov imamo na voljo veliko programskih jezikov in izbrati najprimernejšega, je
zahtevna naloga. Pomemben vidik pri izbiri programskega jezika je tudi njegova
učinkovitost, zato smo v obliki spletne aplikacije izdelali ogrodje za merjenje in primerjavo
učinkovitosti programov, zapisanih v različnih programskih jezikih, in meritve predstavili v
diplomskem delu.
Razvoj računalniških programov in spremljajočih tehnologij sta obsežni področji, zato se
bomo v tem diplomskem delu omejili na tri programske jezike, C#, Java in C++, ter zgolj na
predstavitev rezultatov meritev. Predstavili bomo, kaj so programski jeziki, in njihov
zgodovinski razvoj. Posvetili se bomo kakovosti in učinkovitosti programske opreme ter
programske kode.
S pomočjo pridobljenega znanja smo v obliki spletne aplikacije izdelali ogrodje za merjenje
in primerjavo učinkovitosti programov in njegovo izdelavo ustrezno dokumentirali. Izdelali
smo ga v programskem jeziku C# v razvojnem okolju Microsoft Visual Studio 2015.
Uporabniku omogoča merjenje časa izvajanja, števila vrstic kode in zasedenosti delovnega
pomnilnika programov, zapisanih v enem izmed omenjenih programskih jezikov. Na koncu
smo predstavili način uporabe naše aplikacije.
1.1 Cilji
Cilji diplomskega dela so:
• predstaviti, kaj so programski jeziki;
• predstaviti zgodovino programskih jezikov in njihov razvoj;
• predstaviti pomen kakovosti programske opreme;
• predstaviti učinkovitost programske opreme;
• predstaviti metrike programske opreme;
• izdelati spletno aplikacijo za merjenje in primerjavo učinkovitosti programov;
• predstaviti način delovanja aplikacije.
2
2 PROGRAMSKI JEZIKI
2.1 KAJ JE PROGRAMSKI JEZIK
Ko govorimo o programskem jeziku, govorimo o formalnem jeziku, ki služi za opisovanje
algoritmov, ki se izvajajo v računalniku. Način opisovanja mora biti razumljiv programerju,
ki program napiše, bere, popravlja in dopolnjuje. V osnovi programer stremi k učinkovitemu
pisanju programov s čim manj napakami, zato mora razumeti programsko kodo, da lahko
napake odkrije in jih popravi. Opisovanje mora biti razumljivo stroju oziroma računalniku,
ki program izvaja. Izvajanje mora biti enolično določeno oziroma programski jezik ne sme
biti dvoumen.
Z vidika človeka bi bilo idealno, če bi bil programski jezik kar naravni jezik. Človek bi
računalniku posredoval opis naloge v naravnem jeziku, nejasnosti in dvoumnosti pa bi
računalnik razreševal v dialogu z uporabnikom. Naravni jezik je kompleksen in dvoumen,
zato dialog z računalnikom v tem jeziku zaenkrat še ni mogoč. Na drugi strani pa bi za
računalnik bilo idealno, če bi človek opisoval naloge v strojnem jeziku, ki ga računalnik
neposredno razume, zato v tem primeru programov ne bi bilo treba prevajati. [13]
Ker je strojni jezik zapleten, nepregleden, njegovo pisanje pa počasno, je posledično tudi
težje odkriti in popraviti napake, ki se pojavijo, zato programiranje v strojnem jeziku ni
primerno. Zaradi naštetih težav, ki se pojavijo pri programiranju v strojnem jeziku, so v ta
namen razviti višjenivojski programski jeziki, ki so bližje naravnemu kot strojnemu jeziku.
[28]
3
Vsak programski jezik ima nekaj osnovnih gradnikov, ki opisujejo podatke, procese ali
pretvorbe. Tako pri programskem jeziku ponavadi ločimo pravila za sestavljanje stavkov (t.
i. sintaktična pravila ali sintaksa) in pravila, ki vsakemu stavku enolično določijo pomen (t.
i. semantična pravila ali semantika).
Sintaksa programskega jezika opisuje predpisane kombinacije ukazov in stavkov, ki tvorijo
pravilno zapisan program. Pomen posameznih gradnikov (simbolov, ukazov, stavkov) je
določen s semantiko programskega jezika. Kadar pa program ni napisan v skladu s
sintaktičnimi pravili programskega jezika, prevajalnik odkrije napake v programu in
programerja o njih ustrezno obvesti.
Semantika programskega jezika določa pomen posameznih stavkov, ukazov, ločil
programskega jezika. Do določene mere je semantika določena s sintakso programskega
jezika, vendar se v primerih, ko je program sintaktično pravilen, a semantično nepravilen,
programi vedejo nepredvidljivo. [2]
Slika 2.1 nam na primeru barv semaforja prikazuje pomen sintakse in semantike. Sintaksa
je v tem primeru zelena je spodaj , rumena v sredini, rdeča na vrhu, v semantičnem pomenu
pa je zelena pojdi in rdeča je ustavi.
Slika 2.1: Primer, kaj v praksi pomenita sintaksa in semantika
4
3 ZGODOVINA PROGRAMSKIH JEZIKOV
V prvi polovici dvajsetega stoletja smo bili priča razvoju prvih računalniških sistemov
(računalnikov). Najstarejši računalniki so bili mehanični in elektromehanični. Njihovo
programiranje je bilo mogoče zgolj s fizičnim posegom neposredno v računalnik, in sicer
tako, da so zobnike in električna stikala povezali v ustrezne nastavitve, ki so reševale
določen problem. Programiranje na tak način se je z majhnimi spremembami ohranilo tudi
pri nasledniku mehaničnega računalnika, to je pri elektronskem računalniku. Prvi
uveljavljeni elektronski računalnik je bil ENIAC (slika 3.1), ki se je uporabljal za samodejno
reševanje zahtevnih matematičnih problemov. Možno ga je bilo tudi na novo programirati.
[4]
Slika 3.1: Prvi elektronski računalnik ENIAC
(Vir: https://en.wikipedia.org/wiki/ENIAC, 15. 8. 2016
5
V poznih štiridesetih letih 20. stoletja se je pojavila iniciativa za odkrivanje novih pristopov.
John Von Neumann1 je leta 1945 predstavil delo, v katerem je opisal princip delovanja
modernega računalnika (slika 3.2). Kot izhodišče je zapisal, da mora računalnik vsebovati
enoten pomnilnik za pomnjenje tako ukazov kot podatkov in centralno procesno enoto
(CPE), ločeno od pomnilnika. [27]
Von Neumannova arhitektura vsebuje ozko grlo, ki se kaže v vodilu med CPE in
pomnilnikom ter ima majhno prepustnost podatkov, zato je delovanje računalnika
počasnejše. Problem ozkega grla lahko rešimo s pomočjo predpomnjenja med CPE in
pomnilnikom. Poleg Von Neumannove arhitekture poznamo tudi harvardsko arhitekturo
računalnika (slika 3.3), ki ima ločeni vodili za podatke in ukaze, s čimer omogoča istočasen
prenos ukazov in podatkov. Posledično predvideva tudi ločen pomnilnik za podatke in
ukaze. Slabost harvardske arhitekture je v tem, da ne omogoča možnosti zapisovanja v
pomnilnik ukazov. To pomeni, da so računalniki s Von Neumannovo arhitekturo kljub
počasnejšemu delovanju fleksibilnejši od harvardske arhitekture. [29]
1 John von Neumann je bil madžarsko-ameriški matematik.
Slika 3.2: Von Neumannova
arhitektura računalnika
Slika 3.3: Harvardska arhitektura
računalnika
6
3.1 GENERACIJE PROGRAMSKIH JEZIKOV
Skozi čas so se programski jeziki razvijali zelo hitro in razvoj se do danes še ni ustavil.
Programske jezike lahko razdelimo na pet generacij:
1. strojni jeziki,
2. zbirni jeziki,
3. višjenivojski jeziki,
4. jeziki četrte generacije,
5. jeziki pete generacije.
3.1.1 STROJNI JEZIKI
Strojni jezik (slika 3.4) je predstavnik prve generacije programskih jezikov. Gre za jezik, ki za
programiranje uporablja numerične ukaze v obliki ničel in enic. Programiranje in odkrivanje
napak v programskem jeziku sta težavna in počasna. [13]
Slika 3.4: Primer videza kode strojnega jezika
(Vir: https://en.wikipedia.org/wiki/Machine_code, 25. 8. 2016)
7
3.1.2 ZBIRNI JEZIKI
Drugo generacijo programskih jezikov predstavlja zbirni jezik (slika 3.5). Temelji na strojni
kodi, ki je prilagojena tako, da jo človek bolje razume. Za razliko od strojnega jezika, pri
katerem so ukazi v obliki ničel in enic, se v zbirnem jeziku uporabljajo imena, sestavljena iz
črk, ki si jih je lažje zapomniti in razlagati. Programi, pisani v zbirnem jeziku, so odvisni od
strojne opreme in niso prenosljivi. [4]
Slika 3.5: Primer kode zbirnega jezika
(Vir: http://www.hexblog.com/?p=17, 25. 8. 2016)
8
3.1.3 VIŠJENIVOJSKI JEZIKI
Zaradi razvoja strojne opreme se je pojavila potreba po hitrem razvoju kompleksnejše
programske opreme. Posledično je nastala tretja generacija programskih jezikov (slika 3.6)
ali t. i. višjenivojski programski jeziki, ki so bili neodvisni od strojne opreme. [9] Začetnika
tretje generacije sta bila programski jezik Fortran in programski jezik Cobol. Fortran je bil
namenjen za reševanje matematičnih problemov, cobol pa za poslovne aplikacije. Kot
zanimivost lahko navedemo, da sta oba jezika še danes v uporabi. [4]
Slika 3.6: Predstavniki tretje generacije programskih jezikov
(Vir:http://techolook.blogspot.si/2013/01/third-generation-computer-languages.html, 25. 8. 2016)
9
3.1.4 JEZIKI ČETRTE GENERACIJE
Jeziki četrte generacije so nastali, ker jeziki tretje generacije niso več zadostovali za izdelavo
aplikacij, ki so imele specializiran problem (slika 3.7). Jeziki četrte generacije so generalno
nepostopkovni, izdelani so za obdelovanje velike količine podatkov. Namenjeni so za delo
s podatkovnimi bazami. [4]
3.1.5 JEZIKI PETE GENERACIJE
Peta generacija programskih jezikov je skupina jezikov, ki so se razvijali v osemdesetih letih
dvajsetega stoletja in katerih prihodnost je negotova. Osnovna značilnost teh jezikov je, da
mora programer vnesti omejitve programu, na podlagi katerih ta išče rešitev, namesto da
program sam reši problem. [4]
Slika 3.7: Primerjava med jezikom tretje generacije in jezikom četrte generacije
(Vir:http://techolook.blogspot.si/2013/02/fourth-generation-computer-languages.html, 25. 8. 2016)
10
4 KAKOVOST PROGRAMSKE OPREME
4.1 DEFINICIJA KAKOVOSTI
Obstaja veliko različnih definicij kakovosti. Na kakovost lahko gledamo z različnih zornih
kotov. Za naše področje velja definicija kakovosti po standardu ISO/IEC 25010, ki se
natančneje nanaša na programsko opremo in definira kakovost kot stopnjo, do katere
izdelek izpolnjuje določene zahteve različnih interesnih skupin (funkcionalnost,
učinkovitost, kompatibilnost, uporabnost, zanesljivost, varnost, vzdrževalnost,
prenosljivost). [12]
Kakovost, čas in stroški so trije glavni faktorji (slika 4.1), ki določajo uspeh ali neuspeh
projekta, pri čemer je kakovost edini faktor, na katerega menedžment nima neposrednega
vpliva. [20]
Slika 4.1: Faktorji, ki vplivajo na uspeh oziroma neuspeh projekta
11
4.2 KAKOVOST Z VIDIKA UPORABNIKA, RAZVIJALCA IN UPRAVLJAVCA
PROGRAMSKE REŠITVE
Eden od ciljev razvoja in izdelave programskih rešitev je, da so izdelane kakovostno. Na
kakovost gledamo z različnih zornih kotov:
• kakovost pri uporabi,
• zunanja kakovost,
• lastnosti notranje kakovosti,
• kakovost procesa.
Prvi in najbolj pogost vidik kakovosti je kakovost pri uporabi, kar pomeni izkušnjo končnega
uporabnika programske rešitve. Splošno gledano ta pogled odraža obseg, v katerem lahko
uporabnik doseže cilje v posebnem okolju. Ko proučujemo kakovost v uporabi, smo
pozorni, kako se uporabnik odzove na programsko rešitev.
Zunanja kakovost je vidik, s pomočjo katerega lahko določimo kakovost programske
rešitve, tako da jo poženemo, ponavadi v testnem okolju. Pri lastnostih notranje kakovosti
so to lastnosti, ki jih lahko določimo s pregledom in ne izvajanjem programske opreme.
Vidik s strani upravljavca programske rešitve se nanaša na kakovost procesa razvoja
programske rešitve. Veliko podjetij, ki se ukvarjajo z razvojem programskih rešitev,
uporablja ogrodja, kot sta CMM ali ISO 90012. Omenjeni ogrodji sta namenjeni dobri
dokumentaciji, ponovljivosti, opredeljenosti, upravljanju in optimizaciji procesa gradnje
programske rešitve. [20]
2 Standard, zgrajen na načelih vodenja kakovosti.
12
4.3 ISO/IEC 25010
Cilj serije standardov ISO/IEC 25000 (slika 4.2) je ustvariti ogrodje za ocenjevanje kakovosti
programske opreme. Ti standardi temeljijo na predhodnem standardu ISO/IEC 9126.
Standard ISO/IEC 25010 opredeljuje model kakovosti, ki ocenjuje kakovost programske
rešitve. Model določa, katere značilnosti kakovosti bodo zajete pri ocenjevanju kakovosti
programske opreme. Kakovost programske rešitve je stopnja, do katere izdelek izpolnjuje
vnaprej določene zahteve. Te zahteve so definirane z značilnostmi in njihovimi
podkategorijami, s pomočjo katerih lahko določimo končno oceno kakovosti programske
rešitve. [11]
Slika 4.2: Razdelitev standardov ISO/IEC 25000
13
Spodnja slika (slika 4.3) nam prikazuje model kakovosti, ki s pomočjo osmih značilnosti in
njihovih podkategorij opredeljuje kakovost programske rešitve. Te značilnosti so [12]:
• funkcionalnost,
• učinkovitost,
• kompatibilnost,
• uporabnost,
• zanesljivost,
• varnost,
• vzdrževalnost,
• prenosljivost.
Slika 4.3: Značilnosti za ocenjevanje kakovosti programske rešitve
14
4.4 METRIKE
Po standardu ISO/IEC/IEEE 24765 pravimo metrikam količinske meritve stopnje do katere
sistem, komponenta ali proces poseduje določeno lastnost. [10]
4.4.1 NOTRANJE IN ZUNANJE METRIKE
Notranje metrike se lahko uporabljajo za neizvedljivo programsko opremo skozi razvojne
faze, kot so zbiranje zahtev, oblikovanje, predlog zahtev, programske kode. Notranje
metrike omogočajo uporabniku izmeriti kakovost z vmesnimi meritvami in tako predvideti
kakovost končnega produkta oziroma programske opreme. To omogoča uporabniku, da si
zastavi vprašanja glede kakovosti in nanje najde ustrezen odgovor v zgodnji fazi
življenjskega cikla razvoja programske opreme.
Zunanje metrike se lahko uporabljajo za merjenje kakovosti programske opreme z meritvijo
obnašanja sistema, katerega del je. Zunanje metrike se uporabljajo za merjenje znotraj faz
testiranja, delovanja in opazovanja izvedljive programske opreme ali sistema. Meritve so
izvedene med izvajanjem programske opreme v okolju sistema, ki je predvideno za njeno
delovanje. [7][9]
4.5 METRIKE PROGRAMSKE OPREME
V poglavju 4.1 smo pisali o kakovosti programske opreme, zato smo se pri metrikah
dotaknili tudi metrik, ki zadevajo programsko opremo. Metrike programske opreme lahko
razdelimo na tri kategorije: metrike produkta, procesa in projekta. Metrike produkta
opisujejo lastnosti produkta, kot na primer velikost, kompleksnost, oblikovnost in stopnjo
kakovosti produkta. Metrike procesa nam pomagajo pri izboljšanju razvoja in vzdrževanja
produkta, kot je na primer učinkovito odstranjevanje napak med razvojem produkta.
Metrike projekta pa opisujejo lastnosti in izvedbo projekta, na primer število razvijalcev
15
programske opreme, stroške, urnik in produktivnost, ki zadeva razvoj programske opreme.
Nekatere metrike lahko spadajo v več kategorij hkrati.
Metrike kakovosti programske opreme so podskupina metrik programske opreme. V
osnovi so metrike kakovosti programske opreme bolj povezane z metrikami procesa in
produkta kot pa z metrikami projekta. Moramo omeniti, da tudi parametri projekta, kot so
število razvijalcev in njihova raven usposobljenosti, razpored projekta in velikost
organizacijske strukture prav tako vplivajo na kakovost produkta.
Metrike kakovosti programske opreme je mogoče dodatno razdeliti na metrike kakovosti
končnega izdelka in metrike kakovosti procesa. Pri ustvarjanju programske opreme je
bistvenega pomena raziskati odnose med metrikami procesa, projektnimi lastnostmi in
kakovostjo končnega produkta ter na podlagi ugotovitev izboljšati kakovost procesa in
produkta. [19]
16
5 UČINKOVITOST PROGRAMSKE OPREME
5.1 DEFINICIJA UČINKOVITOSTI
Učinkovitost označuje stopnjo porabe sredstev za ustvarjanje popolnih rezultatov.
Učinkovitost se nanaša na uporabo vseh sredstev, vključno z osebnim časom in energijo za
produciranje poljubnega rezultata. Je merljiv koncept, ki ga določa razmerje med
uporabnimi rezultati in vloženimi sredstvi. Učinkovitost pomeni doseči želen rezultat, pri
čemer je zapravljanje sredstev, kot so fizični materiali, energija in čas, minimalno. [6]
5.2 UČINKOVITOST PROGRAMSKE KODE
Ko govorimo o učinkoviti programski kodi, moramo imeti v mislih, da gre za širok pojem, ki
opisuje zanesljivost, hitrost in metodologijo programiranja, s pomočjo katerih razvijamo
programsko kodo za končni produkt. To so ključni dejavniki, ki vplivajo na zmogljivost
programske kode in sam program. Cilj učinkovite kode je torej čim bolj zmanjšati porabo
virov in s tem ohraniti minimalno tveganje za poslovno ali delovno okolje. Učinkovita
programska koda lahko pripomore k izboljšanju kakovosti programske opreme.
Priporočilo pri razvoju programske opreme je zagotavljanje visoke učinkovitosti
programske kode. Učinkovita programska koda mora biti sposobna obvladovati
kompleksnejše algoritme. [23]
Učinkovitost programskega jezika ali kode zajema dva pomembna elementa: čas in
pomnilnik. Primarna in komplementarna koncepta omogočata računanje. V primeru, da bi
odvzeli nekaj pomnilnika, bi to pomenilo daljše izvajanje nekega programa, kar pomeni, da
se ta dva elementa med seboj dopolnjujeta. [20]
17
5.3 NOTRANJE IN ZUNANJE METRIKE UČINKOVITOSTI
Uporabljajo se za predvidevanje učinkovitosti programske opreme med testiranjem ali
kodiranjem. Za merjenje učinkovitosti moramo najprej definirati konfiguracijo strojne in
programske opreme referenčnega okolja, ki mora biti definirano v konfiguraciji programske
opreme. [9]
• METRIKE ČASOVNEGA OBNAŠANJA prikazujejo niz lastnosti za predvidevanje
časovnega obnašanja sistema, vključno s programsko opremo izdelka med
testiranjem in delovanjem.
• METRIKE PORABE VIROV prikazujejo niz lastnosti za predvidevanje porabe virov
strojne opreme računalniškega sistema, vključno s programsko opremo izdelka
med testiranjem in izvajanjem.
Primere metrik lahko najdemo v ISO/IEC 9126-3. Nekateri primeri metrik so: časovna
odzivnost (angl. Response time), časovna prepustnost (angl. Throughput time), poraba
pomnilnika (angl. Memory utilization), poraba vhodnih in izhodnih virov (angl. I/O
Utilization) itd. [9]
Pri notranjih metrikah učinkovitosti smo govorili o ocenjevanju oziroma predvidevanju
časovnega obnašanja in porabe virov. Zunanje metrike pa dejansko merijo naštete lastnosti
med izvajanjem. Merijo se tudi povprečne vrednosti, maksimalne vrednosti in omejitve
določenih lastnosti. Primere metrik lahko najdemo v ISO/IEC 9126-2. Nekateri primeri
metrik so: povprečen odzivni čas (angl. Mean time to response), Najslabši odzivni čas (angl.
Worst case response time), maksimalna poraba pomnilnika (angl. Maximum memory
utilisation) itd.[8]
Učinkovitost zunanjih metrik se razlikuje od notranjih po tem, da zunanje metrike
opravljajo meritve med samim izvajanjem programske opreme, medtem ko notranje
metrike napovedujejo določene zunanje metrike. Pri zunanjih metrikah se pojavljajo
18
metrike, ki merijo povprečne vrednosti, in metrike za merjenje najslabših možnih scenarijev
za omenjene notranje metrike, ki jih najdemo v ISO/IEC 9126-3.
5.3.1 METRIKE ŠTEVILA VRSTIC KODE
Velikost je ena izmed najpomembnejših lastnosti programske opreme, ki ni le ključni faktor
pri določanju stroškov in časa za izdelavo programske opreme, ampak je tudi osnovna
enota za pridobivanje drugih metrik, ki zadevajo status projekta in meritve kakovosti
programske opreme.
Število vrstic (angl. Lines of Code) je ena izmed najbolj uporabljanih metrik velikosti.
Uporablja se za štetje fizičnih in logičnih vrstic kode. Fizične vrstice kode definiramo kot
vrstice, ki ne vsebujejo praznih vrstic in komentarjev. Fizične vrstice kode lahko štejemo
neodvisno od programskega jezika, saj se ne upošteva sintaktičnih in drugih razlik med
ostalimi programskimi jeziki. Logičnim vrsticam kode pa pravimo stavki, ki se končajo s
podpičjem. Štetje logičnih vrstic se izvaja neodvisno od formata stavkov, ki se štejejo. To
pomeni, da je lahko več logičnih stavkov v eni vrstici ali pa je en logični stavek sestavljen iz
več vrstic kode. [14]
5.3.2 METRIKE ČASOVNEGA OBNAŠANJA
Ko govorimo o časovni odzivnosti, govorimo o času, ki ga strežnik potrebuje za obdelavo
zahteve – na primer spletne strani. Torej odzivni čas bi bil čas, ki ga sistem potrebuje, da
prikaže rezultat zahteve na spletno stran. Metrike časovne odzivnosti so pomembne z
vidika končnega uporabnika programske opreme ali spletne aplikacije. [17]
19
5.4 ZAHTEVNOST ALGORITMOV
Zahtevnost algoritmov je še eden izmed bolj pomembnih dejavnikov, ki vplivajo na
izboljšanje časovnih zmogljivosti programskih rešitev. V programih, ki imajo delovna
opravila vezana na procesorski čas, so osnovni algoritmi daleč najpomembnejši elementi za
izboljšanje njihovega časa izvajanja.
Računalniški strokovnjaki so oblikovali tako imenovano O-notacijo za razvrščanje izvajalnih
časov različnih algoritmov. Takšna notacija izraža izvajalni čas algoritma brez navajanja
vpliva manj pomembnih osnovnih ukazov.
Tako za algoritme, ki lahko sprocesirajo n elementov v O(n) času, vemo, da je izvajalni čas
algoritma linearno sorazmeren s številom elementov algoritma. Torej pri O(n) bi dvojno
število elementov podvojilo čas izvajanja, pri O(1) ne bi vplivalo nanj, pri O(n2) pa bi čas
izvajanja povečalo za faktor 4 (22 = 4). Zahtevnost algoritmov razvrščamo od boljšega do
slabšega (slika 5.1). [22]
Slika 5.1: Razvrstitev zahtevnosti algoritmov
20
Iz grafa na sliki (slika 5.2) je razvidno, kako število operacij in število elementov vplivata na
čas izvajanja različnih algoritemskih odvisnosti. Na primer, če imamo algoritem s časovno
zahtevnostjo O(n2) in pri tem 105 elementov, imamo posledično 1010 operacij in čas
izvajanja 2,8 ure.
Slika 5.2: Prikaz vpliva števila operacij in števila elementov na čas izvajanja pri različnih algoritemskih odvisnostih
(Prirejeno po: Spinellis, D. Code Quality: The Open Source Perspective, Addison Wesley Professional, 2006, str. 190)
21
6 PREVAJANJE PROGRAMSKIH JEZIKOV
6.1 PREVAJALNIK
Prevajalnik (angl. compiler) je program, ki lahko prebere program, napisan v enem jeziku
(ponavadi v izvorni kodi), in ga prevede v ekvivalenten program, napisan v drugem, tako
imenovanem ciljnem jeziku (slika 6.1). Prevajalnik ima pomembno vlogo pri zaznavanju
napak v izvornem programu, ki jih odkrije med procesom prevajanja. [1]
V primeru, da je ciljni program izvedljivi program v strojnem jeziku, ga lahko izvede
uporabnik, ki lahko vnese vhode in dobi izhode (slika 6.2). [1]
Slika 6.1: Vloga prevajalnika
Slika 6.2: Izvajanje ciljnega programa
22
Pri prevajanju programskih jezikov oziroma programov pogosto zasledimo tudi izraz
tolmač.
Tolmač (angl. interpreter) je še en pogost jezikovni procesor. Namesto da ciljni program
prevede v celoti, ga interpretira oziroma tolmači (slika 6.3). Sproti ga prevaja in izvaja ukaz
za ukazom glede na vhode uporabnika. [1]
6.1.1 PREVAJALNIK JAVA
Programski jezik Java je visokonivojski jezik, ki je objektno orientiran, prenosljiv, dinamičen,
varen in robusten. V programskem jeziku Java je vsa izvorna koda najprej napisana v
navadni tekstovni datoteki s končnico .java. Ustvarjena izvorna datoteka ali datoteka z
izvorno kodo je s pomočjo javinega prevajalnika prevedena v datoteko s končnico .class. Te
datoteke ne vsebujejo kode, ki je razumljiva procesorju, ampak so prevedene v vmesno
kodo, ki jo razume strojni jezik JVM. Nato s pomočjo Java tolmača poženemo datoteko
.class in program izvedemo (slika 6.4). [16]
Slika 6.3: Delovanje tolmača
Slika 6.4: Postopek ustvarjanja programa v programskem jeziku Java
(Vir: http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html#FOOT, 8. 9. 2016)
23
Ker je JVM dostopen na velikem številu različnih operacijskih sistemov (Windows, Solaris,
Linux, Mac OS), lahko datoteke .class nemoteno poganjamo na različnih operacijskih
sistemih (slika 6.5). [16]
6.1.2 PREVAJALNIK C++
C++ je splošnonamenski računalniški programski jezik. C++ se ne interpretira ali prevede v
vmesni jezik, kot se na primer java. Zaradi tega za isto opravilo porabi manj časa, posledično
tudi manj energije, kar je prednost predvsem za naprave, ki potrebujejo baterijsko
napajanje. [30]
Za razvoj programov v programskem jeziku C++ ne potrebujemo ničesar drugega, kot nek
tekstovni urejevalnik za pisanje programske kode in prevajalnik, ki to kodo prevede in
poveže v izvršilni program. [18]
Programski jezik C++ uporablja prevajalnik, ki prevede izvorno kodo v izvršilno (npr. gcc).
Izvorno kodo lahko prevedemo znotraj razvojnega okolja s klikom na ustrezno funkcijo ali
pa se lahko lotimo ročnega prevajanja v ukazni vrstici (tabela 6.1). [18]
Slika 6.5: Možnost prenosljivosti aplikacij, napisanih v javi, na različne operacijske sisteme
(Vir: http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html#FOOT, 8. 9. 2016)
24
Tabela 6-1: Primer prevajanja programa v ukazni vrstici
Ukaz, ki ga napišemo v ukazno vrstico: g++ -o program program.cpp
6.1.3 PREVAJALNIK C#
Programski jezik C# je razvilo podjetje Microsoft v okviru razvoja ogrodja .NET. Je objektno
orientiran programski jezik in izvira pretežno iz jezikov C++, Visual Basic in Java. Zaradi
točne specifikacije programskega in vmesnega jezika se lahko program, napisan v C#,
neposredno prevede in izvede v drugih okoljih, ne da bi bilo treba za prenosljivost program
spreminjati. Zaradi omenjenih lastnosti je eden izmed priljubljenejših programskih jezikov.
[31]
Podobno kot pri programskem jeziku C++ tudi za razvoj programov v programskem jeziku
v C# ne potrebujemo ničesar drugega kot nek tekstovni urejevalnik in prevajalnik.
programski jezik C# nam omogoča pisanje namiznih aplikacij za sistem Windows in za
aplikacije, ki se uporabljajo na spletu, zato omogoča razvoj aplikacij s pomočjo razvojnega
okolja Visual Studio. Prevajanje izvorne kode v izvršilno omogoča prevajalnik »csc«, ki je del
Microsoftovega ogrodja .NET Framework. Prevajanje lahko izvedemo s pomočjo razvojnega
okolja Visual Studio, v katerem prevedemo napisan program ali s pomočjo prevajanja iz
komandne vrstice (slika 6.6). [31]
Slika 6.6: Primer zapisa ukaza v ukazno vrstico
25
7 SPLETNA APLIKACIJA ZA MERJENJE UČINKOVITOSTI PROGRAMOV
Po obravnavanih zgornjih poglavjih in pridobljenem ustreznem znanju smo se odločili
izdelati spletno aplikacijo za merjenje programov. Aplikacija bo uporabnikom omogočala
uvoz algoritmov in merjenje njihove učinkovitosti. Področje programskih jezikov in
programov je zelo široko, zato smo se omejili na tri programske jezike, in sicer C#, C++ in
Java.
Skozi vsa leta študija smo se pri več predmetih srečevali z najrazličnejšimi modeli razvoja
programskih rešitev, s pomočjo katerih skozi faze načrtovanja razvijemo programsko
opremo. Odločili smo se za kaskadni model (angl. Waterfall), ki smo ga v času študija
uporabljali v večini primerov načrtovanja programskih rešitev. Kaskadni model vsebuje pet
zaporednih faz: analizo, načrtovanje, implementacijo, testiranje in vzdrževanje. Sam naziv
modela izhaja iz načina, kako so v njem razvojne faze med seboj povezane. Povezane so
tako, da prehod v naslednjo razvojno fazo ni mogoč, če prejšnja faza ni končana. Izhod iz
prejšnje faze je tako vhod v naslednjo fazo načrtovanja. [26]
7.1 ANALIZA
V fazi analize najpogosteje analiziramo problem, ki ga želimo rešiti. Določimo predvidene
omejitve in zahteve problema. [26] Preden smo začeli s kakršno koli analizo, smo določili
programski jezik in razvojno okolje, v katerem smo razvijali spletno aplikacijo. Odločili smo
se za programski jezik C# in razvojno okolje Visual Studio 2015.
Osnovni cilj je spletna aplikacija, ki bo služila kot ogrodje za merjenje in primerjavo
učinkovitosti programov. Omogočala bo dodajanje novih nalog, za katere bodo uporabniki
napisali svojo kodo in opravili meritve svojega programa. Svoje rešitve bodo lahko napisali
v programskem jeziku C#, Java ali pa C++. Aplikacija bo preverila, ali uvoženi program
26
ustreza nalogi, in izvedla merjenje časa izvajanja, števila vrstic kode in zasedenosti
pomnilnika programa. Tako bodo uporabniki lahko med seboj primerjali rešitve in ugotovili,
kateri program je učinkoviteje napisan. Rezultati meritev se bodo nato izpisali v tabelo
rezultatov vseh že opravljenih meritev.
Specifičnih sistemskih omejitev spletna aplikacija nima, saj deluje na vsakem standardnem
računalniku, ki vsebuje spletni brskalnik. Pojavi se le tehnična zahteva, saj za pravilno
delovanje aplikacije potrebujemo internetno povezavo.
7.2 NAČRTOVANJE
V fazi načrtovanja določimo, kako bomo izpolnili zahteve, zapisane v predhodni fazi analize.
Določimo tudi vse funkcionalnosti programske rešitve in način, kako bomo zadevo
implementirali. [26]
Tako kot pri vseh ostali stvareh, ki jih želimo bodisi tržiti ali katerih uporabo želimo povečati,
je tudi pri razvoju programskih rešitev pomembno določiti grafični izgled aplikacije (slika
7.1).
Slika 7.1: Prvo okno spletne aplikacije
27
Stremeli smo k izdelavi preprostega in kar se da preglednega grafičnega vmesnika. Naša
aplikacija je spletna, zato smo se trudili zbrati čim več informacij na prvi strani in s tem
uporabniku olajšati delo z njo. Tako smo na prvo stran želeli dodati seznam nalog, da lahko
uporabnik že na samem začetku ugotovi, za kakšno spletno aplikacijo gre. Prav tako smo
na prvo stran dodali gumb za dodajanje nove naloge in s tem zmanjšali število nepotrebnih
korakov.
Ob izbiri gumba za dodajanje nove naloge smo želeli, da nas aplikacija preusmeri na novo
stran, na kateri je treba izpolniti vnosna polja, da je je korak dodajanja izveden uspešno.
Eden izmed pogojev za uspešno dodano nalogo je prenos datotek, ki smo ga želeli
omogočiti s pomočjo orodja za nalaganje datotek, ki je že v sklopu razvijalnega okolja .NET.
(slika 7.2).
Naša spletna aplikacija podpira tri programske jezike. Zato je bilo treba s pomočjo
predhodno pridobljenega teoretičnega znanja in že obstoječih rešitev na spletu izdelati
ustrezno prevajanje in poganjanje vsakega programskega jezika posebej.
Slika 7.2: Okno za dodajanje nove naloge
28
Meritve so v naši aplikaciji tudi ena izmed glavnih funkcionalnosti. Odločili smo se uporabiti
že obstoječe rešitve, zato smo za merjenje časa izvajanja uporabili kar funkcijo štoparice
(angl. stopwatch), ki jo že v osnovi omogoča razvojno okolje .NET. Razvojno okolje omogoča
tudi merjenje delovnega pomnilnika, ki ga za izvajanje porabi program. Za štetje vrstic kode
pa smo se odločili uporabiti brezplačni program CLOC3, ki omogoča štetje vrstic kode.
Implementirali smo preprečevanje napak, ki uporabniku nudi boljšo uporabniško izkušnjo.
Vemo, da uporabniki velikokrat napačno vnesejo podatke ali pa vnesejo podatke, ki
prekoračijo omejitve, ki smo jih predvideli. Posledično sta uporabniška izkušnja in
zanimanje uporabnika za aplikacijo slabša. Pri vnosu podatkov v vnosna polja smo želeli
implementirati preverjanje, ali je vnosno polje prazno. Pri delu z datotekami lahko pride
tudi do izbire napačne datoteke. Ker aplikacija omogoča merjenje treh programskih jezikov,
smo omejili datoteke oziroma končnice datotek, ki jih uporabnik lahko prenese na strežnik.
Najpomembnejše preverjanje pa je bilo preverjanje ustreznosti algoritma, ki ga uporabnik
prenese na strežnik in ga želi izmeriti.
7.3 IMPLEMENTACIJA
V skladu s fazo načrtovanja smo najprej izdelali grafični uporabniški vmesnik, s pomočjo
katerega uporabnik komunicira z aplikacijo. V nadaljevanju bomo opisali glavne
funkcionalnosti sistema, tehnologije in pristope, ki smo jih uporabili, ter način, na katerega
so bile implementirane.
7.3.1 ASP .NET MVC
Spletno aplikacijo smo želeli implementirati kakovostno in kot dobro osnovo za morebitne
nadgradnje. Želeli smo ustvariti ločen uporabniški vmesnik, poslovno logiko in trajno stanje
podatkov, zato smo se odločili uporabiti ogrodje ASP .NET MVC. Ogrodje je bilo razvito kot
3 Program je dostopen na http://cloc.sourceforge.net/, datum dostopa: 25. 9. 2016.
29
alternativa za spletne aplikacije ASP .NET. ASP .NET MVC je arhitekturno ogrodje, ki
aplikacijo deli na tri glavne komponente: model, pogled in krmilnik (Model – View –
Controller). [15]
Model je zadolžen za upravljanje s podatki spletne aplikacije, ki jo gradimo. Primer je
modul, ki je v interakciji s podatkovno bazo, kar pomeni, da pridobiva ali obdeluje podatke.
Pogled prikazuje model v nekem določenem kontekstu. Pogled ni nič drugega kot koda
HTML, ki jo strežnik vrne odjemalcu.
Krmilnik je jedrna komponenta, ki obdeluje vhodne podatke, deluje na modelu, prikaže
pogled in se odloči, kaj storiti naprej (preusmeri zahtevo ipd.). [24]
Tako smo definirali model (slika 7.3):
• naloga skrbi za upravljanje s podatki, ki so vezani na naloge, ki jih uporabnik lahko
ustvari;
• FileDetail je model, ki je zadolžen za datoteke, ki jih uporabniki prenašajo na
strežnik in se hranijo v podatkovni bazi;
• admin skrbi za podatke, ki so vezani na prijavo administratorja v sistem;
• TableMeritev so podatki, vezani za tabelo meritev, ki se prikaže ob uspešno
izvedeni meritvi programa;
• NalogaContext : skrbi za inicializacijo in komunikacijo z bazo;
• Services je model, v katerem se nahajajo funkcije, ki smo jih potrebovali za
implementacijo spletne aplikacije in so po zgledu dobre prakse ločene.
Uporabili smo krmilnike Home, Login in Naloga, prepoznamo jih po besedi controller (slika
7.4). Vsak krmilnik vsebuje določene akcije, s katerimi operiramo s podatki, delujemo na
modelu in prikazujemo pogled, tako da so pogledi enako poimenovani kot krmilniki. V
30
našem primeru so pogledi (silka 7.5) prav tako poimenovani kot krmilniki Home, Login in
Naloga.
Ogrodje ASP .NET MVC smo izbrali zato, ker smo videli, da vzorec MVC omogoča večjo
preglednost, ločevanje uporabniškega vmesnika, poslovne logike in trajnega stanja
podatkov, s čimer se tudi poveča varnost aplikacije in omogočena je manjšo izgubo časa za
nadgradnjo aplikacije in naknadno vpeljevanje novih ljudi v razvoj same spletne aplikacije.
DELO S PODATKI
Spletna aplikacija je v osnovni zasnovana tako, da obdeluje podatke in jih nato na strani
odjemalca tudi prikaže. Zato smo za delo s podatki ubrali pristop Entity Framework Code
First.
Entity Framework je objektno-relacijsko preslikavno ogrodje za ADO .NET, ki avtomatizira
relacijsko podatkovno bazo za določeno aplikacijo. To pomeni, da razvijalcem omogoča
avtomatsko dostopanje in shranjevanje podatkov v podatkovno bazo. [5]
Slika 7.3: Definirani modeli naše spletne aplikacije
Slika 7.5: Definirani krmilniki
Slika 7.4: Definirani pogledi
31
Pristop Code First: entity framework podpira tri različne pristope k razvoju podatkovne
baze, Code First, Model First in Database First. Mi smo izbrali pristop Code First oziroma
koda prej, kar pomeni, da smo najprej v kodi zapisali razrede in znotraj teh definirali
lastnosti ter nato s pomočjo entity frameworka izdelali podatkovno bazo. [5]
Pristop vsebuje veliko prednosti, saj smo se tako izognili monotonemu programiranju
oziroma vzpostavitvi podatkovne baze. Pristop Code First ni primeren za aplikacije, ki
operirajo z veliko podatki, in pri spreminjanju podatkov znotraj tabel v podatkovni bazi, kjer
je treba opraviti spremembe tudi znotraj razredov entitet v programski kodi in pognati ukaz
za posodobitev celotne podatkovne baze s pomočjo konzole. [3]
7.3.2 NALAGANJE DATOTEK
Da bi uporabniku omogočili čim hitrejše in čim lažje nalaganje datotek z njegovimi algoritmi,
smo uporabili že obstoječi gradnik FileUpload znotraj razvojnega okolja ASP .NET.
Uporabniku omogoča ob nekaj klikih izbrati eno ali več datotek. Izbrane datoteke nato
prenesemo na strežnik.
Razmišljali smo tudi o tem, da se lahko zgodi vnos datotek z neustrezno končnico, zato smo
omogočili zgolj datoteke s končnicami .c, .cc, .cpp, .cs in .java. Prav tako smo tudi za primer,
da uporabnik ne bi izbral nobene datoteke, ustvarili opozorilni izpis kot opozorilo, da ni
izbrana nobena datoteka, s čimer bi preprečili nedelovanje aplikacije.
Na začetku smo razmišljali zgolj o vnosnem polju, v katerega bi uporabnik zgolj prilepil svojo
kodo. Vendar smo na koncu prišli do zaključka, da bi bil ta način nefunkcionalen, ker lahko
uporabnikov algoritem obsega večje število datotek. Tako smo se izognili omejitvi in
izboljšali uporabniško izkušnjo.
32
7.3.3 USTVARI NALOGO
Aplikacija omogoča, da katerikoli uporabnik, ki ima interes, objavi novo nalogo oziroma
problem. Osnovna ideja je, da je naša spletna aplikacija dostopna širši množici in da lahko
vsak ustvari novo nalogo ter tako prispeva k širjenju baze različnih nalog. Dodajanje naloge
smo implementirali s pomočjo forme (slika 7.6), v kateri mora uporabnik določiti ime naloge
in podati natančna navodila ter prenesti datoteko, v kateri so zapisani vhodni podatki, s
katerimi bo naloga operirala. Priložiti mora tudi pričakovani rezultat, ki ga mora naloga
vrniti.
Uporabnik mora za uspešno izvedeno dodajanje izpolniti vsa vnosna polja in izbrati
datoteke za prenos, sicer korak ni uspešno izveden in naloga ni dodana na seznam nalog.
Če pa uporabniki uspešno vnesejo podatke, ki so neprimerni, lahko administrator aplikacije
neustrezno nalogo umakne s seznama.
Slika 7.6: Forma za dodajanje nove naloge
33
7.3.4 ODDAJ REŠITEV
Ena izmed najbolj pomembnih funkcionalnosti naše spletne aplikacije je možnost oddaje
rešitve (slika 7.7). Nahaja se na strani s podrobnostmi o nalogi, kjer lahko zasledimo
podrobna navodila. V naslednjih podpoglavjih bomo po vrsti podrobneje opisali, kako se
oddane rešitve prevedejo, poženejo in izmerijo.
Slika 7.7: Podrobnosti naloge
34
PREVAJANJE IN PREVERJANJE REŠITEV
Nad rešitvami, ki so bile oddane, se v ozadju izvede prevajanje in preverjanje. Datoteke se
prevajajo s pomočjo določenih prevajalnikov glede na programski jezik. Prevajajo in
poganjajo se v sklopu zunanjega procesa, ki ga poganjajo vnaprej zapisane skripte (batch
skripte). Skripte se v aplikaciji poganjajo s pomočjo procesov in simulirajo zagon programa
s pomočjo ukaznega terminala oziroma konzole. Za rešitev prevajanja in poganjanja s
pomočjo skript smo se odločili zato, ker je neposredno izvajanje ukazov iz aplikacije
povzročalo težave pri pravicah dostopa do datotek v operacijskem sistemu Windows.
Pravilnost oddanih rešitev je zelo pomembna, zato smo poskrbeli za njihovo ustrezno
preverjanje in s tem zagotovili točnost opravljenih meritev. Pomembnost preverjanja se
kaže v tem, da onemogoči objavo programov, ki ne delajo. V izogib takšnim uporabnikom
smo uvedli tudi to, da morajo uporabniki, ki ustvarjajo nalogo, podati tip in nabor vhodnih
podatkov, prav tako pa morajo podati pričakovane izhode.
Vhodni podatki in pričakovani izhodni podatki so za druge uporabnike nevidni, avtorji nalog
pa morajo v navodilu točno opisati, s kakšnimi tipi morajo pravilne rešitve operirati in v
kakšnem formatu morajo rešitve podati rezultate. Naša spletna aplikacija nato prevede in
požene rešitev, nad rešitvijo izvede meritve in primerja pričakovane rezultate oddane
rešitve s pričakovanimi rezultati, ki jih je določil avtor naloge. Če se podatki ujemajo, se
rezultati meritev dodajo v tabelo meritev, v nasprotnem primeru pa spletna aplikacija
uporabnika opozori, da oddana rešitev ni pravilna (slika 7.8).
35
MERJENJE ČASA IZVAJANJA, VRSTIC KODE IN ZASEDENOSTI
POMNILNIKA
Sočasno s prevajanjem in preverjanjem smo izvedli tudi meritve algoritma, ki ga je
uporabnik prenesel na strežnik. Merjenje časa izvajanja smo opravili s pomočjo že
obstoječe metode znotraj razvojnega okolja Visual Studio 2015, Stopwatch. Omogoča nam
preprosto merjenje časa izvajanja znotraj programske kode z lastnostmi Stopwatch.Start()
in Stopwatch.Stop(). Razvojno okolje je omogočalo z že vgrajenimi metodami tudi merjenje
delovnega pomnilnika. Meritve so opravljene na trenutnem procesu s pomočjo
runProcess.WorkingSet64, ki vrne vrednost v bajtih, mi pa smo vrednost nato pretvorili v
kilobajte.
Slika 7.8: Potek prevajanja in preverjanja oddanih rešitev
36
Meritve vrstic kode smo implementirali s pomočjo programa CLOC. Program smo pognali
na enak način kot posamezne prevajalnike za posamezni programski jezik, in sicer s
pomočjo zunanjega procesa in simuliranjem ukazov znotraj ukaznega terminala. Ponovno
smo uporabili vnaprej zapisane skripte, v katere smo združili vse ukaze, in se izognili
težavam glede pravic dostopa do datotek znotraj operacijskega sistema Windows. Program
CLOC omogoča izpis meritev v datoteko .csv. V njej najdemo podatke o tem, nad kolikšnim
številom datotek smo izvedli meritev, za kateri programski jezik gre, koliko je praznih vrstic,
koliko je komentarjev in koliko je vrstic s programsko kodo (tabela 7.1).
Tabela 7-1: Primer vpisanih podatkov v datoteko .csv
Files Language Blank Comment Code
1 C# 14 3 94
7.3.5 IZPIS MERITEV V TABELO IN REZULTATI MERITEV
Vse meritve smo združili v tabelo vseh meritev (slika 7.9) in tako omogočili, da ima
uporabnik zbrane vse že opravljene meritve na enem mestu. Uporabnikom smo omogočili,
da lahko ob vsaki opravljeni meritvi prenesejo programsko kodo vsake oddane rešitve in
tako dobijo vpogled, kako so drugi uporabniki napisali svojo kodo.
Slika 7.9: Tabela z opravljenimi meritvami
37
7.4 TESTIRANJE
Faza testiranja je namenjena odkrivanju in popravljanju napak, ki smo jih povzročili med
pisanjem programa. Preverjamo tudi, ali se aplikacija odziva, kot smo načrtovali. Testiranje
smo izvedli od manj zahtevnih funkcionalnosti do bolj zahtevnih. Tako smo na začetku
opravili testiranja, kot so prazni vnosi v vnosno polje za ime, izbiro datotek z neustrezno
končnico, pritisk na kontrolni gumb za prenos datotek v primeru, ko ni izbrana nobena
datoteka. Vsa testiranja so pokazala, da ni bilo prisotnih nobenih pomanjkljivosti in
odstopanj od zastavljenih načrtov.
7.4.1 PREVERJANJE PRAVILNOSTI PRENESENEGA ALGORITMA
Ugotovitve v zvezi s testiranjem preverjanja pravilnosti prenesenega algoritma smo
predstavili s pomočjo testne tabele (tabela 7.2).
Tabela 7-2: Testiranje pravilnosti prenesene datoteke algoritma
Tip testa Komentar Test
Prenesen pravilen in delujoč
program
Rezultat meritev se uspešno vnese v tabelo
vseh meritev.
Uspel
Prenesen delujoč program,
vendar je rezultat nepravilen
Statusna vrstica nas opozori, da pričakovani
rezultat ni pravilen. Meritve se ne vpišejo v
tabelo vseh meritev.
Uspel
Pomanjkljivo napisana koda v
datoteki programa
Statusna vrstica nas opozori, da prenesena
datoteka ni pravilno napisana in ni bila
izvedena. Meritve se ne vpišejo v tabelo vseh
meritev.
Uspel
Delujoč program, ki se ne
zaključi
Statusna vrstica nas opozori, da se program
po določenem času ni zaključil. Meritve se ne
vpišejo v tabelo vseh meritev.
Uspel
38
Kadar se pojavi napaka znotraj datoteke z algoritmom, ki jo uporabnik prenese na strežnik,
aplikacija ne preneha z delovanjem, temveč uporabnika o napakah ustrezno opozori. Na
podlagi zgoraj opravljenih testov menimo, da aplikacija deluje nemoteno.
7.5 VZDRŽEVANJE
Faza vzdrževanja nastopi potem, ko so vse predhodne faze uspešno zaključene. V fazi
vzdrževanja vzdržujemo končen produkt tako, da odkrivamo in odpravljamo napake, lahko
tudi spreminjamo sam sistem zaradi spremembe strojne opreme ali zaradi zahtev
uporabnikov. [25]
Naš končni produkt ne potrebuje specifičnega vzdrževanja, ker v osnovi zadovoljuje vse
potrebe, ki so bile zapisane v fazi analize.
39
8 SKLEP
V diplomskem delu smo opisali kakovost in učinkovitost programske opreme ter metrike za
merjenje kakovosti programske opreme. Seznanili smo se z definicijo kakovosti, z vidiki
kakovosti in modelom kakovosti ISO/IEC 25010. Tako kot ljudje so si tudi programerji med
seboj različni po svojem načinu programiranja. Nekdo lahko reši problem z večjim ali
manjšim številom vrstic kode, zato smo želeli izdelati ogrodje, s katerim bi lahko
programerji v obliki programske kode izmerili, kako učinkovita je njihova rešitev, in
rezultate meritev njihovih rešitev predstavili ostalim uporabnikom.
Pri iskanju literature smo imeli več dela, a smo na koncu našli ustrezno literaturo in izluščili
področja, ki so se navezovala na našo tematiko. Nekaj težav se je pojavilo pri prevajanju
programskih jezikov C++ in Java znotraj programskega jezika C# in s pomočjo razvojnega
okolja Visual Studio 2015, saj nismo mogli dobiti pravic za dostop do datotek operacijskega
sistema Windows, v katerih so se nahajali prevajalniki. Težavo smo odpravili z zapisovanjem
ukazov za dostop do datotek s pomočjo vnaprej zapisanih skript (batch skripte).
S pridobljenim znanjem iz teoretičnega dela smo nato načrtovali in izdelali spletno
aplikacijo za merjenje učinkovitosti programov. Spletna aplikacija omogoča prenos v
izvornih datotekah za programske jezike C#, C++ in Java na strežnik. Aplikacija nato prevede
in izvede posamezen program in opravi meritve (čas izvajanja, število vrstic kode in
zasedenost delovnega pomnilnika) ter rezultate meritev predstavi. Za vsako opravljeno
meritev programa je možno tudi dostopati do izvorne kode, ki jo je uporabnik podal kot
rešitev.
Za v prihodnje razmišljamo o podprtosti meritev za večje število programskih jezikov in za
grafični prikaz statistike meritev.
40
9 VIRI IN LITERATURA
[1] Aho, A. V., Lam, M. S., Sethi, R., Ullman, J. D. Chapter 1, Compilers: Principles,
Techniques and Tools (Second Edition). Boston: Addison Wesley, 2007, str 1-4.
Dostopno na:
https://github.com/chenruiao/ares/blob/master/books/Compilers%20Principles%20T
echniques%20and%20Tools%20(2nd%20Edition)%20.pdf [8.9.2016].
[2] Alterzuim. Sintaksa in semantika. Dostopno na:
http://www.alterzuim.si/11prog/40prog.html [12.8.2016]
[3] Code First Approach. Dostopno na: http://www.c-sharpcorner.com/blogs/entity-
framework-code-first-vs-database-first-approach [28.6.2017]
[4] Časlav Pavlović, Istorijski razvoj programskih jezika. Dostopno na:
https://raf.edu.rs/citaliste/programiranje/3673-istorijski-razvoj-programskih-jezika
[15.8.2016].
[5] Entity Framework Tutorial. Dostopno na:
http://www.entityframeworktutorial.net/code-first-with-entity-framework.aspx
[5.1.2017]
[6] Investopedia. Efficiency. Dostopno na:
http://www.investopedia.com/terms/e/efficiency.asp#ixzz4I3cW51a5 [23.8.2016]
[7] ISO/IEC 9126-1. Software engineering: Product quality – Part 1: Quality model, 2000.
Dostopno na https://www.cse.unsw.edu.au/~cs3710/PMmaterials/Resources/9126-
1%20Standard.pdf [15.6.2017]
[8] ISO/IEC 9126-2. Software engineering: Product quality – Part 2: External metrics,
2002. Dostopno na: https://www.cse.unsw.edu.au/~cs3710/PMmaterials/Resources/9126-
2%20Standard.doc [15.6.2017]
[9] ISO/IEC 9126-3. Software engineering: Product quality – Part 3: Internal metrics, 2002.
Dostopno na: https://www.cse.unsw.edu.au/~cs3710/PMmaterials/Resources/9126-
3%20Standard.doc [15.6.2017]
[10] ISO/IEC/IEEE 24765. Systems and software engineering – Vocabulary, 2010. Dostopno
na: http://liris.cnrs.fr/pierre-
edouard.portier/teaching_2014_2015/sq/his/IEEE24765.pdf [28.8.2017]
[11] ISO 25000. Standard ISO 25000. Dostopno na:
http://iso25000.com/index.php/en/iso-25000-standards [23.8.2016].
[12] ISO/IEC 25010. Standard ISO/IEC 25010. Dostopno na:
http://iso25000.com/index.php/en/iso-25000-standards/iso-25010 [23.8.2016]
41
[13] Kokonenko, I., Šikonja Robnik, M., Bosnić, Z. Programiranje in algoritmi. Ljubljana: FE
in FRI, 2008.
[14] Lines of Code. Dostopno na: http://csse.usc.edu/TECHRPTS/2007/usc-csse-2007-
737/usc-csse-2007-737.pdf [27.6.2017]
[15] Msdn Microsoft. ASP.NET MVC Overview. Dostopno na:
https://msdn.microsoft.com/en-us/library/dd381412(v=vs.108).aspx [3.1.2017]
[16] Oracle. About the Java Technology. Dostopno na:
http://docs.oracle.com/javase/tutorial/getStarted/intro/definition.html#FOOT
[8.9.2016].
[17] Response Time. Dostopno na: https://www.dynatrace.com/blog/week-9-how-to-
measure-application-performance/ [28.6.2017]
[18] Slotech. Programski jezik C++. Dostopno na: from https://slo-
tech.com/clanki/04009/ [8.9.2016].
[19] Software Quality Metrics Overview. Dostopno na:
http://www.informit.com/articles/article.aspx?p=30306 [13.6.2017]
[20] Spinellis, D. Code Quality: The Open Source Perspective. Boston: Addison Wesley,
2006, str. 2-7. Dostopno na: from http://www.e-
reading.club/bookreader.php/141539/Spinellis_-_Code_quality_-
_the_OpenSource_perspective.pdf [25.8.2016]
[21] Spinellis, D. Code Quality: The Open Source Perspective. Boston: Addison Wesley,
2006, str. 205-282. Dostopno na: from http://www.e-
reading.club/bookreader.php/141539/Spinellis_-_Code_quality_-
_the_OpenSource_perspective.pdf [25.8.2016].
[22] Spinellis, D. Code Quality: The Open Source Perspective. Boston: Addison Wesley,
2006, str. 151-204. Dostopno na: from http://www.e-
reading.club/bookreader.php/141539/Spinellis_-_Code_quality_-
_the_OpenSource_perspective.pdf [25.8.2016].
[23] Techopedia. Code Efficiency. Dostopno na:
https://www.techopedia.com/definition/27151/code-efficiency [22.8.2016]
[24] The MVC pattern in theory and practice. Dostopno na:
http://warp.povusers.org/programming/mvc.html [3.1.2017]
[25] Tomašević, V. Održavanje sistema. V: Razvoj aplikativnog softvera. Beograd:
Univerzitet Singidunum, 2012, str. 180. Dostopno na:
www.singipedia.com/attachment.php?attachmentid=2854&d=1340107760
[12.10.2016].
42
[26] Tomašević, V. Razvoj aplikativnog softvera. Beograd: Univerzitet Singidunum, 2012,
str. 15-19. Dostopno na:
www.singipedia.com/attachment.php?attachmentid=2854&d=1340107760
[12.10.2016].
[27] Wiki Fakultete za matematiko in fiziko UL. Von Neummanov model. Dostopno na:
http://wiki.fmf.uni-lj.si/wiki/Von_Neumannov_model [15.8.2016].
[28] Wiki Fakultete za matematiko in fiziko UL. Strojni jezik Dostopno na:
http://wiki.fmf.uni-lj.si/wiki/Strojni_jezik [12.8.2016].
[29] Wiki Fakultete za računalništvo in informatiko Ljubljana. Dostopno na:
http://colos1.fri.uni-
lj.si/ERI/RACUNALNISTVO/ZGRADBA_RACUNALNIKA/von_neuman.html [28.2.2017]
[30] Wikipedija prosta enciklopedija. C++. Dostopno na:
https://sl.wikipedia.org/wiki/C%2B%2B [8.9.2016].
[31] Wikipedija prosta enciklopedija. Programski jezik C sharp. Dostopno na:
https://sl.wikipedia.org/wiki/Programski_jezik_C_sharp#CITEREFRasheed2006
[11.9.2016]
top related