Yleistä
Tärkeä huomautus
Aika kuluu ja kellot paukkaa. Opas on kirjoitettu omana aikanaan ja C++ on elänyt omaa elämäänsä. Perusasiat ovat pysyneet melkolailla ennallaan, mutta oppaassa esitetään asioita, jotka eivät ole väärin, mutta eivät enää se oikea ja hyvä tapa kirjoittaa C++-ohjelmia. Nämä asiat ovat nimiavaruudet ja main-funktion paluuarvo. Molemmista kyllä kerrotaan vallitseva totuus, mutta sitä ei noudateta kaikissa esimerkkiohjelmissa. Esimerkkien päivittäminen on niin iso urakka, että minulla ei siihen ole aikaa - mutta vapaaehtoisia otetaan vastaan. Nykymaailmassa oikea tapa tehdä Hello World -ohjelma on:
#include <iostream> int main() { std::cout << "Hello world!" << std::endl; return EXIT_SUCCESS; // tämä rivi ei ole välttämätön }
Lisäksi tässä oppaassa oleva sisältö keskittyy enemmän C++:n C-henkiseen osuuteen. Nykyaikainen C++-ohjelmointi painottuu enemmän olioihin ja luokkiin, joita ei tässä oppaassa käsitellä riittävän kattavasti.
Mitä tarvitaan, että voi aloittaa C++-ohjelmoinnin?
Lyhyt vastaus
Tee kuten täällä sanotaan:
http://csjava.occ.cccd.edu/~gilberts/devcpp5/
Pidempi vastaus:
Näiden esimerkkien ajamiseen tarvitaan asennettu ja toimiva C++- kääntäjä. Mutta näiden esimerkkien ja oppien pitäisi toimia kaikilla ANSI-standardin mukaisilla C++- kääntäjillä (huomaa kuitenkin edellisen kappaleen lisäys).
Lista ilmaisista kääntäjistä löytyy osoitteesta http://www.thefreecountry.com/compilers/cpp.shtml. Windows-maailmaan voisi suositella helppokäyttöiseksi vaihtoehdoksi Dev-C++-kääntäjää. Linuxissa luonnollinen valinta on GCC, joka tulee myös käyttöjärjestelmän mukana. Windowsissa GCC:ta voi ajaa myös Cygwin UNIX-emulaattorin avulla. Ohjeet asennukseen löytyvät osoitteesta http://www.cygwin.com/cygwin-ug-net/setup-net.html.
Mikäs juttu tämä on?
Tämän tuhkimotarinan juuria kaivellessa pitää porautua hyvin syvälle historian pölyyn ja nöyhtään. Joskus aikojen alussa, kun miehet vielä olivat rautaa ja laivoilla ei saanut verovapaata viinaa, pyysi Jonni Lehtiranta minua kirjoittamaan ohjelmointisivuillensa oppaan C++-ohjelmoinnin alkeisiin. No, minä tein työtä käskettyä. Opas oli melko vajaavainen, mutta jaksamista ei riittänyt sen täydentämiseen. En myöskään osannut kunnolla C++-kieltä, mikä vaikuttaa toisena hyvin raskaana seikkana laiskuuden lisäksi. Myöhemmin, kun jopa kaksi ihmistä olivat ottaneet minuun yhteyttä oppaan puitteissa, jatkui oppaan kirjoittaminen valtavan menestyksen hurmioittamana.
Nykyään pidän opasta näillä www-sivuilla, joten se voi nuorekkaan dynaamisesti kehittyä päivittäin, tai kerran kahdessa vuodessa - riippuen joutoaikani määrästä. Lukijoitakin nykyään on kertynyt jopa niin monta, että niitä ei yhden käden sormilla lasketakaan. Palautettakin on tullut ja mikäs siinä, kun tiimi toimii ja palautetta tulee. Oma aikani on vaan sen verran rajallinen, että yritän aina poimia vain pahimmat virheet ja puutteet ja korjata ne. Mutta silti palautetta otetaan kyllä mielellään vastaan.
Voinko minä nyt lukea tätä?
No mikä ettei. Opastus on suunnattu pääasiassa nuorille aloittelijoille, mutta todistettavasti myös eräät jo kunnioitettavan iän saavuttaneet ovat tykänneet lähestymistyylistäni. Siitä olenkin hyvin ylpeä - onhan se sukupolvi jo useaan otteeseen tuomittu täysin kyvyttömäksi oppimaan mitään tekstinkäsittelyn alkeita vaativampaa tietokoneenkäyttöä.
Asiat ovat likipitäen etenemisjärjestyksessä, aloittelijan kannattaa lukea kappaleita järjestyksessä. Tähdellä merkityt kappaleet ovat hieman haastavampia, joten jos siltä tuntuu voi niiden yli hypätä ja palata tutkiskelemaan niitä sitten myöhemmin. Tarpeen mukaan tekstiin on ripoteltu kehotuksia lukea pätkiä muista aihealueista, lähinnä Sekalaiset-kohdasta. Loppupuolella ei enää johdattalua ole niin paljon - kai jo kaiken kokenut C++-ohjelmoija osaa itsekin ajatella.
Harva asia on yhtä huvittavaa kuin "Opi C++-ohjelmointi 21 päivässä" -tyylinen pelleily. Mikäli ostaa sellaisen kirjan ja lukee yhden kappaleen päivässä, niin 21 päivän päästä ei kyllä voi sanoa osaavansa C++-kieltä. Käytäntö on hyvä opettaja, varsinkin kun pitää oppia jotain teoreettista, kuten C++. Tämän oppaan nimi voisikin olla "Opi C++-ohjelmointi hyvin pitkän ajanjakson kuluessa" tai paremminkin "Opiskele C++:aa, vaikka et sitä ikinä täysin opikaan". Välillä kannattaa jättää koko opas ja tehdä jotain oikeasti. Sitten voi taas palata katsomaan, mitä kaikkea virheitä tulikaan tehdyksi. C++ on todennäköisesti maailman mammuttimaisin ohjelmointikieli, joten sen opiskelu kattavasti ottaa aikansa.
Lainopillinen osio
Kuten normaaliin käytäntöön kuuluu, en ota sivuista rahaa sen enemmän kuin vastuutakaan. Kaikki sivuilla oleva materiaali on ilmaiseksi käytössäsi. Tekstiin minulla on tietenkin normaalit tekijänoikeudet, joten sitä lainattaessa pitää minut aina mainita tekstin kirjoittajaksi. Täältä löytyvien ohjelmien ja ohjelmanosasten suhteen luovun täysin tekijänoikeuksistani, joten niitä saa venyttää ja paukuttaa ihan miten haluaa. En ota mitään vastuuta tekstistä tai ohjelmista koituvasta harmista. Vaikea kyllä on kuvitella mitä harmia niistä voisi koitua - seonnutta vuorokausirytmiä lukuunottamatta.
Ohjelmoinnista
Ohjelmointi on kehittävä harrastus ja ihan hauskaa myös yleensä. Mutta aika vaikeaa se on, joten ei kannata odottaa oppivansa guruksi parissa viikossa - tai edes vuodessa. Mutta kun sitä tarpeeksi osaa, alkaa näpyttely tuntua aina vaan mukavammalta, joten pitää jaksaa yrittää. Ennen pitkää huomaa, että vain mielikuvitus on rajana - ja sen takia ohjelmoijat yleensä hommasta pitävätkin, omien mielikuvitusmaailmojen suunnittelu ja toteuttaminen käytönnössä on mukavaa puuhaa. Ja sen myös sanon, että nykyään ohjelmointibisnes on melko hurja ala - oli lama tai ei. Töitä saa helposti vaikka asuu kaukana korvessa ja on alan koulutusta vailla oleva pojankloppi tai tytönhuitake.
Kääntäminen
C++ on hieman ihmiskieltä muistuttava kieli, joka tahtoo sanoa sitä, että tietokone ei sitä semmoisenaan ymmärrä. Joten silloin tarvitaan kääntäjää. Se tulkitsee C++-lähdekoodin ja muuntaa sen konekieleksi (.exe tms..), jotta konekin sen ymmärtää. Idea siis on: meillä on tekstimuotoinen C++-koodi, kääntäjä lukee sen ja korvaa kaikki ilmaukset kirjastoistaan löytyvillä binäärikoodeilla, joita sitten prosessori osaa suorittaa. Binäärikoodit tietenkin riippuvat ihan siitä, missä ympäristössä ja prosessorissa ohjelma toimii. C++-ohjelma on kuitenkin aina sama.
Tässä oppaassa opetetaan käyttämään C++:n standardiominaisuuksia. On kuitenkin olemassa ympäristöjä, joissa niiden käyttäminen ei ole samalla tavalla mahdollista - siis vaikka oppaassa esitetään vain standardin mukaista C++-koodia, niin aivan jokaisesta C++-kääntäjästä se ei mene läpi. Esimerkkinä mainittakoon Windows-ohjelmointi - ikkunapohjaisessa maailmassa ei ole vastineita kaikille C++:n konsolipohjaisille ominaisuuksille. Vaadittavat muutokset ovat kuitenkin pieniä ja kielihän on aivan sama - ainoastaan esitettävä asia hieman erilainen. Windows-kääntäjästäkin saa oppaan esimerkkiohjelmat menemään sellaisenaan läpi, kun asettaa sen kääntämään konsolitilaan (console mode application).
C++:n historia
Aivan ensimmäisiä tietokoneita ohjattiin kääntelemällä vipuja, joista bitit ovat tavallaan periytyneet. Sitten tulivat transistorit ja mikropiirit, jotka mahdollistivat nykyisen kokoiset tietokoneet. Ennen ne olivat olleet huoneen kokoisia. Aluksi koneita ohjattiin niiden omalla konekielellä, kirjoittamalla suoraan niiden ymmärtämää kieltä. Se oli kuitenkin vaikeaa ja virheiden etsiminen oli todella työlästä.
Niinpä keksittiin Assembly-kieli (Kyllä, se on Assembly. Assembler tarkoittaa Assembly-kääntäjää.). Assemblyssa, tutuille Assyssa, käytettiin yhä konekieltä, mutta muistipaikoille voitiin antaa nimiä eli käyttää muuttujia ja myös käskyt olivat inhimillisempiä. Silloin tarvittiin kuitenkin kääntäjä, joka kääntää Assembly-koodin puhtaaksi konekieleksi. Sitten tuli korkeamman tason kieliä, kuten legendaarinen Basic, Pascal, C, Cobol, Fortran - ja vihdoin C++. Kielet erkanevat koko ajan koneesta ja konekielestä, mikä teki niistä helpommin käytettäviä (ja hitaampia).
C++-kieli
C++-kieli on uudistettu versio C-kielestä (nii-in, C+ kieltä ei ole olemassa!). Perusasiat on hoidettu samalla mallilla kuin C-kielessä, mutta voisi sanoa että C++ menee "pidemmälle". C++ kieli nimittäin tarjoaa paljon uutta mitä C-kielessä ei ole. C kieltä voi sotkea C++-ohjelmien sekaan, ne toimivat kyllä yhteen, mutta erityisen suositeltavaa se ei ole. Eikä sille kyllä ole tarvettakaan.
C++ on yleiskäyttöinen ohjelmointikieli, joka sopii melkein kaikkeen mitä tietokone voidaan ohjelmoida tekemään. C++ on korkean tason kieli, tarkoittaen että sillä ei ole hirveästi yhteistä itse tietokoneen konekielen kanssa. Se tekee siitä melko mukavan käyttää, mutta toisaalta tietenkin hitaamman kuin puhdas konekieli. Nykyajan hyvin optimoivilla kääntäjillä ei ero kuitenkaan ole kovin dramaattinen. Uudempiin kieliin, kuten Java ja C#, verrattuna C++ on laiteläheinen ja nopea. Nopeutta vaativissa C++-ohjelmissa voidaan kriittiset kohdat, siis ne kohdat joita rullataan suurimman osan ajasta, kirjoittaa puhtaalla konekielellä, mutta yleensä ottaen konekielen käyttö C++:n seassa lähinnä sotkee muuten niin siistiä ohjelmaa.
C++ on oliopohjainen kieli. Ennen muinoin kielet olivat proseduraalisia, siis pääosaa esittivät toiminnot. Ohjelma rakennettiin funktioista, toiminnoista. Yksi toiminto luki näppäimen painalluksen, toinen siirsi tietoa paikasta toiseen. Sitten huomattiin, että isoissa ohjelmissa homma ei enää pelaa. Niinpä keksittiin oliopohjaisuus. Oliopohjaiset ohjelmat koostuvat olioista, kuinkas ollakaan. Olio esittää jotain ohjelmaan liittyvää kokonaisuutta; räiskintäpelissä vaikka yksi hirviö voisi olla olio. Oikeaoppiset C++-ohjelmat perustuvat olioiden vuorovaikutukseen. Toiminnot ja tieto on yhdistetty niihin olioihin joihin se liittyy.
Tietotyypeillä on myös tärkeä rooli C++-kielessä. C++ on hyvin tarkka tietotyyppien suhteen. Aluksi se tuntuu vähän hankalalta, mutta suuremmissa ohjelmissa hyöty on melkoinen. Kun C++-kääntäjä valvoo tietotyyppien oikeaa käyttöä, on se melkoinen työmäärä pois ohjelmoijalta.
Ohjelmointikielien kehitys ja laitteistosta erkaneminen on jatkunut C++:n jälkeen. Merkittävin askel on ollut virtuaalikoneen päällä toimivat kielet, ensin Java ja sitten Microsoftin .Net-alusta ja C#-kieli. Virtuaalikoneeseen perustuvat kielet eivät toimi suoraan tietokoneen prosessorissa, vaan virtuaalikoneessa, joka toimii natiivina eli on suoraan yhteydessä prosessoriin. Koska laitteen ja ohjelman välissä on virtuaalikone, voidaan ohjelmaa hallita paljon paremmin. Ja koska virtuaalikoneen voi toteuttaa lukemattomille eri tietokoneympäristöille, toimivat myös ohjelmat suoraan eri ympäristöissä. Javan ja C#:n opiskelu C++:aa osaaville on melko vaivatonta, koska näiden kielten kieliopit ovat hyvin samankaltaisia.
Merkinnöistä
Olen kirjoittanut tämän oppaan tietokonefriikkinä, en kielifriikkinä (joka tietyssä määrin olen myös). Joten esimerkiksi olioiden ja funktioiden nimet on kirjoitettu pienellä, myös lauseen alussa. Asia on katsos niin, että esimerkiksi syötettä lukeva olio cin kirjoitetaan aina ohjelmoidessa pienellä. Cin:n voi tietenkin kirjoittaa lauseen alussa isolla, mutta isolla kirjoitettu Cin ei toimi ohjelmissa, koska C++ erottelee isot ja pienet kirjaimet; MeidanTalo, Meidantalo ja meidantalo ovat C++-kääntäjän silmissä eri asioita.
Koska englanti on ohjelmoinnin kieli ja koska C++ on suunniteltu englannin pohjalta ja koska lähes kaikki oheiskirjastot mitä maailmasta löytyy ovat englanniksi, ovat myös tämän oppaan laajemmat esimerkkiohjelmat englanniksi. Aluksi ajattelin laittaa kaiken C++-kielisen osuuden englanniksi, mutta lopulta päätinkin jättää lyhyemmät esimerkit suomeksi. Isommat esimerkkiohjelmat ja yleensäkin loppupuolella olevat kehittyneemmät ohjelmaesimerkit voivat olla englanniksi. Olen myös lisännyt uusien termien perään mitä ne ovat englanniksi (in english), jotta opit tärkeimmät termit sillä tärkeimmällä kielellä heti aluksi. Sanastosta löytyvät myös englanninkieliset termit. Jos aikoo oppia ohjelmoimaan ilman säädyllistä englanninkielen taitoa, on tilanne sama kun opettelisi uimaan ilman käsiä.
Varatut sanat, siis C++:n "käskyt", olen kirjoittanut paksunnettuna. Paitsi silloin jos niitä toistetaan niin usein, että niiden paksuntaminen aiheuttaisi jo boldofobiaa.
Mainosmaakarin toivomus
Kun yön yksinäisinä tunteinä näpyttelen opasta, juolahtaa joskus, tosin melko harvoin, mieleeni se seikka, että lukeekohan kukaan tätä tekstiä ikinä. No, sen varjolla voin sitten keksiä mitä tahansa mauttomia vitsejä, kun kukaan ei niitä kuitenkaan lue. Kuitenniin, kun olen nähnyt ainakin jonkun verran vaivaa tämän oppaan eteen, niin olisi kiva että joku sitä lukisikin. Tai ainakin kokeilisi, kun eihän tämä lysti teille maksa yhtään mitään. Siksi siis nyt tämä mainoshumpuuki.
[makea ääni päälle] Oletko ohjelmointihenkinen nuori? Tai ehkä jo varttuneempi teknonörtti? Mikä olisikaan siistimpää kun julistaa C++-vakaumuksestasi omilla kotisivuillasi? Nyt nimittäen me tarjoamme kahta supermageeta C++-banneria aivan vapaasti käyttöösi. Näin voit tukea monia uljaita aatteita, kuten ilmaisuuden vakaa periaate, ohjelmoinnin komea doktriini ja C++:n jalo aate. Erotu massasta - ja pian massat seuraavat sinua.
Vaikka tämmöisellä HTML-koodin jämällä saat bannerin kivasti paikalleen:
<p align="center"><a href="http://www.funet.fi/c++opas"> <img src="http://www.funet.fi/c++opas/banneri.gif" border="0" width="400" height="40" alt="C++-oppaan banneri"></a></p>
Kun haluat alemman bannerin, laita "banneri.gif" tilalle "banneri2.gif". Kuva ladataan oppaan www-levytilasta, siis sinun ei tarvitse sitä imuroida. Kuvat eivät ole mitään isoja, molemmat alle 10 kt. Osoite on siis http://www.funet.fi/c++opas. Osoitteen pitäisi pysyä muuttumattomana. Tietenkin on täysin sallittua imuroida banneri ja sijoittaa se oman palvelimen levytilaan.
Kiitokset
Minä olen niitä MBnet-sukupolven ihmisiä, jotka ovat kasvaneet MBnetin viestialueiden parissa. Tosin en MBnetiä ole käyttänyt enää moneen vuoteen. Kuitenkin, paljon kiitoksia tulisi kai lähettää MBnetin ylläpidolle ja eritoten alueen 8 - PC-Ohjelmointi kaikille guruille ja muille avustajille. Tärkeä tekijä on ollut myös Jesse Libertyn kohtalaisen kattava (tosin tylsä) Opeta Itsellesi C++-ohjelmointi -kirja, joka toimi aloittelevan matkamiehen oppaana samotessani C++-kielen autiomaita. Nykyään en kyllä edes muista missä tuo kirja on, ei ainakaan kirjahyllyssäni. Bjarne Stroustrupin järkelemäinen The C++ Programming Language on nykyään tärkein tietolähteeni, parin WWW-sivun lisäksi.
Palautetta
Asiaa oppaassa on jo ihan kohtalaisesti, vaikka paljon vielä puuttuukin. Kokonaisuus on ehkä vieläkin vähän epätasainen ja joitakin oleellisia asioita on "unohtunut" välistä pois. Niinpä toivoisinkin jonkun aloittelijan antavan palautetta siitä, mitä pitäisi selittää paremmin ja mikä asia on unohtunut melkein kokonaan. Mukana tulee jonkun verran ohjelmakoodia, joka on testattu joko Watcom C++- tai GCC-kääntäjällä. Ei ole kuitenkaan mikään ihme, vaikka mukana tulevien ohjelmien seassa olisikin virheitä. Jos siis et saa niitä toimimaan, älä syytä itseäsi, vaan lähetä minulle sähköpostia (jos lähetät lähdekoodia, niin pistä se viestin rungossa eikä liitteenä, koska niin se on helpompi lukea). Yleensäkin kaikki asiavirheet, puutteet, epäselvyydet ja muut kammottavuudet kannattaa ilmoittaa minulle, niin ne tulevat sitten "pian" (pian on tässä tapauksessa hyvin liukuva käsite) korjatuksi. Onhan se jo ihan tarpeeksi, että jaksan kirjoittaa tätä tekstiä, en kai minä sitä sentään enää jaksa uudestaan läpi lukea!
Otan myös mielellään vastaan asiavirheitä koskevaa palautetta kokeneemmilta ohjelmoijilta. Opas on ollut melko ankarassa syynissä Usenetin sfnet.atk.ohjelmointi uutisryhmässä, joten mitään oikeita asiavirheitä ei pitäisi olla. Mutta eihän mikään ole mahdotonta. Myös mielipideasioista saa ruveta väittelemään, jos siltä tuntuu. On tosin hyvin epätodennäköistä että muuttaisin sen seurauksena opasta, mutta maininnan tästä toisesta ajattelutavasta kyllä voin lisätä aloittelijoiden iloksi. Joten: kyselyjä, kehuja, haukkuja, ehdotuksia, kommentteja ja ylistysvirsiä - siis ihan mitä vaan - otetaan vastaan sähköpostitse :
(katso alkusivua, en laita sähköpostiosoitetta tähän kun se kuitenkin muuttuu ja jää päivittämättä)