ALTE DOCUMENTE
|
||||
8. kafli - Forritun og forritunarmįl
Mįlskipan og merkingarfręši
Forritunarmįl og mannamįl
Forritunarmįl eru notuš eru til aš orša algrķm. Žau eru aš žvķ leyti eins og tungumįl aš hęgt er aš nota endanlegan oršaforša til aš mynda óendanlega margar mismunandi setningar og setningarunur. En mįlskipan žeirra og merkingarfręši eru miklu einfaldari en ķ tungumįlum eins og ķslensku eša ensku.
Mįlskipan (į ensku syntax) forritunarmįls er reglur um hvernig raša mį oršum og öšrum tįknum saman ķ skipanir og heil 21121y2417v forrit. Žessar reglur skera śr um hvort runa af oršum og tįknum er rétt mynduš skipun (eša rétt myndaš forrit eša forritshluti) eša ekki.
Merkingarfręši (į ensku semantics) forritunarmįls er reglur um hvaša merkingu rétt myndašar skipanir hafa.
Til aš forritunarmįl sé nothęft žarf ķ fyrsta lagi aš vera til nothęft algrķm sem sker śr um hvort runa af tįknum er rétt mynduš eša ekki og ķ öšru lagi žarf aš vera til nothęft algrķm sem žżšir texta af forritunarmįlinu į vélamįl einhverrar tölvu. Fyrrnefnda algrķmiš byggir į reglum um mįlskipan forritunarmįlsins og žaš seinna byggir į reglum um merkingarfręši žess. Til aš žessi algrķm séu nothęf žarf flękjutķmi žeirra aš vera innan hóflegra marka.
Žaš er įlitamįl hvort til eru algrķm sem skera śr um hvort setningar į tungumįli (eins og t.d. ķslensku eša ensku) eru rétt myndašar. Ef slķk algrķm eru til hljóta žau aš vera afar flókin. Hins vegar er ljóst aš ekki eru til reglur um merkingarfręši tungumįla sem duga til aš įkvarša merkingu setninga. Žetta er vegna žess aš žaš hvernig viš skiljum setningar į tungumįlum ręšst aš nokkru leyti af ašstęšum og vitneskju sem eru utan viš sviš merkingarfręšinnar.
Sem dęmi um hvernig merking ręšst af ašstęšum getum viš tekiš setninguna "Žaš er hundur ķ honum". Ef męlandi horfir į mann žį getur hśn merkt aš hann sé ķ vondu skapi. En sé bent į kofa žį getur hśn merkt aš žar inni sé dżr af įkvešinni tegund.
Ef viš hugsum um setningar eins og "Sigga gat ekki fariš ķ bśšina žvķ hśn var lasin" og "Sigga gat ekki fariš ķ bśšina žvķ hśn var lokuš" žį įttum viš okkur strax į aš fornafniš "hśn" vķsar į Siggu ķ fyrri setningunni en į bśšina ķ žeirri seinni. Viš gerum okkur grein fyrir žessu vegna žess aš viš vitum aš konum er hęttara viš lasleika en bśšum.
Til aš skilja žessar (og ašrar) setningar į venjulegum tungumįlum dugar ekki aš fletta upp ķ mįlfręšireglum og oršabókum. Til aš skilja mannamįl žarf aš styšjast viš heil ókjör af vitneskju til višbótar viš reglur um mįlskipan og merkingarfręši. Žegar forritunarmįl eiga ķ hlut duga mįlfręšireglur hins vegar fullkomlega til aš skera śr um hvort runa af tįknum er rétt mynduš setning (eša forrit eša forritshluti) og žegar žaš hefur veriš gert er hęgt aš komast aš merkingu hennar įn žess aš styšjast viš neitt annaš en oršabękur og formlegar reglur sem yfirleitt eru ekki fyrirferšarmeiri en svo aš hęgt er aš koma žeim fyrir ķ einni lķtilli bók.
Backus Naur rithįttur
Żmsar leišir eru til aš lżsa mįlskipan forritunarmįla. Ein sś algengasta er Backus-Naur rithįttur. Tįknin sem eru notuš til aš gera grein fyrir mįlskipan meš žessum hętti eru , | og oddbogar. (Stundum er ::= eša => notaš ķ stašinn fyrir
Viš skulum taka sem dęmi skilgreiningu į gildisgjöf ķ mįli eins og Java eša C. Hśn gęti veriš svona:
gildisgjöf nafn segš
Žetta žżšir aš gildisgjöf sé skilgreind žannig aš fyrst komi nafn, svo komi merkiš = og svo komi segš. Merkiš = er ekki innan oddboga žvķ žaš er lokatįkn, ž.e.a.s. tįkn sem ekki žarf aš skilgreina nįnar. Oršiš nafn er hins vegar innan oddboga žvķ žaš žarf aš skilgreina nįnar hvaš nafn er.
Ef viš gerum rįš fyrir aš nafn sé myndaš śr einum eša fleiri litlum bókstöfum śr enska stafrófinu og engu öšru žį getum viš skilgreint nafn svona:
nafn bókstafur bókstafur nafn
Tįkniš | žżšir eša svo žessi skilgreining segir aš nafn sé annaš hvort einn bókstafur eša einn bókstafur og nafn. Til aš žessi skilgreining sé notahęf žarf aš skilgreina bókstaf. Ef viš höldum okkur viš litlu stafina ķ enska stafrófinu getum viš gert žaš svona:
bókstafur a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
Samkvęmt žessu er x nafn žvķ žaš er einn bókstafur. ex er lķka nafn žvķ žaš er bókstafur (nefnilega e) meš nafni fyrir aftan (nefnilega x). Meš sömu rökum er kex nafn žvķ žaš er bókstafur (nefnilega k) meš nafni (nefnilega ex) fyrir aftan.
Hér er bókstafur skilgreindur meš tómum lokatįknum. Skilgreiningar meš Backus-Naur rithętti geta innihaldiš atriši sem žarf aš skilgreina nįnar. Skilgreiningar į žessum atrišum geta svo innihaldiš enn önnur atriši sem žarfnast skilgreiningar en žetta getur ekki haldiš endalaust įfram. Viš endum alltaf į lokatįknum sem eru hluti af oršaforša eša stafrófi mįlsins sem fjallaš er um.
Skilgreiningar į mįlskipan heils forritunarmįls eins og Java eša C fylla nokkrar blašsķšur. Hér mun žvķ lįtiš duga aš skilgreina ofurlķtinn part af mįli sem svipar til Java og C. Žessi partur inniheldur:
nöfn śr litlum stöfum śr enska stafrófinu;
gildisgjöf (meš merkinu =);
jįkvęšar heilar tölur;
segšir sem eru myndašar śr heilum tölum, nöfnum, reikniašgeršunum +, - og * og svigum;
Meš žessu getum viš myndaš skipanir eins og
breidd = 7
lengd = 5*(y-3)
magn = 3 + 5 * (y - 1)
Viš vorum bśin aš skilgreina gildisgjöf, nafn og bókstaf svona.
gildisgjöf nafn segš
nafn bókstafur bókstafur nafn
bókstafur a | b | c | d | e | f | g | h | i | j | k | l | m | n | o | p | q | r | s | t | u | v | w | x | y | z
Žį į eftir aš skilgreina segš og tölu. Žaš er gert hér fyrir nešan.
segš lišur lišur segš lišur segš
lišur žįttur žįttur lišur
žįttur nafn tala segš
tala tölustafur tölustafur tala
tölustafur
Athugum nś hvernig hęgt er aš leiša śt setninguna
magn = 3 + 5 * (y - 1)
Setningin er gildisgjöf į forminu
nafn segš
magn er nafn samkvęmt reglum nśmer 2 og 3. Žetta er hęgt aš leiša śt skref fyrir skref svona.
nafn
bókstafur nafn Skv. 2. reglu mį setja bókstafur nafn ķ staš nafn
m nafn Skv. 3. reglu mį setja m ķ staš bókstafur
m bókstafur nafn Skv. 2. reglu mį setja bókstafur nafn ķ staš nafn
ma nafn Skv. 3. reglu mį setja a ķ staš bókstafur
ma bókstafur nafn Skv. 2. reglu mį setja bókstafur nafn ķ staš nafn
mag nafn Skv. 3. reglu mį setja g ķ staš bókstafur
mag bókstafur Skv. 2. reglu mį setja bókstafur ķ staš nafn
magn Skv. 3. reglu mį setja n ķ staš bókstafur
3 + 5 * (y - 1) er segš samkvęmt reglunum. Žetta er hęgt aš leiša śt skref fyrir skref svona:
segš
lišur segš 4. regla: segš lišur segš
žįttur segš 5. regla: lišur žįttur
tala segš 6. regla: žįttur tala
tölustafur segš 7. regla: tala tölustafur
segš 8. regla: tölustafur
lišur 4. regla: segš lišur
žįttur lišur 5. regla: lišur žįttur lišur
tala lišur 6. regla: žįttur tala
tölustafur lišur 7. regla: tala tölustafur
lišur 8. regla: tölustafur
žįttur 5. regla: lišur žįttur
segš 6. regla: žįttur segš
lišur segš 4. regla: segš lišur segš
žįttur segš 5. regla: lišur žįttur
nafn segš 6. regla: žįttur nafn
bókstafur segš 2. regla: nafn bókstafur
( y - segš 3. regla: bókstafur y.
( y - lišur 4. regla: segš lišur
( y - žįttur 5. regla: lišur žįttur
( y - tala 6. regla: žįttur tala
( y - tölustafur 7. regla: tala tölustafur
( y - 1 ) 8. regla: tölustafur
Reglur 1 til 8 lżsa ašeins ofurlitlum hluta af forritunarmįli. En žaš er hęgt aš bęta viš reglum eins og t.d. žessum:
skilyršissetning if ( röksegš skipanablokk
röksegš segš samanburšarvirki segš
samanburšarvirki < | >
skipanablokk
skipanaruna skipun skipun skipanaruna
skipun gildisgjöf skilyršissetning
Samkvęmt reglum 1 til 14 er hęgt aš mynda setningar eins og:
if (x > 3) |
eša |
if (x + 5 > y) |
Verkefni 8.1.a
Leiddu eftirtaldar setningar af myndunarreglum 1 til 14.
x = 5 - 3 ax = x - 2 * y if (x > 3)
Verkefni 8.1.b
Myndunarreglur 8 til 9 duga til aš mynda jįkvęšar heilar tölur. Settu fram myndunarreglur sem duga til aš mynda bęši jįkvęšar og neikvęšar kommutölur.
Verkefni 8.1.c
Myndunarreglur 2 og 3 duga til aš mynda nöfn śr litlum bókstöfum śr enska stafrófinu. Settu fram myndunarreglur fyrir nöfn sem eru mynduš śr bókstöfum og tölustöfum žannig aš fyrsti stafurinn sé žó alltaf bókstafur.
Višbętur viš Backus-Naur rithįtt og flęširit
Žau dęmi sem hér hafa veriš skošuš sżna aš Backus-Naur rithįttur er nokkuš langoršur. Žaš žarf margar reglur til aš gera grein fyrir einföldustu atrišum ķ mįlskipan forritunarmįla og langar śtleišslur til aš leiša setningar af reglunum. Til aš bęta śr žessu hafa veriš settar fram višbętur viš Backus-Naur rithįttinn (į ensku extended Backus-Naur form skst. EBNF). Žessar višbętur eru einkum fólgnar ķ žvķ aš nota hornklofa til aš tįkna aš atriši komi fyrir 0 eša 1 sinni og slaufusviga til aš tįkna aš žaš komi 0 sinnum eša oftar. Meš žessum višbótum er hęgt aš skrifa myndunarreglur fyrir nafn sem byrjar į bókstaf og inniheldur bókstafi og tölustafi svona:
nafn bókstafur
Žetta žżšir aš fyrst komi bókstafur svo komi 0 sinnum eša oftar bókstafur eša tölustafur. Meš hornklofum og slaufusvigum er lķka fremur aušvelt aš skrifa myndunarreglur fyrir tölur sem duga til aš mynda alls konar tölur, jįkvęšar og neikvęšar, heiltölur og brot.
tala formerki tölustafur tölustafur
formerki
tölustafur
Myndunarreglan fyrir tölu segir aš fyrst komi formerki ž.e. ekkert eša eitt formerki. Žaš mį semsagt sleppa formerkinu og žaš mį setja eitt formerki. Nęst kemur tölustafur og žar fyrir aftan ž.e. 0 eša fleiri tölustafir. Aftan viš žetta kemur tölustafur sem merkir aš setja megi einu sinni (eša aldrei) kommu meš tölustöfum fyrir aftan.
Til eru fleiri ašferšir til aš gera grein fyrir mįlskipan forritunarmįla. Ein žeirra algengustu er aš teikna flęširit eins og hér fyrir nešan. Lokatįkn eru höfš innan ķ hring og tįkn sem žarf aš skilgreina nįnar eru skrifuš innan ķ ferhyrning. Til aš mynda setningu žarf aš fylgja stefnu örvanna. Fyrsta myndin sżnir t.d. aš hęgt er aš mynda segš śr einum liš eša meš žvķ aš skrifa einn liš og svo annaš hvort plśs eša mķnus og fara svo aftur gegnum alla myndina.
Flęširit sem samsvarar myndunarreglunni segš lišur lišur segš lišur segš |
Flęširit sem samsvarar myndunarreglunni lišur žįttur žįttur lišur |
Flęširit sem samsvarar myndunarreglunni žįttur nafn tala segš |
Til eru žokkalega fljótvirk algrķm sem taka viš myndunarreglum į Backus-Naur formi og texta og skera śr um hvort textinn er ķ samręmi viš myndunarreglurnar. Meš Backus-Naur rithętti eša flęširitum er hęgt aš setja fram reglur sem skera śr um hvort setning er ķ samręmi viš mįlfręšireglur en žessar reglur segja ekkert um merkingu žeirra.
Verkefni 8.1.d
Teiknašu flęširit sem samsvara myndunarreglunum
skilyršissetning if ( röksegš skipanablokk
skipanablokk
skipanaruna skipun skipun skipanaruna
skipun gildisgjöf skilyršissetning
Forritunarmįl
Vélamįl og ęšri forritunarmįl
Hver tegund gjörva getur hlżtt skipunum į einu vélamįli. Vélamįl eru yfirleitt mjög einföld aš žvķ leyti aš žau hafa einfalda mįlskipun, lķtinn oršaforša og merking hverrar setningar er óbrotin og aušskilgreinanleg. Žessi einfaldleiki veldur žvķ aš hęgt er aš smķša ódżrar vélar (gjörva) sem "skilja" vélamįlin en hann veldur žvķ lķka aš vélamįl eru afar erfiš fyrir fólk žvķ:
Žaš er erfitt aš lęra žau žar sem skipanir samsvara ekki hugtökum sem fólki er tamt aš nota;
Hver skipun segir mjög lķtiš svo žaš žarf langar romsur til aš lżsa einföldustu verkum;
Žaš er erfitt aš lesa forrit į vélamįli til aš breyta žeim eša finna og leišrétta villur.
Flest forrit eru samin į svoköllušum ęšri forritunarmįlum. Žetta eru mįl sem hęgt er aš žżša į vélamįl hvaša gjörva sem er žvķ, eins og nefnt hefur veriš, eru til algrķm til aš įkvarša hvort runur af tįknum eru rétt mynduš forrit į tilteknu forritunarmįli og hvaša merkingu žau žį hafa.
Helstu kostir sem ęšri forritunarmįl hafa umfram vélamįl eru:
Žaš er aušvelt aš lęra žau žar sem skipanir samsvara nokkurn veginn hugtökum sem fólki er tamt aš nota;
Forrit eru žokkalega lęsileg svo aušvelt er aš breyta žeim og finna villur og leišrétta žęr;
Aušvelt er aš fęra forrit milli ólķkra véla žvķ fyrir flest tölvukerfi eru til žżšendur sem žżša af mörgum algengum forritunarmįlum.
Smalamįl eru eins konar millistig milli vélamįla og ęšri forritunarmįla. Hver skipun į smalamįli samsvarar einni skipun į vélamįli. Munurinn er einkum ķ žvķ fólginn aš žar sem skipanir į vélamįlum eru ritašar sem tölur ķ tvķundakerfi eru skipanir į smalamįlum ritašar meš skammstöfunum. Einnig leyfa smalamįl yfirleitt aš breytum séu gefin lżsandi nöfn.
Hér er forritsbśtur į Pascal sem męlir fyrir um aš skrifa skuli enska stafrófiš frį A til Z.
FOR s := 'A' TO 'Z' DO
BEGIN
Write(s);
END;
Hér kemur žżšing į smalamįl fyrir Intel 8086 örgjörva:
MOV DL, 'A'
MOV CX, 26
slaufa: CALL skrifa
LOOP slaufa
INT 32
skrifa: MOV AH, 2
INT 33
INC DL
RET
Og er žżšing į vélamįl Intel 8086 örgjörvans:
01000001
10111001 00011010 00000000
11101000 00000100 00000000
11100010 11111011
11001101 00100000
10110100 00000010
11001101 00100001
11111110 11000010
11000011
Žegar rętt er um vélamįl er yfirleitt įtt viš mįl sem žarf aš žżša forrit af ęšri mįlum į til aš tölva geti keyrt žau. Stundum er nokkur munur į žessum mįlum og žeim sem vélbśnašur tölva getur framkvęmt millilišalaust. Žęr skipanir į vélamįli sem ekki er hęgt aš keyra beint į vélbśnašinum eru oftast tślkašar af hugbśnaši sem er falinn ķ lesminni.
Forritsbśturinn sem skrifašur er į Pascal, smalamįli og vélamįli hér aš ofan skrifar enska stafrófiš (frį A til Z) į skjį tölvunnar. Skipanirnar sem birta stafina į skjįnum sjįst hvorki ķ smalamįls- né vélamįlskótanum. Ķ staš žeirra eru į smalamįlinu
MOV AH, 2
INT 33
og į vélamįlinu
10110100 00000010
11001101 00100001
Žessar skipanir hlaša tölunni 2 inn ķ eitt af gistum gjörvans og kalla sķšan į rof nśmer 33 meš žeim afleišingum aš framkvęmd er skipanaromsa ķ lesminninu sem birtir staf į skjįnum. Žessi skipanaromsa er ansi löng og ef henni vęri skotiš inn ķ vélamįlskótann žį kęmist hann ekki į eina blašsķšu.
Til aš keyra forrit į žvķ vélamįl sem forrit eru žżdd į af ęšri mįlum getur tölva žurft aš nota heilmikiš af hugbśnaši, en sį hugbśnašur er yfirleitt innbyggšur ķ lesminni hennar og forritarar žurfa ekki aš hafa neinar įhyggjur af žvķ hvar mörkin liggja milli vélbśnašar og hugbśnašar ķ lesminni.
Stundum er forritunarmįlum skipaš ķ stigveldi eftir žvķ hvaš žau eru "nįlęgt" vélbśnašinum. Vélamįl er nešarlega ķ žessu stigveldi. Ofan viš vélamįlin koma svo smalamįl og žar fyrir ofan ęšri mįl. Ęšri forritunarmįl eru ekki öll į sama staš ķ žessu stigveldi. Sum mįl eins og t.d. C eru nešarlega vegna žess aš žau gefa forriturum kost į aš vķsa į tiltekna staši ķ minni eša tiltekin gisti ķ gjörva. Önnur mįl eins og Pascal eša Java eru ofar vegna žess aš žau gefa forriturum ekki kost į žessu. Forrit sem standa nešarlega ķ stigveldinu eru stundum kölluš lįgtęknimįl (į ensku low-level languages).
Almennt mį segja aš lįgtęknimįl hafi žį kosti aš veita forritara fullt vald yfir vélinni meš žvķ aš stjórna innihaldi einstakra vistfanga ķ minni og gista ķ gjörva. Žeir sem skrifa stżrikerfi og rekla fyrir jašartęki žurfa oft į žessum möguleikum lįgtęknimįlanna aš halda. Stundum er lķka hęgt aš nżta žį til aš skrifa forrit sem taka minna plįss og keyra hrašar en forrit sem skrifuš eru į ęšri mįlum. En žaš er lķka hęgt aš misnota žį til aš gera verri vitleysur en hęgt er meš góšu móti aš koma oršum aš į ęšri mįlum. Yfirleitt žarf töluverša žekkingu į vélbśnaši til aš geta nżtt kosti lįgtęknimįla.
Žżšendur og tślkar
Forrit sem žżša af einu forritunarmįli į annaš eru af tvennu tagi: žżšendur og tślkar. Ķ flestum tilvikum žżša žessi forrit af ęšri forritunarmįlum į vélamįl. Žaš eru žó til žżšendur og tślkar sem žżša af einu vélamįli į annaš eša milli annarra mįla en vélamįla.
Žżšandi (į ensku compiler) les heilt forrit, žżšir žaš allt frį upphafi til enda og skrifar žżšinguna ķ skrį. Ef žżšingin er į vélamįl er skrįin sem žżšandinn skrifar śt yfirleitt keyrsluhęft forrit. Eftir aš žżšandi hefur lokiš verki sķnu er forritiš til į tveim mįlum: mįlinu sem žaš var skrifaš į og mįlinu sem žaš var žżtt į, sem er oftast vélamįl.
Verkinu sem žżšandi vinnur er hęgt aš lżsa į žessa leiš:
byrja į upphafi forrits;
endurtaka mešan (ekki er komiš aš enda forrits)
skrifa allt śttakiš ķ skrį;
Tślkur (į ensku interpreter) les forrit skipun fyrir skipun og ķ hvert sinn sem heil skipun hefur veriš lesin er hśn žżdd og tölvan lįtin framkvęma hana. Žegar tślkur hefur lokiš störfum er bśiš aš framkvęma forrit einu sinni en žżšingin er hvergi til. Verkinu sem tślkur vinnur er hęgt aš lżsa į žessa leiš:
byrja į upphafi forrits;
endurtaka mešan (ekki er komiš aš enda forrits)
Hvort sem žżšandi eša tślkur į ķ hlut mį skipta žżšingunni ķ žrjį verkžętti sem eru:
Lesgreining, ž.e. aš skipta runu af stöfum nišur ķ einstök orš og merkingarbęr tįkn.
Setningafręšileg greining sem er ķ žvķ fólgin aš mįta žį runu af oršum og tįknum sem fęst śt śr lesgreiningunni viš myndunarreglur sem lżsa mįlskipun forritunarmįlsins.
Kótasmķš sem er hin eiginlega žżšing. Bśin er til runa af tįknum į öšru mįli (oftast vélamįli) sem hefur sömu merkingu og forritiš.
Hugsum okkur aš žżšandi taki viš eftirfarandi skipun į forritunarmįlinu C.
if (xhnit == 7)
Lesgreining skiptir žessu ķ orš og tįkn svona:
if |
xhnit |
Setningafręšileg greining leišir svo ķ ljós aš žetta er skilyršissetning į forminu
if ( röksegš
Kótasmķšin bżr svo til vélamįlskóta sem samsvarar žessari skipun.
Eftir aš kótasmķši er lokiš yfirfara flestir žżšendur vélamįlsromsuna og stytta hana og lagfęra eins og kostur er til aš forritiš verši sem hrašvirkast og fyrirferšarminnst.
Nokkur algeng forritunarmįl
Ęšri forritunarmįlum er stundum skipt ķ nokkrar mįlaęttir. Flest algengustu mįlin, eins og BASIC, Pascal, Delphi, C, C++ og Java tilheyra flokki gildingarmįla (į ensku imperative languages). Samkenni žessara mįla er aš gildisgjöf (skipanir til aš gefa breytum gildi) gegnir lykilhlutverki. Feykilega mörg forritunarmįl tilheyra žessum flokki. Hér verša ašeins talin nokkur žau žekktustu:
Fortran er elst allra ęšri forritunarmįla. Fyrsti Fortran žżšandinn var bśinn til įriš 1955. Nafniš er stytting į Formula translator. Fortran er enn töluvert notaš af verkfręšingum og öšrum sem forrita tölvur til aš vinna śtreikninga einkum į sviši tękni- og raunvķsinda.
COBOL er eitt af elstu mįlunum. Žaš var bśiš til ķ kringum 1960. Nafniš er stytting į Common Buisness Oriented Language. COBOL var einkum notaš til aš skrifa forrit fyrir višskiptalķfiš.
PL/1 er litlu yngra en COBOL og žvķ var einnig ętlaš aš žjóna žörfum višskiptalķfsins.
BASIC var upphaflega bśiš til um 1965 en žęr śtgįfur sem nś eru ķ notkun eru ansi frįbrugšnar fyrstu gerš mįlsins. Nafniš stendur fyrir Beginner's Advanced Symbolic Instruction Code.
Basic er fremur einfalt mįl og aušlęrt. Upphaflega tóku tślkar fyrir žaš lķtiš rśm ķ minni og geršu litlar kröfur til vélbśnašar. Žegar einmenningstölvur komu fyrst fram į 8. įratugnum fylgdi žeim yfirleitt BASIC tślkur og sķšan mį segja aš mįliš hafi žróast meš einmenningstölvunum og žaš er enn žann dag ķ dag mikiš notaš til aš semja smįforrit og fjölva fyrir einmenningstölvur.
Sś śtgįfa af BASIC sem nś nżtur mestra vinsęlda er Visual BASIC frį Miccrosoft. Žvķ fylgir hugbśnašur til sjįlfvirkrar kótunar į notendaskilum fyrir Windows forrit. Meš žessum bśnaši er hęgt aš raša upp valmyndum, hnöppum, tękjastikum og fleiri sżnilegum hlutum og forritskótinn sem segir fyrir um gerš žeirra og stašsetningu veršur til sjįlfkrafa. Forritin ķ Microsoft Office pakkanum (Word, Excel, PowerPoint, Access) hafa innbyggšan tślk fyrir afbrigši af Visual BASIC sem heitir Visual BASIC for Applications. Į žvķ mįli er hęgt aš skrifa fjölva til aš keyra ķ žessum forritum.
Öfugt viš flest gildingarmįl (sem eru yfirleitt žżdd) er BASIC oftast tślkaš. Fyrir sumar śtgįfur eru žó bęši til žżšendur og tślkar.
Pascal var bśiš til um 1970. Žaš var upphaflega hugsaš sem kennslumįl en nįši fljótt miklum vinsęldum og hefur um 30 įra skeiš veriš notaš viš hugbśnašargerš į mörgum svišum.
Pascal er aš verulegu leyti snišiš eftir eldra mįli sem heitir Algol og er yfirleitt tališ fyrsta mótaša forritunarmįliš. Mįlfręši Pascal er žó mun einfaldari en Algol og raunar eru fį forritunarmįl meš jafn einfalda mįlskipan og merkingarfręši eins og Pascal. Fyrir vikiš er žaš fremur aušlęrt og aušvelt er aš bśa til trausta žżšendur fyrir žaš.
Żmis nżrri forritunarmįl hafa veriš bśin til undir įhrifum frį Pascal. Hér mį t.d. nefna Ada (sem er mikiš notaš af bandarķska hernum) Modula 2, Concurrent Pascal og Delphi. Ķ sumum tilvikum er įlitamįl hvort žetta eru nż mįl eša afbrigši af Pascal žau eru a.m.k. ekkert ólķkari innbyršis en žau afbrigši sem til eru af BASIC.
Mešal žeirra sem semja forrit fyrir Microsoft Windows stżrikerfiš er Delphi vinsęlast žessara Pascal afbrigša. Delphi bżšur bęši upp į alla kosti hlutbundinnar forritunar og sjįlfvirka kótun į notendaskilum.
C var bśiš til įriš 1972. Žaš er mótaš mįl eins og Pascal og byggir lķka aš nokkru leyti į Algol. Frį upphafi hefur C haft nįin tengsl viš UNIX stżrikerfiš žótt žżšendur séu til fyrir flest stżrikerfi.
C hefur sérstöšu mešal ęšri forritunarmįla vegna žess hvaš žaš veitir forriturum mikiš vald yfir innvišum vélarinnar. Žżšendur fyrir C skila yfirleitt mjög samžjöppušum og hrašvirkum kóta. C hefur žvķ flesta kosti lįgtęknimįla (smalamįla og vélamįla) en er laust viš verstu galla žeirra. Fyrir vikiš nżtur C vinsęlda mešal žeirra sem semja kerfishugbśnaš (stżrikerfi, rekla o. ž. u. l.).
C++ var bśiš til snemma į 9. įratugnum. Žaš inniheldur višbętur viš C sem gera mögulegt aš skrifa hlutbundin forrit. Žessar višbętur gagnast einkum viš gerš stórra hugbśnašarverkefna en aušvelda lķka mjög forritun fyrir gluggakerfi.
Sķšan C++ kom fram hefur žaš įtt vaxandi vinsęldum aš fagna og er nś mest notaš allra forritunarmįla viš lausn stórra hugbśnašarverkefna. Žaš sameinar kosti lįgtęknimįla og hlutbundinnar forritunar og gefur forriturum žvķ bęši möguleika į aš nį fullkomnu valdi yfir vélbśnašinum og aš skipuleggja flókin forrit.
Java er ungt mįl (bśiš til į įrunum eftir 1990). Java markar nokkur tķmamót žvķ žaš var frį upphafi hugsaš fyrir hlutbundna forritun, samspil tölva į neti og keyrslu į vefsķšum.
Java svipar um margt til C++ en er žó mun einfaldara og žaš bżšur ekki upp į möguleika į lįgtękniforritun. Mešal mikilvęgustu einkenna žess er aš žaš er ķ senn žżtt og tślkaš. Java žżšandi žżšir ekki į vélamįl neins tiltekins gjörva heldur į millimįl sem kallast Bytecode. Bytecode er afar einfalt mįl og fyrir öll vélamįl er aušvelt aš bśa til hrašvirkan tślk sem tślkar af Bytecode. Žegar bśiš er aš žżša forrit af Java į Bytecode er hęgt aš keyra žaš į hvaša tölvu sem er aš žvķ tilskildu aš hśn hafi Bytecode tślk. Flest önnur žżdd mįl eru žżdd į vélamįl einhver tiltekins örgjörva og gerš til aš nżta sér žjónustu tiltekins stżrikerfis. Hafi forrit t.d. veriš skrifaš į C og žżtt į PC tölvu sem keyrir Microsoft Windows žį er ašeins hęgt aš keyra žżšinguna į PC tölvum sem nota Windows stżrikerfiš.
Bytecode tślkur er innbyggšur ķ flestar vefsjįr (eins og Netscape Navigator og Internet Explorer) svo žęr geta keyrt Java forrit sem vķsaš er ķ af vefsķšum. Slķk forrit kallast Applet. Einnig er hęgt aš lįta vefžjóna keyra Javaforrit og kallast žau žį Servlet. Java er žó ekki eingöngu til aš skrifa forrit fyrir vefinn. Žaš er fullkomiš alhliša forritunarmįl og hentar m.a. vel til aš skrifa forrit fyrir išntölvur og sjįlfvirknibśnaš af żmsu tagi.
Perl er mįl sem svipar um margt til C en er sérstakt aš žvķ leyti aš žaš hentar vel til aš vinna meš strengi (ž.e. runur af stöfum og tįknum). Į sķšustu įrum hefur Perl notiš vaxandi vinsęlda mešal žeirra sem skrifa CGI-bin forrit, ž.e. forrit sem keyrš eru af vefžjónum, yfirleitt til aš bregšast viš einhverjum skilabošum frį vefsjį. Dęmi um CGI-bin forrit eru til dęmis leitarvélar į vefnum.
Javascript. Meš žróun og śtbreišslu veraldarvefsins hefur skapast žörf fyrir forrit af żmsu tagi til aš keyra ķ vefsjįm og į vefžjónum. Žegar hefur veriš minnst į Java og Perl. Žetta eru fullkomin alhliša forritunarmįl sem eru ekkert endilega til aš skrifa forrit sem tengjast vefsjį eša vefžjóni. Javascript er hins vegar einfalt mįl (sem į fįtt sameiginlegt meš Java) sem er eingöngu til aš skrifa forrit til aš setja į vefsķšur. Forrit į žessu mįli eru skrifuš inn į vefsķšurnar og flestar vefsjįr innihalda tślk til aš tślka Javascript forrit.
Frį spaghettķkóta til mótašra mįla
Undir lok kafla 7.1. var fjallaš um algrķm til aš skrifa tölu ķ tvķundakerfi. Skošum hvernig žetta algrķm lķtur śt į gamaldags BASIC.
1 INPUT X%
2 S$ = ""
3 T% = X% MOD 2
4 IF T% = 1 THEN S$ = "1" + S$ ELSE S$ = "0" + S$
5 x% = INT(X% / 2)
6 IF X% > 0 THEN GOTO 3
7 PRINT S$
Nöfn breyta rįša tegundum žeirra (nafn sem endar į $ tįknar streng og % tölu). Skilyrši eru tįknuš meš IF - THEN eša IF - THEN - ELSE en žaš er engin skipun fyrir endurtekningu önnur en GOTO til aš hoppa fram og aftur um forritiš. Skipanirnar eru framkvęmdar ķ röš og žaš er eingin leiš aš pakka žeim saman ķ blokkir eša undirforrit.
Langt forrit į gamaldags BASIC getur innihaldiš margar GOTO skipanir sem lįta keyrsluna hoppa hingaš og žangaš žannig aš reyni mašur aš žręša sig gegnum forritiš verši śr flękja sem minnir helst į fullan disk af spaghettķ. Slķk forrit eru illęsileg og žaš er erfitt aš leišrétta villur ķ žeim og fyrir vikiš fékk BASIC hįlfgert óorš į sig. Nżlegar śtgįfur BASIC hafa žó helstu kosti mótašra mįla svo žaš er óžarfi aš lįta glósur um spaghettķforritun fęla sig frį aš nota BASIC.
Skošum nś hvernig žetta sama algrķm lķtur śt ef žaš er skrifaš į nżlegri gerš af BASIC.
INPUT N%
PRINT tuga2tvi$(N%)
FUNCTION tuga2tvi$(x%)
S$ = ""
WHILE x% > 0
T% = x% MOD 2
IF T% = 1 THEN S$ = "1" + S$ ELSE S$ = "0" + S$
x% = INT(x% / 2)
WEND
tuga2tvi$ = S$
END FUNCTION
Ašalforritiš er ašeins tvęr lķnur. Sś fyrri (INPUT x%) les gildi inni ķ talnabreytuna N% og sś seinni skrifar śtkomuna śr žvķ aš senda fallinu tuga2tvi$ gildi breytunnar N%. Falliš er sjįlfstętt undirforrit meš sķnar eigin breytur. Endurtekning er forrituš meš
WHILE skilyrši
skipanir
WEND
Skipanir milli WHILE og END mynda eins konar blokk sem er endurtekin. Į svipašan hįtt er hęgt aš pakka mörgum skipunum saman inn ķ skilyršissetningu svona:
IF skilyrši THEN
skipanir
END IF
Žessi śtgįfa af BASIC hefur tvö af megineinkennum mótašra mįla sem eru aš:
Hęgt er aš skilgreina sjįlfstęš undirforrit (eša föll) sem hafa stašvęrar breytur.
Hęgt er aš pakka mörgum skipunum saman ķ blokkir innan ķ endurtekningu eša skilyršissetningu.
BASIC er žó ekki bįlkaš eins og Pascal eša C žar sem allar skipanir tilheyra skipanablokk og žessar blokkir geta veriš hver innan ķ annarri. Ķ Pascal afmarkast žęr af oršunum BEGIN og END, ķ C afmarkast žęr af slaufusvigum. Hér į eftir er algrķmiš sem ritar tölu ķ tvķundakerfi skrifaš į Pascal.
PROGRAM ur_tuga_i_tviundakerfi;
VAR x : Integer;
FUNCTION tuga2tvi(x : Integer) : String;
VAR s, t : String;
BEGIN
s := '';
WHILE (x > 0) DO
BEGIN
Str((x MOD 2), t);
x := x DIV 2;
s := t + s;
END;
tuga2tvi := s;
END;
BEGIN
Readln(x);
Writeln(tuga2tvi(x));
END.
Falliš tuga2tvi tekur viš einni heiltölu og skilar streng. Skipanirnar ķ žvķ mynda eina blokk og afmarkast af oršunum BEGIN og END. Ašalforritiš er nešst. Žaš inniheldur tvęr skipanir sem einnig mynda blokk.
Pascal er tagaš eins og flest mótuš mįl. Žetta žżšir aš hver einasta breyta er skilgreind įšur en hśn er notuš og tekiš fram af hvaša tegund hśn er. T.d. eru stašvęru breyturnar s og t ķ fallinu tuga2tvi af tegundinni String.
Žrišja megineinkenni mótašra mįla er aš hęgt er aš skilgreina nżjar tegundir af gögnum og byggja flóknar gagnagrindur.
Ķ BASIC er hęgt aš nota fylki auk strengja, bókstafa og talna en žaš bżšur ekki upp į sömu möguleika į aš skilgreina nżjar tegundir eins og mótušu mįlin Pascal og C.
Lķtum t.d. į hvernig hęgt er aš skilgreina spilastokk ķ Pascal.
TYPE
litur = (hjarta, spadi, tigull, lauf);
gildi = 1..13;
spil = RECORD
l : litur;
g : gildi;
END;
spilastokkur = ARRAY[1..52] OF spil;
Oršiš TYPE tįknar aš į eftir komi skilgreiningar į tegundum. Fyrst er tegundin litur skilgreind žannig aš hśn geti tekiš gildin hjarta, spadi, tigull, eša lauf og tegundin gildi er skilgreind žannig aš hśn geti geymt tölu milli 1 og 13. Nęst er spil skilgreint sem fęrsla sem inniheldur eina breytu af tegundinni litur og eina af tegundinni gildi og aš sķšustu er spilastokkur skilgreindur sem fylki af 52 spilum.
Žegar bśiš er aš smķša tegundina spilastokkur er svo hęgt aš skilgreina breytu af žeirri tegund svona:
VAR X : spilastokkur;
Mótuš mįl og ofansękin hönnun
Mótuš forritunarmįl voru hönnuš meš žaš fyrir augum aš aušvelda forriturum aš skipta flóknum verkum nišur ķ einfaldari verkžętti og nota ofansęknar (į ensku top down) ašferšir viš lausn žeirra.
|
Viš skulum taka sem dęmi aš skrifa eigi forrit sem teiknar turn eins og er hér til hęgri. Forritunarmįliš sem viš notum er blendingur af ķslensku mótušu mįli og viš gerum rįš fyrir aš žaš hafi ekki ašrar teikniskipanir en en skipun til aš teikna strik. Lįtum
strik(x1, y1, x2, y2)
žżša aš teiknaš skuli strik frį punkti meš hnitin (x1, y1) til punkts meš hnitin (x2, y2). Žaš er erfitt aš teikna turninn meš žvķ aš nota eingöngu žessar skipanir svo viš ķmyndum okkur aš viš höfum skipun til aš teikna ferhyrning žannig aš
ferhyrningur(x1, y1, h, b)
teikni ferhyrning meš horn nešst til vinstri ķ punktinum (x1, y1), hęšina h og breiddina b. Meš žessa (ķmyndušu) skipun aš vopni getum viš bśiš til undirforrit sem teiknar turn śr 5 ferhyrningum sem hver um sig er af stęršinni 40 sinnum 25. Horniš nešst til vinstri er ķ punktinum (0, 0).
undirforrit turn
}
Til aš žetta virki žarf aš bśa til skipunina ferhyrningur žvķ hśn er ekki innbyggš ķ mįliš. Žaš er hęgt aš gera svona:
ferhyrningur(heiltölur x1, y1, h, b)
Žessi ašferš byggist į žvķ aš byrja į aš lżsa verki ķ stórum drįttum meš žvķ aš ķmynda sér aš mašur hafi allar žęr skipanir sem hugurinn girnist (ķ žessu tilviki skipunina ferhyrningur). Sumar žeirra eru ķ raun og veru innbyggšar ķ mįliš en sumar ekki. Ķ nęstu umferš eru bśin til undirforrit fyrir allar žęr skipanir sem eru ekki innbyggšar ķ mįliš. Viš hvert žeirra er notuš sama ašferš žar til kemur aš undirforritum sem eru nógu einföld til aš hęgt sé aš skrifa žau į oršaforša mįlsins.
Meš mótušum forritunarmįlum fylgir išulega safn undirforrita til aš vinna algeng verk og verkžętti.
Hlutbundin forritun
Hlutbundin forritunarmįl hafa alla kosti mótašra mįla en aš auki bjóša žau upp į möguleika į aš skilgreina klasa (į ensku class), ž.e. tegundir sem innihalda bęši gögn og ašferšir.
Hér hefur veriš sżnt hvernig hęgt er aš skilgreina spilastokk ķ Pascal. Žessi spilastokkur getur ekkert gert annaš en geymt upplżsingar um lit og gildi 52 spila. Žaš er engin leiš aš kenna honum neinar ašferšir. Eigi til dęmis aš stokka hann eša sżna spilin į skjįnum žį žarf aš skrifa undirforrit til žess og žau eru ekki hluti af spilastokknum. Į hlutbundnum mįlum eins og C++, Delphi, og Java er hins vegar hęgt aš skilgreina spilastokk žannig aš hann innihaldi bęši spilin og ašferšir til aš gera eitthvaš viš žau eins og t.d. aš stokka žau og sżna žau į skjįnum.
Lķtum į hvernig hęgt er aš skrifa algrķmiš til aš umrita tölu į tvķundaform į Java. Ešlilegast er aš skilgreina klasa sem geymir eina heila tölu og kann ašferš til aš skrifa hana sem streng į tvķundaformi. Ef viš lįtum klasann heita Tala žį getur hann litiš svona śt:
public class Tala
public String tuga2tvi()
return s;
}
Breytan gildi er af tegundinni int (ž.e. heiltala) og hśn geymir töluna. Hśn er lokuš (private) sem merkir aš ašferširnar sem tilheyra klasanum hafa einkarétt į aš breyta gildi hennar. Auk žessarar breytu hefur klasinn tvęr ašferšir. Önnur er smišur sem er notašur til aš bśa til hluti af tegundinni Tala hin er tuga2tvi() skilar streng sem er talan į tvķundaformi.
Žegar žessi klasi hefur veriš skilgreindur er hęgt aš gefa skipun eins og
Tala t = new Tala(25)
til aš bśa til nżja tölu meš nafninu t og gefa henni gildiš 25. Svo er hęgt aš nota skipunina
String tvi = t.tuga2tvi()
til aš gefa strengnum tvi gildiš sem fęst meš žvķ aš lįta hlutinn t framkvęma į sér ašferšina tuga2tvi(). Meš skipuninni
t.tuga2tvi()
er hlutnum sem heitir t send skilaboš um aš framkvęma ašferšina tuga2tvi().
Meginmunurinn į mótušum mįlum og hlutbundnum er sį aš ķ mótušu mįlunum eru gögn ašskilin frį ašferšum. Heilt forrit į mįli eins og Pascal eša C samanstendur af gögnum og ašferšum. Ašferširnar eru undirforrit og föll sem gera eitthvaš viš gögnin. Gögnin eru geymd ķ breytum (sem geta veriš einfaldar eins og heiltölubreytur, allflóknar eins og spilastokkur eša mjög flóknar eins og ęttartré, lķkan af gatnakerfi ķ stórborg eša persóna ķ tölvuleik) og breyturnar gera ekki neitt.
Forrit sem skrifuš eru į hlutbundnum mįlum innihalda yfirleitt marga hluti sem geta sent hver öšrum skilaboš. Ein mikilvęg tegund skilaboša eru svokallašir atburšir (į ensku event). Atburšur er eitthvaš sem gerist ķ tölvunni, t.d. žegar smellt er į hnapp į lyklaboršinu, mśsin fęrš eša smellt meš henni. Atburšir gegna mikilvęgu hlutverki viš forritun notendaskila. Meš hlutbundnum mįlum er aušvelt aš lįta hnapp, valmynd eša annan hlut sem er sżnilegur į skjįnum senda öšrum hlutum atburši t.d. žegar smellt er į žį meš mśsinni. Žetta er oršaš svo aš meš hlutbundnum mįlum sé aušvelt aš bśa til atburšarekin forrit.
Hugsum okkur aš forrita eigi tölvuleik žar sem karlar og kerlingar hoppa og hlaupa um. Į hlutbundnu mįli vęri ešlilegast aš byrja į aš skilgreina klasa sem inniheldur eiginleika og ašferšir sem eru sameiginleg öllum körlum og kerlingum ķ leiknum. Hann gęti t.d. heitiš Persona[2] og innihaldiš notfrjįlsu (į ensku public) ašferširnar hoppa og hlaupa og skjóta.
Trślega žyrfti aš nota ofansękna hönnun til aš bśa til notfrjįlsu ašferširnar hoppa og hlaupa. En undirforritin sem lżsa einstökum pörtum žessara verka og gögnin sem žau nota yršu algerlega lokuš (į ensku private) innan ķ klasanum. Aš ašferš eša breyta sé notfrjįls žżšir aš hęgt aš nota hana utan klasans sem hśn er skilgreind ķ. Sé hśn lokuš er žetta hins vegar ekki hęgt.
Hugsum okkur aš klasinn Persona innihaldi notfrjįlsa ašferš sem heitir hlaupa. Gerum rįš fyrir aš breytan p geymi hlut af tegundinni Persona. Viš getum žį sent p skilaboš um aš nota ašferšina hlaupa svona:
p.hlaupa();
Ef ašferšin hlaupa notar lokaš undiforrit sem heitir t.d. beygjaHnje žį getum viš ekki skipaš:
p.beygjaHnje();
žvķ beygjaHnje er ekki notfrjįls ašferš. Meš žvķ aš hafa sumar ašferšir og sumar breytur notfrjįlsar og ašrar lokašar geta klasar skammtaš ašgang aš innvišum sķnum. Žaš er žvķ eins og hver hlutur segi viš hina hlutina: Ég leyfi ykkur ekki aš fikta ķ mķnu dóti žvķ žį getiš žiš klśšraš mįlunum. Žiš megiš nota ašferšir og breytur sem ég skilgreini sem notfrjįlsar og žar sem ég fę aš hafa allt annaš ķ friši get ég tryggt aš žęr virki rétt. Žessi eiginleiki hlutbundinnar forritunar, aš geta lokaš gögn og ašferšir inni ķ sķnum klösum kallast żmist hjśpun eša upplżsingahuld (į ensku encapsulation).
Viš ętlušum aš hafa sumar persónurnar ķ leiknum karla og sumar įttu aš vera kerlingar. Klasinn Persona inniheldur allt sem karlar og kerlingar eiga sameiginlegt. Klasarnir Karl og Kerling žurfa ekki aš innihalda žessi sameiginlegu atriši. Žeir geta erft žau frį Persona. Įsamt möguleikum į aš hjśpa ašferšir og gögn eru erfšir (į ensku inheritance) meš mikilvęgustu einkennum hlutbundinnar forritunar. Meš žvķ aš lįta einn klasa erfa eiginleika annars er hęgt aš endurnżta forritskóta sem er bśiš aš fullvinna aš žaulprófa įn žess aš hręra neitt ķ honum.
Enn eru ótaldir tveir mikilvęgir eiginleikar hlutbundinna forritunarmįla sem eru er fjölbreytni og kvikleg binding.
Kvikleg binding (į ensku dynamic binding) žżšir aš žaš getur rįšist ķ keyrslu forrits af hvaša tegund breyta er, žaš žarf ekki aš negla žaš fast um leiš og forritiš er žżtt. Viš getum t.d. hugsaš okkur aš breytan k sé skilgreind sem Persona og ef notandi smellir meš mśsinni į einn hlut į skjįnum žį fįi hśn gildi af tegundinni Karl en ef smellt er į annan staš žį fįi hśn gildi af tegundinni Kerling.
Fjölbreytni (į ensku polymorphism) žżšir aš margar ašferšir geta heitiš sama nafni og žegar nafniš er notaš ręšst žaš af samhengi hver af ašferšunum er framkvęmd. Viš getum t.d. hugsaš okkur aš klasinn Karl hafi ašferš sem heitir dansa og lętur karlinn dansa ólmann strķšsdans og klasinn Kerling hafi lķka ašferš sem heitir dansa og hśn lįti kerlinguna kjaga kringum mannętupott. Ef forrit inniheldur skipunina
k.dansa();
žį er śtkoman strķšsdans ef gildi k er af tegundinni Karl en öšru vķsi dans ef žaš er Kerling og žaš getur rįšist eftir aš keyrsla forrit hefst hvort tegund breytunnar er skilgreind af klasanum Karl eša af klasanum Kerling.
Viš getum nś dregiš saman ķ stutt mįl helstu einkenni hlutbundinna forritunarmįla:
Ķ hlutbundnum mįlum er gögnum og ašferšum pakkaš saman ķ einingar sem kallast klasar.
Breyta af tegund einhvers klasa er hlutur sem inniheldur eiginleika og ašferšir klasans. Hlutir geta sent hver öšrum skilaboš og stórt forrit er yfirleitt safn margra hluta sem skiptast į skilabošum og bregšast viš atburšum.
Hlutbundin mįl bjóša upp į hjśpun, erfšir, kviklega bindingu og fjölbreytni.
Rétt eins og söfn undirforrita fylgja mótušum mįlum fylgja hlutbundnum mįlum söfn af klösum. Flestir forritarar nżta sér slķk söfn og bęta viš sķnum eigin klösum sem oft erfa eiginleika og ašferšir frį klösum sem fylgja meš mįlinu. Einnig ganga klasar milli forritara og sumir eiga stór söfn til višbótar žeim sem fylgja forritunarmįlinu. Žegar forritari lżkur viš forrit hefur hann žvķ kannski ašeins skrifaš brot af öllum žeim kóta sem forritiš er gert śr.
Hlutbundin mįl aušvelda forriturum mjög aš nżta vinnu hver annars. Žótt hver klasi sé ef til vill ekki mjög frįbrugšinn forriti į mótušu mįli aušvelda žeir eiginleikar hlutbundinna mįl sem hér hefur veriš fjallaš um forriturum mjög mikiš aš glķma viš flókin verkefni og skipta meš sér verkum. Į móti kemur aš hlutbundin mįl eru yfirleitt fremur flókin svo žaš tekur lengri tķma aš lęra žau almennilega heldur en einfaldari mįl eins og Pascal eša BASIC.
Ašrar mįlaęttir
Flest algengustu forritunarmįlin tilheyra flokki gildingarmįla. Mįl af öšrum ęttum gegna žó mikilvęgu hlutverki į żmsum svišum tölvufręšinnar. Hér veršur fjallaš stuttlega um tvenns konar öšru vķsi forritunarmįl fallamįl og rökfręšimįl.
Elsta fallamįliš (į ensku functional language) heitir Lisp. Žaš kom fram žegar ķ įrdaga tölvanna fyrir 1960 og var byggt į lambda calculus sem er eins konar forritunarmįl sem rökfręšingurin Alonso Church bjó til ķ žeim tilgangi aš skilgreina stęršfręšilega ašferš į 4. įratug 20. aldar. Nokkur önnur fallamįl eins og Scheme og Logo eru nįskyld Lisp. Žessi mįl eru afar öflug aš žvķ leyti aš į žeim er hęgt aš orša flóknar ašferšir ķ stuttu mįli. Mįlskipan žeirra og merkingarfręši er lķka einfaldari en ķ flestum öšrum forritunarmįlum. Į móti kemur aš fallamįlin gera yfirleitt miklar kröfur til vélabśnašar, forritin eru frek į minni og yfirleitt keyrš af tślkum sem eru heldur svifaseinir. Žótt žessi mįl henti vel til żmiss konar tilraunastarfsemi eru žau af žessum sökum illa til žess fallin aš smķša notendaforrit sem žurfa aš keyra hratt į ódżrum vélum.
Logo er mest notaš til aš kenna byrjendum forritun. Lisp og Scheme gegna mikilvęgu hlutverki viš rannsóknir ķ żmsum greinum tölvufręši m.a. gervigreindarfręšum (ž.e. fręšum sem snśast um aš fį tölvur til aš lķkja eftir mannlegu hugarstarfi og skynjun).
Mešal einkenna fallamįla eru:
Listavinnsla. Gögn eru geymd ķ listum sem eru kviklegar og afar sveigjanlegar gagnagrindur.
Forrit og gögn eru ekki ašgreind. Forrit eru listar af tįknum og gögnin sem žau vinna meš eru lķka listar af tįknum. Žetta žżšir aš forrit geta breytt sjįlfum sér og aušvelt er aš bśa til forrit sem bęta ašferšum viš sjįlf sig.
Tiltekiš er hvaš forrit į aš gera meš žvķ aš skilgreina föll og lįta žau kalla hvert į annaš fremur en meš žvķ aš telja upp ķ röš žaš sem į aš gera.
Hér er ekki rśm til aš gera fallamįlum frekari skil. Forritiš sem hér fer į eftir er skrifaš į Scheme. Žaš tekur viš tölu og skrifar hana į formi tvķundakerfis.
(define (tuga2tvi x t)
(if (> x 0)
(tuga2tvi (quotient x 2) (append (list (remainder x 2)) t ))
t
)
(define (tvi x) (tuga2tvi x '()))
Eins og önnur mįl į Lisp-ęttinni er Scheme gagnvirkt žannig aš um leiš og bśiš er aš slį inn eitt fall er hęgt aš lįta tślkinn keyra žaš. Žaš er t.d. hęgt aš keyra falliš tvi (sem kallar į tuga2tvi) og fį aš sjį hvernig 25 lķtur śt ķ tvķundakerfi meš žvķ aš skrifa:
(tvi 25)
og Scheme tślkurinn svarar meš:
Af rökfręšimįlum er Prolog einna žekktast. Lķkt og Lisp og Scheme er žaš enn sem komiš er mest notaš viš rannsóknir og tilraunastarfsemi. Žaš hefur žó veriš notaš til aš smķša sérfręšikerfi (ž.e. forrit sem draga rökréttar įlyktanir af upplżsingum ķ gagnasafni, yfirleitt į einhverju sérfręšisviši).
Prolog er forritunarmįl af 4. kynslóš sem žżšir aš hver skipun samsvarar yfirleitt mjög löngum vélamįlskóta og forritari getur ķ mörgum tilvikum lįtiš duga aš lżsa žvķ hvaš forrit į aš gera ķ staš žess aš skrifa algrķm sem tiltekur skref fyrir skref hvernig į aš gera žaš. Forrit į Prolog eru skrifuš sem runur af stašreyndum og skilgreiningum į eiginleikum og venslum. Eigi til dęmis aš skrifa žęr stašreyndir aš Ślfur sé fašir Grķms og Grķmur sé fašir Žórólfs og Egils og Egill sé fašir Böšvars žį er hęgt aš gera žaš svona:
fašir(ślfur, grķmur).
fašir(grķmur, egill).
fašir(grķmur, žórólfur).
fašir(egill, böšvar).
Žaš er svo hęgt aš skilgreina venslin afi og bróšir meš
afi(A, B) :- fašir(A, X), fašir(X, B).
bróšir(A, B) :- fašir(X, A), fašir(X, B).
Fyrri skilgreiningin segir aš A sé afi B ef A er fašir einhvers, X, og sį sami X er fašir B. (Hér er öllu kvenfólki sleppt og skilgreiningin yrši dįlķtiš flóknari ef žaš vęri haft meš.)
Žessar fjórar stašreyndir og tvęr skilgreiningar mynda saman ofurlķtiš forrit. Žegar Prolog tślkur hefur veriš matašur į žvķ er hęgt aš leggja fyrir hann spurningar eins og
afi(X, böšvar).
og tślkurinn svarar
X = grķmur
Prolog er aš žvķ leyti lķkt mįlum af Lisp-ęttinni aš listavinnsla gegnir mikilvęgu hlutverki. Hér fer į eftir forrit į Prolog sem skrifar tölu į formi tvķundakerfis.
dec2bin(0, [0]).
dec2bin(1, [1]).
dec2bin(X, [Haus|Hali]) :- Haus is X mod 2,
Y is X // 2,
dec2bin(Y, Hali).
conc([], L, L).
conc([X|L1], L2, [X|L3]) :- conc(L1, L2, L3).
snua([],[]).
snua([Haus|Hali], X) :- snua(Hali, Y),
conc(Y, [Haus], X).
tuga2tvi(X, S) :- dec2bin(X, S1), snua(S1, S).
Žegar Prolog tślkur hefur veriš matašur į žessum skilgreiningum er hęgt aš gefa fyrirmęli eins og
tuga2tvi(25, S).
og tślkurinn svarar
S = [1, 1, 0, 0, 1]
Skilgreiningin og stašreyndirnar um venslin dec2bin duga raunar til aš breyta tölu ķ lista af tölustöfum ķ tvķundakerfi en sį listi er öfugur. Venslin conc og snua snśa honum viš.
Hugbśnašargerš, villur og įreišanleiki
Hugbśnašur - tvöfalt stęrri, margfalt dżrari
Žegar tölvur hófu innreiš sķna ķ atvinnulķf į įrunum eftir 1960 voru vélarnar dżrar og kostnašurinn viš kaup og višhald žeirra margfalt meiri en žaš sem greitt var fyrir hugbśnaš. Nś hefur žetta hlutfall fyrir löngu snśist viš og fyrirtęki sem nota tölvur greiša aš jafnaši miklu meira fyrir hugbśnaš heldur en fyrir vélabśnaš.
Fyrir žį sem ašeins hafa skrifaš smįforrit, eins og verkefni ķ byrjendabók ķ forritun, getur veriš erfitt aš gera sér grein fyrir žvķ hve mikil vinna liggur aš baki hugbśnaši eins og bókhaldskerfi, töflureikni eša tölvuleik. Žaš er freistandi aš hugsa sem svo aš ef žaš tekur einn mann viku aš skrifa smįforrit žį geti hann skrifaš 50 sinnum stęrra forrit į einu įri. En reynslan sżnir aš žetta er fjarri sanni. Stór hugbśnašarverkefni eru yfirleitt mun dżrari og mun tķmafrekari en žeir sem ašeins hafa reynslu af smķši lķtilla forrita geta meš góšu móti gert sér grein fyrir. Fyrir žessu eru żmsar įstęšur:
Lķtil forrit eins og fjölvar eša smįforrit į vefsķšum eru yfirleitt skrifuš sem ein heild. Stórir hugbśnašarpakkar eru hins vegar samsettir śr mörgum hlutum sem žurfa aš spila saman og žaš er tķmafrek vinna aš skilgreina višmót og samskeyti og tryggja snuršulausa samverkun.
Smįforrit žarfnast ekki skjalbśnašar (ž.e. leišarvķsa, handbóka, upplżsinga um višhald o.s.frv.) en meš stórum hugbśnašapökkum žarf aš fylgja verulega mikiš af gögnum og upplżsingum svo hęgt sé setja žį upp, nota žį, višhalda og endurbęta žótt höfundar žeirra séu ekki viš.
Stóra hugbśnašarpakka žarf aš vera hęgt aš keyra ķ fjölbreytilegu umhverfi (t.d. į öllum PC tölvum sem keyra Microsoft Windows hvort sem žęr nota Windows 95, 98 eša NT og hvort sem žęr eru stakar, eša hluti af stašarneti og hvort sem žęr vista gögn į eigin diski eša į diski netžjóns o.s.frv.).
Stórir hugbśnašarpakkar žurfa yfirleitt aš męta fjölbreytilegum žörfum sem er erfitt aš hafa yfirsżn yfir og skilgreina nįkvęmlega. Sį sem skrifar smįforrit veit oftast nįkvęmlega hvaš forritiš į aš gera. En žeir sem vinna stór verkefni žurfa oft og išulega aš verja miklum tķma til aš įtta sig į vinnubrögšum, žörfum og hugsunarhętti vęntanlegra notenda.
Žetta žrennt sem tališ hefur veriš veldur žvķ aš vinna viš hverja lķnu af kóta ķ stórum hugbśnašarpakka er margfalt meiri en ķ smįforriti. Enn er žó ótališ žaš sem mestu skiptir:
Stórir hugbśnašarpakkar eru išulega samvinnuverkefni margra forritara, enda tęki vinna viš žį mörg įr og jafnvel įratugi ef hśn vęri unnin af einum manni. En tveir forritarar sem vinna saman afkasta alls ekki tvöfalt meiru en einn, žvķ žótt hlutbundin forritun hafi greitt mjög yfir samvinnu forritara fer samt verulega mikill hluti af tķma žeirra ķ aš samstilla kraftana og koma sér saman um verkaskiptingu og tilhögun eša skilgreiningu einstakra verkžįtta. Žegar margir forritarar vinna saman getur žetta žżtt aš hver žeirra skrifi tvöfalt, fjórfalt eša įttfalt fęrri lķnur af kóta į dag en hann gerši ef hann ynni einn. Ef einn mašur yrši tvö įr aš ljśka verkefni, en žaš žarf aš ljśka žvķ į einu įri, žį getur žvķ žurft aš fjölga forriturum ķ fjóra, įtta eša jafnvel sextįn fremur en tvo.
Frį hönnun til śtgįfu
Vinnu viš gerš hugbśnašar er hęgt aš skipta ķ nokkra įfanga. Alls fyrst žarf aušvitaš aš įkveša nokkurn veginn hvaš į aš gera og safna saman forriturum og öšru sérfróšu fólki til aš vinna verkiš. En eftir aš hin eiginlega vinna er hafin eru helstu įfangar į leiš frį hönnun til śtgįfu žessir:
Lżsing į žvķ hvaš hugbśnašurinn į aš gera og hvernig hann į aš vera. Slķk lżsing getur veriš ansi langt mįl. Hśn žarf m.a. aš tiltaka hvaša žörfum forritiš į aš žjóna og lżsa notendaskilum žess.
Lżsing į innvišum forritsins. Hvernig skiptist žaš ķ klasa. Hvers konar gagnagrindur eru notašar og hvaša algrķm eru notuš til aš vinna einstaka verkžętti.
Verkaskipting milli einstaklinga og vinnuhópa įkvešin.
Forritunin sjįlf. Forritarar skrifa kóta į einhverju forritunarmįli. Į žessu stigi koma išulega ķ ljós vankantar į žeirri hönnunar- og skipulagsvinnu sem unnin var į fyrri stigum svo žaš veršur aš endurtaka hana aš einhverju leyti.
Prófun einstakra klasa og forritshluta. Leiši prófanir ķ ljós galla ķ hönnun eša forritun getur žurft ašendurtaka einhvern hluta žeirrar vinnu.
Samtenging allra hluta hugbśnašarins ķ eina heild og prófanir į samspili žeirra.
Samning skjalbśnašar (leišarvķsa, handbóka o. ž. u. l.)
Einhver hópur vęntanlegra notenda fenginn til aš reyna brįšabirgšaśtgįfu af hugbśnašinum. Slķk brįšabirgšaśtgįfa er oft kölluš beta-śtgįfa.
Hugbśnašurinn lagašur ķ ljós reynslunnar af beta śtgįfunni.
Śtgįfa og markašssetning. Žegar hingaš er komiš er vinna viš gerš annarrar śtgįfu ef til vill hafin.
Villur
Stór hluti af vinnunni viš hugbśnašargerš snżst um prófanir, leit aš villum, lagfęringar og leišréttingar. Samt eru villur ķ flestum forritum og sumar žessar villur leyna į sér, forrit getur jafnvel veriš ķ notkun įrum saman įn žess aš žęr komi ķ ljós.
Hinn svokallaši 2000-vandi var t.d. ķ žvķ fólginn aš forrit geymdu įrtöl sem tveggja stafa tölu. Žannig var įrtališ 1998 geymt sem talan 98. Oft žurfa forrit aš finna bil milli tveggja dagsetninga (t.d. til aš reikna vexti) og hluti af žeim śtreikningum er išulega ķ žvķ fólginn aš draga eitt įrtal frį öšru. Žannig er biliš milli įranna 1991 og 1998 reiknaš sem 98-91=7 įr. En ef įrtališ 2000 er geymt sem talan 00 žį reiknast biliš milli 1998 og 2000 vera 00-98=-98 įr. Žessi villa leyndist įrum saman ķ fjölmörgum forritum og gerši fyrst vart viš sig um įramótin 1999 til 2000.
Į ensku eru villur ķ forritum stundum kallašar bugs (ž.e. skordżr) og forrit sem leitar uppi villur ķ kóta kallaš debugger. Į bak viš žetta oršalag er sś saga aš Grace Hooper (einn af höfundum forritunarmįlsins COBOL) hafi lent ķ žvķ einhvern tķma ķ įrdaga tölvutękninnar aš vélin sem hśn vann viš hagaši sér undarlega. Grace leitaši įn įrangurs aš villu ķ forritinu en fann enga. Žį stóš hśn upp, opnaši tölvuna (sem var į stęrš viš heilt herbergi) gekk inn ķ hana og fann hvaš var aš: Skorkvikindi hafši trošiš sér milli raflagna meš žeim afleišingum aš vélin vann ekki sem skyldi. Žetta dżr var vķst ekki lśs en į ķslensku er samt talaš um aš forrit sem innihalda mikiš af villum séu lśsug og forrit sem leita uppi villur ķ kóta kölluš kembiforrit (enda eru lśsakambar notašir til aš greiša lżs śr hįri manna).
Villum ķ forritum er hęgt aš skipta ķ tvo meginflokka: Mįlvillur og hugsunarvillur.
Žaš er mįlvilla žegar forritskótinn samrżmist ekki mįlskipun forritunarmįlsins. Žżšendur eiga aš bregšast viš slķkum villum meš žvķ aš neita aš žżša forritiš en žżšendur geta innihaldiš villur rétt eins og önnur forrit svo stundum valda mįlfręšivillur žvķ aš til veršur gallašur vélamįlskóti. Flestum žżšendum fylgja kembiforrit sem finna mįlfręšivillur og ašstoša forritara viš aš leišrétta žęr.
Alvarlegar villur ķ hugbśnaši koma žó oftast til af öšru en žvķ aš forritskóti samręmist ekki mįlfręšireglum. Žetta eru hugsunarvillur af żmsu tagi. Sumar valda inningarvillum (į ensku run-time error) ž.e. villum sem koma ķ ljós žegar forrit er keyrt og valda žvķ oft aš keyrslan stöšvast. Sem dęmi um villur af žessu tagi mį nefna deilingu meš nślli eša yfirflęši ķ reikningi (į ensku arithmetic overflow) sem veršur žegar śtkoma śr reikniašgerš fer śt fyrir žau mörk sem gisti eša breyta getur rśmaš. Ašrar hugsunarvillur birtast ekki meš jafnaugljósum hętti. Žęr eru rökvillur sem valda žvķ aš forrit gerir eitthvaš annaš en žvķ er ętlaš aš gera eša skilar rangri nišurstöšu. Žaš getur veriš mjög erfitt aš sannreyna aš forrit sé laust viš rökvillur.
Rökvillur, forskilyrši og eftirskilyrši
Žaš er hęgt aš fullyrša įn fyrirvara aš forritskóti innihaldi mįlvillu eša aš inningarvilla verši viš keyrslu žess en žaš er ekki hęgt aš tala um rökvillu nema meš hlišsjón af einhverri lżsingu į hvaš forriti er ętlaš aš gera. Ef forriti er t.d. ašeins ętlaš aš mešhöndla dagsetningar frį 1.1.1900 til 31.12.1999 žį er varla hęgt aš tala um rökvillu žó žaš fari rangt meš dagsetninguna 1.1.2000. Žaš er heldur ekkert undan žvķ aš kvarta žó forrit skrifi į skjįinn 2+2=5 ef žvķ er ašeins ętlaš aš vera skjįhvķlir. Sé žvķ hins vegar ętlaš aš vera reiknivél hlżtur žetta aš teljast rökvilla.
Eitt af žeim verkum sem ekki er hęgt aš leysa meš algrķmi er aš skera śr um hvort forrit hagar sér ķ samręmi viš lżsingu į verki eša greinargerš fyrir žvķ hvaš žaš į aš gera. En žótt ekki sé til pottžétt ašferš til aš komast aš žessu ķ öllum tilvikum er stundum hęgt aš leiša ķ ljós, og jafnvel aš sanna meš stęršfręšilegum hętti, aš forrit eša forritshluti vinni sitt verk eins og til er ętlast.
Eitt af mikilvęgustu hjįlpartękjum sem forritarar nota til aš stašfesta réttmęti og įreišanleika forrita er nįkvęmar lżsingar į forskilyršum og eftirskilyršum. Flest forrit skiptast ķ nokkra klasa og hver klasi inniheldur nokkrar ašferšir. Sé ofansękin ašferšafręši notuš er hver ašferš mynduš śr nokkrum stuttum undirforritum. Til aš stašfesta aš hvert undirforrit (eša hver forritshluti) vinni rétt žarf aš lżsa žvķ hvaš žaš į aš gera. Žetta er yfirleitt gert meš žvķ aš tiltaka forskilyrši og eftirskilyrši.
Forskilyrši segja ķ hvaša įstandi gögn mega vera og hvaša gildi breytur mega hafa įšur en tiltekinn hluti forrits er framkvęmdur.
Eftirskilyrši segja hvaša įhrif tiltekinn hluti forrits hefur į gögn og breytur, į hvern hįtt staša žeirra eftir er fall af stöšu žeirra fyrir keyrslu žessa hluta.
Til upprifjunar
Hvaš eru:
Backus-Naur rithįttur, BASIC, Bytecode, C, C++, eftirskilyrši, erfšir, fallamįl, fjölbreytni, flęširit, forskilyrši, gildingarmįl, inningarvilla, Java, Javascript, kembiforrit, klasi, kótasmķš, kvikleg binding, lįgtęknimįl, lesgreining, Lisp, Logo, lokatįkn, mįlskipan, merkingarfręši, notfrjįls ašferš, ofansękin hönnun, Pascal, Perl, Prolog, Scheme, smalamįl, tślkur, vélamįl, žżšandi, ęšri forritunarmįl.
Nefndu dęmi um:
Fallamįl, gildingarmįl, hlutbundin mįl, lįgtęknimįl, mótuš mįl.
|