De dominerende programmeringssprog er naturligvis tæt knyttet til den dominerende klassiske maskinarkitektur og programmeringsmodel med processor der bearbejder data i en adresserbar lagerenhed. Der har dog været en løbende udvikling i programmeringssprog af faciliteter til bedre håndtering af maskinarkitekturen og programmeringsmodellen samt kompleksiteten i de udviklede programmer. Programmeringssprog er ligeledes udviklet løbende i relation til udviklingen fra den klassiske til den distribuerede maskinarkitektur og programmeringsmodel.
Højniveau programmeringssprog som pascal og C begrænser kompleksiteten i programmer ved at begrænse bieffekter af programinstruktioner ved delvist at opdele lagerenheden i mindre, separate lagerområder i form af lokale variable i de enkelte funktioner. Internt i funktionerne fungerer de efter den klassiske programmeringsmodel.
Med abstrakte datatyper og objektorienterede programmeringssprog mindskes kompleksiteten i form af bieffekter af programinstruktioner yderligere ved at begrænse disse til definerede operationer på data. Internt fungerer abstrakte datatyper og objekter dog også efter den klassiske programmeringsmodel.
Den klassiske maskinarkitektur og programmeringsmodel omfatter én processor som gennemløber et program, hvilket også afspejler sig i de dominerende højniveau programmeringssprog som de imperative programmeringssprog og objektorienterede programmeringssprog med passive objekter. I sådanne programmer er én procedure eller ét objekt som udgangspunkt styrende, hvorfra kontrollen trinvis i ordnet rækkefølge overdrages til andre procedurer og objekter.
Imperative programmeringssprog med parallelprogrammeringsudvidelser og objektorienterede programmeringssprog med aktive objekter bryder med den klassiske programmeringsmodel ved at tillade flere forskellige kontrollerende procedurer og objekter indenfor et program for at udnytte multiprocessor maskinarkitekturer. Det kan desuden mindske kompleksiteten af programmer og udviklingen af programmer ved at opdele dem i mindre, samarbejdende enheder, men det øger dog også kompleksiteten med timing og allokering problemer i det omfang at enhederne deler data og ressourcer. Dette vil som regel være tilfældet, da programmeringssprogene grundlæggende, indenfor de enkelte enheder fortsat fungerer efter den klassiske programmeringsmodel.
Væsentlige problemer i forbindelse med de dominerende imperative og objekorienterede programmeringssprog kan henføres til den klassiske programmeringsmodel i forbindelse med bieffekter af programinstruktioners operationer på data i lagerenheden.
Funktionelle programmeringssprog undgår problemer med bieffekter ved at bryde med den klassiske programmeringsmodel ved ikke at adressere og bearbejde data i lagerenhed men i stedet for kun at aflæse og anvende data i lagerenheden som inddata til en funktion, der allokerer og genererer nye data i lagerenheden som uddata. Funktionel programmering virker umiddelbart dog ikke så effektivt med hensyn til såvel udvikling som eksekvering af programmer, og mange programtyper virker umiddelbart ikke så naturligt som funktioner.
Dataflow programmeringssprog undgår ligeledes problemer med bieffekter ved at data kun eksisterer som selvstændige, ikke-adresserbare enheder der flyder/transmitteres som inddata og uddata igennem netværk af programinstruktioner (der alle principielt altid er aktive). Dataflow programmering er funktionel men omfatter mere avancerede data og kontrolstrukturer og virker umiddelbart mere naturligt.
Der kan således ses en udvikling i programmering fra at omfatte én programproces og ét lagerområder med udgangspunkt i den klassiske maskinarkitektur og programmeringsmodel til at omfatte mange selvstændige programprocesser og data (uanset om den underliggende maskinarkitektur er klassisk eller distribueret).
|