Er det altid godt at være dynamisk?
I almindeligt, dagligt sprog er ordet "dynamisk" betragtet som noget positivt. Jobannoncer søger efter "en dynamisk, ung person", og dynamisk ledelse betragtes også som noget positivt. Tilsvarende betragtes "statisk" som negativt -- tilbageskuende og ufleksibelt.
Men hvordan forholder det sig i programmeringssprogenes verden?
Man bruger ofte statist/dynamisk distinktionen til at indikere, om noget sker, før et program afvikles (typisk under oversættelsen), eller først, når programmet afvikles (enten i en fortolker eller når den genererede kode afvikles). Statisk er i denne betydning det, der sker før afvikling, og dynamisk er det, der sker under afvikling.
Eksempel 1: Statiske versus dynamiske typer.
Statiske typer betyder, at man inden et program afvikles finder og rapporterer typefejl, mens dynamiske typer betyder, at de først findes og rapporteres på køretid (hvis programmet rent faktisk når det sted, hvor fejlen sker).
Hvad er så bedst? Statisk typecheck finder mange fejl, som i dynamiske typesystemer først findes under afprøvning, eller i værste fald, når kunden bruger programmet. Til gengæld er statiske typesystemer mere restriktive, f.eks. kræves normalt, at alle elementer i et array har samme type, hvor man i dynamisk typede sprog sagtens kan have et array, hvor hvert andet element er et tal, og hvert andet er en string. Her må man i statisk typede sprog enten bruge en sum-/uniontype, bruge et array af tal/string-par, eller opdele i to arrays. Det er ikke uoverkommeligt, men det er lidt mere besværligt. Jeg hælder selv mest til statisk typede sprog, for jeg ved, at jeg laver fejl, og jeg vil gerne opdage dem så tidligt som muligt. Det kan illustreres med følgende billede:
Eksempel 2: Statiske versus dynamiske virkefelter (scopes).
Statiske virkefelter (også kaldet lexical scoping) betyder, at synligheden af en variabel- eller funktionserklæring er bestemt af syntaksen, sådan at denne er kendt før afviklingen af programmet. Med dynamiske virkefelter afhænger synligheden af programmets kørsel: Hvis du på køretid er kommet forbi erklæringen, den ikke er overskygget af en anden erklæring, og den ikke er "aferklæret" igen (f.eks. ved udgangen af en funktion), så er den synlig. F.eks. kan en funktion f erklære en variabel x, og kalde en funktion g et helt andet sted i programmet, og g kan nu bruge x. Men hvis du kalder g fra et sted, hvor x ikke er erklæret, så kan g ikke bruge x.
Statiske virkefelter bruges i de fleste moderne sprog, men der nogle scripting sprog, nogle varianter af BASIC, og ældre versioner af LISP, der bruger dynamiske virkefelter. Dynamiske virkefelter er enklere at implementere, så sprog, der er implementeret over en weekend af folk, der enten ikke kender implementeringsmetoder for statiske virkefelter eller ikke gider besværet, har ofte dynamiske virkefelter. Der er dog undtagelser: TeX (og dermed LaTeX) bruger dynamiske virkefelter, og det er på ingen måde lavet af en amatør over en weekend. Knuts begrundelse for dynamiske virkefelter er, at en TeX-makro helst skal bruge samme tegnstørrelse, skriftsnit, osv., som er i brug det sted, hvor makroen bruges, og ikke der, hvor makroen defineres. Hvis der ikke var dynamiske virkefelter, skulle alle den slags attributter overføres eksplicit til makroen. Det kunne i stedet håndteres med en implicit kontekstparameter (lidt ligesom self/this i objektorienterede sprog), men i den kontekst, hvor TeX/LaTeX bruges, er statiske virkefelter ikke nogen stor fordel. Men dynamiske virkefelter er ikke kompatible med statiske typer (undtagen hvis en variabels navn afslører dens type, som f.eks. x, x$ og x% i BASIC, der er hhv. floating-point, string og heltal), så hvis man er tilhænger af statiske typer, er statiske virkefelter (næsten) en nødvendighed. Da statiske virkefelter også gør det nemmere at læse og forstå et program, hælder jeg i høj grad til, at statiske virkefelter er bedre end dynamiske ditto.
Så min holdning er, at når det gælder programmeringssprog, så er statisk godt og dynamisk skidt. Det er så uheldigt, at det normalt er omvendt i almindelig sprogbrug. Det kunne jo f.eks. få Dilberts chef og lignende typer til at foretrække dynamiske typer og virkefelter "for dynamisk er jo godt". Så måske skulle vi finde på andre ord en "statisk" og "dynamisk", når det gælder programmeringssprog? Jeg har set betegnelserne "early" og "late" brugt (f.eks. "early/late binding" og "early/late types"). Det er dels mere beskrivende for den faktiske situation, og det betragtes normalt for mere positivt at være tidlig end sen, så det er måske ikke et dårligt ordvalg. Har I bedre bud (på dansk eller engelsk)?
