Miten ensimmäinen ohjelma on ohjelmoitu?

Seuraa 
Viestejä45973
Liittynyt3.9.2015

Tämä nyt on yhtä viisas kysymys kuin kumpi oli ensin muna vai kana?
Eli on tietokone ohjelmia joilla voidaan esim C++ kieltä käyttäen ohjelmoida uusia ohjelmia. Mutta miten on ensimmäinen ohjelma ohjelmoitu? Pitihän varhaisetkin käyttöjärjestelmät jotenkin luoda.

Sivut

Kommentit (16)

Vierailija

Kääntelemällä vipuja.

Ohjelmahan ei ole mitään muuta kuin pitkä litania ykkösiä ja nollia. Jos ohjelmoija tietää, että rivi 10101001001001 tarkoittaa tietokoneelle samaa kuin joku tietty komento, niin se voidaan yhtä hyvin syöttää sinne laittamalla rivi vipuja oikeisiin asentoihin ja sen jälkeen heilauttamalla sitä yhtä vipua, joka siirtää rivin sisällön muistipaikkaan.

Käsittääkseni ohjelmointi tapahtui sillä tavalla, että ohjelmoija antoi prosessorille suoraan komentoja ja käytti itse sitä vipua, joka lähetti kellopulsseja. Hän saattoi lähettää prosessorille esim. komennon "Siirrä muistipaikkaan X tieto Y" ja sitten hän heilautti kellopulssin ylös, jolloin prosessori teki mitä oli käsketty. Sitten kun muistiin oli syötetty koko ohjelma, prosessorille annettiin komento alkaa suorittamaan sitä ja kellopulssin hallinta annettiin automaattiselle oskillaattorille.

Myöhemmin koneeseen lisättin kortti, jossa oli kiinni näppäimistö ja niillä vivuilla ohjelmoitiin laite ymmärtämään mitä näppäimistöllä kirjoitetaan, eli kehitettiin ensimmäinen käyttöjärjestelmä. Tuota pohjimmaista käyttöjärjestelmää kutsutaan nykyisin nimellä BIOS.

Reikäkortteja käytettiiin vipujen korvikkeena.

Ensimmäisten tietokoneiden aikaisissa elektronisissa laskimissa oli myös ohjelmat, vaikka näitä ei tietokoneiksi sanottu. Laskinhan sisältää prosessorin ja ohjelmoitava laskin on periaatteessa tietokone. Näissä laitteissa kuitenkin ohjelmisto, joka sisälsi lähinnä laskenta-algoritmit, ohjelmoitiin koneeseen fyysisesti juottamalla piirikortille diodeja tiettyyn järjestykseen.

Idea on siinä, että kun ohjelman sisältävälle kortille lähetetään binäärimuodossa vaikkapa numero viisi, eli 0101, niin piirikortti palauttaa listauksessa paikassa viisi olevan käskyn, joka suoritetaan ja sitten ohjelmalaskuri pyytääkin seuraavassa paikassa olevaa käskyä (0110)

Neutroni
Seuraa 
Viestejä26886
Liittynyt16.3.2005
Natural
Tämä nyt on yhtä viisas kysymys kuin kumpi oli ensin muna vai kana?
Eli on tietokone ohjelmia joilla voidaan esim C++ kieltä käyttäen ohjelmoida uusia ohjelmia. Mutta miten on ensimmäinen ohjelma ohjelmoitu? Pitihän varhaisetkin käyttöjärjestelmät jotenkin luoda.

Kysymys on sinänsä hyvä. Ensimmäiset reletietokoneet ohjelmoitiin juottamalla johdot oikeisiin paikkoihin.

Nykyään tietokoneissa on prosessori, joka lukee muistista käskyjä ja suorittaa niitä. Käytännössä käskyt ovat lukuja. Tietty luku tarkoittaa (yksinkertaistetusti) tiettyä käskyä. Käskyn jälkeen on vaihteleva määrä käskyn parametrejä (lukuja, osoitteita, jne.). Tämä on konekieltä. Kun kone käynnistetään, ensimmäiset käskyt suoritetaan ROM-muistista. Se on ennaltaohjelmoitua muistia.

Jos lähdetään puhtaalta pöydältä, jonkunlainen käyttöliittymä pitää ohjelmoida. Ellei mitään tietokonetta ole, pitää kirjoittaa assembler-ohjelma paperilla ja kääntää se käsin konekielelle. Assembler on kieli, jossa on konekielen käskyilla annettu havainnollisempia nimiä. Konekielinen numerosarja pitää sitten syöttää muistiin. Aikanaan, 60 luvulla kai, se on tehty jonkinlaisella kytkinmatriisilla. Sen jälkeen on pikku hiljaa pantu tietokoneet tekemään tuo homma, on tehty jollakin koneella ohjelmia toiselle. Nykyään sillä tavalla ohjemoidaan mikro-ohjaimia. Ohjelma kirjoitetaan ja käännetään PC:llä ja johdetaan johtoa pitkin mikropiirille tiettyä ohjelmointialgoritmia käyttäen. Mikro-ohjain toimii sen jälkeen eräänlaisena yhden komponentin tietokoneena.

Vierailija

Niin kuin aikaisemmissa viesteissä sanottiin, vanhoja tietokoneita usein ohjelmoitiin kytkimiä kääntämällä. Olen itse kokeillut hyvikseni ohjelmoida ison jääkaappipakastin yhdistelmän kokoista tietokonetta, jossa oli kaksi pitkää riviä kytkimiä. Ylimmästä rivistä valittiin osoite binäärimuodossa ja alimmasta rivistä kerottiin mikä arvo osoitteen osoittamaan tavuun syötetään (tavun pituus ei ollut kahden potenssi). Muistia taisi olla kokonaiset 4 tai 8 kilotavua rippuen ferriittimuistin koosta (tavut olivat enemmän kuini 8 bittiä). Vielä nykyäänkin muistia sanotaan usein coreksi muistona termistä ferrite core.

Samaan koneesen oli myös saatavana reikäkorttin lukia/kirjoittaja. Tämän avulla ohjelmointi oli nopeampaa. Ohjelma kirjoitettiin reikäkortille puhkomalla reikiä ja kortti syötettiin koneeseen.

Vierailija
Deus Ex
Oliko ensimmäinen tietokoneohjelma "Hello World!"?

Taisi olla laskualgoritmi ja sitä kautta enigman koodin purkuohjelma. Varsinaiset näyttölaitteet tulivat vasta kymmenisen vuotta ensimmäisen tietokoneen jälkeen.

Vierailija

Pitääkin muuten korjata aikaisempaa vastausta. Ensimmäisiä tietokoneita (computer), ei ohjelmoitu binäärinä.

Ensimmäiset laskulaitteet joilla suoritettiin ohjelmia olivat ihmiset. Ranskan vallankumouksen jälkeen palkattiin halvalla työttömäksi jääneitä peruukintekijöitä (ei ollut aatelispäitä joihin perukkeja laittaa) laskemaan logaritmitaulukkoja, komeettojen sijainteja jne. Toisessa maailmansodassa amerikkalaiset tekivät monimutkaisia ohjelmia, joita konemaisesti noudattamalla joukko koluttamattomia ihmisiä pystyi laskemaan monimutkaisia laskuja.

Before mechanical and electronic computers, the term "computer", in use from the mid 17th century, meant a human undertaking mathematical calculations. Teams of people or human computers were used to undertake long and often tedious calculations. The work was divided so that this could be undertaken in parallel.

The approach was taken for astronomical and other tedious complex calculations. Perhaps the first example of organized human computing was by the Frenchman Alexis Claude Clairaut (1713–1765), when he divided the computation to determine timing of the return of Halley's Comet with two colleagues, Joseph-Jérôme Le Lepart and Nicole-Reine Étable.

Lisätietoa:

When Computers Were Human
David Alan Grier
http://www.pupress.princeton.edu/titles/7999.html

BlackKnight
Seuraa 
Viestejä320
Liittynyt28.3.2006
Veikko
Deus Ex
Oliko ensimmäinen tietokoneohjelma "Hello World!"?



Taisi olla laskualgoritmi ja sitä kautta enigman koodin purkuohjelma. Varsinaiset näyttölaitteet tulivat vasta kymmenisen vuotta ensimmäisen tietokoneen jälkeen.

Voidaan tietysti olla useaa mieltä mikä on tietokone. Kuitenkin minun mielestäni ensimmäiset tietokonemaisesti toimivat laitteet olivat jonkinlaisia soittorasioita, jota voitiin ohjelmoida vaihtamalla rasiassa pyöriviä levyjä. Tulostuslaitehan oli tällöin ainoastaan akustinen.

Tällöinhän ensimmäinen tietoneohjelma olisi jonkin historiallisen pelimannin sävellys pimpparaudalle.

H
Seuraa 
Viestejä2622
Liittynyt16.3.2005

Mikä on algoritmin ja tietokoneohjelman ero? Edellä joku viittasi laskenta-algoritmeihin ensimmäisinä ohjelmina. Yleensä niitä ei pidetä tietokoneohjelmina vaan katsotaan, että ensimmäisen ohjelman teki Ada Byron, Lovelacen kreivitär, 1840-luvulla. http://www.sdsc.edu/ScienceWomen/lovelace.html
Hän teki ohjelman maailman ensimmäiselle yleiskäyttöiseksi suunnitellulle tietoneelle (joka ei koskaan valmistunut). Erotukseksi soittorasiasta tai kutomakoneesta Babbagen suunnittelemassa koneessa oli muisti ja se olisi pystynyt muuttamaan omaa ohjelmointiaan.

Vastaus alkuperaiseen kysymykseen ei historiallisella linjalla:

1. Ensimmäinen "ohjelma" on logiikka piiri, joka tulkitsee tietyssä paikassa olevan koodin ns. konekielisen käskyn, esim. laske yhteen annetuissa muistipaikoissa olevat luvut. Ei lasketa tietokoneohjelmaksi.

2. Tietokoneen käynnistyessä ensimmäiseksi suoritetaan pysyvässä muistissa (ROM) oleva konekielinenohjelma, joka erilaisten tarkistusten jälkeen alkaa ajaa käyttöjärjestelmää levyltä. Tätä voi pitää ensimmäisenä ohjelman.

3. Ohjelmointikielet kuten C on tehty helpottamaan ihmisten ohjelmointityötä. Esim. C ohjelma muutetaan ajettavaan muotoon ns. kääntäjän avulla. Yleensä ohjelmasta tehdään ensin jonkinlaista välikoodia, joka optimoidaan suorituksen kannalta. Sitten se muutetaan ajtetavaan muotoon. Aikanaan se tarkoitti konekielelle, mutta nykyään ns. konekieli ei vielä suoraan ole prosessorin logiikkatason kieltä.

Vierailija

Ohjelmoinnin tasot menevät niin, että ensin on binääri, sitten on heksakoodi, siitä ylempi taso on assembly, eli selkokielellä merkattu heksakoodi. Assemblyn päälle tulee varsinaiset ohjelmointikielet ja näiden rinnalla on sitten erilaiset tulkattavat kielet ja skriptit. Käsittääkseni esim. C kieli käännetään assemblyllä kirjoitettujen kirjastojen avulla binääriksi/heksaksi niin, että jokaista C kielen komentoa vastaa joku sarja assemblykomentoja.

(Heksakoodi on alfanumeerisesti esitettyä binääriä)

Eri ohjelmointikielillä taitaa olla vielä erikseen jonkinlaiset välimuodot, joiden avulla voidaan automaattisesti tunnistaa jotan rutiineja ja käyttää erilaisia konekielikäskyjä niiden toteuttamiseen eri prosessoreita varten.

Millähän tavalla prosessorille annettu binääriksi käännetty assembly ei ole suoraan prosessorin kieltä? Onhan siinä käytännössä monia tasoja välissä, mutta mikään ei estä että prosessorille annettaisiin suoraan x86, tai jonkun muun käskykannan mukaisia komentoja.

Assemblystä itselläni on sen verran kokemusta, että joskus ohjelmoin BASIC:illa jonkun pikkunäppärän pelin, ja koska kirjoitin sen hitaalla qbasicilla niin jouduin kirjoittamaan näytön käsittelyyn pienen inline-assembly rutiinin joka siirsi kuvadataa näytönohjaimen muistiin siirtämällä yhdelle muuttujalle varatun muistialueen kerralla sinne.

Käytännössä sen assemblypätkän suorittaminen tehtiin niin, että kirjoitettiin ohjelma, käännettiin se heksakoodiksi ja siirrettiin johonkin aikaisemmin varattuun muistialueeseen. Sitten tämän alueen alkuosoite annettiin prosessorille, joka suoritti ohjelmanpätkän. Koodi itsessään näytti jotakuinkin seuraavalta: "1232A8B78C8FFF875544F08765F".

H
Seuraa 
Viestejä2622
Liittynyt16.3.2005
Veikko
Eri ohjelmointikielillä taitaa olla vielä erikseen jonkinlaiset välimuodot, joiden avulla voidaan automaattisesti tunnistaa jotan rutiineja ja käyttää erilaisia konekielikäskyjä niiden toteuttamiseen eri prosessoreita varten.

Saman tekijän erikielten kääntäjät käyttävät yleensä samaa välikoodia, jota sitten tehdään suoritettava ohjelma.

Veikko
Millähän tavalla prosessorille annettu binääriksi käännetty assembly ei ole suoraan prosessorin kieltä? Onhan siinä käytännössä monia tasoja välissä, mutta mikään ei estä että prosessorille annettaisiin suoraan x86, tai jonkun muun käskykannan mukaisia komentoja.

Tarkoitan mikrokoodia. Yleensä jokainen konekielinen käsky toteutetaan useammalla mikrokoodin käskyllä. Samaan tyyliin kuin tuossa edellä kerroit korkeantason kielen kääntämisestä. Mikrokooditulkki taitaa näissä uudemmissa prosessoreissa olla jo raudessa, mutta aikankin Transmetan Crusoessa se on vielä vaihdettavissa.

Vierailija

Mikrokoodi riippuu arkitehtuurista. CISC arkitehtuurissa pyritään käskyt suorittamaan suoraan erikoistuneella prosessoriytimellä (esim. Intelin MMX käskyt), kun taas RISC arkitehtuurissa näitä käskyjä joudutaan emuloimaan mikrokoodilla tai muuten softatasolla.

Vierailija
Veikko
Ohjelmoinnin tasot menevät niin, että ensin on binääri, sitten on heksakoodi, siitä ylempi taso on assembly, eli selkokielellä merkattu heksakoodi. Assemblyn päälle tulee varsinaiset ohjelmointikielet ja näiden rinnalla on sitten erilaiset tulkattavat kielet ja skriptit. Käsittääkseni esim. C kieli käännetään assemblyllä kirjoitettujen kirjastojen avulla binääriksi/heksaksi niin, että jokaista C kielen komentoa vastaa joku sarja assemblykomentoja.

(Heksakoodi on alfanumeerisesti esitettyä binääriä)

Aiemmin käytettiin myös aika paljon oktaalia, eli 8-järjestelmää. Jos oikein muistan, niin AGC, eli Apollo Guidance Computer, käytti pääasiassa oktaalia. Muistaakseni käskytkin syötettiin muodossa VERB - V1 - V2 - NOUN - N1 - N2 - ENTER. V1, V2, N1 ja N2 ovat siis 8-järjestelmän lukuja, (joista jokainen vastaa 6-bitin tavua), VERB ja NOUN nappulat eivät puolestaan tee oikeastaan mitään, niillä vain kerrotaan tietokoneelle mitä osaa käskystä ollaan syöttämässä, ja ENTER tietenkin toteuttaa käskyt.

Volitans
Seuraa 
Viestejä10670
Liittynyt16.3.2005
Natural
Tämä nyt on yhtä viisas kysymys kuin kumpi oli ensin muna vai kana?
Eli on tietokone ohjelmia joilla voidaan esim C++ kieltä käyttäen ohjelmoida uusia ohjelmia. Mutta miten on ensimmäinen ohjelma ohjelmoitu? Pitihän varhaisetkin käyttöjärjestelmät jotenkin luoda.

Tuohon ensinmäiseen on yksiselitteinen vastaus: Muna oli ensin.

Loppuosa onkin hieman vaikeampi, koska erilaisia tietokoneita on ollut vaikka kuinka paljon ja kaikkiin niihin on ensin täytynyt luoda jonkinlainen alkeellinen BIOS.

Vierailija
Natural
Tämä nyt on yhtä viisas kysymys kuin kumpi oli ensin muna vai kana?
Eli on tietokone ohjelmia joilla voidaan esim C++ kieltä käyttäen ohjelmoida uusia ohjelmia. Mutta miten on ensimmäinen ohjelma ohjelmoitu? Pitihän varhaisetkin käyttöjärjestelmät jotenkin luoda.

http://computer.howstuffworks.com/microprocessor.htm

Jos englanti ei ole ongelma, niin ylläolevasta linkistä löytyy mielenkiintoinen juttu prosessoreista, ja se myös sivuaa tätä aihetta. Etenkin kohta "microprosessor instructions", ja sitä seuraava sivu kuvaavat aihetta aika tarkkaan...

Mutta yksinkertaistettuna voisi sanoa, että tietokone on laite, joka kykenee suorittamaan jonkin määrän ennalta määriteltyjä tehtäviä, kuten lukemaan datan muistiosoitteesta, laskemaan, kirjoittamaan muisteihin, piirtämään erivärisiä pikseleitä ruudun eri kohtiin. Konekieliset käskyt ovat kirjaimellisesti käskyjä, ja ohjelmat koostuvat suurista määristä käskyjä. Ohjelma voidaan kirjoittaa vaikka suoraan konekielisenä, tai sitten ohjelma voidaan kirjoittaa vaikkapa jollain ohjelmointikielellä, minkä jälkeen kääntäjä muuntaa koodin käskyiksi. Tätä ennen kääntäjä pitää tietenkin ohjelmoida, mutta sehän onnistuu niitä käskyjä syöttämällä... Joskin konekielisten käskyjen syöttäminen onkin aika epäinhimillistä puuhaa, ja siksihän onkin kehitetty ohjelmointikielet ja kääntäjät.

Sivut

Uusimmat

Suosituimmat