arvostelija Java-virtuaalikone Heikki Korhola Helsinki HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
|
|
- Joel Lahtinen
- 8 vuotta sitten
- Katselukertoja:
Transkriptio
1 hyväksymispäivä arvosana arvostelija Java-virtuaalikone Heikki Korhola Helsinki HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
2 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta Fakultet Faculty Laitos Institution Department Matemaattis-luonnontieteellinen tiedekunta Tekijä Författare Author Heikki Korhola Työn nimi Arbetets titel Title Tietojenkäsittelytieteen laitos Java-virtuaalikone Oppiaine Läroämne Subject Tietojenkäsittelytiede Työn laji Arbetets art Level Aika Datum Month and year Sivumäärä Sidoantal Number of pages Kandidaatintutkielma sivua Tiivistelmä Referat Abstract Sun Microsystemsin Java on 1990-luvun alussa kehitetty uudenaikainen ohjelmointi- ja ohjelmien suoritusympäristö, jonka sydämessä on Java-virtuaalikone, abstrakti tietokone, jonka konekieli on Java-tavukoodi. Virtuaalikoneteknologian ansiosta Java-ympäristölle laaditut sovellusohjelmat ovat siirrettäviä, turvallisia ja kohtuullisen suorituskykyisiä. Java-tavukoodi on laitteistoriippumaton välikieli. Java-tavukoodiohjelmat esitetään laitteistoja käyttöjärjestelmäriippumattomassa class-tiedostomuodossa. Java-tavukoodiohjelmia suoritetaan tavallisimmin ohjelmallisella Java-virtuaalikonetoteutuksella. Java-virtuaalikonetoteutus on olemassa useille erilaisille laitteisto- ja käyttöjärjestelmäympäristöille, mukaan lukien kaikki yleisimmät nykyiset kotitietokoneet. Java-tavukoodiohjelmat toimivat millä tahansa Java-virtuaalikoneella samalla tavalla. Virtuaalikoneteknologia mahdollistaa myös sovellusohjelmien luotettavuus- ja turvallisuusominaisuuksien parantamisen. Keskeinen virtuaalikoneen määritelmään kuuluva ominaisuus on, että virtuaalikoneen sisällä suorittavien ohjelmien käytettävissä on ainoastaan virtuaalikoneen itsensä määrittelemät toiminnot. Java-virtuaalikoneen rakenne ja toiminnot on määritelty etenkin ohjelmien turvallisuutta silmälläpitäen. Tämä on tärkeää erityisesti verkkosivuille sulautettujen sovelmien (applet) tapauksessa, jossa suoritettavaa koodia ladataan tietoliikenneverkon ylitse mahdollisesti epäluotettavista lähteistä. Java-tavukoodin suorittaminen ohjelmallisesti on luonnollisesti konekielisten ohjelmien suorittamista raskaampaa. Nykyaikaiset Java-virtuaalikonetoteutukset nykyaikaisilla tietokoneilla saavuttavat kuitenkin jo niin korkean suorituskyvyn, ettei erolla ole useimmissa sovelluksissa merkitystä. ACM Computing Classification System (CCS): C.1.3 [Other Architecture Styles], D.3.4 [Processors] Avainsanat Nyckelord Keywords java, virtuaalikone Säilytyspaikka Förvaringsställe Where deposited Muita tietoja övriga uppgifter Additional information
3 Sisältö ii 1 Johdanto 1 2 Java-virtuaalikoneen rakenne ja toiminta 3 3 Class-tiedostomuoto 7 4 Suoritusaikaiset tapahtumat 11 5 Verifikaatio ja poikkeukset 12 6 Esimerkki: Hello, world! 15 7 Yhteenveto 18 Lähteet 19
4 1 Johdanto 1 Termillä virtuaalikone tarkoitetaan joko abstraktia tietokonetta yleensä tai sellaisen toteutusta, eli ohjelmaa, joka jäljittelee (emuloi) abstraktin koneen toimintoja. Abstraktin koneen toiminnot voidaan määritellä samoiksi kuin jollakin todellisella koneella, mutta nykyinen virtuaalikoneen määritelmä kattaa myös koneet, joilla ei ole mitään suoraa vastaavuutta todellisiin koneisiin [SmN05, s. 35]. Jälkimmäiseen ryhmään kuuluu Sun Microsystemsin Java-teknologian kulmakivi, Java-virtuaalikone (Java Virtual Machine, JVM). Java-teknologian alkuperäisenä ja pääasiallisena tarkoituksena on mahdollistaa sovellusohjelmien laatiminen Java-ohjelmointikielellä ja niiden suorittaminen turvallisesti ja kohtuullisen tehokkaasti monissa erilaisissa laitteisto- ja käyttöjärjestelmäympäristöissä. Tyypillisesti Java-lähdekieliset ohjelmat käännetään välikielelle, Java-tavukoodiksi (Java bytecode), jota suoritetaan ohjelmallisesti Java-virtuaalikonetoteutuksella. Tämä poikkeaa perinteisestä ohjelmien levitysmallista, jossa loppukäyttäjälle tarkoitetut ohjelmat ovat jonkin tietyn käyttöjärjestelmän binääriformaatissa ja jonkin tietyn todellisen suorittimen konekielellä. Selkeänä etuna virtuaalikonemallissa on paitsi ohjelmien huomattavasti korkeampi siirrettävyys, myös mahdollisuus parantaa niiden luotettavuus- ja turvallisuusominaisuuksia. Virtuaalikoneen malli lainattiin Java-teknologiaan aikaisemmasta UCSD p-system -järjestelmästä [All04, s. 26]. P-System oli kokonainen käyttöjärjestelmä, joka oli helposti siirrettävissä eri laitteistoalustoille. Sen ytimessä oli virtuaalikone, joka suoritti p-koodia, kuvitellun koneen konekieltä, ohjelmallisesti. P-systemin ytimen ulkopuoliset osat oli kirjoitettu UCSD:n omalla Pascal-kielen muunnelmalla ja käännetty p-koodiksi. Uudelle laitteistoalustalle tarvitsi siis laatia vain pieni p-kooditulkki ja muut järjestelmän osat toimivat sen kanssa muokkaamattomina. P-system ei koskaan levinnyt akateemisen yhteisön ulkopuolelle. Java-toteutus sen sijaan löytyy nykyään yli 4,5 miljardista laitteesta [Sun09a]. Näiden laitteiden joukkoon kuuluu tavanomaisten pöytäkoneiden ja palvelimien lisäksi matkapuhelimia, sirukortteja ja jopa lääketieteellisiä koneita [Sun09a]. Selkein ero Java-tavukoodiohjelmien ja perinteisten konekielisten ohjelmien välillä on Java-tavukoodiohjelmien laitteisto- ja käyttöjärjestelmäriippumattomuus. Javatavukoodiohjelmat on tarkoitettu jollekin tietylle (yleensä taaksepäin yhteensopivalle) Java-ympäristön standardille. Java-ympäristön standardiin kuuluu virtuaalikoneen lisäksi oleellisena osana standardikirjasto. Yleisin Java-ympäristön standardi
5 2 on Java SE (Standard Edition). Kutsutaan virtuaalikoneen ja standardikirjaston toteutusta yhdessä Java-toteutukseksi. Sunin oma Java-toteutus (Java SE Runtime Environment 6u13) on saatavilla Windowsille (x86, x64, Itanium), Linuxille (x86, x64, Itanium) ja Solarikselle (x86, x64 ja SPARC) [Sun09b]. Apple ylläpitää Mac OS X:lle omaa Java-toteutustaan [App09]. Nämä kattavat yli 95% Internetiin kytketyistä tietokoneista [Usa09]. Java-virtuaalikoneita on laadittu myös useille muille eri laitteisto- ja käyttöjärjestelmäympäristöille muiden instituutioiden toimesta [Lis09]. Suuri osa Javan ydinteknologioiden lähdekoodista on nykyään vapaasti saatavilla GPL-lisenssin alaisena [Sun09c]. Tämä helpottaa tarvittaessa oman Java-toteutuksen laatimista myös mille tahansa muulle halutulle laitteistolle tai käyttöjärjestelmälle. Tavukoodiohjelmien suorittaminen ohjelmallisesti virtuaalikonetoteutuksella on selkeästi raskaampaa kuin konekielisten ohjelmien suorittaminen suoraan laitteistolla. Alkuaikojen virtuaalikoneet saattoivat olla 1000 kertaa vastaavaa oikeaa konetta hitaampia [Gol74, s. 35]. On selvää, ettei oikeiden, isojen ohjelmien suorittaminen tällä tavoin ole kovin mielekästä. Nykyaikaiset tietokoneet ja nykyaikaiset virtuaalikoneet sen sijaan ovat jo niin tehokkaita, ettei virtuaalikoneen lisärasite ole enää ratkaisevan suuri. Java-tavukoodiohjelmien suorituskyky nykyaikaisilla virtuaalikonetoteutuksilla on jo samassa suuruusluokassa vastaavien konekielelle käännettyjen C++-ohjelmien kanssa [Cow04]. Javan luotettavuus ja turvallisuus ovat seurausta virtuaalikoneen mahdollistamasta tavasta suorittaa sovellusohjelmia hiekkalaatikossa (sandbox), eristyksissä virtuaalikoneen ulkopuolisesta ympäristöstä. Java-virtuaalikonetta voisi sanoa oliopohjaiseksi tietokoneeksi. Java-tavukoodi ei oikeista matalan tason konekielistä poiketen tarjoa mahdollisuuksia eksplisiittiseen muistinhallintaan tai osoitinaritmetiikkaan. Tämä estää esimerkiksi osoittimien väärentämisen (pointer forging) [Eis97, 2]. Java-virtuaalikoneen staattinen verifikaatiomekanismi varmistaa class-tiedostojen osittaisen turvallisuuden jo ennen suoritusta. Myös suoritusaikaisten virheiden vaikutusalue pyritään rajaamaan virtuaalikoneen sisälle, siten että Java-tavukoodiohjelmat eivät koskaan kaataisi isäntäkonetta.
6 2 Java-virtuaalikoneen rakenne ja toiminta 3 Nykyaikaisia yleiskäyttöisiä tietokoneita (mukaanlukien IBM-PC -yhteensopivat) voidaan tarkastella hierarkisina järjestelmien järjestelminä [Sta06, 1.2]. Niistä voidaan korkealla tasolla erotella komponentteja kuten suoritin, keskusmuisti ja lisälaiteväylä. Suoritinta itseään voidaan puolestaan tarkastella järjestelmänä josta voidaan erottaa komponentteja kuten kontrolliyksikkö ja aritmeettis-looginen yksikkö. Asioiden tarkasteleminen tällä tavalla ylhäältä alaspäin helpottaa asiakokonaisuuksien ymmärtämistä perustuen tapaan, jossa tarkoituksella pyritään unohtamaan kulloinkin epäolennaiset yksityiskohdat. The Java T M Virtual Machine Specification [LiY97] määrittelee abstraktin tietokoneen, Java-virtuaalikoneen (Java Virtual Machine, JVM). Tässä luvussa käytän termiä Java-virtuaalikone tarkoittamaan vain tätä abstraktia konetta, jonkin tietyn toteutuksen sijaan. Java-virtuaalikoneella on paljon yhteistä oikeiden tietokoneiden kanssa. Sitä voidaan luontevasti tarkastella hyvin samaan tapaan kuin oikeita tietokoneita. Esittelen seuraavassa lyhyesti Java-virtuaalikoneen rakennetta osoittamalla sen yhtäläisyydet ja eroavaisuudet oikeisiin tietokoneisiin. Oikeiden tietokoneiden tärkeimpinä komponentteina voidaan pitää suoritinta ja keskusmuistia. Suoritin kykenee lukemaan ja kirjoittamaan keskusmuistiin tallennettua tietoa ja suorittamaan aritmeettisia ja loogisia toimituksia. Suorittimessa on sisäinen pc-rekisteri (program counter), joka osoittaa keskusmuistissa olevaan konekäskyyn (pc-rekisteri voi osoittaa myös muistipaikkaan jonka sisältöä ei ole tarkoitettu tulkittavaksi käskyksi). Suorittimen käskykanta-arkkitehtuuri (instruction set architecture, ISA) määrittelee minkä muotoinen tieto voidaan tulkita käskyksi ja millä tavalla. Tietokoneen toiminta perustuu yksinkertaistettuna nouda-ja-suorita -sykliin, jossa suoritin toistuvasti noutaa pc-rekisterin osoittamasta muistipaikasta sanan tietoa, tulkitsee sen koodaaman käskyn (purkaa siitä operaatiokoodin ja operandit), suorittaa kyseisen operaatiokoodin määräämät toimenpiteet ja (poislukien hyppykäskyt) kasvattaa pc:n arvoa yhdellä. Näin suoritin siis toistuvasti suorittaa käskyjä peräkkäisistä muistipaikoista, ellei hyppykäskyillä toisin määrätä. Nykyaikaiset suorittimet ovat yleensä arkkitehtuuriltaan rekisteripohjaisia. Tämä tarkoittaa tässä yhteydessä sitä, että esimerkiksi laskutoimitusten suorittaminen perustuu tapaan, jossa keskusmuistista noudetaan konekäskyillä dataa suorittimen ulkoisiin (konekäskyillä manipuloitaviin) rekistereihin, laskutoimitukset suoritetaan
7 prosessorin sisällä ja lopputulos tallennetaan ulkoiseen rekisteriin (josta se voidaan tarvittaessa tallentaa taas keskusmuistiin erillisellä käskyllä). Java-virtuaalikone on pinokone. Tämä tarkoittaa, että laskutoimitukset tapahtuvat operandipinon välityksellä. Esimerkiksi yhteenlasku koostuu kahden luvun asettamisesta operandipinoon push-käskyillä ja add-käskyn suorittamisesta. Add-käsky poimii operandipinon päältä kaksi lukua, laskee niiden summan ja asettaa sen operandipinon päälle. Pinopohjaisen arkkitehtuurin ansiosta koodista tulee hieman tiivimpää, joka on eduksi esimerkiksi siirrettäessä koodia tietoliikenneverkon ylitse (esimerkiksi verkkosivuille sulautettujen sovelmien tapauksessa). Operandipinolla ja pinopohjaisilla arkkitehtuureilla ei ole mitään tekemistä myöhemmin esiteltävän kehyspinon kanssa. Java-virtuaalikoneen konekieli on Java-tavukoodi (Java bytecode). Tavukoodia kutsutaan välikieleksi, koska se on abstraktiotasoltaan korkean tason kielten (kuten Java) ja oikeiden konekielten välissä. Se on riittävän korkealla tasolla mahdollistaakseen turvallisen oliopohjaisuuden ja riittävän matalalla tasolla, jotta sitä voidaan tehokkaasti suorittaa oikeilla koneilla. Tavukoodi-nimitys juontuu operaatiokoodien pituudesta. Ne ovat 8-bittisiä tavuja, ja mahdollisia operaatiokoodeja on siis 256. Käskykannassa on paljon erilaisia vakionlatauskäskyjä (kuten iconst_1, joka asettaa pinon päälle kokonaisluvun 1), jotka ovat olemassa vain tehokkuussyistä. Niissä jonkin tyyppinen vakio (esimerkiksi 1, 0 ja -1) on ilmaistu kiinteästi käskyssä itsessään. Tällä tavoin vältetään tällaisten usein käytettyjen vakioiden välittäminen operandeina (iconst 1 ilman alaviivaa on toiminnallisesti sama käsky kuin iconst_1, mutta siinä 1 on välitetty operandina). Java-virtuaalikoneen tyypitettyjen operaatioiden vuoksi useimmille alkeistyypeille on omat, sinänsä toisteiset, vastaavat käskynsä. Java-virtuaalikoneen alkeistyypit ovat enimmäkseen samat kuin Java-kielen. Ne ovat [LiY97, 3.2]: byte: 8-bittinen etumerkillinen kokonaisluku kahden komplementti -muodossa. Ei voida käyttää operandina aritmeettisissa operaatioissa. short: 16-bittinen etumerkillinen kokonaisluku kahden komplementti -muodossa. Ei voida käyttää operandina aritmeettisissa operaatioissa. int: 32-bittinen etumerkillinen kokonaisluku kahden komplementti -muodossa. long: 64-bittinen etumerkillinen kokonaisluku kahden komplementti -muodossa. char: 16-bittinen etumerkitön kokonaisluku, joka esittää Unicode-merkkiä. 4
8 float: 32-bittinen IEEE 754-standardin mukainen (pienin poikkeuksin) liukuluku double: 64-bittinen IEEE 754-standardin mukainen (pienin poikkeuksin) kaksoistarkkuuden liukuluku boolean: totuusarvotyyppi, jonka arvo on joko tosi tai epätosi. Ei voida käyttää operandina aritmeettisissa operaatioissa. JVM ei sisällä erikoisoperaatioita boolean-tyyppisiä muuttujia varten joten lausekkeissa esiintyvät totuusarvot on koodattava esimerkiksi int-tyypin arvoiksi 1 (tosi) ja 0 (epätosi). Booleantyyppiset taulukot on toteutettu byte-taulukoina käyttäen edellämainittua 1-0 -koodausta. reference: viittaustyyppi jonka arvo on viittaus keosta varattuun luokkatyyppiseen, rajapintatyyppiseen tai taulukkotyyppiseen olioon tai erityinen nullarvo, joka merkitsee viittausta ei-mihinkään. Ei voida muokata suorituksen aikana tavukoodikäskyillä. Ei voida käyttää operandina aritmeettisissa operaatioissa. returnaddress: viittaustyyppi, joka osoittaa tavukoodikäskyyn. Ei voida muokata suorituksen aikana tavukoodikäskyillä. Ei voida käyttää operandina aritmeettisissa operaatioissa. 5 Java-tavukoodi on staattisesti (tyypit ovat muuttujien, eivät arvojen ominaisuuksia) ja vahvasti tyypitetty kieli. Java-tavukoodin vahva tyypitys ilmenee edellämainituissa vakionlatauskäskyissä ja aritmeettisissa käskyissä. Eri alkeistyypeille on omat käskynsä, jotka periaatteessa eroavat toisistaan vain operandiensa tyypissä. Esimerkiksi iadd-käsky ei merkitse ainoastaan, että operandeilla suoritetaan kokonaislukuyhteenlasku, vaan operandien on todella oltava kokonaislukuja. Vastaavasti fadd-käsky laskee yhteen kaksi yksöistarkkuuden liukulukua. Yritykset käyttää operandeille väärän tyyppisiä käskyjä havaitaan koodin verifikaatiovaiheessa [LiY97, 4.9.2]. Byte-, short- ja char-tyyppiset arvot laajennetaan automaattisesti int-tyyppisiksi jos ne esiintyvät aritmeettisten operaatioiden operandeina [LiY97, ]. Viittaustyyppisillä (reference) arvoilla ei voi suorittaa laskutoimituksia, eikä niille siksi tarvita tyypitettyjä operaatioita siinä missä kokonaisluvuille tai liukuluvuille. Tyypitettyjen käskyjen toteuttaminen kaikille luokkatyypeille ei ole käytännössä mahdollista. Luokkatyyppiset arvot eivät kuitenkaan jää tyyppijärjestelmän ulkopuolelle. Kaikkia luokkatyyppisiä arvoja käsitellään a-alkuisilla operaatioilla (esimerkiksi aload i lataa operandipinon päälle viittauksen aktiivisen kehyksen paikallisten muuttujien taulukon indeksistä i). Luokkatyyppisten arvojen oikea käyttö varmistetaan osittain staattisella verifikaatiolla ja osittain suorituksen aikana poikkeusten avulla.
9 6 Java-virtuaalikoneen tärkeimmät komponentit ylimmällä abstraktiotasolla ovat säie (thread), luokka-alue (method area) ja keko (heap). Säikeen tärkeimmät komponentit puolestaan ovat pc-rekisteri ja kehyspino (Java Virtual Machine stack). Luokka-alueen komponentit ovat luokkia. Keon komponentit ovat olioita. Eritellään seuraavassa hieman tarkemmin näiden komponenttien koostumusta ja tarkoitusta. Java-virtuaalikoneen suoritin on säie, joita voi olla useampia kuin yksi (verrattavissa monisuoritinkoneisiin ja/tai moniydinprosessoreihin). Koska Java-virtuaalikone on abstrakti kone, sen kuvaamiseen voidaan käyttää (ja on käytetty) abstraktimpeja käsitteitä kuin mitä oikeiden, käsinkosketeltavien tietokoneiden tekniseen kuvaamiseen vaaditaan. Yksittäinen säie pitää sisällään paitsi pc-rekisterin, jolla on suhteellisen suora vastaavuus samannimiseen oikeiden suorittimien komponenttiin, myös kehyspinon, joka on käsitteellisesti huomattavasti korkeammalla tasolla. Pc-rekisteri osoittaa luokka-alueelle, suorituksessa olevan metodin luokan metodialueelle suorituksessa olevaan tavukoodikäskyyn. Pc-rekisteri ei koskaan osoita minnekään muualle kuin jonkin metodin tavukoodikäskyyn, esimerkiksi sattumanvaraiseen tietoon jota ei ole tarkoitettu tulkittavaksi käskyksi. Kehyspinon tarkoitus on metodikutsujen toteuttaminen. Se vastaa pitkälti lohkorakenteisten kielten kutsupinoa. Kehyspino sisältää kehyksiä, joista kerrallaan yksi, pinon päällimmäinen, on aktiivinen. Yksittäinen kehys sisältää metodin suorittamista varten tarvittavia tietoja, erityisesti operandipinon, metodin paikalliset muuttujat sisältävän taulukon, ja viittauksen metodin sisältävän luokan vakioalueelle. Pinon päälle luodaan uusi kehys metodia kutsuttaessa ja se tuhotaan metodin suorituksen loputtua joko normaalisti tai poikkeuksen kautta. Luokka-alue sisältää luokkakohtaisia tietoja. Käsitteellisesti voi olla helpompaa ajatella sen sisältävän luokkia, vaikka tämä ei täysin pitäisikään paikkaansa. Java-virtuaalikoneen luokka sisältää vakiotaulukon ja metodien suoritettavan tavukoodin. Vakiotaulukko sisältää suoritusaikana tarvittavia vakioita (esimerkiksi koodissa viitattujen muiden luokkien symbolisia tai konkreettisia tunnisteita). Keko on muistialue, josta kaikki tavukoodiohjelmien ohjaamat muistinvaraukset tehdään. Muistia voidaan varata keosta ainoastaan luomalla sinne olio tai taulukko newoperaatiolla. Keon komponentit ovat luokkien ilmentymiä, olioita, jotka sisältävät vain ilmentymäkohtaisia tietoja. Esimerkiksi (sekä staattisten että ei-staattisten) metodien koodi sijaitsee luokka-alueella kyseessä olevan luokan metodialueella, ei monistettuna jokaiseen kyseisen luokan ilmentymään keossa. Java-virtuaalikoneessa on automaattinen muistinhallinta, eli se käyttää roskienke-
10 7 rääjää (garbage collector) vapauttamaan tarpeettomaksi jääneet muistialueet sopivaksi katsomanaan ajankohtana. Tämä voidaan katsoa sekä hyödyksi että haitaksi. Automaattinen muistinhallinta vapauttaa ohjelmoijan (tai kääntäjän) tarpeesta pitää kirjaa muistinvarauksista ja tekee muistivuodot käytännössä mahdottomiksi. Haittaa tästä voi olla ympäristöissä, joissa käytettävissä oleva muistin määrä on vähäinen ja ohjelmoija voisi eksplisiittisellä muistinhallinnalla käyttää sen paremmin hyödyksi. 3 Class-tiedostomuoto Java-virtuaalikoneelle tarkoitetut ohjelmat esitetään class-tiedostomuodossa. Classtiedosto sisältää täydellisen kuvauksen yksittäisestä luokasta tai rajapinnasta. Varsinaisen luokkamäärittelyn lisäksi class-tiedosto sisältää myös muuta tarpeellista informaatiota, kuten vakiotietuetaulukon (constant pool table). Java-virtuaalikone rakentaa annetun class-tiedoston perusteella itselleen sisäisen, suoritusaikaisen esityksen tiedoston kuvaamasta luokasta. Class-tiedosto on 8-bittisten tavujen sarja. Esittelen tässä class-tiedoston rakennetta käyttäen samaa pseudotietue -merkintätapaa kuin The Java T M Virtual Machine Specificationissa [LiY97]. Tyypit u1, u2 ja u4 määritellään tarkoittamaan etumerkittömiä yhden, kahden ja neljän tavun suuruuksia, tässä järjestyksessä. Useamman kuin yhden tavun suuruudet on koodattu big-endian -järjestyksessä. Tyyppinimet cp_info, field_info, method_info ja attribute_info määritellään tarkemmin myöhemmin (sanottakoon tässä vaiheessa, että ne ovat tietueita). Class-tiedosto on seuraavan muotoinen [LiY97, 4.1]: ClassFile { u4 magic; u2 minor_version; u2 major_version; u2 constant_pool_count; cp_info constant_pool[constant_pool_count - 1]; u2 access_flags; u2 this_class; u2 super_class; u2 interfaces_count; u2 interfaces[interfaces_count]; u2 fields_count; field_info fields[fields_count];
11 8 } u2 methods_count; method_info methods[methods_count]; u2 attributes_count; attribute_info attributes[attributes_count]; Tutkitaan seuraavassa hieman tarkemmin tämän tietueen sisältöä. Kenttä magic on taikaluku, joka identifioi class-tiedostomuodon. Sen arvo on heksadesimaaliluku CAFEBABE. Taikaluvun olemassaoloa voidaan perustella sillä, että esimerkiksi virtuaalikoneelle tarjotut muut kuin class-tiedostot tai korruptoituneet tiedostot voidaan hylätä heti kättelyssä. Kentät minor_version (m) ja major_version (M) yhdessä tulkitaan versionumeroksi M.m. Versionumeron tarkoitus on ilmaista mille Java-ympäristön versiolle tiedosto on tarkoitettu. Java-ympäristön ja siihen kuuluvan virtuaalikoneen tukemien class-tiedostojen versionumeroiden arvoalue on erikseen määritelty kyseessä olevan Java-ympäristön julkaisuversion standardissa. Kenttä constant_pool_count on kokonaisluku, joka on (harhaanjohtavasti) yhtä suurempi kuin tiedostossa seuraavan constant_pool-taulukon alkioiden lukumäärä. Taulukossa constant_pool on alkioita siis constant_pool_count - 1 kappaletta. Taulukko constant_pool sisältää cp_info-tyyppisiä tietueita, jotka kuvaavat erilaisia merkkijonoja, luokkien ja kenttien nimiä ja muita vakioita joihin muualla tiedostossa viitataan. Nämä cp_info-tietueet ovat seuraavan muotoisia: cp_info { u1 tag; u1 info[]; } Tietueen cp_info kenttä tag on kokonaisluku, joka koodaa kyseessä olevan vakion tyypin, esimerkiksi CONSTANT_FieldRef (kenttä) tai CONSTANT_String (merkkijono). Taulukko info tulkitaan kentän tag ilmaisemalla tavalla. Seuraavana tiedostossa on kenttä access_flags, joka koodaa luokan näkyvyysmääreet rajattuna yhdistelmänä seuraavista arvoista: public, final, super, interface, abstract. Kentät this_class ja super_class tulkitaan indekseiksi constant_pool-taulukkoon. Kyseessä olevan indeksin on osoitettava tietueeseen, joka ensimmäisessä tapauksessa
12 9 on tämän luokan kuvaus ja jälkimmäisessä tämän luokan yliluokan kuvaus. Mikäli tiedoston kuvaama luokka on Object, super_classin arvo on 0 (nolla). Kenttä interfaces_count on kokonaisluku, joka ilmaisee tämän luokan toteuttamien rajapintojen lukumäärän ja siten seuraavan interfaces-taulukon alkioiden lukumäärän. Taulukon interfaces alkiot ovat kokonaislukuja, joiden on oltava indeksejä constant_pool-taulukkoon ja constant_pool-taulukon kyseisessä indeksissä sijaitsevan tietueen on kuvattava kulloinkin kyseessä oleva rajapinta. Kenttä fields_count on kokonaisluku, joka ilmaisee tämän luokan kenttien lukumäärän ja siten seuraavan fields-taulukon field_info-tyyppisten tietueiden lukumäärän. Näiden field_info-tietueiden muoto on seuraava: field_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; } Tietue field_info kuvaa siis kentän nimen, näkyvyysmääreet, kuvauksen (descriptor) ja kentän attribuutit. Kentän attribuutit eli ominaisuudet on kuvattu attribute_info-tietueissa, joiden muoto on seuraava: attribute_info { u2 attribute_name_index; u4 attribute_length; u1 info[attribute_length]; } Kenttä attribute_name_index on kokonaisluku, joka tulkitaan indeksiksi tämän tiedoston constant_pool-taulukkoon. Taulukon constant_pool kyseisessä indeksissä oleva cp_info-tyyppinen tietue kuvaa attribuutin nimen. Osa attribuuteista (tarkalleen ottaen attribuuttien nimistä) on ennalta määriteltyjä osana classtiedostomuodon standardia. Kentille määriteltyjä attribuutteja ovat ConstantValue (kenttä on staattinen), Synthetic (kenttä on kääntäjän generoima eikä esiinny lähdetiedostossa) ja Deprecated (kenttä on vanhentunut). Seuraavana tiedostossa tuleva kenttä methods_count on kokonaisluku, joka ilmaisee tämän luokan metodien lukumäärän ja siten seuraavan methods-taulukon
13 method_info-tyyppisten tietueiden lukumäärän. Näiden method_info-tietueiden muoto on seuraava: method_info { u2 access_flags; u2 name_index; u2 descriptor_index; u2 attributes_count; attribute_info attributes[attributes_count]; } 10 Tietue method_info kuvaa siis metodin nimen, näkyvyysmääreet, kuvauksen ja attribuutit. Metodeille määriteltyjä attribuutteja ovat Code, Exceptions (kuvaa metodin aiheuttamat tarkistetut poikkeukset), Synthetic ja Deprecated. Code-nimisten attribuuttien info-taulukko tulkitaan Code_attribute-tyyppiseksi tietueeksi. Näiden Code_attribute-tietueiden muoto on seuraava: Code_attribute { u2 attribute_name_index; u4 attribute_length; u2 max_stack; u2 max_locals; u4 code_length; u1 code[code_length]; u2 exception_table_length; { u2 start_pc; u2 end_pc; u2 handler_pc; u2 catch_type; } exception_table[exception_table_length]; u2 attributes_count; attribute_info attributes[attributes_count]; } Tämän tietueen tarkka muoto ja yksityiskohdat eivät ole tämän tutkielman kannalta kovin kiinnostavia. Tässä vaiheessa riittää tietää, että luokan metodien tavukoodi on luettavissa methods-taulukon method_info-tietueiden attributes-taulukon attribute_info-tietueiden info-taulukoista. Lopuksi class-tiedostosta luetaan tämän luokan attribuutit taulukosta attributes. Luokan attribuuttien muoto on sama kuin edellä kuvatuilla kentillä ja metodeilla,
14 11 mutta ainoat luokille määritellyt attribuuttityypit (nimet) ovat SourceFile (kuvaa lähdetiedoston josta tämä class-tiedosto on käännetty) ja Deprecated. Taikaluvun analogia class-tiedoston häntäpäässä on tiedoston loppuminen oikeassa kohdassa. Mikäli tiedosto loppuu kesken tai sen lopussa on ylimääräisiä bittejä, tiedostoa ei tulkita korrektiksi class-tiedostoksi. 4 Suoritusaikaiset tapahtumat Tyypillisessä nykyaikaisessa käyttöjärjestelmässä, johon on asennettu Java-ympäristön toteutus, esimerkiksi komentorivi java HelloWorld aiheuttaa Java-virtuaalikoneen käynnistymisen. Tämä virtuaalikone suorittaa toimet, jotka johtavat HelloWorldluokan paikallistamiseen, lataamiseen (loading), linkitykseen (linking), alustukseen (initialization) ja sen main(string[])-metodin kutsumiseen. Java-virtuaalikone aloittaa luomalla toteutuskohtaisen aloitusluokan (initial class), lataamalla sen bootstrap-lataimella ja linkittämällä sen [LiY97, 5.2]. Virtuaalikone käynnistää ensimmäisen säikeen ja kutsuu aloitusluokan main-metodia, jonka suoritus ohjaa virtuaalikoneen toimintaa tästä eteenpäin. Erityisesti se voi siis aiheuttaa muiden luokkien lataamisen, linkityksen ja niiden metodien suorittamisen. Kun jonkin luokan jotakin metodia kutsutaan, virtuaalikone tarkistaa, että kyseessä oleva luokka on ladattu, eli että virtuaalikoneella on siitä sisäinen, suoritusaikainen esitys. Jos näin ei ole, luokka on ladattava. Luokan lataaminen koostuu luokan kuvaavan class-tiedoston paikallistamisesta ja luokan suoritusaikaisen esityksen johtamisesta siitä tulkitsemalla se class-tiedostomuodon määrittelemällä tavalla. Luokka voidaan ladata joko virtuaalikoneen sisäisellä bootstrap-lataimella tai käyttäjän määrittelemällä lataimella. Käyttäjän määrittelemät lataimet ovat ClassLoaderluokan perillisiä, ja ne mahdollistavat luokkien lataamisen epätavallisilla tavoilla, esimerkiksi purkamalla ne kryptatuista tiedostoista tai lataamalla ne suoraan verkosta. Linkitys koostuu luokan verifikaatiosta (verification) ja valmistelusta (preparation). Verifikaatiolla pyritään varmistamaan luokan turvallisuus, ja se on kuvattu tarkemmin seuraavassa luvussa. Valmistelussa luokan staattiset kentät luodaan ja niiden alkuarvot asetetaan. Selvitys (resolution) voi olla osa linkitysvaihetta tai se voi tapahtua vasta suorituksen aikana. Tavukoodissa viitataan muihin luokkiin vakiotaulukossa sijaitsevien
15 12 viittauksien avulla. Kaikki viittaukset ovat aluksi symbolisia. Viittauksien selvityksellä tarkoitetaan prosessia, jossa symboliset viittaukset muunnetaan konkreettisiksi viittauksiksi [LiY97, 5.4.3]. 5 Verifikaatio ja poikkeukset Verifikaatio tarkoittaa suomeksi tarkistusta ja/tai varmistusta. Java-virtuaalikoneen verifikaatioalgoritmin tarkoituksena on varmistaa class-tiedostojen turvallisuus. Se pyrkii havaitsemaan potentiaalisesti vahingolliset ohjelmat ennen suoritusta ja estämään niiden suorituksen. Tämä on tärkeää etenkin verkkosivuille upotettujen sovelmien tapauksessa, jossa suoritettavaa koodia ladataan tietoliikenneverkon ylitse mahdollisesti epäluotettavista lähteistä. Java-virtuaalikone verifioi kaikki ladattavaksi tarjotut class-tiedostot ennen suoritusta, riippumatta siitä kuka sen on kirjoittanut tai millä kääntäjällä se on tuotettu. Jos kyseessä oleva tiedosto ei noudata tarkoin kaikkia class-tiedostomuodon sääntöjä, se hylätään. Kaikkien oikein toimivien ohjelmien erottaminen ennalta on ratkeamaton ongelma. Java-virtuaalikoneen verifikaatioalgoritmi ratkaisee rajatumman ongelman hylkäämällä virheellisten ohjelmien lisäksi myös osan oikein toimivista ohjelmista [Eng99, 6.5] Verifikaatioalgoritmin tehtävä on karkeasti ottaen kaksijakoinen: class-tiedoston rakenteen tarkistaminen ja tavukoodin verifikaatio. Ensimmäisessä vaiheessa varmistetaan, että tiedosto on ulkoisesti class-tiedostomuodon mukainen, eli muun muassa, että se alkaa heksadesimaaliluvulla CAFEBABE, sen versionumero on tuettu, se sisältää kaiken vaaditun informaation eikä se lopu kesken tai sen lopussa ole ylimääräisiä bittejä. Toisessa vaiheessa tutkitaan luokan metodien tavukoodia ensin pinnallisesti ja sitten tietovuoanalyysin (data-flow analysis) keinoin [LiY97, 4.9.2]. Pinnallisiin tarkistuksiin kuuluu esimerkiksi se, että hyppykäskyt eivät hyppää kyseessä olevan metodin ulkopuolelle tai jonkin käskyn keskelle. Tietovuoanalysoija tulkitsee jokaisen käskyn ja mallintaa niiden vaikutuksen operandipinolle. Esimerkiksi mikäli tarkasteltava käsky käyttää operandipinon päällä olevia operandeja, tarkistetaan, että operandipinossa olisi tällöin riittävän monta operandia ja että ne olisivat oikean tyyppisiä. Käytetyille paikallisille muuttujille tehdään vastaava tarkistus. Mikäli operandipinon tai paikallisten muuttujien taulukon viitattua arvoa ei ole olemassa tai se on väärän tyyppinen, koodi hylätään. Muutoin käskyn tila, eli operandipinon ja paikallisten muuttujien taulukon tila merkitään muistiin.
16 13 Seuraavaksi määritetään tarkasteltavan käskyn mahdollisten seuraajakäskyjen (successor instruction) joukko, johon kuuluu koodin järjestyksessä seuraava käsky, ehdollisen tai ehdottoman hyppykäskyn kohde tai poikkeuskäsittelijän osoite, jonka tapauksen jätän tässä käsittelemättä. Nykyisen käskyn ja jokaisen sen mahdollisen seuraajakäskyn (paitsi poikkeuskäsittelijän tapauksessa) kanssa toimitaan seuraavasti: Mikäli seuraajakäskyä ei ole vielä tarkasteltu merkitään muistiin, että käskyn tila on sama kuin edellisen käskyn tila. Muutoin nykyisen käskyn tila ja seuraajakäskyn tila yhdistetään (merge). Jotta kahden operandipinon tilat voidaan yhdistää, on niissä oltava yhtä monta arvoa ja vastaavien arvojen on oltava yhteensopivia, eli identtisiä poislukien reference-tyyppiset arvot. Muuten operandipinojen tiloja ei voida yhdistää. Paikallisten muuttujien taulukot yhdistetään vertaamalla niiden vastaavia alkioita toisiinsa. Poislukien reference-tyyppiset arvot, mikäli vastaavat alkiot eivät ole identtisiä merkitään muistiin, että kyseinen alkio on käyttökelvoton. Sekä operandipinon että paikallisten muuttujien tapauksessa reference-tyyppisten arvojen yhdiste on viittaus kyseessä olevien arvojen ensimmäiseen yhteiseen yliluokkaan, jollainen on aina olemassa (Object). Mikäli operandipinojen tiloja ei voida yhdistää, koodi hylätään. Tässä vaiheessa koodi on periaatteessa läpäissyt staattisen verifikaation. Lopuksi suoritetaan muutamia virtuaalisia (virtuaalikonekäskyillä suoritettavia) tarkistuksia, kuten kutsutun metodin olemassaolo, jotka voidaan suorittaa staattisesti tai vasta suorituksen aikana [LiY97, 4.9.1]. Kun kaikki edellä kuvatut (ja muut, The Java T M Virtual Machine Specificationissa [LiY97] kuvatut) tarkistukset on läpäisty, luokan käyttö ja sen metodien suoritus voidaan sallia. Verifikaation jälkeen koodin turvallisuudesta voidaan vetää jo melko pitkälle vieviä johtopäätöksiä. Esimerkiksi verifikaation läpäisevä tavukoodi ei voi aiheuttaa operandipinon yli- tai alivuotoa [LiY97, 4.9]. Niitä seikkoja, jotka jo tiedetään, ei tarvitse enää varmistaa suoritusaikaisilla tarkistuksilla. Virtuaalikoneen JIT-kääntäjä voi tällöin generoida suorituskykyisempää natiivikoodia. Virhetilanteet, joita ei voida havaita staattisen verifikaation keinoin käsitellään suorituksen aikana poikkeusten (exception) avulla. Esimerkki tällaisesta virhetilanteesta on indeksointi taulukon ulkopuolelle. Poikkeukset voidaan jakaa kahteen ryhmään: Tavukoodin (käyttäjän tai kirjastojen koodin) aiheuttamat poikkeukset tai virtuaalikoneen suoraan aiheuttamat poikkeukset. Poikkeukset ovat Throwable-luokan perillisiä. Luokalla Throwable on kaksi aliluokkaa, Exception ja Error. Jälkimmäisen luokan ja sen perillisten ilmentymät esittävät virheitä, joista tavallisten ohjel-
17 14 mien ei oleteta pystyvän toipumaan. Tämä jako on tehty siksi, että ohjelmissa olisi mahdollista käyttää catch(exception e)-rakennetta sieppaamaan kaikki virheet, joista on mahdollista toipua. Java-virtuaalikoneen suoraan aiheuttamia poikkeuksia ovat RunTimeException-, Error- tai VirtualMachineError-luokkien aliluokkia [LiY97, 2.16]. Ne kuvaavat lataus-, linkitys- ja suoritusaikaisia poikkeustilanteita ja virheitä. Luokan RunTimeException aliluokkia ovat seuraavat: ArithmeticException ArrayStoreException ClassCastException IllegalMonitorStateException IndexOutOfBoundsException NegativeArraySizeException NullPointerException SecurityException Luokan Error aliluokkia ovat seuraavat: luokan LinkageError aliluokat: ClassFormatError ClassCircularityError NoClassDefFoundError UnsupportedClassVersionError AbstractMethodError UnsatisfiedLinkError NoSuchFieldError NoSuchMethodError InstantiationError IllegalAccessError VerifyError ExceptionInInitializerError
18 15 luokan VirtualMachineError aliluokat: InternalError OutOfMemoryError StackOverflowError UnknownError 6 Esimerkki: Hello, world! Useimmat aloittelevat ohjelmoijat kirjoittavat ensi töikseen jonkin muunnelman Hello, world! -ohjelmasta, jonka tehtävänä on tulostaa standarditulostusvirtaan tervehdys koko maailmalle. Siitä voidaan hyvin aloittaa myös Java-tavukoodin opiskelu. Tutkitaan seuraavassa Java-kielistä Hello, world -ohjelmaa ja siitä käännettyä symbolista tavukoodia. Class-tiedoston voi purkaa symboliseksi tavukoodiksi Java Development Kitin javap-työkalulla komennolla javap -c [luokan nimi]. Java-kielinen lähdekoodi: public class HelloWorld { public static void main(string args[]) { System.out.println("Hello, world!"); } } javac HelloWorld.java -komennolla tuotettu HelloWorld.class -tiedosto näyttää heksadesimaaleina esitettynä seuraavalta: CA FE BA BE D 0A F A C 69 6E E F F 4C 69 6E 65 4E 75 6D C D E B 4C 6A F 6C 61 6E 67 2F E 67 3B A 53 6F C F C 6C 6F 57 6F 72 6C 64 2E 6A C C D C 6C 6F 2C F 72 6C A 0C 00 1B 00 1C A C 6C 6F 57 6F 72 6C A F 6C 61 6E 67 2F 4F 62 6A A F 6C 61 6E 67 2F 53
19 D F C 6A F 69 6F 2F E D 3B A F 69 6F 2F E D E 74 6C 6E C 6A F 6C 61 6E 67 2F E 67 3B D A B B A B 00 0C B B B A A D E Pinnallisessa tarkastelussa tiedostosta havaitaan, että se alkaa class-tiedostomuodon määrittelyn mukaisesti tunnisteella CAFEBABE ja sen versionumero on , joka vastaa Java-ympäristön (SE) julkaisuversiota 6.0. javap -c HelloWorld -komennoilla tuotettu symbolinen tavukoodi: public HelloWorld(); Code: 0: aload_0 1: invokespecial #1; // java/lang/object.<init> 4: return public static void main(java.lang.string[]); Code: 0: getstatic #2; // java/lang/system.out 3: ldc #3; // "Hello, world!" 5: invokevirtual #4; // java/io/printstream.println 8: return Ensimmäinen silmiinpistävä asia tavukoodissa on konstruktori public HelloWorld(), jota ei ole lähdekielisessä luokassa määritelty. Kyseessä on oletuskonstruktori, jonka kääntäjä generoi automaattisesti, sillä Java-luokalla on oltava konstruktori [LiY97, 2.12]. Main-metodin koodi ja sen selvitys: 0: getstatic #2. Tällä käskyllä noudetaan (kopioidaan) pinon päälle staattisen kentän arvo. Operandi 2 tulkitaan indeksiksi suorituksessa olevan metodin luokan vakiotaulukkoon. Kyseisen indeksin osoittamassa kohdassa olevan alkion on oltava symbolinen viittaus kenttään. Symbolinen viittaus kenttään sisältää myös viittauksen luokkaan, jossa kenttä sijaitsee. Tässä tapauksessa
20 kyseessä on viittaus java/lang/system-luokan java/io/printstream-tyyppiseen kenttään java/lang/system.out. Java-tavukoodissa luokkiin viitataan aina niiden koko nimellä, jotta nimiristiriidoilta vältyttäisiin. Luokan nimen perusteella Java-virtuaalikone pystyy paikallistamaan kyseisen luokan kuvaavan class-tiedoston. Jos kyseessä olevaa luokkaa ei ole vielä virtuaalikoneen tämän instanssin aikana käytetty, se täytyy ladata ja linkittää (virtuaalikoneen toimesta). 3: ldc #3. Tällä käskyllä noudetaan (kopioidaan) pinon päälle viittaus merkkijonoon Hello world!. Operandi 3 tulkitaan indeksiksi suorituksessa olevan metodin luokan vakiotaulukkoon. Kyseisen indeksin osoittamassa kohdassa olevan alkion on oltava joko int- tai float-tyyppinen arvo tai symbolinen reference-tyyppinen viittaus merkkijonovakioon. Tässä tapauksessa kyseessä on symbolinen viittaus merkkijonovakioon. Symboliset viittaukset on ennen käyttöä muunnettava konkreettisiksi viittauksiksi [LiY97, 5.4.3]. Virtuaalikone luo String-luokan ilmentymän, joka esittää Hello, world! -merkkijonoa [LiY97, 5.1]. Operandipinon päälle asetetaan konkreettinen viittaus tähän olioon. 5: invokevirtual #4. Tällä käskyllä kutsutaan metodia println(string). Operandi 4 tulkitaan indeksiksi suorituksessa olevan metodin luokan vakiotaulukkoon. Kyseisen indeksin osoittamassa kohdassa oleva alkio on symbolinen viittaus metodiin. Symbolinen viittaus muunnetaan konkreettiseksi viittaukseksi [LiY97, ]. Operandipinossa on edellisten käskyjen jäljiltä päällimmäisenä viittaus metodin String-tyyppiseen argumenttiin ja sen alla viittaus luokkaan, johon metodikutsu kohdistuu. Lopuke virtual merkitsee (eistaattisten metodien tapauksessa), että metodikutsu on polymorfinen. Tämä voidaan tavukoodiohjelmissa (mutta ei Java-ohjelmissa) kiertää käskyllä invokespecial. 8: return. Tämä käsky palauttaa suorituksen kutsuneelle metodille. Javavirtuaalikoneen return-käskyt on tyypitetty metodin palautusarvon tyypin mukaan. Esimerkiksi kokonaisluvun palauttavan metodin palautuskäskyn on oltava ireturn (ja sen operandin on oltava int-tyyppiä). Return-käskyä voidaan käyttää ainoastaan metodin palautusarvon tyypin ollessa void. 17
21 7 Yhteenveto 18 Java-virtuaalikone on pinopohjainen abstrakti tietokone, joka suorittaa Java-tavukoodia. Se on keskeinen osa Java-ympäristöä. Se on vastuussa Java-tavukoodiohjelmien luotettavuudesta, turvallisuudesta, koodin pienestä koosta ja silti kohtuullisen suuresta suorituskyvystä. Java-tavukoodi on laitteistoriippumaton välikieli. Java-tavukoodiohjelmat esitetään laitteisto- ja käyttöjärjestelmäriippumattomassa class-tiedostomuodossa. Java-tavukoodiohjelmia suoritetaan tavallisimmin ohjelmallisella Java-virtuaalikonetoteutuksella. Java-virtuaalikonetoteutus on olemassa useille erilaisille laitteisto- ja käyttöjärjestelmäympäristöille. Java-tavukoodiohjelmat toimivat millä tahansa Java-virtuaalikoneella samalla tavalla. Ne toimivat siis perinteisistä konekielisistä ohjelmista poiketen sellaisenaan useissa erilaisissa laitteisto- ja käyttöjärjestelmäympäristöissä. Java-virtuaalikone on pinokone, mutta muuten sillä on paljon yhteistä oikeiden tietokoneiden kanssa. Java-virtuaalikoneen suoritin on säie, joita voi olla useampia kuin yksi. Java-virtuaalikoneen keskusmuistin virkaa toimittaa useampi erillinen tietoalue, joilla on omat käyttörajoitteensa. Merkittävästi oikeista tietokoneista ja niiden konekielistä poiketen Java-virtuaalikone ei tarjoa mahdollisuuksia minkä tahansa muistialueen eksplisiittiseen käsittelyyn. Esimerkiksi suorituksessa olevan ohjelman koodia ei voi millään keinolla muokata suorituksen aikana. Java-tavukoodin suorittaminen ohjelmallisella virtuaalikonetoteutuksella on konekielisten ohjelmien suorittamista raskaampaa. Nykyaikaiset Java-virtuaalikonetoteutukset nykyaikaisilla tietokoneilla saavuttavat kuitenkin jo niin korkean suorituskyvyn, ettei erolla ole useimmissa sovelluksissa merkitystä. Java-virtuaalikoneen implisiittiisiin turvallisuusmekanismeihin kuuluu sen oliopohjaisuus ja automaattinen muistinhallinta. Lisäksi Java-virtuaalikoneessa on staattinen verifikaatioalgoritmi, joka varmistaa class-tiedostojen turvallisuuden osittain jo ennen suoritusta. Java-tavukoodiohjelmat ovat siis perinteisiä konekielisiä ohjelmia luotettavampia ja turvallisempia.
22 Lähteet 19 All04 Allman, E., A conversation with James Gosling. App09 Java, [ ] Cow04 Cowell-Shah, C. W., Nine Language Performance Round-up: Benchmarking Math & File I/O, /Nine_Language_Performance_Round-up_Benchmarking_Math_ File_I_O. [ ] Eis97 Eisen, J., Executing Java Applets Using Trusted Hosts, Applets_Using_Trusted_Hosts/index.html. [ ] Eng99 Engel, J., Programming for the Java T M virtual machine. Addison- Wesley, Gol74 Lis09 Goldberg, R., A survey of virtual machine research. List of Java virtual machines, List_of_Java_virtual_machines. [ ] LiY97 Lindholm, T. ja Yellin, F., The Java T M Virtual Machine Specification, Second Edition. Tekninen raportti, Sun Microsystems, Inc., URL edition/html/vmspectoc.doc.html. SmN05 Sta06 Smith, J. ja Nair, R., The Architecture of Virtual Machines. Stallings, W., Computer Organization & Architecture - Designing for Performance. Prentice Hall, Sun09b Java SE Downloads, downloads/index.jsp. [ ] Sun09a Learn About Java Technology, [ ] Sun09c What components of the JDK software have been open sourced?, b2. [ ]
23 20 Usa09 Usage share of desktop operating systems, http: //en.wikipedia.org/wiki/usage_share_of_desktop_operating_ systems. [ ]
1 Johdanto. 2 Java-tavukoodin periaatteet
Java-tavukoodi Pekka Parviainen Helsinki 1.4.2005 Ohjelmointikielten kääntäjät -kurssin seminaarityö Helsingin yliopisto Tietojenkäsittelytieteen laitos Sisällys 1 Johdanto...1 2 Java-tavukoodin periaatteet...1
Javan tavukoodi. Helsinki 1. huhtikuuta 2005 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Javan tavukoodi Ari Silvennoinen Timo Suomela Helsinki 1. huhtikuuta 2005 HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Ohjelmointikielten kääntäjät kevät 2005 i Sisältö 1 Javan virtuaalikone 1 1.1
arvostelija OSDA ja UDDI palveluhakemistoina.
Hyväksymispäivä Arvosana arvostelija OSDA ja UDDI palveluhakemistoina. HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta/Osasto Fakultet/Sektion Faculty/Section Laitos Institution
JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?
JAVA-OHJELMOINTI 3op A274615 JAVAN PERUSTEET LYHYT KERTAUS Teemu Saarelainen teemu.saarelainen@kyamk.fi Lähteet: http://java.sun.com/docs/books/tutorial/index.html Vesterholm, Kyppö: Java-ohjelmointi,
4. Lausekielinen ohjelmointi 4.1
4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen ja tulkinta. - Kääntäminen,
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, literaalivakio, nimetty vakio Tiedon merkkipohjainen tulostaminen 1 Tunnus Java tunnus Java-kirjain Java-numero
11/20: Konepelti auki
Ohjelmointi 1 / syksy 2007 11/20: Konepelti auki Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007 p.1/11 Tämän luennon
Olio-ohjelmointi Virhetilanteiden käsittely
Olio-ohjelmointi 2016 Virhetilanteiden käsittely Poikkeustilanteet n Java-järjestelmässä voidaan ottaa kiinni ohjelman suoritusaikana tapahtuvia virhetilanteita, joita ei saada kiinni tavanomaisilla ohjausrakenteilla
5. HelloWorld-ohjelma 5.1
5. HelloWorld-ohjelma 5.1 Sisällys Lähdekoodi. Lähdekoodin (osittainen) analyysi. Lähdekoodi tekstitiedostoon. Lähdekoodin kääntäminen tavukoodiksi. Tavukoodin suorittaminen. Virheiden korjaaminen 5.2
Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki
Sisällys JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta Abstrakti luokka ja metodi Rajapintamäärittely (interface) Eero Hyvönen Tietojenkäsittelytieteen laitos Helsingin yliopisto 13.10.2000 E.
Tulkinta ja emulointi
Luento 11 (verkkoluento 11) Tulkinta ja emulointi Java ohjelman suoritus Tavukoodi JVM Tulkinta Java-suoritin Käännös ja JIT-käännös JVM vs. Titokone Java ohjelmien suoritus Java virtuaalikone SW HW Java
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008. 1. Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen raine.kauppinen@haaga-helia.
Ohjelmointitaito (ict1td002, 12 op) Kevät 2008 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-ympäristö Java-ohjelma ja ohjelmaluokka
8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
Selainpelien pelimoottorit
Selainpelien pelimoottorit Teemu Salminen Helsinki 28.10.2017 Seminaaritutkielma Helsingin yliopisto Tietojenkäsittelytiede ! 1 HELSINGIN YLIOPISTO HELSINGFORS UNIVERSITET UNIVERSITY OF HELSINKI Tiedekunta
Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo
Concurrency - Rinnakkaisuus Group: 9 Joni Laine Juho Vähätalo Sisällysluettelo 1. Johdanto... 3 2. C++ thread... 4 3. Python multiprocessing... 6 4. Java ExecutorService... 8 5. Yhteenveto... 9 6. Lähteet...
.NET ajoympäristö. Juha Järvensivu 2007
.NET ajoympäristö Juha Järvensivu juha.jarvensivu@tut.fi 2007 Käännösprosessi C# lähdekoodi C# kääntäjä CILtavukoodi JITkäännös Ajettava natiivikoodi Kehitysympäristössä ohjelmoijan toimesta Ajonaikana.NET
4. Luokan testaus ja käyttö olion kautta 4.1
4. Luokan testaus ja käyttö olion kautta 4.1 Olion luominen luokasta Java-kielessä olio määritellään joko luokan edustajaksi tai taulukoksi. Olio on joukko keskusmuistissa olevia tietoja. Oliota käsitellään
Taulukot. Jukka Harju, Jukka Juslin 2006 1
Taulukot Jukka Harju, Jukka Juslin 2006 1 Taulukot Taulukot ovat olioita, jotka auttavat organisoimaan suuria määriä tietoa. Käsittelylistalla on: Taulukon tekeminen ja käyttö Rajojen tarkastus ja kapasiteetti
Java-kielen perusteet
Java-kielen perusteet Tunnus, varattu sana, kommentti Muuttuja, alkeistietotyyppi, merkkijono, Vakio Tiedon merkkipohjainen tulostaminen Ohjelmointi (ict1tx006) Tunnus (5.3) Javan tunnus Java-kirjain Java-numero
Luento 1 Tietokonejärjestelmän rakenne
Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Luento
Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus
Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Tietokone
Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.
Osoittimet Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan. Muistilohkon koko riippuu muuttujan tyypistä, eli kuinka suuria arvoja muuttujan
4. Lausekielinen ohjelmointi 4.1
4. Lausekielinen ohjelmointi 4.1 Sisällys Konekieli, symbolinen konekieli ja lausekieli. Hyvä ohjelmointitapa. Lausekielestä konekieleksi: - Lähdekoodi, tekstitiedosto ja tekstieditorit. - Kääntäminen
Luento 1 Tietokonejärjestelmän rakenne
Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Tietokone
Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus
Luento 1 Tietokonejärjestelmän rakenne Järjestelmän eri tasot Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä Tietokonelaitteisto Oheislaitteet (peripheral or I/O devices) Tietokone (computer) 2 Tietokone
1. Omat operaatiot 1.1
1. Omat operaatiot 1.1 Sisällys Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
812341A Olio-ohjelmointi Peruskäsitteet jatkoa
812341A Olio-ohjelmointi 2106 Peruskäsitteet jatkoa Luokkakohtaiset piirteet n Yhteisiä kaikille saman luokan olioille n Liittyvät luokkaan, eivät yksittäiseen olioon n Kaikki ko. luokan oliot voivat käyttää
Harjoitustyö: virtuaalikone
Harjoitustyö: virtuaalikone Toteuta alla kuvattu virtuaalikone yksinkertaiselle olio-orientoituneelle skriptauskielelle. Paketissa on testaamista varten mukana kaksi lyhyttä ohjelmaa. Ohjeita Noudata ohjelman
Tiedon esitysmuodot. Luento 6 (verkkoluento 6) Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto
Luento 6 (verkkoluento 6) Tiedon esitysmuodot Lukujärjestelmät Kokonaisluvut, liukuluvut Merkit, merkkijonot Äänet, kuvat, muu tieto Ohjelman esitysmuoto Rakenteellinen tieto 1 Tiedon tyypit Kommunikointi
Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python
Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python 8. marraskuuta 2010 Ohjelmointi Perusteet Peruskäsitteitä Olio-ohjelmointi Pythonin alkeet Esittely Esimerkkejä Muuttujat
Olion elinikä. Olion luominen. Olion tuhoutuminen. Olion tuhoutuminen. Kissa rontti = null; rontti = new Kissa();
Sisällys 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden käsittelyä: sijoitus, vertailu ja varautuminen null-arvoon. Viite metodin paluuarvona.. 7.1 7.2 Olio
Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python
Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python 31. tammikuuta 2009 Ohjelmointi Perusteet Pythonin alkeet Esittely Esimerkkejä Muuttujat Peruskäsitteitä Käsittely
7. Oliot ja viitteet 7.1
7. Oliot ja viitteet 7.1 Sisällys Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen. Viitteiden sijoitus. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona. Viite metodin
14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
8. Näppäimistöltä lukeminen 8.1
8. Näppäimistöltä lukeminen 8.1 Sisällys Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. In-luokka, käännös ja tulkinta Scanner-luokka. 8.2 Yleistä Näppäimistöltä annettujen arvojen (syötteiden)
Sisältö. 22. Taulukot. Yleistä. Yleistä
Sisältö 22. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko metodin parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 22.1 22.2 Yleistä
7. Näytölle tulostaminen 7.1
7. Näytölle tulostaminen 7.1 Sisällys System.out.println- ja System.out.print-operaatiot. Tulostus erikoismerkeillä. Edistyneempää tulosteiden muotoilua. 7.2 Tulostusoperaatiot System.out.println-operaatio
815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 3 vastaukset Harjoituksen aiheena ovat imperatiivisten kielten muuttujiin liittyvät kysymykset. Tehtävä 1. Määritä muuttujien max_num, lista,
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
Ohjelmointitaito (ict1td002, 12 op) Kevät Java-ohjelmoinnin alkeita. Tietokoneohjelma. Raine Kauppinen
Ohjelmointitaito (ict1td002, 12 op) Kevät 2009 Raine Kauppinen raine.kauppinen@haaga-helia.fi 1. Java-ohjelmoinnin alkeita Tietokoneohjelma Java-kieli ja Eclipse-kehitysympäristö Java-ohjelma ja luokka
7/20: Paketti kasassa ensimmäistä kertaa
Ohjelmointi 1 / syksy 2007 7/20: Paketti kasassa ensimmäistä kertaa Paavo Nieminen nieminen@jyu.fi Tietotekniikan laitos Informaatioteknologian tiedekunta Jyväskylän yliopisto Ohjelmointi 1 / syksy 2007
Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista
Sisällys 1. Omat operaatiot Yleistä operaatioista. Mihin operaatioita tarvitaan? Oman operaation määrittely. Yleisesti, nimeäminen ja hyvä ohjelmointitapa, määreet, parametrit ja näkyvyys. HelloWorld-ohjelma
Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä 12.1 12.2 12.3 12.4
Sisällys 12. Näppäimistöltä lukeminen Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä.. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit. Scanner-luokka.
Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2
4. Attribuutit 4.1 Sisällys Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2 Yleistä Luokan lohkossa, mutta metodien ulkopuolella esiteltyjä muuttujia ja vakioita. Esittely
13. Loogiset operaatiot 13.1
13. Loogiset operaatiot 13.1 Sisällys Loogiset operaatiot AND, OR, XOR ja NOT. Operaatioiden ehdollisuus. Bittioperaatiot. Loogiset operaatiot ohjausrakenteissa. Loogiset operaatiot ja laskentajärjestys.
Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi. Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer)
Luento 3 (verkkoluento 3) Ttk-91 konekielinen ohjelmointi Ohjelman esitysmuoto Konekielinen ohjelmointi ttk-91:llä (Titokone, TitoTrainer) 1 Suorituksenaikainen suorittimen ja muistin sisältö muisti suoritin
Yleistä. Nyt käsitellään vain taulukko (array), joka on saman tyyppisten muuttujien eli alkioiden (element) kokoelma.
2. Taulukot 2.1 Sisältö Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.2 Yleistä
12. Näppäimistöltä lukeminen 12.1
12. Näppäimistöltä lukeminen 12.1 Sisällys Arvojen lukeminen näppäimistöltä yleisesti. Arvojen lukeminen näppäimistöltä Java-kielessä. In-luokka. Luetun arvon tarkistaminen. Tietovirrat ja ohjausmerkit.
Sisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
Teemun juustokakku Rekisterien, välimuistin, muistin, levymuistin ja magneettinauhan nopeudet suhteutettuna juuston hakuaikaan juustokakkua tehdessä?
Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi 27.1.2011 Tietokone suoritin (CPU) väylä tai väylät laiteohjaimet muiden koneiden kanssa Ethernet, modeemi,... laitteiden kanssa Levy, DVD, CD,
Ohjelmointi 2. Jussi Pohjolainen. TAMK» Tieto- ja viestintäteknologia , Jussi Pohjolainen TAMPEREEN AMMATTIKORKEAKOULU
Ohjelmointi 2 Jussi Pohjolainen TAMK» Tieto- ja viestintäteknologia Tietotyypeistä C++ - kielessä useita tietotyyppejä Kirjaimet: char, wchar_t Kokonaisluvut: short, int, long Liukuluvut: float, double
19. Olio-ohjelmointia Javalla 19.1
19. Olio-ohjelmointia Javalla 19.1 Sisällys Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit
Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva
Sisällys 6. Muuttujat ja Java Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut, merkit, totuusarvot. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi
6. Muuttujat ja Java 6.1
6. Muuttujat ja Java 6.1 Sisällys Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut, merkit, totuusarvot. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi
9. Periytyminen Javassa 9.1
9. Periytyminen Javassa 9.1 Sisällys Periytymismekanismi Java-kielessä. Piirteiden näkyvyys periytymisessä. Ilmentymämetodien korvaaminen. Luokkametodien peittäminen. Super-attribuutti. Override-annotaatio.
Sisällys. 14. Poikkeukset. Johdanto. Johdanto
Sisällys 14. Poikkeukset Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla poikkeuksella? Poikkeusten heittäminen.
Sisältö. 2. Taulukot. Yleistä. Yleistä
Sisältö 2. Taulukot Yleistä. Esittely ja luominen. Alkioiden käsittely. Kaksiulotteinen taulukko. Taulukko operaation parametrina. Taulukko ja HelloWorld-ohjelma. Taulukko paluuarvona. 2.1 2.2 Yleistä
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset
815338A Ohjelmointikielten periaatteet 2015-2016. Harjoitus 5 Vastaukset Harjoituksen aiheena ovat aliohjelmat ja abstraktit tietotyypit sekä olio-ohjelmointi. Tehtävät tehdään C-, C++- ja Java-kielillä.
14. Poikkeukset 14.1
14. Poikkeukset 14.1 Sisällys Johdanto. Tarkistettavat ja tarkistamattomat poikkeukset. Miten varautua poikkeukseen metodissa? Poikkeusten tunnistaminen ja sieppaaminen try-catchlauseella. Mitä tehdä siepatulla
Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen
Metodit Metodien määrittely Metodin parametrit ja paluuarvo Metodien suorittaminen eli kutsuminen Metodien kuormittaminen 1 Mikä on metodi? Metodi on luokan sisällä oleva yhteenkuuluvien toimintojen kokonaisuus
Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit:
Sisällys 6. Muuttujat ja Java Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut, merkit, totuusarvot. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi
Sisällys. 6. Muuttujat ja Java. Muuttujien nimeäminen. Muuttujien nimeäminen. salinovi tai syntymapaiva
Sisällys 6. Muuttujat ja Java Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut. boolean- ja char-tyypit. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi
6. Muuttujat ja Java 6.1
6. Muuttujat ja Java 6.1 Sisällys Muuttujien nimeäminen. Muuttujan tyypin määritys. Javan tietotyypit: Kokonais- ja liukuluvut. boolean- ja char-tyypit. Tyyppien yhteensopivuus. Viitetietotyypit ja merkkijonotietotyyppi
Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla
Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla ohjelmoida useita komponenteiltaan ja rakenteeltaan
Sisällys. 7. Oliot ja viitteet. Olion luominen. Olio Java-kielessä
Sisälls 7. Oliot ja viitteet Olio Java-kielessä. Olion luominen, elinikä ja tuhoutuminen.. Viitteiden vertailu. Varautuminen null-arvoon. Viite metodin paluuarvona.. Muuttumattomat ja muuttuvat merkkijonot.
Java kahdessa tunnissa. Jyry Suvilehto
Java kahdessa tunnissa Jyry Suvilehto Ohjelma Ohjelmointiasioita alkeista nippelitietoon n. 45 min Tauko 10 min Oliot, luokat ja muut kummajaiset n. 45 min Kysykää Sisältöä ei oikeasti ole 2x45 min täytteeksi,
Javan perusteita. Janne Käki
Javan perusteita Janne Käki 20.9.2006 Muutama perusasia Tietokone tekee juuri (ja vain) sen, mitä käsketään. Tietokone ymmärtää vain syntaksia (sanojen kirjoitusasua), ei semantiikkaa (sanojen merkitystä).
Virtualisointiympäristössä on kolme pääosaa: isäntä (host), virtualisointikerros ja vieras (guest).
1 Virtualisoinnin avulla voidaan purkaa suora linkki suoritettavan sovelluksen (tai käyttöjärjestelmän tms.) ja sitä suorittavan laitteiston välillä. Näin saavutetaan joustavuutta laitteiston käytössä.
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014
Ohjelmoinnin jatkokurssi, kurssikoe 28.4.2014 Kirjoita jokaiseen palauttamaasi konseptiin kurssin nimi, kokeen päivämäärä, oma nimi ja opiskelijanumero. Vastaa kaikkiin tehtäviin omille konsepteilleen.
Sisällys. 19. Olio-ohjelmointia Javalla. Yleistä. Olioiden esittely ja alustus
Sisällys 19. Olio-ohjelmointia Javalla Olioiden esittely ja alustus. Metodit Yleistä metodeista. Mihin metodeja tarvitaan? Metodien määrittely. Omat metodit: nimeäminen, paikka, kutsuminen, parametrit
Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes)
Kääreluokat (oppikirjan luku 9.4) (Wrapper-classes) Kääreluokista Javan alkeistietotyypit ja vastaavat kääreluokat Autoboxing Integer-luokka Double-luokka Kääreluokista Alkeistietotyyppiset muuttujat (esimerkiksi
C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.
Taulukot C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa. Taulukon muuttujilla (muistipaikoilla) on yhteinen nimi. Jokaiseen yksittäiseen
Kertausluento luennoista 1-3 1
Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi
Luento 1 (verkkoluento 1) Tietokonejärjestelmä
Luento 1 (verkkoluento 1) Tietokonejärjestelmä Järjestelmän eri tasot Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus 1 Tietokonejärjestelmä Käyttäjä This image cannot currently be displayed.
17. Javan omat luokat 17.1
17. Javan omat luokat 17.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 17.2 Java API Java-kielen Application Programming Interface (API)
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3
16. Lohkot 16.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 16.2 Lohkot Kaarisulut
12. Javan toistorakenteet 12.1
12. Javan toistorakenteet 12.1 Sisällys Yleistä toistorakenteista. Laskurimuuttujat. While-, do-while- ja for-lauseet. Laskuri- ja lippumuuttujat. Tyypillisiä ohjelmointivirheitä. Silmukan rajat asetettu
Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.
11. Rajapinnat 11.1 Sisällys Johdanto. Abstrakti luokka vai rajapinta? Rajapintojen hyötyjä. Kuinka rajapinnat määritellään ja otetaan käyttöön? Eläin, nisäkäs, kissa ja rajapinta. Moniperiytyminen rajapintojen
2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)
2. Lisää Java-ohjelmoinnin alkeita Muuttuja ja viittausmuuttuja Vakio ja literaalivakio Sijoituslause Syötteen lukeminen ja Scanner-luokka 1 Muuttuja ja viittausmuuttuja (1/4) Edellä mainittiin, että String-tietotyyppi
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op. Assembly ja konekieli
TIEP114 Tietokoneen rakenne ja arkkitehtuuri, 3 op Assembly ja konekieli Tietokoneen ja ohjelmiston rakenne Loogisilla piireillä ja komponenteilla rakennetaan prosessori ja muistit Prosessorin rakenne
18. Abstraktit tietotyypit 18.1
18. Abstraktit tietotyypit 18.1 Sisällys Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli
TIE-20306 PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli Seminaariesitelmä ryhmä 24 Markku Ahokas Jani Kuitti i SISÄLLYSLUETTELO 1. YLEISTÄ EIFFELISTÄ... 1 1.1 Historia ja tausta... 1 1.2
Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1. Oliot ja luokat Javaohjelmoinnissa
Aalto Yliopisto T-106.2001 Informaatioverkostot: Studio 1 Oliot ja luokat Javaohjelmoinnissa Vesa Laakso 22.9.2012 Sisällysluettelo Sisällysluettelo... 1 Johdanto... 2 1. Luokka... 2 2. Olio... 2 3. Luokan
Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta
C++ - perusteet Java-osaajille luento 5/7: operaattoreiden ylikuormitus, oliotaulukko, parametrien oletusarvot, komentoriviparametrit, constant, inline, Operaattoreiden ylikuormitus Operaattoreiden kuormitus
Käännös, linkitys ja lataus
Luento 10 (verkkoluento 10) Käännös, linkitys ja lataus Ohjelmasta prosessiin Käännösyksikkö Kääntämisen vaiheet Makrot, literaalit Staattinen ja dynaaminen linkitys Nimien sidonta Lausekielestä suoritukseen
Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3
15. Lohkot 15.1 Sisällys Tutustutaan lohkoihin. Muuttujien ja vakioiden näkyvyys sekä elinikä erityisesti operaation lohkossa. Nimikonfliktit. Muuttujat operaation alussa vai myöhemmin? 15.2 Lohkot Aaltosulkeet
Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus
Luento 1 (verkkoluento 1) Tietokonejärjestelmä Järjestelmän e eri tasot Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus 1 Tietokone- järjestelmäj ä Käyttäjä Tietokonelaitteisto Oheislaitteet
Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen
Pedacode Pikaopas Java-kehitysympäristön pystyttäminen Pikaoppaan sisältö Pikaoppaassa kuvataan, miten Windowstyöasemalle asennetaan Java-ohjelmoinnissa tarvittavat työkalut, minkälaisia konfigurointeja
Virtuaalikoneiden generointi Vmgen-kääntäjällä
Virtuaalikoneiden generointi Vmgen-kääntäjällä Risto Saarelma Helsinki 18.4.2005 Ohjelmointikielten kääntäjät -kurssi HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos 1 Johdanto 1 Virtuaalikoneet ovat
20. Javan omat luokat 20.1
20. Javan omat luokat 20.1 Sisällys Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.2 Java API Java-kielen Application Programming Interface (API)
Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi
Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi
Sisällys. 20. Javan omat luokat. Java API. Pakkaukset. java\lang
Sisällys 20. Javan omat luokat Application Programming Interface (API). Pakkaukset. Merkkijonoluokka String. Math-luokka. Kääreluokat. 20.1 20.2 Java API Java-kielen Application Programming Interface (API)
Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus
Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi Järjestelmän eri tasot Laitteiston nopeus ttk-91 rakenne ja käskykantaarkkitehtuuri Konekielinen ohjelmointi
Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto
Sisällys 18. bstraktit tietotyypit Johdanto abstrakteihin tietotyyppeihin. Pino ja jono. Linkitetty lista. Pino linkitetyllä listalla toteutettuna. 18.1 18.2 Johdanto Javan omat tietotyypit ovat jo tuttuja:
1. Keskusyksikön rakenne
1. Keskusyksikön rakenne Kuvassa on esitelty TTK-91 esimerkkikoneen keskusyksikkö. Oikeiden tietokoneiden keskusyksiköt ovat luonnollisesti monimutkaisempia, mutta tämä riittää oikein mainiosti asian havainnollistamiseen.
Osoitin ja viittaus C++:ssa
Osoitin ja viittaus C++:ssa Osoitin yksinkertaiseen tietotyyppiin Osoitin on muuttuja, joka sisältää jonkin toisen samantyyppisen muuttujan osoitteen. Ohessa on esimerkkiohjelma, jossa määritellään kokonaislukumuuttuja
ELM GROUP 04. Teemu Laakso Henrik Talarmo
ELM GROUP 04 Teemu Laakso Henrik Talarmo 23. marraskuuta 2017 Sisältö 1 Johdanto 1 2 Ominaisuuksia 2 2.1 Muuttujat ja tietorakenteet...................... 2 2.2 Funktiot................................
15. Ohjelmoinnin tekniikkaa 15.1
15. Ohjelmoinnin tekniikkaa 15.1 Sisällys For-each-rakenne. Lueteltu tyyppi enum. Override-annotaatio. Geneerinen ohjelmointi. 15.2 For-each-rakenne For-rakenteen variaatio taulukoiden ja muiden kokoelmien
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely
Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely Poikkeukset Poikkeuksella tarkoitetaan yllättävää ajonaikaista tilannetta, joka