250 likes | 437 Views
Skriptni jezici i Java. -podrška za Javascript. Autor: Zvonko Ivić Mentor: mr. sc. Marko Čupić. Zagreb, svibanj 2007. Sadržaj prezentacije:. Općenito o skriptama i Javascriptu Prednosti i nedostatci upotrebe skripti u Javi
E N D
Skriptni jezici i Java -podrška za Javascript Autor: Zvonko Ivić Mentor: mr. sc. Marko Čupić Zagreb, svibanj 2007
Sadržaj prezentacije: • Općenito o skriptama i Javascriptu • Prednosti i nedostatci upotrebe skripti u Javi • Pregled razreda, sučelja i metoda za rad sa skriptama u Javi, popraćeno primjerima • Opis demo aplikacije Kalkulatora • Zaključak
u Javu SE 6.0 ugrađena podrška za skriptne jezike • sadrži skriptni stroj za Javascript: Rhino 1.6R2 • postoje mnogi drugi skriptni strojevi za druge skriptne jezike, te oni se mogu naći i skinuti s stranice:https://scripting.dev.java.net/ • JSR-223 specifikacija nam daje podršku za rad sa skriptnim jezicima preko standardnog sučelja, a detalji specifikacije se mogu naći na: http://www.jcp.org/en/jsr/detail?id=223
Zašto uopće koristiti skriptne jezike? • skriptni jezici nam daju mogućnost da riješimo gotovo svaki problem koji je programskim jezicima moguće riješiti, te to možemo učiniti na jednostavniji i brži način nego što bi to mogli učiniti u objektno-orijentiranim jezicima poput Jave • također, skriptni jezici se u većini slučajeva interpretiraju (iako se mogu i prevoditi), te time omogućuje naizmjenično pisanje i testiranje linije po linije koda, čime se dobiva na dinamičnosti programiranja • no postoji i veliki nedostatak: brzina izvođenje skriptnih jezika je, u usporedbi s recimo Javom, izrazito mala • postoji iznimno velik broj skriptnih jezika, a neki poznatiji među njima su: Javascript, Python, Ruby, itd.
Javascript • za početak, objašnjenje česte pogreške zbog neinformiranosti: Javascript ≠ Java • skriptni jezik kojemu je pravo ime ustvari ECMAScript, dok je JavaScript ime implementacije ECMAScript standarda od Netscape-a i Mozille • najčešće se koristi prilikom izrade Internet stranica, no postoji primjena i na drugim područjima
Prednosti upotrebe skripti u Javi: • rad sa skriptnim jezicima je izuzetno lagan i fleksibilan • skripte se ne moraju prevoditi prije izvođenje, nego se interpretiraju, a kako postoji ciklička povezanost između pisanja koda i testiranja, na taj način se povećava produktivnost programera • skriptni jezici imaju općenito sažetiju sintaksu algoritama od sintakse tih istih algoritama u objektno-orijentiranim jezicima poput Jave • proširenje osnovne funkcionalnosti koda u Javi sa kodom napisanim u skripti, čime se dobiva na modularnosti i promijenjivosti koda • skriptni jezici su jednostavniji za korištenje od Jave, što omogućuje korisnicima s manjim tehničkim znanjem da prošire osnovnu funkcionalnost nekog kompleksnog koda u Javi koristeći jednostavne skripte koje su sami napisali, te time program prilagođavaju vlastitim potrebama
Nedostatak upotrebe skripti u Javi: • skriptni jezici su mnogo puta sporiji od čistog Java koda, te zbog toga kod kombinacije skriptnih jezika i Jave dolazi do velikog smanjenja brzine izvođenja; kasnije u prezentaciji će biti prikazana usporedba testa brzine izvođenje
ScriptEngineManager • razred je odgovoran za otkrivanje raspoloživih skriptnih strojeva kao i za pristupanje primjercima tih strojeva ScriptEngineManager manager = new ScriptEngineManager() ScriptEngineFactory • Sadrži informacije o svim podržanim skriptnim strojevima List<ScriptEngineFactory> list = manager.getEngineFactories(); Metode: getEngineName() getEngineVersion() getLanguageName() getLanguageVersion() getNames() Primjer0.java
ScriptEngine • sučelje čijim metodama pristupamo samom skriptnom stroju ScriptEngine engine = manager.getEngineByName("js"); Metode: put(String key, Object value) -postavlja vrijednost varijable u skripti get(Ştring key) –vraća vrijednost varijable u skripti eval(String script) –obrađuje skriptu predanu kao String eval(Reader script) –obrađuje skriptu predanu kao Reader objekt
moguća pojava dvije vrste iznimki prilikom izvođenja metode eval(): • ScriptException -ako se dogodi greška u skripti • NullPointerException -ako se kao argument metodi preda null • metoda eval() vraća rezultat zadnje izvedene naredbe u skripti Primjer1.java Primjer2.java
Bindings • daje nam mogućnost da radimo s varijablama u skripti po principu ključ/vrijednost Bindings bindings = engine.createBindings(); Metode: put(String key, Object value) -postavlja vrijednost varijable u skripti get(Ştring key) –vraća vrijednost varijable u skripti • metoda eval() sad izgleda: • eval(String script, Bindings bindings) • eval(Reader reader, Bindings biddings) Primjer3.java
unutar skripte možemo koristiti bilo koji razred ili paket koji postoji u Javi, samo ga na početku koda skripte moramo uvesti naredbom importPackage(ime paketa) • nakon što smo to napravili možemo unutar skripte koristiti razred i njegove metoda na isti način kako bi to činili da radimo u Javi • treba imati na umu da u skriptama, za razliku od Jave, ne postoji paket java.lang, tako da taj paket prvo moramo uvesti da bi ga unutar skripte mogli koristiti, dok u Javi za tim nema potrebe Primjer4.java Primjer5.java
Compilable • sučelje čijim metodama radimo sa skriptnim strojem koji dopušta prevođenje skripti Compilable compilable = (Compilable) engine; Metode: compile(String script) –prevodi skriptu predanu kao String i stvara novi objekt tipa CompiledScript compile(Reader script) –prevodi skriptu predanu kao Reader objekt i stvara novi objekt tipa CompiledScript
CompiledScript • razred koji predstavlja prevedenu skriptu CompiledScript script = compilable.compile(String script) CompiledScript script = compilable.compile(Reader script) Metode: eval() –skripta se izvodi s otprije postavljenim vrijednostima eval(Bindings bindings) –skripta se izvodi s vrijednostima postavljenim u primjerak objekta tipa Bindings
Svaki od programa u tablici će biti izveden 10 000 puta, te se rezultati izvođenja nalaze u tablici dolje:
Program Primjer6c.java nam pokazuje jedan praktičan i pametan način kako možemo čuvati kolekciju prevedenih skripti u mapama tako da se one ne moraju svaki puta ispočetka prevoditi. Primjer6c.java
Invocable • sučelje koje nam svojim koji nam omogućuje pozivanje iz Jave funkcija koje se nalaze unutar skripte Invocable invocable = (Invocable) engine; Metode: invokeFunction(String name, Object ... args) -metoda koja poziva funkciju u skripti pod imenom koje se predaje kao prvi argument, s argumentima koji se predaju kao daljnji argumenti ovoj metodi -ova metoda će vratiti vrijednost koju vraća funkcija u skripti Primjer7.java
Demo aplikacija: Kalkulator • na ovoj demo aplikaciji biti će prikazan primjer kada je korisno koristiti kombinaciju Jave i skiptnih jezika • aplikacija predstavlja kalkulator u obrnutoj poljskoj notaciji (postfix notaciji) koji osim standardnih tipka ima i dvije posebne tipke: F1 i F2 • to su tipke čije funkcije možemo programirati pomoću skripti • skripte programiramo pomoću editora koji se otvara zajedno s kalkulatorom, te u kojega upisujemo našu funkciju, te ju tada spremamo u skriptu odgovarajućeg imena koja se nalazi u tekućem direktoriju aplikacije
za potrebe ove prezentacije, imamo pripremljene dvije skripte: prvu koja računa sinus (kao argument prima radijane), te drugu koja računa zadani Fibonacchijev broj (ako je zadan decimalni broj, u obzir se uzima samo njegov cjelobrojni dio) • dio koda u Javi koji se tiče rada sa skriptama u ovoj aplikaciji je identičan onom iz prijašnjih primjera, te jedina stvar koju moramo znati je da iz Jave zovemo funkciju racunaj() u skriptama, te to činimo metodom invokeFunction() sučelja Invocable koju smo prethodno spomenuli, te u toj metodi kao argument predajemo ime funkcije u skripti, u ovom slučaju racunaj(), te referencu na stog na kojem se nalaze operandi • u svakoj od skripta se nalazi funkcija racunaj() koja kao argument prima referencu na stog, te obavlja željene operacije
jedina nova stvar je to ovdje smo uveli obradu iznimki u skripti • Javascript sve iznimke klasificira kao Javascript Error objekt, ili kao neki podtip tog objekta • iznimke izazvane od strane Java metoda će biti također pretvorene (engl. wrapped) u Javascript Error objekt, te se međusobno neće moći razlikovati • Java pruža još jednu pogodnost u radu sa skriptama, a to je da Rhino dodaje javaException svojstvo svakom Javascript Error objektu u trenutku kada se Java iznimka pretvori u Javascript Error • ovo svojsto nam govori o kojem tipu Java iznimke je riječ, pa tako u ovdje u kodu u obradi iznimke prvo uzimamo javaException svojstvo Javascript Error objekta, te tada gledamo je li ono primjerak java.util.EmptyStackException razreda, te ako je, onda obrađujemo tu iznimku na odgovarajući željeni način
Zaključak Prilikom korištenja skripti u Javi treba biti oprezan, jer kao što smo u prezentaciji spomenuli, taj pristup donosi znatno smanjenje u brzini. No kada nam brzina nije od presudne važnosti, a treba nam modularan kod čije ponašanje želimo mijenjati na jednostavan način pomoću koda jednostavne sintakse, onda treba razmisliti o ovom pristupu.