Javan ja C/C++:n eroavaisuuksia
Pekka Tapani Kanerva, 42764s
Sisällys
1. Yleistä
1.1 Javan synty
2. Miten Java eroaa C/C++:sta
2.1 Muutamia merkittävimpiä eroavaisuuksia
2.2 Olio-käsite
3. Javan edut verkossa
3.1 Laitteistoriippumattomuus
3.2 Ylläpidon helppous
3.3 Turvallisuus
3.4 Javan suosio
4. Mitä uutta Java 1.1 tuo tullessaan
4.1 Kokonaan uusittu AWT tapahtumankäsittelyluokka
4.2 Sisemmät luokat
4.3 Kansainvälisyys
4.4 Java Beans
4.5 Remote Method Invocation
5. Yhteenveto
Viitteet
Lisätietoja aiheesta
1. Yleistä
Java on alunperin syntynyt ohjelmointikieleksi, jota käytettäisiin
kuluttajaelektroniikassa. Televisiot, radiot, mikroaaltouunit yms. jokapäiväiseen
elämään liittyvät laitteet sisältävät
nykyään paljon ohjelmistotekniikkaa. Syntyi tarve uudelle ohjelmointikielelle,
joka täyttäisi muutamia erityisiä vaatimuksia. Ohjelmien
pitää pystyä sopeutumaan uusiin mikropiireihin, joita näiden
valmistajat tuovat markkinoille. Kuluttajaelektroniikassa otetaan uusia
mikropiirejä käyttöön sitä mukaa kun niitä
tulee saataville. Ohjelmistojen pitää toimia myös näissä
uusissa mikropiireissä ilman erillisiä muutoksia.
1.1 Javan synty
Vuonna 1990 James Goslingin johtama pieni työryhmä koodinimeltän
Green alkoi työskennellä Sun Microsystems:illä aiheen parissa.
Kävi selväksi, että sen paremmin C kuin C++ ei soveltuisi
yllä kuvailtuihin käyttötarkoituksiin. Sekä C että
C++ pitää kääntää aina uudelle mikropiirityypille
uudelleen. Lisäksi näiden kielten monimutkaisuus tekee niistä
erittäin vaikeakäyttöiset työkalut silloin, kun pitää
kehittää ohjelmistoja jotka ovat erittäi luotettavia ja
varmatoimisia. Kielen piti olla yksinkertainen ja tutuntuntuinen [ 1
]. Kehittelyn tuloksena syntyi uusi kieli nimeltä Java, joka kuvaillaan
seuraavasti:
Java: Yksinkertainen, oliopohjainen, hajautettu, tulkattu, turvallinen,
arkkitehtuurista riippumaton, siirrettävä, suorituskykyinen,
säikeinen ja dynaaminen ohjelmointikieli [ 2
]
2. Miten Java eroaa C/C++:sta
Javasta haluttiin tehdä mahdollisimman samankaltainen kieli verrattuna
C- ja C++-kieliin. Näin haluttiin saada kynnys Javan käyttöön
siirtymiseen mahdollisimman matalaksi. Näkökohtana oli, että
ohjelmointikielen tarkoitus on ohjelmoiminen ja toimivien sovellusten tuottaminen.
Kieli ei saa olla niin monimutkainen, että sen opettelemiseen kuluu
kohtuuttomasti aikaa, ennen kuin tuottava työskentely sitä käyttäen
voi alkaa.
Javan yksinkertaisuutta ja oppimisen helppoutta korostaa myös se,
että Java pyrittiin tekemään mahdollisimman pienikokoiseksi.
Javan kotisivuilla todetaan että "Olet saavuttanut täydellisyyden
suunnittelussa ei silloin kun sinulla ei enää ole mitään
lisättävää vaan silloin kun sinulla ei ole mitään
poistettavaa." (Antoine de Saint Exupery) [ 1 ].
C++-kielen kehittäjä Bjarne
Stoustrup on kuitenkin sitä mieltä, että Java tulee
kasvamaan paljon monimutkaisemmaksi ajan kuluessa. Hänen mielestään
Javan pieni koko selittyy sillä, ettei kieli ole vielä "valmis"
vaan että sen kehitystyö on vielä käynnissä [
3 ].
2.1 Muutamia merkittävimpiä eroavaisuuksia
-
Ei esiprosessoria Toisin kuin C ja C++ ei Javassa ole lainkaan esiprosessoria.
Tämä
saattaa vaikuttaa oudolta ja suoranaiselta puutteelta heille, jotka
ovat tottuneet ohjelmoi-
maan käyttäen C:n ja C++:n #include, #define ja #ifdef esiprosessorin
komentoja.
Käytännössä ei Java kuitenkaan tarvitse tällaisia
rakenteita
-
Ei osoittimia Olioihin viittaus tapahtuu automaattisesti Javassa.
Kieli ei anna käyttäjän
suoraan käsitellä osoittimia tai muistiviittauksia. Osoittimet
ovat tunnettu ja maineikas
ohjelmointivirheiden ja bugien lähde. Poistamalla osoittimet kielestä
poistuu samalla
suuri määrä ohjelmointivirheitä.
-
Ei rakenteita eikä unioneita Java ei sisällä C:n
stuct ja union tietotyyppejä. Näitä ei tarvita, sillä
javan luokat tarjoavat kaikki sellaiset ominaisuudet, joita struct ja union
tarjoavat. Lisäksi käyttäjä voi matkia unionin
käytöstä Javan aliluokkien avulla.
-
Ei funktioita Java ei tunne funktion käsitettä ollenkaan.
C++:ssa voi olla sekä funktioita,
jolla käsitellä dataa, sekä luokkiin liittyviä
metodeja, joilla käsitellään luokkien ja niiden
ilmentymien eli instanssien sisältöä. Java tuntee vain
luokat ja niiden käsittelyyn
tarkoitetut metodit.
-
Roskien keruu (Garbage Collection) [ 4 ]Javassa
käyttäjän ei tarvitse murehtia muistin suorasta käsittelystä.
Olioita luodaan new-operaattoria käyttäen, mutta minkään-
laista C++:n kaltaista free-operaattoria ei ole. Javan ajonaikainen
ympäristö huolehtii
olioiden muistinvarauksesta sekä muistin vapauttamisesta sen jälkeen,
kun oliota ei
enää käytetä. Muistinhallinta on ollut tunnettu
ongelmalapsi C++:aa käytettäessä. Roskienkeruu pitää
automaattisesti huolta muistin hallinnasta ja erityisesti vanhentu-
neiden olioiden - roskien - poistosta, ja vapauttaa näin ohjelmoijan
keskitty-
mään olennaisimpaan - toimivien ja luotettavien sovellusten
tekemiseen.
-
Moniperintä Java ei tue moniperintää kuten C++. Moniperintä
tarkoittaa yksinertaisesti
sitä, että aliluokalla voi olla vain yksi yliluokka. Moniperintää
ei liitetty Javaan siitä syystä,
että vaikkakin se voi tuoda lisää ominaisuuksia kieleen,
voi moniperintää väärin tai
huolimattomasti käyttämällä saada ohjelmistaan
tarpeettoman monimutkaisia. Tämä sotii
vastaan Javan perusperiaatetta, yksinkertaisuutta ja selkeyttä.
-
Rajapinnat (interfaces) Javan ratkaisu moniperinnän puuttumiseen
ovat rajapinnat.
Vaikka aliluokka voi periä vain yhden yliluokan ominaisuudet ja
metodit, voi luokka
periä lisäksi abstrakteja metodeita lukuisista rajapinnoista.
Tällöin näiden luokkien
täytyy kuitenkin määritellä näiden perittyjen
metodien toteutukset sisällään. On kuitenkin
huomattava, että rajapinnat tarjoavat paljon muutakin, kuin pelkän
kompensaation
moniperinnän puuttumiselle. Rajapinnoilla voi olla alirajapintoja
aivan samalla tavalla
kuin luokilla voi olla aliluokkia
2.2 Olio-käsite
Java on - kuten edellä jo on todettu - olio-ohjelmointikieli. Tämä
tarkoittaa sitä, että Javassa kaikki paitsi primitiiviset tietotyypit
(kuten char, int, bool jne.) ovat olioita. C++ tarjoaa mahdollisuuden ohjelmoida
olio-orientoituneesti, mutta yhtä hyvin C++:aa voi käyttää
perinteisen C:n tapaan ja olla välittämättä olio-ominaisuuksista.
Tämä antaa mahdollisuuden iloiseen sekasotkuun, missä sekoitetaan
perinteistä C:tä ja C++:n olio-ominaisuuksia, jolloin ohjelmista
tulee vaikeammin luettavia ja sen seurauksena vaikeammin ymmärrettäviä.
Olio-käsite on otettu ohjelmoinnin malliksi arkielämästä.
Meitä kaikkia ympäröivät oliot. Esimerkkejä voidaan
ottaa vaikka kuinka paljon: autot, tietokoneet, rannekellot jne. Samalla
tavoin sovellusohjelmistot sisältävät olioita: painonappeja,
tiedostolistoja, tekstinkäsittelyohjelman tekstitila, tietokanta-alkiot
jne. Yhteistä näillä on, että niillä on tila ja
käytös [ 5 ] Tällaisia olioita mallinnetaan
luokilla. Luokka sisältää malliaan kuvaavat muuttujat (tila)
ja metodit, joilla luokan sisältämää dataa voidaan
käsitellä (käytös).
3. Javan edut verkossa
3.1 Laitteistoriippumattomuus
Java suunniteltiin alun perin toimimaan verkossa. Verkot ovat yleensä
erittäin heterogeenisiä ympäristöjä, joista löytyy
monenlaisia laitteistoja. On UNIX pohjaisia työasemia, henkilökohtaisia
tietokoneita eli PC:itä, MacIntosheja yms. Perinteiset C:llä
tai C++:lla kirjoitetut ohjelmat tarvitseevat jokaiseen laitteistoarkkitehtuuriin
oman käännöksen ohjelmasta, joka toimii vain tietyssä
arkkitehtuurissa. Java ratkaisee ongelman niinsanotulla tavukoodilla. Java
kääntäjä tuottaalähdekoodista tällaista tavukoodia,
perinteisen konekielikodin sijaan. Java Virtual Machine (JVM)tulkitsee
ajonaikana tätä tavukoodia. Tällä menetelmällä
saavutetaan laitteistoriippumattomuus: Java ohjelmat toimivat kaikissa
niissä ympäristöissä, joihin JVM on käännetty.
Tämä ei kuitenkaan vielä riitä. Tunnettu esimerkki
on, että C-kielessä eri laitteistoarkkitehtuureissa esiintyy
esimerkiksi erikokoisia int-tietotyyppejä. Näitä voi olla
16-, 32-, tai 64-bittisiä vari- aatioita riippuen laitteistoarkkitehtuurista.
Jotta tällaiset ongelmat ja siitä aiheutuvat laitteisto- riippuvuudet
vältettäisiin, Java määrittelee kaikille perustietotyypeille
niiden koot sekä näiden aritmeettisien operaatioiden käytöksen.
Sun Microsystems:in 100% Pure Java Program -ohjelma auttaa ohjelmistosuunnittelijoita
pyrkimyksessä täysin laitteistoriippumattoman koodin tuottamiseen.
3.2 Ylläpidon helppous
Java-sovelluksen eli appletin käyttö on yksinkertaisimmillaan
yhtä helppoa kuin HTML- linkin klikkaaminen. Sovellus ladataan verkon
yli tarvittaessa, eikä sitä tarvitse välttämättä
asentaa omalle kovalevylle. Koska useimmat nykyiset verkon yli toimivat
sovellukset ovat erilaisia asiakas/palvelin muunnelmia, saavutetaan Javan
käyttämällä menetelmällä huomattavia etuja
esimerkiksi sovellusten ylläpidon suhteen.[ 5
] Kun sekä palvelin- että asiakasohjelma sijaitsevat fyysisesti
palvelinkoneen levyllä, on asiakasohjelman päivitys yksinkertaista.
Laitetaan uusi versio vanhan tilalle, eikä tarvitse käydä
läpi aikaa vievää päivitysten sarjaa eri yrityksissä.
Tällöin säästyy aikaa, eikä tarvitse miettiä
eri sovellusversioiden yhteensopivuutta keskenään. Toisaalta
voidaan käyttää jonkinlaisia versiontunnistusmenetelmiä
eri asiakasversioiden kesken. Palvelin voi sisältää tiedon
siitä, mikä on uusin asiakasliityntäohjelman versionumero
ja kysyä tätä yhteyttä ottavalta asiakkaalta. Mikäli
versio on vanhentunut, voi asiakasohjelma automaattisesti päivittää
itsensä verkon yli, eikä erillisiä paikallisen ylläpidon
toimenpiteitä tarvita.
3.3 Turvallisuus
Verkossa toimivien sovellusten turvallisuuteen on kiinnitettävä
erityistä huomiota. Javan ajonaikainen järjestelmä, Java
Virtual Machine, eli Java virtuaalikone tarkistaa kaiken ajettavan koodin,
eikä anna tehdä mitään epäilyttävää.
Koska Java ei sisällä suoria muistiviittauksia, suljetaan kokonaan
pois laskuista hyökkäykset, jotka perustuvat suoraan muistinkäsittelyyn.
Toinen JVM:n käyttämä menetelmä on kaiken ajettavan
koodin tarkistus. Kun verkon yli ladataan tavukoodia, johon ei voida täysin
luottaa, Java-tulkki varmistaa kaiken ajettavan koodin ennen kuin ajaan
sen. Tällöin tarkistetaan, että koodi on oikeinmuodostettua,
että se ei esimerkiksi vuoda yli pinossa, eikä sisällä
laittomia toiminteita. Kolmanneksi, Java-tulkki antaa jokaiselle ajettavalle
sovellukselle eräänlaisen kehyksen, jossa ohjelma saa toimia.
Kehyksen ulkopuolelle ei ole tulemista. Esimerkkinä mainittakoon,
että kehys kieltää kaikenlaisen paikallisen levy- järjestelmän
käytön. Tällöin eivät esimerkiksi virukset voi
kirjoittaa itseään levylle. Vastaavasti muistin suojaus estää
niitä leviämään sellaisille muistialueille, joita JVM
ei nimenomaisesti ole osoittanut ohjelman käyttöön.
3.4 Javan suosio
Mikä selittää Javan saaman huomion ja sen, että kaikki
rummuttavat Javan käytön puolesta? Syitä on varmasti monia.
Ensimmäisenä voidaan pitää Internetin käytön
nykyistä eksponentiaalista kasvuvauhtia, ja sen käytön leviämistä
suuren yleisön keskuuteen. Tätä ennen Internet oli paljolti
vain sotilaallisen ja akateemisen maailman verkko, jossa kulki pääasiassa
sähköpoisti sekä uutisryhmien levitys. Toisena syynä
voidaan pitää WWW:n tuloa julkisuuteen. WWW:n kautta aukesivat
yritysten silmät uudenlaisen markkinointikanavan käyttöön.
Mutta pelkkä html ei tarjonnut kovin ihmeellisiä mahdollisuuksia
visuaalisesti rikkaiden sivujen tekoon. Tähän sopivat pienet
java-sovellukset, java-appletit, joilla voitiin helposti liittää
kivoja animaatioita ja ääniä sivun koristukseksi. Sittemmin
huomattiin, että Java on paljon muutakin. Se on kokonainen, täydellinen
ohjelmointikieli, jolla voi tehdä oikeita sovelluksia. Vieläpä
sellaisia, jotka toimivat verkossa. Tällaiselle oli ilmeinen tilaus.
Verkottuminen oli päivän kuuma puheenaihe, ja hajautettujen sovellusten
teko C:llä ja C++:lla oli hankalaa. Java tarjoaa valmiit välineet
verkon yli kommunikointiin. Kun tämän kaiken lisäksi Sun
jakaa Javan peruskehitysympäristöä Java Development Kit:iä
ilmaiseksi kaikille halukkaille verkossa [ 6 ] ja
näin tarjoavat helpon tavan tutustua Javaan ja huomata sen yksinkertaisuus,
lienee menestys varmaa.
4. Mitä uutta Java 1.1 tuo tullessaan
4.1 Kokonaan uusittu AWT tapahtumankäsittelyluokka
Koko tapahtumankäsittelyjärjestelmä (events) on uudistettu
Java 1.1:ssä Uudessa tapahtuma- mallissa tapahtumat tuotetaan erilaisissa
tapahtumalähteissä. Kun tapahtuma ilmenee, kerrotaan tästä
tarvittaville tahoille, joita kutsutaan tapahtuman kuuntelijoiksi. Tällaista
mallia kutsutaan delegoinniksi, sillä se mahdollistaa tapahtumien
käsittelyn kohdistamisen niille tahoille, jotka huolehtivat tapahtumien
käsittelystä. Tällä menetelmällä yhtenäistetään
tapahtumien käsittely- mallia pitäen silmällä uutta
Java Beans-ominaisuutta.
4.2 Sisemmät luokat
Java 1.1:een on lisätty mahdollisuus liittää luokkamäärittelyjä
sisäkkäin. Tämän tarkoitus on selkeyttää
koodin kirjoitusta, jolloin erilaiset apu- ja liityntäluokat tuodaan
koodissa lähelle niitä paikkoja joissa niitä käytetään.
Samalla ne on helpompi erottaa ohjelmakoodin varsinaisista luokista, joilla
on keskeinen merkitys ohjelmassa.
4.3 Kansainvälisyys (Internationalization)
Internationalization (tästä eteenpäin lyennettynä I18N)
mahdollistaa sovellusten toiminnan eri maissa, joissa on eri kieli. Tämän
lisäksi on tärkeää muuttaa esimerkiksi päiväyksen,
kellonajan ja valuuttayksikön esitystapa kunkin maan tavan mukaiseksi.
Lisäksi pitää miettiä merkkien koodaustapaa, joka on
meille suomalaisille ääkkösten muodossa tuttu ongelma. Java
1.1 tarjoaa menetelmät näiden ongelmien ratkaisemiseksi.
4.4 Java Beans
Java Beans on malli, jonka avulla voidaan kirjoittaa uudelleenkäytettäviä
sovellusohjelman osasia. Sovellusohjelmat ovat täynnä erilaisia
usein esiintyviä osia, kuten painonappeja, tietynlaisia ikkunoita,
jotka tarjoavat tietoa käyttäjille jne. Java Beans:in tarkoituksena
on yhtenäistää käytäntö, miten sovellusohjelman
osia, eli yleensä luokkia kierrätetään, miten niitä
nimetään yms. Mikäli yksittäinen bean eli "papu" noudattaa
tällaisia käytäntöjä, voi toinen ohjelmoija saada
tietoa kyseisestä pavusta Java 1.1:n Reflection API:n kautta.
4.5 Remote Method Invocation
RMI on tarkoitettu erityisesti verkossa tapahtuvaa viestintää
varten. RMI mahdollistaa eri Java sovellusten kutsua metodeja, jotka ovat
mahdollisesti eri JVM:ssä, mahdollisesti eri isäntäkoneessa.
Java tukee socketteja, mutta näiden käyttö edellyttää
erillisen protokollan käyttöä. Tunnettua on, että tällaisten
protokollien suunnittelu on erittäin monimutkaista ja hankalaa sekä
erittäi altista erilaisille virheille.
5. Yhteenveto
Vain tulevaisuus näyttää, miten Java asettuu muiden ohjelmointikielten
joukkoon. Tuleeko siitä kenties johtava työkalu ohjelmien kehitykseen,
"standardi" samassa mielessä kuin C ja C++ ovat ohjelmointimaailmassa
nykyään. Onko tulevaisuudessa prosessoreja, joiden konekielenä
on Java, siten kuin Javan alkuperäinen tarkoitus oli, leivänpaahtimet,
radiot, kännykät toimivat Javaa käyttäen. Microsoftin
Bill Gatesin haaveena on tuoda Windows ulos PC:stä yleiseksi ohjausjärjestelmäksi
ja käyttöliittymäksi kaikkeen kodin viihde-elektroniikkaan.
On mielenkiintoista nähdä millaisia kapuloita Java mahdollisesti
työntää tämän suunnitelman pinnojen väliin.
Viiteet
[1] Sun Microsystems: Java-Simple and Familiar - 1.11.1997 ***
<URL: http://java.sun.com/docs/white/langenv/Simple.doc.html#343
>
[2] Sun Microsystems: The Java(tm) Language: An Overview - 1.11.1997
****
<URL: http://java.sun.com/docs/overviews/java/java-overview-1.html
>
[3] Bjarne Stoustrup: Bjarne Stoustrup's FAQ - 31.10.1997 *
<URL: http://www.research.att.com/~bs/bs_faq.html
>
[4] Sun Microsystems: Main Features of Java Programming Language 2.1
- 1.11.1997 ***
<URL: http://java.sun.com/docs/white/langenv/Simple.doc1.html#2333
>
[5] Ron Resnic: Bringing Distributed Objects to the World Wide Web -
1.11.1997 ***(*)
<URL: http://www.interlog.com/~resnick/javacorb.html#Promise
>
[6] Sun Microsystems: Products and APIs - 1.11.1997 **
<URL: http://java.sun.com/products/index.html
>
Lisätietoja aiheesta
Sun Microsystems: Java
Documentation - 1.11.1997 ****
Sisältää Javan koko dokumentaation
Lindström, Juha: Johdatus
Java-kieleen - 27.4.1997 ***
Tik-110.300 Tietoliikennearkkitehtuurit-kurssilla tehty essee aiheesta
Sun World Online July 1995: Java:
The Inside Story - 6.1995 ****
Katsaus Javan kehitykseen
Fortune: Sun's
Java: The Threat to Microsoft Is Real - 11.11.1996 ***(*)
Kertoo Javan muodostamasta uhasta Microsoftin monopoliasemalle
Sunin kotisivuilta löytyviä dokumentteja ja johdatuksia
aiheisiin:
Sun Microsystems: Introducing
Java Beans - 1.11.1997***
Sun Microsystems: Java
Beans - 1.11.1997 ****
Sun Microsystems: Remote
Method Invocation - 1.11.1997 ****
Sun Microsystems: Java
White Papers - 1.11.1997 *****
--
Amerikkalaisen konsulttiyhtiön dokumentteja aiheesta:
ObjectWorks Consulting Inc: WEB/Database
Middleware - 11.6.1997 ***
ObjectWorks Consulting Inc: Java
Beans - 11.6.1997 ***
ObjectWorks Consulting Inc: Java
- 11.6.1997 ***
--
Bjarne Stoustrup: The
Design and Evolution of C++ - 3.12.1996 **
Mainos kirjasta joka kertoo C++:n kehityksestä ja kehittymisestä
kielen kehittäjän kertomana
David Flanagan: Java in a Nutshell, 1st and 2nd
edition , 1997, O'Reilly ****
Erittäin hyvä kirja Java-kielestä, 1. ja 2. painos ovat
tavallaan jatko-osat
(c) Pekka Kanerva 1997