Ohjelmistojen varhaisesta kehityksestä 1952-1968. Tommi Kärkkäinen (Ceruzzi ss. 79-108)



Samankaltaiset tiedostot
Computing Curricula raportin vertailu kolmeen suomalaiseen koulutusohjelmaan

Imperatiivisten ohjelmien organisointiparadigmojen. historia

Imperatiivisten ohjelmien organisointiparadigmojen historia

Tietotekniikka koulutus- ja tieteenalana. Tommi Kärkkäinen

Käyttöjärjestelmien historia. Joni Herttuainen Henri Jantunen Markus Maijanen Timo Saksholm Johanna Tjäder Eetu Turunen

Ongelma(t): Miten mikro-ohjelmoitavaa tietokonetta voisi ohjelmoida kirjoittamatta binääristä (mikro)koodia? Voisiko samalla algoritmin esitystavalla

Ongelma(t): Miten jollakin korkeamman tason ohjelmointikielellä esitetty algoritmi saadaan suoritettua mikro-ohjelmoitavalla tietokoneella ja siinä

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

11.4. Context-free kielet 1 / 17

Luento 1 Tietokonejärjestelmän rakenne. Järjestelmän eri tasot Laitteiston nopeus

TIEA255 Tietotekniikan teemaseminaari ohjelmointikielet ja kehitysalustat. Antti-Juhani Kaijanaho. 16. helmikuuta 2011

Johdatus ohjelmointiin

Johdanto Meta Kielten jaotteluja Historia. Aloitusluento. TIES542 Ohjelmointikielten periaatteet, kevät Antti-Juhani Kaijanaho

1. Olio-ohjelmointi 1.1

Käyttöjärjestelmät. Teemu Saarelainen Tietotekniikka

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Johdatus rakenteisiin dokumentteihin

4. Lausekielinen ohjelmointi 4.1

Ohjelmointi 1 / syksy /20: IDE

Linux. 00 Keskeiset piirteet. Unix ja Linux Helsingin ammattikorkeakoulu Stadia Vesa Ollikainen (muokannut M.Mäki-Uuro) Kysymyksiä

Johdantoluento. Ohjelmien ylläpito

Johnson, A Theoretician's Guide to the Experimental Analysis of Algorithms.

Ongelma(t): Mihin perustuu tietokoneiden suorituskyky ja sen jatkuva kasvu? Mitkä tekijät rajoittavat suorituskyvyn parantamista ja mitkä niistä ovat

KTKO104. Luento

Ongelma(t): Mihin perustuu tietokoneiden suorituskyky ja sen jatkuva kasvu? Mitkä tekijät rajoittavat suorituskyvyn parantamista ja mitkä niistä ovat

.NET ja C# Virtuaalikone. Common Language Infrastructure (CLI) Periaate. Etuja. Haittoja. Mikä on CLI. CLI standardin merkitys (CLS, Ecma)

Software engineering

Ongelma(t): Miten tietokoneen käyttöjärjestelmä toimii sisäisesti, jotta resurssit saadaan tehokkaaseen käyttöön?

11/20: Konepelti auki

Kehittää ohjelmointitehtävien ratkaisemisessa tarvittavia metakognitioita!

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

Tarvitseeko informaatioteknologia matematiikkaa?

OHJ-1010 Tietotekniikan perusteet 4 op Syksy 2012

4. Lausekielinen ohjelmointi 4.1

815338A Ohjelmointikielten periaatteet

Ohjelmistojen mallintaminen, mallintaminen ja UML

TIE448 Kääntäjätekniikka, syksy Antti-Juhani Kaijanaho. 7. joulukuuta 2009

KTKO104 Tieto- ja viestintätekniikka. 2. Luento - Opetussuunnitelma 2014 Tiistai

Kertausluento luennoista 1-3 1

Tietorakenteet ja algoritmit - syksy

Hieman lisää malleista ja niiden hyödyntämisestä

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 3. joulukuuta 2015

815338A Ohjelmointikielten periaatteet

Algoritmit. Ohjelman tekemisen hahmottamisessa käytetään

KTKO104 Tieto- ja viestintätekniikka. 2. Luento - Opetussuunnitelma ja TVT Tiistai

Teemun juustokakku Rekisterien, välimuistin, muistin, levymuistin ja magneettinauhan nopeudet suhteutettuna juuston hakuaikaan juustokakkua tehdessä?

13/20: Kierrätys kannattaa koodaamisessakin

Rajoittamattomat kieliopit (Unrestricted Grammars)

TIEA341 Funktio-ohjelmointi 1, kevät 2008

Tietorakenteet ja algoritmit Johdanto Lauri Malmi / Ari Korhonen

Tietotekniikan kaupallistuminen (USA) Tommi Kärkkäinen (Ceruzzi ss )

Luento 1 (verkkoluento 1) Ohjelman sijainti Ohjelman esitysmuoto Laitteiston nopeus

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Käännös, linkitys ja lataus

14/20: Keittokirja I

Johdanto. TIE303 Formaalit menetelmät, kevät Antti-Juhani Kaijanaho. Jyväskylän yliopisto Tietotekniikan laitos.

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

Ohjelmoinnin perusteet Y Python

Hajautettujen sovellusten muodostamistekniikat, TKO_2014 Johdatus kurssiin

1. Ohjelmoinnin peruskäsitteet ja -elementit

Ohjelmien lisensoinnista

Imperatiivisten ohjelmien organisointiparadigmojen historia

.NET ajoympäristö. Juha Järvensivu 2007

8/20: Luokat, oliot ja APIt

17/20: Keittokirja IV

Lisää pysähtymisaiheisia ongelmia

Ohjelmoinnin peruskurssien laaja oppimäärä

Jakso 4 Aliohjelmien toteutus

Aliohjelmatyypit (2) Jakso 4 Aliohjelmien toteutus

Luento 1 (verkkoluento 1) Tietokonejärjestelmä

FORMAALI SYSTEEMI (in Nutshell): aakkosto: alkeismerkkien joukko kieliopin määräämä syntaksi: sallittujen merkkijonojen rakenne, formaali kuvaus

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Ohjelmistojen mallintaminen

Ohjelmoinnin perusteet, syksy 2006

TIES325 Tietokonejärjestelmä. Jani Kurhinen Jyväskylän yliopisto Tietotekniikan laitos

Juha Merikoski. Jyväskylän yliopiston Fysiikan laitos Kevät 2009

Ohjelmoinnin peruskurssien laaja oppimäärä

Miten voin selvittää säästömahdollisuuteni ja pääsen hyötymään niistä?

8. Kieliopit ja kielet

Laiteläheinen C-kieli, yleistä

Kertausluento 1 (lu01, lu02, lu03) Tietokonejärjestelmän rakenne ttk-91 ja sillä ohjelmointi

Tietokoneen toiminta, Kevät Copyright Teemu Kerola Järjestelmän eri tasot Laitteiston nopeus

Pythonin alkeet Syksy 2010 Pythonin perusteet: Ohjelmointi, skriptaus ja Python

Tähtitieteen käytännön menetelmiä Kevät 2009 Luento 4: Ohjelmointi, skriptaus ja Python

TIEA241 Automaatit ja kieliopit, syksy Antti-Juhani Kaijanaho. 30. marraskuuta 2015

kontrollivuon analyysejä optimointiensa tueksi ja myös tiettyjen merkitysopillisten

Tässä tiivistelmässä standardi tarkoittaa standardia SFS-EN

1. Universaaleja laskennan malleja

TIE Tietorakenteet ja algoritmit 1. TIE Tietorakenteet ja algoritmit

12. luento: Simplexin implementointi Mallinnusjärjestelmät. Simplexin implementointiin liittyviä asioita

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

Avoimen lähdekoodin kehitysmallit

CUDA. Moniydinohjelmointi Mikko Honkonen

tään painetussa ja käsin kirjoitetussa materiaalissa usein pienillä kreikkalaisilla

Staattinen metaohjelmointi

Tietokonejärjestelmä. Tietokoneen rakenne. Ch 1 - Ch 8 [Sta06] Valikoituja paloja. TITO-kurssista. John von Neumann ja EDVAC, 1949.

jotakin käyttötarkoitusta varten laadittu kokoelma toisiinsa liittyviä säilytettäviä tietoja

Transkriptio:

Ohjelmistojen varhaisesta kehityksestä 1952-1968 Tommi Kärkkäinen (Ceruzzi ss. 79-108)

Johdantoa There will be no software in this man s army! (Dwight D. Eisenhower, 1947) Fortran-kieli sekä ohjelmoinnin että ohjelmistokehityksen airueena Ohjelmisto (software) ~ Tietokoneohjelmat, proseduurit (so. aliohjelmat ja funktiot) ja niihin liittyvä dokumentaatio ja data, jotka määrittävät tietokonejärjestelmän toiminnan (IEEE Standard Glossary of Software Engineering Terminology, 1990) Ohjeistuksia (proseduureja) joka puolella, eri tarkoituksiin Dataa kaikkialla (esim. Instanssi, 2012: Avoin Data) Nykyisin laitteistoja (HW) l. ohjelmistoalustoja kaikkialla Käyttötarpeen ja käytön sekä toisaalta alustan erottaminen varsinaisesta toimivasta (l. koneessa ajettavasta) ohjelmasta Ohjelmisto-käsitteenä viittaa yhteen asiaan/kokonaisuuteen vaikka käytännössä ohjelmistoon sisältyy oman ohjelmointikielellä kirjoitetun osuuden lisäksi suuri määrä olemassa olevia, vertikaalisesti (kerrosarkkitehtuuri) sekä horisontaalisesti yhdessä toimivia palasia (komponentteja): esim. Meego Usein väitetään että tietotekniikan kehityksen todellinen pullonkaula on ohjelmistojen (kehityksen) skaalautumishaasteet: enemmän, monimutkaisempia, isompia, suuremmalle käyttäjäkunnalle jne. (koska Mooren lain mukaan kehittyvästä HW:sta se ei jää kiinni); niinpä, mutta toisaalta koko nykyinen ja tuleva tietoyhteiskuntakehitys perustuu sovelluksille Näistä haasteista lisää mm. Roycen ja Brooksin parissa

Alkuvuodet 1944-1951 Harward Mark I tietokoneen ohjelmointia reikäkorttien avulla Howard Aikenin ja Grace Hopperin toimesta: arkustangentin ja linssisuunnitelmien laskentaa Nauhoilla olevien käskyjonojen uudelleenkäyttö: (ali)ohjelmakirjasto ohjelman kääntäminen l. sopivien reikäkorttipinojen valinta; kääntäjä-termi (Hopper) ~ ohjelman generoiva rutiini joka tuottaa tietyn ohjelman tiettyyn ongelmaan A-O-kielen kääntäjä 1952 UNIVACille (automaattinen ohjelmointi) Harward Mark III: ohjelmoijan käskyjen matemaattisten esitysten muuntaminen konekielisiksi (l. ajettaviksi) numeerisiksi koodeiksi Kääntäjä nyk.: lähdekielisen ohjelman (ohjelmointikieli) muuntaminen kohdekieleksi (konekieli l. prosessorin käskykieli) Välikieli paljon käytetty tarjoten monia etuja Laning ja Ziegler (1954): A Program for Translation of Mathematical Equations for Whirlwind I : käyttäjän (matemaattisista) käskyistä konekielen generointia/tulkintaa (kääntäjä vs. tulkki) Pikkuhiljaa lähdekielen rakenteiden (syntaksi) standardointiin (vrt. suomen kielin kielioppi (ja vaikkapa automaattinen suomi-englanti kielenkäännös)) Alusta asti pyrkimys kasvattaa lähdekielen abstraktiotasoa eli esittää mahdollisimman laaja joukko kohdekielen käskyjä kerralla (high-level programming languages) Konekieli (assembler) prosessorin käskykannan ja prosessoitavien muuttujien symbolisten representaatioiden sekä näiden todellisten muistiosoitusten välittäjäksi

Rakenteita ja kieliä SHARE (Society to Help Avoid Redundant Effort): aliohjelmakirjasto mm. matriisien käsittelyyn IBM 704:lle (ohjelmistoyhteisö) Tiedosto tietojen (esim. välitulokset) tallentamiseksi Järjestämisen (sorting) merkittävä rooli ohjelmissa (von Neumann ja EDVAC) Sekä vanhan että uuden järjestyksen tallentaminen (varmuuskopio) Linkityt listat eli alkio ja tieto mistä löytyy seuraava yhdessä Fortran (1957) IBM 704:lle Selkeä rakenne (varsinkin mat. kaavat) Hyvät käyttöoppaat Tehokas konekieli Mahdollisuus laiteläheiseen(kin) ohjelmointiin Cobol (Common Business Oriented Language, 1959 alk.) Puolustusministeriön (DoD) aloite Nopea leviäminen ja standardointi johti useiden kääntäjien syntymiseen ja sitä kautta useiden laitealustojen tukeen Merkittävää tuki pitkille muuttujien nimille (Fortran: I (Integer), Cobol: Age-of-Employee) Mahdollisuus helpompilukuisiin ohjelmiin joita manageritkin saattoivat ymmärtää (vaikkeivat itse kirjoittaneetkaan) Kaupallis-hallinnolliset sovellukset! Koodi dokumentoi itse itseään, parempi kuin ei dokumentointia ollenkaan Silti, ohjelman tavoitteena tehdä mitä tarkoitan eikä mitä sanon (syntaksi vs. semantiikka) Vuosi-2000 -ongelmista monet aiheutuivat 1960-luvun perinnejärjestelmistä ja COBOLista Ohjelmointikieli -käsitteen haasteet eli tarkoitettu kirjoitettavaksi ja käännettäväksi tehokkaaksi konekieleksi, ei puhuttavaksi tai yleiskieleksi; siispä edellyttää täsmällisen rakenteen, muodon (syntaksi) sekä tulkinnan (semantiikan) määrittämisen

Ohjelmointikielistä Korkean tason kielet (erit. Fortran ja Cobol) eli abstraktiotason nosto konekieleen verrattuna Algol (Algorithmic Language, 1960): alustariippumatonta ohjelmointia (vrt. Fortran ja IBM 704:n rekisterit) Kielen täsmällinen määritys: Backus-Normal/Naur-Form (BNF); myös minkä tahansa ohjelmalle sallitun merkkijonon täsmällinen määrittäminen hyödyllistä (inputtien validointi) Tutustutaan alkuperäiseen metakielen määritelmään a la Backus, 1959 LISP (List Processing, 1958 John McCarthy, 1960) Symbolien eikä (matemaattisten) lausekkeiden prosessointia Logiikkaohjelmoinnin ja tekoälyn kehittymisen lähtökohtana Sekä ohjelmakoodi että prosessoitava aineisto listamuotoinen Puolalainen notaatio (operaattori operandit, esim. + 1 2) Automaattinen roskienkeruu (l. muistinvapautus) Dynaaminen tyypitys (l. ajonaikainen päättely muuttujien tyypeille) Laaja kehityshistoriakuvaus (kiinnostuneille ;-) RPG (Report Program Generator, IBM 1959): standardimuotoisia raporttien tuottavien ohjelmien generointi, alunperin reikäkorttikoneille, käytössä edelleen

Järjestelmäohjelmista Varsinaisten ratkaistavien ongelmien apuna tarvittiin tietokoneen rakenteen mukaisesti toimivia apuohjelmia, esimerkiksi palkkakuitit: lue, prosessoi, siirrä eteenpäin/kirjoita tulos levylle/tulosta ulos (paljon samaa yleisesti, tapauskohtaista vaihtelua) Aluksi koneen operaattori huolehti eri tehtävien tai saman tehtävän eri variaatioiden ajamisesta ja synkronoinnista (tiedot, ajastus l. suoritusjonon hallinta) keskenään Perustoiminnan organisoinnin vastuunsiirto koneelle pohjusti tähän tarkoitettujen erikoisjärjestelmien (nyk. käyttöjärjestelmä, Operating System, OS) rakentamista Prosessointiin/laskentaan käytössä olevien resurssien hallinta Aluksi kontrolli(reikä)korttien avulla: minkälaista hommaa seuraavaksi odotettavissa Sovellusten ja laitteiston välisen yhteistoiminnan hoitaminen Aktiivisten tehtävien ajastuksen ja synkronoinnin hallinta Itsenäisistä tehtäväjonoista (batch processing) rinnakkaisuuden hallintaan Esim. IBM Job Control Language Michigan Algorithmic Decoder (MAD, 1959; UMichigan) Ohjelmien nopea kääntäminen (jota tarvittiin ohjelmoinnin perusopetuksessa) Virheilmoitukset eli jos jotain menee pieleen niin mitä kerrotaan käyttäjälle (Core dumped) Yleistavoitteena myös (kalliin) tietokoneen pitäminen työn touhussa 24/7 Niukan muistin jakaminen järjestelmäohjelmien ja varsinaisten tehtävien kesken: tekemisen monitoroinnista (monitor) sen hallintaan (supervisor operating system) IBM: System/360 koneena menestys, käyttöjärjestelmä OS/360 (1966) pahasti pieleen (Brooks: The Mythical Man-Month: ryhmän suunnittelu ja vastuutus, henkilöiden lisääminen myöhässä oleviin hankkeisiin ym.) Minitietokoneiden syntyminen uudisti (laiteympäristön muuttuessa) käyttöjärjestelmät, sama tapahtui henkilökohtaisten tietokoneiden noustessa Kuvia: Ceruzzi ss. 97-100

Tieteenalan (CS) ensiaskeleita Yliopistoihin CS-professuureja ja koulutusta (Suomeen 1960-luvulla) Oppiaineen määrittäminen suhteessa sähkötekniikkaan ja sovellettuun matematiikkaan (paikka silti mat. laitosten yhteydessä, myös usein nykyisin) Simon, Perlis, Newell (1967, Science): study of computers (tietokone järjestelmänä ei pelkkänä laitteena); rajoittuneempi määritelmä study of algorithms (programs), not computers silti kuvaavampi tutkimukselle Voiko tietokoneen tutkiminen olla luonnontiedettä koska ihmisen rakentama artifakta? Eka ACM Computing curricula (1968): matemaattiset ja teoreettiset lähtökohdat tietojenkäsittelyn oppiaineelle (ei tietokonetekniikkaa vaan ohjelmointikieliä, algoritmeja ja tietorakenteita eli ohjelmointia) Donald E. Knuth (1968): The art of Computer Programming. Fundamental Algorithms Täsmälliset (l. elegantit) ongelmien ratkaisut ohjelmoinnin ytimessä Edsger J. Dijkstra (1968): Goto-Statement Considered Harmful Pohjustusta selkeämpien ohjelmarakenteiden ja pidemmällä tähtäimellä täsmällisemmän ohjelmistokehityksen (formaalit menetelmät, Formal Methods) puolesta: ensin todistetaan että ohjelma toimii ja vasta sitten kirjoitetaan se Rakenteinen ohjelmointi (Structured Programming) Böhm ja Jacobini (1966): Flow diagrams, turing machines and languages with only two formation rules : teoreettiset perusteet (minimirakenteet ohjelmointitehtävien ratkaisemiseksi) Selkeä kontrollivuo (control flow, ohjelman suoritusjärjestys) eli mm. ei hyppyjä ohjelman sisällä Pyrkimys lisätä ohjelmien selkeyttä ja laatua sekä pienentää niiden kehittämiseen ja ylläpitämiseen kuluvaa aikaa käyttämällä aliohjelmia, lohkorakenteita ja toistorakenteita

Tekijänoikeuksista IPR (Intellectual Property Rights): oikeudet itse luotuun teokseen Ideaan ei synny tekijänoikeutta vaan sille joka sen toteuttaa, syntyy teoskynnyksen ylittävä tuotos Käyttötarkoituksella täsmännetyn tuotoksen voi suojata eli esim. patentoida Tuotoksen suojaaminen eli tekijänoikeuksien hallinta Kuka teosta saa käyttää ja millä ehdoilla Kuka teosta saa muuttaa ja millä ehdoilla Kuka teosta saa välittää eteenpäin ja millä ehdoilla Ohjelmakoodit erityyppisiä kuin maalaukset tai musiikki mutta ihan vastaavan luovan prosessin tuloksia eli tekijänoikeudet omaavia tuotoksia Ohjelmalisenssit väline joiden kautta määritellään muiden käyttö-, muokkaus- ja hyödyntämisoikeuksia Pyrkimys TRAC-ohjelmointikielen suojaamiseen muutoksilta ja laajennuksilta (Calvin Mooers) Mielipiteenvaihtoa siitä miten laajemman joukon (erit. opiskelijat) mielipiteet ja mukanaolo vaikuttavat ohjelmointikielen laatuun (Linux-slogan) usemmat silmät näkevät useampia virheitä ja parannusmahdollisuuksia Ryhmäsuunnittelu rämettää rakennetta ja aikaansaa epäyhteensopivuutta Suojatusta kielestä ei tullut suosittu Asia nousi tosimielessä esille Microsoftin nousun yhteydessä (joka edellytti sitä että voitiin ostaa joltakin tekijältä oikeudet tuotokseen, muokata tätä ja myydä muokatun tsysteemin (pelkkää käyttöoikeutta) eteenpäin : MS-DOS)

Ohjelmistotekniikan syntyminen Järjestelmä- ja sovellusohjelmien kehittämisen ja kehittymisen historia yhtä vanha kuin modernin tietokoneen Alkuvaiheessa ohjelmistokehitys samaistettiin ohjelmointiin (eli ohjelmointikielten sekä tietorakenteiden ja algoritmien hallintaan) Kuitenkin ihan alusta asti ohjelmia (vaikkapa niitä järjestelmäohjelmia eli esikäyttöjärjestelmiä) tehtiin tiettyyn tarpeeseen (tietokoneen toiminnan kokonaishallinta, I/O-puskurointi ym.) eli ohjelmalla oli toiminnallisia vaatimuksia jotka sen piti toteuttaa Kuten rakenteisen ohjelmoinnin nousu osoitti, myös ohjelmien kokonaisrakenteen selkeys ja hallinta olivat tärkeitä ominaisuuksia Ja pitihän niitä ohjelmia (kuten mitä tahansa uusia rakennelmia) myös testata eli varmistaa että ne toimivat kuten on tarkoitus (kannattaisi osata nykyisinkin, vaikkapa pankkifuusioiden tai lipunmyyntijärjestelmien yhteydessä: rasitustestaus!) (Jo) 1950- ja 1960-luvulla paljon ongelmia suurien järjestelmäohjelmistoprojektien läpiviennissä (milloin valmiina, mitä ominaisuuksia): software crisis, ohjelmistokriisi Ohjelmoinnin ja ohjelmien tarpeiden välissä nähtiin enemmän taidetta kuin systematiikkaa Nato-konferenssi Saksassa lokakuussa 1968: Software Engineering Software Engineering ~ Järjestelmällisten insinööriperiaatteiden soveltaminen ohjelmistokehitykseen Suomalainen ohjelmistotekniikka -termi menee joskus sekaisin ohjelmistotuotannon, ohjelmistoliiketoiminnan tms. kanssa (tietotekniikan laitoksella ohjelmistotekniikka ) Laajojen ohjelmistojen kehitysmallien muodoista: Winston Royce (1970)

Yhteenveto Myös hinnoittelussa rauta ja softa alkoivat eriytyä toisistaan (IBM, tottakai) Ken Thompson ja Dennis Ritchie (1969): Unix-käyttöjärjestelmän alkuaskeleet Paljon hyviä ja huonoja, suosittuja ja kuolleita, erityyppisiä ohjelmointikieliä: Algol-68, B, PL/I, Pascal (Wirth) Joka tapauksessa, tietokonetekniikan lisäksi: i) tarvittiin ohjelmointia ja ohjelmistoja, ii) niiden kehitys oli tärkeää ja iii) ohjelmien ja ohjelmistokehityksen hallintaan tarvittiin erityisiä työvälineitä (CASE, Computer-Aided Software Engineering) Ohjelmisto (software) termi n. 1959 Aliohjelmakirjastoista korkeamman tason ohjelmointikieliin (ja niiden kääntämiseen) Tietokonetekniikka kehittyä ja samaa voi sanoa silloin (ja nyt) ohjelmistoista, vaikka ensimmäisiä ajoi eteenpäin Mooren laki ja jälkimmäiset olivat (ja ovat) kriisissä