Computer Science and Information Systems?(?):???? DOI: N/A Tehnike poboljšanja upotrebljivosti sintakse programskih jezika Petar Prvulović Matematički fakultet 11000 Belgrade, Serbia {petar.prvulovic}@gmail.com Abstract. U radu postavljamo programski jezik kao interfejs izme du programera i računara. U tom kontekstu posmatramo jezike i identifikujemo neke ideje koje utiču na njihovu upotrebljivost. Jezike posmatramo u najširem mogućem smislu, ne ograničavajući se na odre denu familiju jezika, paradigmu ili vid izražavanja. Posmatrane ideje su klasifikovane u šest grupa. Baziramo se na tekstualnim jezicima i za svaku grupu opisujemo osnovne ideje i ilustrujemo ih primerima. Zatim dajemo osnov za primenu na vizuelne jezike i ilustrujemo primerima. Na kraju dajemo kratak osvrt na upotrebljivost jezika kao interfejsa u kontekstu ciljne grupe korisnika i namene i predlažemo moguće primene u sistemu obrazovanja Republike Srbije. Keywords: upotrebljivost programskih jezika, preglednost koda, čitljivost koda, preimenovanje seta instrukcija, proširenje seta instrukcija, sintaksne slobode. 1. Uvod Programski jezik je interfejs izme du programera i računara. Taj interfejs treba programeru da omogući pretvaranje ideje u niz instrukcija ciljne platforme. Programski jezici doživeli su evoluciju sintakse. Sintaksa je obogaćivana logičkim i jezičkim konstrukcijama kako bi podržala potrebe programera i omogućila izražavanje ideja kroz odre dene paradigme. Identifikovali smo neke često korišćene elemente koji doprinose upotrebljivosti programskih jezika, u smislu da olakšavaju čitljivost i pisanje koda, tj. izražavanje ideja, i grupisali ih. U tom razmatranju obuhvaćeni su jezici opšte namene i ezoterični jezici prvi jer su svakodnevnoj upotrebi a drugi jer su granični slučajevi primene pomenutih ideja. Jezici su posmatrani nezavisno od paradigmi za koje su dizajnirani, pa su tako izdvojene ideje koje imaju opštu primenu. Uticaj paradigmi biće pomenut samo gde je to nužno potrebno. Opisaćemo šest tipova poboljšanja upotrebljivosti programskih jezika. Daćemo primere za svaki od njih i razmotriti neke prednosti i mane. Zatim ćemo pokazati kako je moguće posmatrati dizajn jezika u odnosu na ciljnu grupu korisnika i namenu. Na kraju pokazujemo kako je moguće primeniti ovakvo gledište na izbor programskih jezika u sistemu obrazovanja. 2. Tehnike poboljšanja upotrebljivosti sintakse programskih jezika 2.1. Preimenovanje osnovnog seta instrukcija Davanje smislenih aliasa binarnim instrukcijama čini prepoznavanje i zadavanje instrukcija manje zamornim i manje sklonim greškama. Pogrešno zapisana binarna instrukcija
2 Petar Prvulović (invertovan bit) u velikoj verovatnoći dovodi do prihvatanja instrukcije kao validne i izazivanja logičke greške, primetne tek u izvršenju. Korišćenje alfabeta prirodnog jezika omogućava set instrukcija takav da zamena jednog slova može da izazove grešku nepostojeće instrukcije i bude primećena u fazi pisanja koda. Bušači kartica su osnovni primer primene ove tehnike - kao ulaz dobijaju tekstualne mnemonike instrukcija, koje preslikavaju u binarni zapis koda instrukcija i otiskuju ga na kartici/traci [1]. Ovakvi ure daji predstavljaju klasičan primer interfejsa. Vremenom su evoluirali u programske jezike, editore i kompajlere. Asembler ima sintaksu koja je dobrim delom 1-1 preslikavanje u skup binarnih instrukcija. Brainfuck je primer namerno lošeg interfejsa: sintaksa je 1-1 preslikavanje skupa instrukcija Turingove mašine, pri čemu su izabrani neintuitivni nazivi kako bi se pisanje i čitanje programa načinilo težim. Ook! koristi potpuno isti princip. Skup naziva sadrži onomatopeje glasova majmuna, čime se postiže komičan efekat tako što kôd na prvi pogled izgleda kao zapis na "orangutanskom", posebno ako se čita naglas. Brainfuck Ook! Opis < Ook. Ook? Pomeriti pokazivač udesno > Ook? Ook. Pomeriti pokazivač ulevo + Ook. Ook. Inkrement aktivne ćelije - Ook! Ook! Dekrement aktivne ćelije. Ook! Ook. Ispis aktivne ćelije, Ook. Ook! Unos vrednosti i upis u aktivnu ćeliju [ Ook! Ook? Uslovni skok. Ako je vrednost ćelije 0, skoči do uparenog ] ] Ook? Ook! Skok nazad na upareni [ Fig. 1. Set instrukcija za Brainfuck i Ook! Ook! Ook! Ook? Ook! Ook? Ook. Ook! Ook. Ook. Ook? Fig. 2. Deo programa na Ook! jeziku 2.2. Dodavanje logičkih konstrukcija i sintaksnih pravila Sintaksne olakšice i gramatička pravila, kao što su if-then-else, switch-case, notacija izraza... donekle apstrahuju platformu i čine programske jezike bližim govornim jezicima. Ovakve konstrukcije kompajler prevodi u niz mašinskih instrukcija, neretko po složenim pravilima i ne obavezno kroz 1-1 preslikavanje. Gramatika jezika definiše se u skladu sa paradigmom na koju se jezik naslanja, pa imamo raznolik skup konstrukcija. Namena
Tehnike poboljšanja upotrebljivosti sintakse programskih jezika 3 konstrukcija može biti apstrahovanje toka (razni oblici uslova, petlji, skokova, pozivanja procedura), definisanje iskaza, zadavanje vrednosti itd. Ilustrovaćemo ovu tehniku primerom naredbe skoka. Ovakvo rezonovanje može se primeniti i za druge konstrukcije. Na primer, mogu se uporediti uslovne konstrukcije u Pascal i C familiji i jezicima funkcionalne paradigme. Naredba skoka zahteva broj instrukcije. Jedna naredba može da se prevede u više mašinskih instrukcija. Naknadno umetanje koda vrši promenu položaja (broja) instrukcija nakon umetnog koda. Oba dovode do problema numerisanja instrukcija. U Basic-u je to rešeno tako što svaki red počinje brojem. Naknadno umetanje koda rešeno je preporukom da brojevi redova ne moraju biti uzastopni, već sa razmakom (npr. 10,20,30...), pa ostaje brojni prostor za numerisanje umetnih redova (npr. 15, 21...). Time je otklonjena potreba ažuriranja instrukcija skoka koriste se brojevi značajni na nivou jezika a stvarni brojevi instrukcija dobijaju se prilikom kompajliranja. Mana ovog rešenja je uvo denje dodatnog napora programeru. Asembler i Pascal problem skoka rešavaju uvo denjem labela. Instrukcija skoka kao parametar prima ime labele a u fazi kompajliranja pretvara ga u broj instrukcije nakon mesta gde je labela definisana. program goto_example ; l a b e l r p t ; var a : i n t e g e r ; begin a : = 1 0 ; r p t : r e p e a t { s k i p 15 } i f ( a = 15) then begin a := a +1; goto r p t ; end ; w r i t e l n ( a=, a ) ; a := a +1; u n t i l a =20; end. 10 PRINT " f a c t o r i a l of : " 20 INPUT A 30 LET B=1 35 REM b e g i n n i n g o f t h e loop 40 IF A<=1 THEN 80 50 LET B=B A 60 LET A=A 1 70 GOTO 40 80 PRINT B Fig. 3. Primer: Basic i Pascal kôd sa uslovnim skokom
4 Petar Prvulović 2.3. Proširenje seta instrukcija i tipova podataka Kada se neatomična operacija koristi dovoljno često ima smisla obezbediti atomičnu zamenu. Primer toga su print i write funkcije. Slično važi i za tipove podataka - string nije primitivan tip ali se dovoljno često koristi da ima smisla tretirati ga tako. C koristi nul-terminisane nizove karaktera i na taj način uvodi izvor velikog broja problema (komplikovan kôd, rukovanje pokazivačima sklono greškama). Pascal omogućava string kao primitivan tip a Java kao klasu u podrazumevano uključenom paketu. Izbor raspoloživih tipova podataka i opisivanja promenljivih tako de zavisi od namene jezika. Tako, jezici nižeg nivoa apstrakcije veći fokus stavljaju na primitivne tipove i njihove varijante (int i short int, signed i unsigned...) dok viši jezici rade sa apstraktnim tipovima PHP ima native podršku za heš mape, Java sakriva pokazivače itd. Interpretirani jezici su često slabo tipizirani, tj. ne zahtevaju eksplicitno zadavanje tipa promenljivoj, čime se programer rasterećuje tih detalja implementacije. Uopšte, sakrivanje detalja implementacije apstrahovanjem omogućava bolje fokusirano učenje jezika, na štetu efikasnosti rezultujućih programa. 2.4. Modularnost koda Razdvajanje koda u više fajlova omogućava bolje organizovanje koda, izolovanje logičkih celina i lakše vo denje velikih projekata. Preduslov je za stvaranje biblioteka i višestruko iskoristivog koda. Benefiti su sažetiji i pregledniji kôd, jer se delovi mogu apstrahovati i pozivati eksterno. Način uključivanja koda iz drugih fajlova je bitan faktor. Razlikujemo uključivanje pomoćnih fajlova u zaglavlju u tim fajlovima nalaze se deklaracije elemenata koje izvršni kôd koristi, i uključivanje fajla u toku koda u tim fajlovima mogu biti pomoćne deklaracije ali i izvršni kôd koji se izvršava na mestu uključenja. Tako se mogu neki detalji implementacije izdvojiti iz koda čime se dobija bolja preglednost. Sličan efekat može da pruži i opcija sažimanja koda, često prisutna u editorima. 2.5. Dodavanje biblioteka Dodavanje biblioteka je direktna posledica modularnosti. Tiče se izbora, načina imenovanja, organizacije i dokumentovanja raspoloživih biblioteka i načina distribucije (da li su preinstalirane ili se ručno dodaju, kako se dodaju). Biblioteke omogućavaju najveći prostor za proširenje jezika, ali u okviru definisane sintakse. Zavisno od namene korišćenja treba razmotriti koji jezik pruža najbolju podršku planiranim aktivnostima. 2.6. Sintaksna ograničenja i slobode Prethodne tehnike omogućavaju dovo denje jezika na nivo prilično blizak govornom jeziku, mada ograničene fleksibilnosti. Ignorisanje praznih karaktera i dodavanje komentara su gotovo obavezne mogućnosti jezika. Time je omogućena dodatna izražajnost koda i dodavanje sadržaja koji nije definisan rečnikom jezika tamo gde nije moguće ili nije praktično postići željenu izražajnost koda.
Tehnike poboljšanja upotrebljivosti sintakse programskih jezika 5 Komentari su blokovi teksta koje kompajler ignoriše. Označavaju se početnim i krajnjim simbolom, i mogu biti umetnuti u kôd ili se nalaziti u zasebnim redovima. Neki ezoterični jezici izbegavaju eksplicitno označavanje komentara pa se komentarom smatra sve što se ne izvršava ili nema značenje. Tako je moguće komentare pisati gotovo bilo gde, neprimetno spojene sa naredbama, čime kôd postaje blizak govornom jeziku. Chef i Shakespeare koriste ovaj princip i tako dobijaju kôd koji izgleda kao recept za pripremanje hrane, odnosno drama u Šekspirovom stilu. Jezici imaju uzak skup naredbi pa rešavanje problema na njima nije toliko jednostavno koliko bi bilo na popularnim jezicima ali pokazuju da je koncept slobodnih jezika, bliskih govornom, izvodiv. This recipe prints the first 100 Fibonacci numbers. It uses an auxiliary recipe for caramel sauce to define Fibonacci numbers recursively. This results in an awful lot of caramel sauce! Definitely one for the sweet-tooths. Ingredients. 100 g flour 250 g butter 1 egg Method. Sift the flour. Put flour into mixing bowl. Serve with caramel sauce. Stir for 2 minutes. Remove egg. Rub the flour until sifted. Stir for 2 minutes. Fold the butter into the mixing bowl. Pour contents of the mixing bowl into the baking dish. Serves 1. Fig. 4. Deo programa na Chef jeziku Beli karakteri imaju bitnu ulogu u izgledu koda. Odluka da li ih ignorisati ili ne dovodi do mogućnosti, odnosno obaveze, uvlačenja koda i označavanja kraja naredbi. Uvlačenje redova može biti ignorisano, dato u vidu estetskih preporuka (C, Pascal), a može biti i deo sintakse - Python odre duje blokove koda na osnovu uvlačenja. Definisanje blokova naredbi i kraja naredbe su blisko povezani. Asembler, Basic i Python ne koriste simbol za kraj naredbe ali su ograničeni na jednu naredbu po redu. C i Pascal familije jezika koriste ; za oznaku kraja naredbe. JavaScript omogućava oba pristupa: naredbu je moguće završiti sa ; ili se ograničiti na jednu naredbu po redu. Izbacivanje potrebe završavanja naredbi znakom ; i definisanje blokova uvlačenjem a ne eksplicitnim navo denjem simbola doprinosi čitljivosti i brzini pisanja koda i eliminiše sintaksne greške izostavljanja tih simbola, ali može stvoriti probleme druge vrste. Grupisanje uvlačenjem stvara problem neraspoznavanja tab i space karaktera, koji mogu proizvesti na oko isto uvlačenje ali za kompajler različito. Nekorišćenje ; može dovesti do nejasnih greški kompajlera a opciono korišćenje do, na prvi pogled, neočekivanog ponašanja koda. JavaScript kôd u 5 vraća undefined jer automatski dodaje ; na kraj reda, nakon return.
6 Petar Prvulović return 0 ; Fig. 5. Primer dvoznačnog koda 2.7. Vizuelni programski jezici Vizuelni programski jezici koriste grafičke simbole i njihove me dusobne odnose kao elemente izražavanja. Pokazali su se pogodnim za opisivanje tokova, objekata i relacija izme du njih. Grafički elementi mogu se posmatrati isto kao i tekstualni. Na primer, sintaksno pravilo zadavanja tipa objektu u tekstualnom obliku može biti <tip> <ime objekta> <kraj naredbe>, dok u grafičkom tu ulogu može imati oblik elementa (kvadrat, elipsa...). Prethodno pomenute tehnike tako mogu da se primene i na vizuelne jezike. Ilustrovaćemo ovo kroz nekoliko primera. UML koristi grafičke elemente za prikaz objekata i linije i strelice za povezivanje objekata. Pravila crtanja pružaju izvesnu slobodu (u izboru veličine, mesta, boje elemenata...) a dodatna sloboda postignuta je konceptom komentara, u vidu pridruživanja teksta i grafike elementima šeme. Scratch omogućava zapisivanje naredbi upotrebom grafičkih elemenata, čime se može dobiti prilično pregledan kôd. Izrada koda može biti sporija od tekstualnog zapisa, pošto je potrebno raditi sa grafičkim editorom ali je potrebno predznanje manje. Naredbe mogu biti predstavljene ikonicama i tekstualnim nazivima a logičke konstrukcije (grananja, skokovi i sl.) grafičkim šablonima u koje je moguće smestiti naredbe. U odre denim uslovima Scratch je projektovan tako da mogu da ga koriste deca uzrasta 5 godina. Piet je ezoterični jezik koji u osnovi koristi princip preimenovanja seta instrukcija. Ime instrukcije dobija se razlikom boja susednih regiona na bitmapi, pri čemu postoji odre den skup boja koje imaju sintaksni značaj. Ostale boje se, u najprostijem slučaju, zanemaruju, tj. tretiraju se kao komentari. Tako je moguće dobiti kôd koji izgleda kao Mondrianove slike. Fig. 6. Piet program
3. Moguće primene i dalji razvoj Tehnike poboljšanja upotrebljivosti sintakse programskih jezika 7 Izbor programskog jezika treba vršiti u skladu sa korisnicima i upotrebnom namenom [12]. Jezik (interfejs) ne bi trebalo da bude svrha sam sebi niti da korisniku nameće suvišne elemente, već da služi kao alat. Tako je moguće vršiti objektivan izbor jezika. [14] je primer razmatranja u ovom kontekstu. Pomenute tehnike daju ideju za definisanje mera. Kao posledica toga, moguće je vršiti pore denje podrške ovakvih tehnika ugra deno u programska okruženja, kao vid benchmarka. Konkretne studije se mogu sprovesti i u evaluaciji plana i programa nastave programiranja u osnovnim i srednjim školama i fakultetima kojima računarstvo nije primarna oblast. Ilustrovaćemo osnovnu ideju na primeru programa za računarstvo i informatiku za gimnazije. Programom je predvi den Pascal koji se kritikuje jer nema primenu u praksi. Sa druge strane, cilj kursa je savladavanje veština modelovanja problema na algoritamski način [8] što Pascal podržava. Pritom sakriva platformske specifičnosti i pruža sintaksu zadovoljavajuće izražajnosti. Ovako je moguće postaviti okvire i izvršiti izbor jezika koji ispunjavaju potrebe nastavnog programa i pokrivaju primećene nedostatke. 4. Zaključak U radu smo postavili programski jezik kao interfejs izme du programera i računara. Tako smo identifikovali neke koncepte ugra dene u sintaksu kako bi poboljšali upotrebljivost programskih jezika i svrstali ih u šest grupa. Data klasifikacija nije konačna i ne obuhvata sve koncepte već pokazuje ideju i postavlja osnovu za dalji rad. Iznete ideje mogu se primeniti kao osnov za ocenjivanje i dizajniranje programskih jezika i alata, a data je ideja primene u izboru programskih jezika u obrazovnom sistemu. References 1. A brief history of small computers, [Online]. Available: http://www.erg.abdn.ac.uk/ gorry/eg3576/comp-history.html (current May 2014) 2. Chef, [Online]. Available: http://www.dangermouse.net/esoteric/chef.html (current May 2014) 3. Comment (computer programming), [Online]. Available: http://en.wikipedia.org/wiki/comment_(computer_programming) (current May 2014) 4. Ook!, [Online]. Available: http://www.dangermouse.net/esoteric/ook.html (current May 2014) 5. Piet, [Online]. Available: http://www.dangermouse.net/esoteric/piet.html (current May 2014) 6. Visual programming language, [Online]. Available: http://en.wikipedia.org/wiki/visual_programming_language (current May 2014) 7. Ook! (2013), [Online]. Available: http://esolangs.org/wiki/ook! (current May 2014) 8. Pravilnik o izmenama i dopunama pravilnika o nastavnom planu i programu za gimnaziju (2013), [Online]. Available: http://www.mpn.gov.rs/dokumenta-i-propisi/nastavni-planovii-programi/srednje-obrazovanje-i-vaspitanje/79-gimnazije/883-pravilnik-o-izmenama-idopunama-pravilnika-o-nastavnom-planu-i-programu-za-gimnaziju (current May 2014) 9. Canneyt, M.V.: Reference guide for free pascal, version 2.6.4 (2014), [Online]. Available: http://www.freepascal.org/docs-html/ref/ref.html (current May 2014) 10. ECMAScript, E., Association, E.C.M., et al.: Ecmascript language specification (2011) 11. Kemeny, J.G., Kurtz, T.E.: A Manual for Basic. CEIR Multi-Acess Computer Service (1965)
8 Petar Prvulović 12. McKeeman, W.M.: Programming language design. In: Compiler Construction. pp. 514 524. Springer (1974) 13. Müller, U.: Brainfuck an eight-instruction turing-complete programming language (1993), [Online]. Available: http://en.wikipedia.org/wiki/brainfuck (current May 2014) 14. Phillips, L.: Scientific computing s future: Can any coding language top a 1950s behemoth? (2014), [Online]. Available: http://arstechnica.com/science/2014/05/scientific-computingsfuture-can-any-coding-language-top-a-1950s-behemoth/ (current May 2014)