Leserbrev

Instansieringen av Java

Dette leserinnlegget sto i PC MAGAZINE NORGE, no. 9 1996. Redaktørene forkortet det ganske kraftig når det kom til detaljer.

Her er den komplette artikkelen:

Jeg er blant de som har kjøpt meg noen Java bøker. Kanskje har jeg dermed "kjøpt meg inn i eventyret" som John C. Dvorak (PC Magazine, mai) sier. Jeg har i så fall "hatt hjernen ute på service" - fordi jeg inderlig ønsker at Java ikke blir "dødfødt" (juni).

Det skal bli spennende å se om "instansieringen" av Java blant programmerere får noen suksess - men jeg føler meg overbevist om at "erklæringen" av språket er et trekk i riktig retning. Språkkrigen er alt i gang, vi får kaldfronter, og Goliat føler slynga til David som svært truende.

Jeg mener at noe av det viktigste med Java er 1) at pekere er borte - en stor gruppe feil er dermed fjernet, og 2) at språket har støtte for fleroppgavekjøring - behovet for en egen separat sanntidskjerne er derfor borte. I tillegg har Sun fjernet mye av grumset i C og C++ (som header-filer og preprosessoren), og lagt til en del saker (som automatisk minnehåndtering og globale pakkenavn).

Angående mangel på pekere sier Sun at "istedenfor pekeraritmetikk har Java sanne array". Når pekerne er henvist til bakrommet, og man verken får se dem eller bruke dem til noe, så kan man likegodt fjerne dem fra ordlista. Faktisk var det et designmål å unngå dem. De er blitt "abstrahert bort".

Med objektorienterte språk lager man objekter av maler som kalles klasser, med noen arvede og noen nye egenskaper. I sanntidssystemer lager man "tasker" eller oppgaver. Disse er ferdige "program" som andre program igjen kommuniserer med vha. postbokser eller kanaler eller noe liknende. Man kan si at disse to løsningsmetodene ikke har vært lette å forene. Java gjør et forsøk på dette - akkurat som Ada-95 og SDL-92. Det nærmeste man ellers kommer i C-verdenen er C++ og separat sanntidskjerne. Verken C++ eller sanntidskjernen forstår hva en "task" er. Huff og huff.

Ingen har vurdert å ha to samtidige sjafører på en buss, fordi man kan ikke dele på et ratt. Javas "monitor" løser problemet med deling av felles ressurser. Engelskmannen C.A.R. Hoare oppfant "monitor" i 1974. I Java er det opp til brukeren å passe på at dette benyttes rett. Her tillates man friskt å modifisere en godt innelukket variabel med kall fra to samtidige brukere! Bare synd Sun ikke kjente til språket occam, som er basert på den samme Hoares "CSP" teori fra 1978. Ada baserer seg også på CSP, men språket regnes for å være tungt. Occam kompilatoren "tar deg" dersom du forsøker å skrive til en og samme variabel fra parallelle tasker - det vil si - språket har en dypere forståelse av hva en "task" er. Det kan utføre "usage check" av variable. Likevel, Java har begrepene "thread" og "synchronized", pluss operander på "monitor", så man kan bygge mye oppå disse primitivene. Men uansett hvilken paradigme man bygger på toppen av Java, så vil Java kompilatoren kun forstå Java, ikke den nye paradigmen. Derfor burde man lagt seg litt høyere enn "monitor". Likevel, det går an å se det positive med Java uten å ha hjernen på service!

En annen viktig ting med Java er alle bibliotekene som er definert. Modula-2 kode var ikke skikkelig portabel fordi bibliotekene ikke ble definert da språket var nytt. I Java har man nesten et helt vindus-basert nettverk multitasking operativsystem bygd inn fra første dag!

Ada er et språk hvor skalerbarhet er satt i høysetet. Det skal være mulig å utvikle kjempestore applikasjoner uten å miste oversikten. Jeg tror Java er på rett spor med sitt ene programkode format. Dette inneholder portabel kjørbar kode og type-informasjon.

På flere punkt kunne Javas språkdefinisjon vært enda sprekere. Jeg skal gi et par eksempler: sideeffekter og "alias" - feil.

x=y[i]+y[i++] er lovlig Java kode, men hva x til slutt blir er avhengig av evalueringsrekkefølgen. I Java skal "sideeffekter" beregnes først. Jeg mener at Java anno 1996 ikke burde ha tillatt sideeffekter i uttrykk i det hele tatt.

Dessuten tillater språket såkalte "alias"-feil. Man kan lage kode som tilsvarer at man først kjører x=x+y og deretter x=x-y, og svaret blir x=x (ok) eller x=0 (oops!) (Komplett programeksempel i Java ville tatt en halv side). Det blir ikke null epler på fatet hvis jeg ombestemmer meg og legger eplet tilbake! Jeg vet bare om occam som verken tillater sideeffekter eller alias-feil. Sideeffekter fjernes så vidt jeg vet stort sett i språkdefinisjon, alias-feil fjernes ved at kompilatoren "kjører" generert kode for å se om noen minneposisjon bærer mer enn et navn.

Det er flott at Java kan benyttes over internett, og at det er portabelt. Det gir håp at språket i seg selv er så bra som det er. Da kan det kanskje benyttes til mer enn internettprogrammering. Alle de flotte overbygningene over C++ burde så absolutt migrere til Java-verdenen. På den måten kunne grunnmuren stått litt mer i forhold til resten av huset.

Øyvind Teig, Autronica