Programmeringsspråk - typer, historikk, mekanismer, objektorientering,...


Høy- og lavnivå

Programmeringsspråk kan være høynivå eller lavnivå:

Med lavnivå mener vi assembler- og maskinkodeprogram. De er omstendelige å bruke og man må skrive mange instruksjoner for å få gjort ting.

En instruksjon i assemblerspråk kompileres til en instruksjon i maskinkode.

Med høynivå mener vi "vanlige" programmeringsspråk som Fortran, Cobol, Algol, Pascal, Basic, C, Java o.s.v..
Disse språkene er mer effektive, da en instruksjon i et høynivåspråk kompileres til mange (10-100) maskinkoder!
Høynivåspråk er derfor mer "uttrykksfulle" eller effektive.

Litt historikk:

År: Språk: Kommentarer:
Før 1957 Forskjellige lavnivå-språk.  
1957 Fortran Regnes av mange som det første "ordentlige" høynivåspråk.
Mest matematikk: Formula Translation
1960 Cobol Mye bruk av banker, brukes fremdeles.
1960 Algol Første "strukturerte" språk: Blokkorientert.
1967 Simula 67 Nygård og Dahl, første objektorienterte språk! Så forut for sin tid at det gikk 20 år før alle skjønte hvor genialt det var...
1970 Pascal En milepel, godt språk, men mest brukt i utdanningsinstitusjoner.
1972 C I utgangspunktet laget for å lage operativsystem. Raskt, men lite feilkontroll. Antagelig det mest brukte språket i dag?
1975 Basic Et enkelt og lettlært språk, men regnes som "dårlig" av mange eksperter...
1980 Smalltalk Første rene objektorienterte språk
1980 C++ Objektorientert versjon av C
1986 Eiffel Objektorientert språk
1995 Java Objektorientert språk Pr. 2011 verdens mest brukte programmeringsspråk;
da det er det eneste som har lykkes i å bli utbredt på "alle" plattformer;
Windows, Linux, Mac OS, pc, mobiltelefoner (hovedspråk i Android) og mikrokontrollere
i TV, biler, alarmsystemer, måleutstyr, osv. osv.

Milepeler i utvikling:

Før Algol:

Lite struktur i programskriving, mye hopp-instruksjoner (GOTO). Algol-famillien la vekt på å strukturere programmer i blokker og delprogrammer, med veldefinerte kontrollstrukturer (IF, FOR, WHILE istedenfor GOTO) og mekanismer for prosedyrer og delprogrammer.

Pascal:

Mulig å lage egne og nye datatyper. (I tillegg til heltal (integer), flyttall (real), tegn (character) og tekst (string))
Mekanismene RECORD og såkalte pekere/referanser, POINTER, gjorde det mulig å også lage nye datastrukturer (utover enkelt-data og tabeller),
som trestrukturer, listestrukturer, køer og nettverksstrukturer.

Separat kompilering av delprogrammer gjorde det i tillegg mulig å lage biblioteker som andre kunne bruke uten å kjenne til hvordan de var laget.
(Importere i egne program, ferdig kompilert.)

Simula og Smalltalk:

Programvarekrisen ble erkjent på 80-tallet: 99% av alle programmer er for ustabile og upålitelige, nødvendig å få bedre og sikrere språk!
Dette skyldes delvis at programmeringsspråkene er for dårlige, delvis at problemområdene man arbeidet med ble mer og mer komplekse og vanskelige.

De objektorienterte språkene prøvde å få til dette med fire krav:

Objektorientering

Innkapsling:

Språket må ha mulighet til å skjule "innsiden" av et delprogram/modul/bibliotek/datastruktur og gjøre den utilgjengelig.
Dette beskytter mot feil og hindrer brukere i å endre noe som allerede fungerer bra.

Data abstraksjon:

Mulighet til å dele opp programmet i moduler ("black box") og på denne måten pakke inn og skjule kompleksitet, slik at programmereren kan skifte mellom detaljperspektiv (i hver modul) og oversiktsperspektiv (sette sammen moduler).

Det nye er at man kan samle operasjoner og data i samme "boks", såkalte objekter/klasser.

Polymorfi:

Litt vanskelig å forklare hvordan dette gjøres, men prinsippet er greit.

Før de objektorienterte språkene kom kunne man f.eks. lage et bibliotek med en kø som kunne ta i mot kunder.
Problemet oppstår hvis man ønsker å bruke køen til noe annet enn kunder, f.eks. ventende telefonsamtaler.
Da kan man ikke bruke biblioteket og må lage hele kø-systemet på nytt med den nye datatypen.

Objektorienterte språk skal ha muligheten til å lage datastrukturer som kan ta i mot hva som helst, selv om man ikke vet helt hva på det tidspunkt datastrukturen ble laget.

Utvidbarhet og arv:

I tillegg til å kunne anvende en ferdig datastruktur fra et bibliotek, krever objektorientering at man i tillegg skal kunne utvide biblioteket, og gi det tilleggsfunksjonalitet uten å endre på originalen.

Dessuten har objektorienterte språk ofte automatisk minnehåndtering og gjør en del ting som andre språk krever at programmereren gjør selv. Fordelen med dette er at programmerere gjør for mange feil, automatisk feilsjekking og kodegenerering er tryggere.

Dagens grafiske brukergrensesnitt gjør at alle objektorienterte språk også er hendelsesdrevne (event-driven),
det vil si at ma setter opp lyttere som venter på at de får melding om at noe har skjedd.