Miksi sama konekieliohjelma ei toimi koneissa, joissa on samantyyppinen prosessori?

Jo varhaisissa kotitietokonelehdissä opetettiin lukijoille, että tietokoneiden "aivojen" virkaa toimittaa CPU eli Central Processing Unit, suomeksi vain prosessori. Alkuun koneissa oli vain yksi CPU, mutta nyt jo pitkään prosessoreita on ollut tietokoneissa useampia, joten tietokone voi suorittaa useampia ohjelmia samaan aikaan aidosti rinnakkaisesti suhteessa aikaan. Aion kuitenkin tässä blogissani keskittyä vain yhden CPU:n koneisiin, mutta kertomani asiat pätevät myös monen CPU:n koneisiin ihan samalla tavalla.

Kotitietokonelehdistä opimme, että esimerkiksi Atari 800 ja Commodore 64 koneissa on lähes identtiset CPU:t. Atari 800:ssa on 6502 ja C64:ssä on 6510, jossa ei ole juuri mitään eroa 6502:een. Vastaavasti Spectravideo MSX 728 ja Sinclair ZX Spectrum koneissa on identtiset Z80 tyyppiset CPU:t. Meille opetettiin, että näissä kotitietokoneissa esimerkiksi BASIC-kieliset tietokoneohjelmat eivät ole suoraan sellaisia, joita tietokoneen "aivot" eli CPU ymmärtäisi. CPU ymmärtää vain hyvin yksinkertaisia ja melko alkeellisiakin käskyjä eli op-koodeja. Kaikki ns. korkeamman tason ohjelmointikielet täytyy ensin joko tyypillisesti kääntäjäohjelman avulla kääntää CPU:n ymmärtämäksi konekieleksi (siis ennen kuin ohjelma voidaan suorittaa) tai sitten korkean tason ohjelma täytyy tulkkiohjelman avulla tulkita ajonaikaisesti reaaliajassa konekieleksi, jotta CPU tajuaisi mitä kuuluu tehdä. Esimerkiksi Commodore 64:ssä vakiona tuleva Microsoftilta ostettu BASIC-kieli ajettiin jälkimmäisellä tavalla eli reaaliaikaisesti tulkittuna.

Nyt saattaa herätä kysymys: Jos siis Atari 800 ja C64 sisältävät samanlaiset "aivot" eli ne ymmärtävät samanlaista konekieltä, niin miksi sitten Atari 800:lle tehty peliohjelma ei toimikaan C64:ssä tai C64:lle tehty ei toimi Atari 800:ssa? Kysymys ei ole tyhmä, vaan ihan aiheellinen. Nämä koneet tosiaan ymmärtävät samaa kieltä, mutta niiden konekieliohjelmat eivät toimi vaihdettavasti koneiden välillä, sillä niiden muut komponentit eivät ole yhteensopivia keskenään. CPU kyllä tietää mitä käskyillä pitää tehdä, mutta esimerkiksi grafiikkaa, musiikkia ja joystick-ohjaimia hoitavat piirit ovat ominaisuuksiltaan erilaisia. Aina täsmälleen samanlainen komponenttikaan ei riittäisi yhteensopivuuden takaamiseksi, sillä tyypillisesti vaikkapa joystick-ohjain on samanlainen, mutta sijaitsee koneen muistiavaruuden eri osoitteessa.

Esimerkiksi Commodore 64:ssä joystick-porttia numero yksi luetaan muistiin mapatusta muistiosoitteesta 56321. En edes tiedä miten Atari 800:ssa luetaan joystickia, mutta varmasti ihan eri tavalla. Commodore 64:n konekielinen peliohjelma siis yrittää saada joystick-portista #1 tietoja lukemalla muistiosoitetta 56321, mutta sama koodi Atari 800 koneella ei teekään yhtään mitään järkevää. Sitä samaa muistiosoitetta voidaan kyllä yrittää lukea Atari 800:ssakin, mutta sen "takana" ei ole siinä tietokoneessa joystick-porttia - siis pelikään ei voi mitenkään toimia. Täsmälleen vastaavat ongelmat on musiikin soittamisen ja grafiikan piirtämisen suhteen. Commodore 64:ssä esimerkiksi ääniä soitetaan SID-piirin eli tavallaan sen "äänikortin" kautta kirjoittamalla muistiosoitteisiin mapattuihin SID-piirin rekistereihin, mutta Atari 800:ssa on ihan omanlaisensa, erilainen äänipiiri ja Commodore 64:n lähettämät tiedot eivät tekisi Atarissa mitään järkevää vaikka piiri sijaitsisikin muistiavaruudessa samoissa osoitteissa!

Yhteenvetona siis vaikka koneiden "aivot" eli CPU:t ymmärtäisivät samoja käskyjä, se ei riitä konekieliohjelmien siirrettävyyteen näiden eri koneiden välillä. Syynä on se, että koneissa on paljon muitakin komponentteja kuin CPU ja jotta yhteensopivuus saavutettaisiin ohjelmistotasolla, pitäisi kaikkia näitä komponentteja käsitellä konekielisissä ohjelmissa täsmälleen samalla tavalla. 8-bittisten kotitietokoneiden MSX-standardit pyrkivät aikoinaan juuri sellaiseen yhteensopivuuteen ohjelmistojen ja koneiden suhteen eli eri valmistajien MSX1-standardoidut koneet (Spectravideo, Hitachi, Toshiba, Canon, Philips jne.) tarjosivat ohjelmistojen suuntaan raudasta samanlaiset, täsmälliset rajapinnat. Toisin sanoen, ei ollut erikseen konekieliohjelmaa vain Spectravideolle, vaan jos ohjelma oli MSX1-yhteensopivalle koneelle tehty, niin se toimi myös muiden valmistajien MSX1-tietokoneissa.

Mietitään vielä lopuksi nykyaikaa. Samassa PC-tietokoneessa voi olla asennettuna vaikkapa Windows 10 ja Fedora Linux 26 käyttöjärjestelmät. Koska kyse on yhdestä ja samasta koneesta, sen laitteisto on tietenkin itsensä kanssa identtistä. Miksi kuitenkaan Windows 10:n konekielinen sovellusohjelma ei toimi suoraan Fedora Linux 26:ssa? Siksi, että näissä moderneissa koneissa sovellusohjelman ja laitteiston välissä on useita kerroksia ohjelmistokirjastoja ja käyttöjärjestelmä. Windows 10:lle tehty ohjelma käyttää Windowsin ohjelmakirjastoja ja tekee sen omalla tavallaan. Jos siis kopioit vaikka Firefox-selaimen Windows-version Linuxiin, niin se ei edes suostu käynnistymään.