270 likes | 389 Views
Ohjelmointiparadigmojen historia. 10.5.2001 Tietojenkäsittelytieteen historia -seminaari Mikko Teräs. Ohjelmoinnin esihistoriaa. Ensimmäiset algoritmit Mesopotamiassa n. 2000 e.Kr. Ohjelmointi 1800-luvulta alkaen Korkean tason kielet 1945. Ohjelmointiparadigmoista.
E N D
Ohjelmointiparadigmojen historia 10.5.2001 Tietojenkäsittelytieteen historia -seminaari Mikko Teräs
Ohjelmoinnin esihistoriaa • Ensimmäiset algoritmit Mesopotamiassa n. 2000 e.Kr. • Ohjelmointi 1800-luvulta alkaen • Korkean tason kielet 1945
Ohjelmointiparadigmoista • Ohjelmointiparadigmat liittyvät korkean tason ohjelmointiin • Kuvaavat kielissä käytettyä ajattelutapaa, idiomia, filosofiaa • Esim. imperatiiviset, funktionaaliset, deklaratiiiviset, olio-, rinnakkais- ja logiikkakielet
1940-1960 • Ensimmäinen korkean tason kieli: Zusen Plankalkül, 1945 • Ensimmäinen yleisesti tunnettu kieli: Short Code, 1949 • Ensimmäinen kääntäjä: AUTOCODE, 1952 • 1945-1957 tutkittiin n. 20 korkean tason kieltä, pääasiassa imperatiivisia
Fortran • 1950-luvulla vain konekieltä pidettiin riittävän tehokaana, vaikka se ymmärrettiin hankalaksi ja siirtokelvottomaksi • Fortranin tarkoituksena oli tuottaa yhtä tehokasta koodia kuin hyvä konekieliohjelmoija • Ensimmäinen toteutus 1957
“Object programs produced by Fortran will be nearly as efficient as those written by good programmers.” • Saavutti heti huomattavan suosion.
int i; float y; float a[11]; float f (float t) { return sqrt(fabs(t)) + 5 * t * t * t; } int main (void) { for (i = 0; i <= 10; ++i) scanf(“%d”, a[i]); for (i = 10; i >= 0; --i) { y = f(a[i]); if (y > 400) printf(“%d TOO LARGE\n”, i); else printf(“%d %d\n”, i, y); return 0; } TPK-algoritmi, C
DIMENSION A(11) READ A 2 DO 3, 8, 11 J = 1, 11 3 I = 11 - J Y = SQRT(ABS(A(I+1))) + 5 * A(I + 1)**3 IF (400 >= Y) 8, 4 4 PRINT I, 999. GO TO 2 8 PRINT I, Y 11 STOP TPK-algoritmi, Fortran 0
FUNF(T) = SQRTF(ABSF(T)) +5.0*T**3 DIMENSION A(11) FORMAT(6F12.4) 1 READ 1, A DO 10 J = 1,11 I = 11 - J Y = FUNF(A(I+1)) IF (400.0-Y) 4, 8, 8 4 PRINT 5, I 5 FORMAT(I10, 10H TOO LARGE) GO TO 10 PRINT 9, I, Y 9 FORMAT(I10, F12.7) 10 CONTINUE STOP 52525 TPK-algoritmi, Fortran 1
LISP 1956-1959 • Listakieli tekoälyohjelmointiin • Fortranin listalaajennus FLPL • LISP 1 1958: rekursio, ehtolausekkeet, roskienkeruu... • LISP 1.5 1959: paranteluja, erityisesti laskennassa
1960-luku: ALGOL • ALGOL 60 uudisti imperatiiviset kielet esittelemällä lohkorakenteen • “ALGOLin kaltaiset kielet” • Käytettiin laajasti yliopistomaailmassa ja julkaisuissa, ei menestystä teollisuudessa • ALGOL 68: komitean suunnittelema hevonen
procedure TPK (a[]) =: b[]; array (a[0:10], b[0:21]); begin for i := 10(-1)0; begin y := f(a[i]); f(t) := sqrt(abs(t)) + 5× t 3 ; if (y > 400); y := 999; b[20 - 2 × i] := i; b[21 - 2 × i] := y end; return; integer (i) end TPK TPK-algoritmi, ALGOL 60
1960 ja ohjelmistokriisi • 1960-luvulla jouduttiin etsimään uusia tapoja tuottaa oikein toimivia ohjelmia • Matalan tason rakenteet joutuivat kritiikin kohteeksi • Yrityisesti goto-lause puhutti: goto:ttomia kokeiluja jo vuonna 1960
Ohjelmistokriisi... • Dijkstra: Go To Statement Considered Harmful • “For a number of years I have been familiar with the observation that the quality of programmers is a decreasing function of the density of go to statements in the programs they produce.”
Kokeilut jatkuivat: • “It is my aim to write programs with no labels. I am doing quite well. I have got the operating system down to 5 labels and I am planning to write a compiler with no labels at all.” -- Christopher Strachey, 1971 -- • ACM National Conference 1972 ja gotot
LISP 60-luvulla • LISPin kehitys hajosi monelle taholle • Matemaattinen eleganssi kävi ilmeiseksi: LISPistä poistettiin imperatiivisia rakenteita • Kontrollirakenteena rekursio • Kaikki data ja koodi samanmuotoista (listoja)
;; Palauta listan l viimeinen alkio (defun (rac l) (cond ((eq l ()) ()) ((eq (cdr l) ()) (car l)) (rac (cdr l)))) LISP-esimerkki
Simula 67: oliot • Kristen Nygaard & Ole-Johan Dahl: ohjelmointikieli simulaatioihin • Ensimmäinen versio vain simulaatioihin, jonot perusrakenteena • Simula 67: ALGOL 60:n yleiskäyttöinen luokkalaajennus • Luokat, oliot, virtuaalifunktiot, perintä
70-luku: modulaarisuus • Ohjelmistot kasvoivat edelleen • Moduulit tulivat muotiin vasta 70-luvulla, vaikka toteutuksen kätkeminen oli keksitty jo paljon aiemmin • Uusia kieliä: Pascal, C, Modula
Smalltalk 1970-1980 • Xeroc PARC: kannettava “Dynabook” maallikoille, erityisesti lapsille • Tarvittiin yleistajuinen ohjelmointikieli järjestelmän laajentamiseen • Viestinvälitys ja periytyminen • 100% puhdas oliokieli: kaikki toiminnot palautuvat olioihin
| s f | s := Prompter prompt: ‘Enter line’ default: ‘’. f := bag new. s do [:c | c isLetter ifTrue: [f add: c asLowerCase]]. ^f Smalltalk-esimerkki
Smalltalk... • Paljon kiinnostusta, vähän menestystä • Edesauttoi myöhemmin uusien oliokielien syntyä
70-luvun jälkeen • Oliot herättivät suurta kiinnostusta, tutkittiin proverbiaalisena “hopealuotina” • Olioiden integrointi imperatiivisiin kieliin: C++, CLOS • Olio-ohjelmointi on muodissa, mutta ei puhtaassa muodossaan
Funktiokielet tänään • Uusia funktionaalisia kieliä: ML, Haskell, Miranda, Gofer... • Teoreettiset ansiot käytännöllisiä suuremmat • Ei juuri menestystä kaupallisessa maailmassa... • ...mutta tutkimus, GNU-projekti?
Viimeinen alkio LISPillä • ;; Palauta listan l viimeinen alkio • (defun (rac l) • (cond ((eq l ()) ()) • ((eq (cdr l) ()) (car l)) • (rac (cdr l))))
...ja sama ML:ksi: • fun rac (nil) = nil • | rac (a::x) = if null(x) then a • else rac(x)
“APL is like a beautiful diamond - flawless, beautifully symmetrical. But you can’t add anything to it. If you try to glue on another diamond, you don’t get a bigger diamond. LISP is like a ball of mud. Add more and it’s still a ball of mud - it still looks like LISP.” -- Joel Moses --