1.7. Differentialekvationer
Differentialekvationerna spelar en stor roll i naturvetenskaperna. Man kan med fog s¨aga, att en differential- ekvation ¨ar den primitivaste t¨ankbara beskrivningen av ett naturfenomen. Alla differentialekvationer har ingalunda en analytisk l¨osning, och vi m˚aste d¨arf¨or ofta ty oss till en numerisk l¨osning.
Vad menar vi med l¨osningen till en differentialekvation? L˚at oss t.ex. betrakta ekvationen y0 = x2 − y2.
Intuitivt skulle man t¨anka sig en kurva y = y(x) i varje punkt (x, y), d¨ar kurvans tangent y0(x) uppfyller ekvationen ovan. Som vi ser, ¨ar det fr˚aga om en rent lokal egenskap. Det finns givetvis inte en enda kurva, som utg¨or l¨osning till differentialekvationen, utan ist¨allet passerar det en kurva, som utg¨or en l¨osning till ekvationen, genom varje punkt (x0, y0).
Denna tanke kan man ocks˚a ˚ask˚adligg¨ora grafiskt genom att man v¨aljer olika punkter i (x, y)–planet och ber¨aknar tangenten till kurvan genom punkten enligt ekvationen ovan. Dessa tangentsegment anger den riktning, som l¨osningskurvan har lokalt, och med en smula fantasi kan man skissera olika l¨osningskurvor om man har tillr¨ackligt t¨att med punkter i planet. Nedan visas ett dylikt ”riktningsf¨alt” f¨or ovanst˚aende differentialekvation (gjord med Matlab-programmet dfield):
F¨or att f¨orenkla metoden n˚agot, kan man s¨oka efter de kurvor, l¨angs vilka tangenterna har samma riktning (isoklinerna). I v˚art exempel finner vi, att isoklinerna ¨ar en hyperbelskara:
x2 − y2 = k.
Denna grafiska metod ¨ar ganska grov, men den kan likv¨al ge en ganska god f¨orest¨allning om problemets natur, vilket kan underl¨atta den numeriska l¨osningen.
Om vi endast ¨onskar ber¨akna en l¨osningskurva, som g˚ar genom en given punkt ¨ar det on¨odigt att rita hela riktningsf¨altet. Vi kan d˚a g¨ora p˚a det s¨att som visas i figuren nedan.
F¨orst uppritas ett segment av en tangent till kurvan, som g˚ar genom den givna punkten, d¨arp˚a en ny tangent som g˚ar genom segmentets ¨andpunkt etc. Vi f˚ar p˚a detta s¨att den polygonb˚age, som visas i figuren.
Som vi ser fungerar denna metod inte alltid s˚a bra, beroende p˚a att vi alltid anv¨ander f¨oreg˚aende tangent f¨or att ber¨akna n¨asta punkt p˚a kurvan, vilket leder till ett systematiskt fel, om man inte v¨aljer punkterna mycket t¨att.
Det vore d¨arf¨or f¨ornuftigare att kasta en blick fram˚at, ber¨akna tangenten d¨ar, och d¨arp˚a forts¨atta i den riktning, som best¨ams av medeltalet av de b˚ada tangentriktningarna. Denna id´e ligger till grund f¨or en klass av numeriska metoder f¨or att l¨osa differentialekvationer, som brukar kallas prediktor-korrektor–metoder.
Den f¨orsta som uppfann en numerisk metod f¨or att l¨osa differentialekvationer av f¨orsta ordningen var Leonhard Euler1. Denna metod vidareutvecklades av Cauchy under f¨orel¨asningar i ´Ecole Polytechnique2. Id´en ¨ar f¨oljande: Vi utg˚ar fr˚an ekvationen
dy
dt = f (t, y),
under antagande av randvillkoret y(t0) = y0. Vi antar ytterligare, att f och ∂f∂y ¨ar reella och kontinuerliga funktioner inom rektangeln |t − t0| ≤ a, |y − y0| ≤ b, och att sampelpunkterna tk = t0 + hk ¨ar givna. Man kan d˚a definiera en r¨acka av funktionsv¨arden y0, y1, . . . , yn med hj¨alp av rekursionslikheten
yi+1 = yi + hf (ti, yi), (i = 0, 1, . . . , n − 1).
Cauchy visade, att under dessa omst¨andigheter kommer den polygonb˚age, som definieras av punkter- na (t0, y0), (t1, y1), . . . att konvergera mot differentialekvationens l¨osning. Cauchys konvergensvillkor vidareutvecklades och f¨orb¨attrades sedermera av Lifschitz (1877).
1L. Euler: De Integratione Aequationum Differentialium per Approximationem, 1768-1769
2F. Moigno: Lec cons de calcul diff´erentiel et de int´egral, r´edig´ees d’apr´es les m´ethodes et les ouvrages publi´es ou in´edits de M. A. L. Cauchy, 4 vol., Paris, 1840-1861
Eulers metod f¨oljer av Taylor–utvecklingen
y(t0 + h0) ≈ y(t0) + h0y0(t0) = y0 + h0f (t0, y0), om vi v¨aljer
y1 = y0 + h0f (t0, y0)
som approximation f¨or l¨osningen vid tiden t1. Parametern h0 > 0 kallas stegl¨angden. Vi kan g¨ora ett steg till med stegl¨angden h1 genom en Taylor–utveckling kring punkten t = t1:
y(t1 + h1) ≈ y(t1) + h1y0(t1) = y(t1) + h1f (t1, y(t1)).
Eftersom vi inte k¨anner den exakta l¨osningen i t = t1, s˚a kan vi inte ber¨akna h¨ogra membrum av denna ekvation, men om vi anv¨ander approximationerna y1 ≈ y(t1) och f1 = f (t1, y1) ≈ f (t1, y(t1)) s˚a kan vi uttrycka l¨osningen i t2 = t1 + h1 som
y(t2) ≈ y2 = y1 + h1f1.
Vi ser nu den allm¨anna principen. I varje steg ber¨aknas f i den approximativa l¨osningspunkten (tn, yn), och sedan anv¨ands tangenten till kurvan f¨or att ber¨akna yn+1:
yn+1 = yn + hnf (tn, yn).
Den upprepade anv¨andningen av denna ekvation definierar Eulers metod. Ett enkelt MATLAB–program (d¨ar hn = h) skulle kunna se ut s˚a h¨ar:
function y = eultest(fname,h,y0,t0,n)
% Invariabler:
% fname : namn p˚a funktionen
% h : stegl¨angd
% y0(t0): begynnelsev¨arde
% n : max antal steg
k = 0;
tn = t0;
yn = y0;
while k <= n
disp(sprintf(’%3.0f %10.7f %10.7f’, k, tn,yn)) tn = tn + h;
fn = feval (fname,tn, yn);
yn = yn + h*fn;
k = k + 1;
end
Problemet med Eulers metod ¨ar att h (=intervallets l¨angd) m˚aste v¨aljas litet f¨or att metoden skall fungera.
F¨or att belysa detta problem, studerar vi ekvationen dy
dx = e−y − x2, y(0) = 0 som l¨oses med Eulers metod f¨or t = 0, h, 2h, . . ., nh = 1 (h = 0.05, 0.1, 0.2 och 0.3). Resultatet visas i nedanst˚aende tabell.
Exakt l¨osn. Eulers approximativa metod
x y h = 0.05 h = 0.10 h = 0.2 h = 0.3
0.0 0.0
0.1 0.09498 0.09694 0.09900 - -
0.2 0.17977 0.18261 0.18557 0.19200 -
0.3 0.25389 0.25672 0.25964 - 0.27300
0.4 0.31667 0.31872 0.32077 0.32505 -
0.5 0.36731 0.36786 0.36833 - -
0.6 0.40488 0.40329 0.40152 0.39756 0.39333
0.7 0.42839 0.42407 0.41942 - -
0.8 0.43686 0.42923 0.42119 0.40395 -
0.9 0.42929 0.41782 0.40582 - 0.35277
1.0 0.40477 0.38895 0.37246 0.33749 -
I figuren nedan har den exakta kurvan, samt de ber¨aknade kurvorna f¨or h = 0.1 och h = 0.2 ritats med MATLAB som funktion av t:
Tabellen och figuren visar, att felet ¨ar starkt beroende av stegl¨angden. En kortare stegl¨angd ger noggrannare resultat, men samtidigt ¨okar antalet funktionsber¨akningar, vilket f¨orl¨anger r¨aknetiden.
Felet i Eulers metod kan vi studera genom att v¨alja en konstant stegl¨angd h och anta, att yn−1 ¨ar exakt.
Genom att subtrahera yn = yn−1 + hfn−1 fr˚an Taylor–utvecklingen
y(tn) = yn−1 + hy0(tn−1) + h2
2 y00(θ),
d¨ar tn−1 ≤ θ ≤ tn, f˚ar vi
y(tn) − yn = h2
2 y00(θ),
som kallas det lokala avkortningsfelet. Detta fel kan man f¨orst˚a s˚a, att punkten (tn, yn) befinner sig p˚a en viss l¨osningskurva yn(t), som satisfierar differentialekvationen y0(t) = f (t, y(t)). Med n¨asta steg kommer vi ¨over till en ny l¨osningskurva, och hoppets storlek ¨ar lika med det lokala avkortningsfelet.
Om felet ¨ar proportionellt mot hk+1, brukar man s¨aga, att metoden ¨ar av ordningen k; d¨arf¨or ¨ar Eulers metod av ordningen 1. Det finns ocks˚a ett globalt fel, som ¨ar den verkliga skillnaden mellan den ber¨aknade l¨osningen yn f¨or t = tn, och den sanna l¨osningen y(tn): gn = y(tn) − yn.
Metodens stabilitet inverkar ocks˚a p˚a ber¨akningen. Om vi t.ex. till¨ampar Eulers metod p˚a differentialek- vationen y0(t) = −10y(t), s˚a blir iterationsformeln yn+1 = (1 − 10h)yn. F¨or att inte felet skall v¨axa under iterationsprocessen, s˚a m˚aste vi fordra att |1 − 10h| < 1, allts˚a t.ex. h < 1/5. Om detta kriterium ¨ar uppfyllt, s˚a ¨ar metoden stabil. Om d¨aremot h > 1/5, s˚a kommer ett fel δ i utg˚angsvillkoren att leda till ett fel av storleken (1 − 10h)nδ vid den n:te iterationen.
F¨or att f¨orst˚a stabilitetsbegreppet b¨attre, skall vi studera en variant av Eulers metod, som kallas Eulers bakl¨anges metod.
Om vi utg˚ar fr˚an approximationen
y(tn+1 + h) ≈ y(tn+1) + y0(tn+1)h = y(tn+1) + f (tn+1, y(tn+1))h och s¨atter h = −hn = tn − tn+1, s˚a f˚ar vi
y(tn) ≈ y(tn+1) − hnf (tn+1, y(tn+1)).
Om vi substituerar yn ist¨allet f¨or y(tn), och yn+1 ist¨allet f¨or y(tn+1), s˚a f˚ar vi formeln yn+1 = yn + hnf (tn+1, yn+1),
som beskriver iterationerna i Eulers bakl¨anges metod.
Eulers bakl¨anges metod ¨ar en implicit metod eftersom den ger en implicit definition f¨or yn+1. Om t.ex.
y0 = ay s˚a har vi
yn+1 = yn + hnayn+1 = 1
1 − hnayn,
s˚a att metoden ¨ar stabil f¨or alla positiva stegl¨angder, om a < 0. Eulers vanliga metod ¨ar en explicit metod, eftersom yn+1 definierats explicit med hj¨alp av tidigare ber¨aknade storheter. Implicita metoder har i allm¨anhet b¨attre stabilitet ¨an explicita metoder.
I Eulers metod anv¨ander man i varje steg endast ett v¨arde av funktionen f (t, y). I en Runge–Kutta metod r¨aknar man ut flere funktionsv¨arden, innan man g¨or ett steg fram˚at. En metod som anv¨ander tv˚a funktionsber¨akningar (dvs ¨ar av andra ordningen) kan t.ex. skrivas
k1 =hf (tn, yn)
k2 =hf (tn + αh, yn + βk1) yn+1 =yn + ak1 + bk2,
d¨ar α, β, a och b ¨ar parametrar, som kan best¨ammas s˚a, att felet ¨ar av storleksordningen O(h3). En Taylor–utveckling av y(tn+1) = y(tn + h) ger
y(tn+1) = y(tn) + y0(tn)h + y00(tn)h2
2 + O(h3).
Emedan
y0(tn) =f (tn, yn) ≡ f y00(tn) =∂f
∂t + ∂f
∂y · dy
dt = ∂f (tn, yn)
∂t + ∂f (tn, yn)
∂y f (tn, yn) ≡ ft + fyf,
(totala derivatan!) s˚a f˚ar vi
y(tn+1) = y(tn) + f h + (ft + fyf )h2
2 + O(h3).
˚A andra sidan ¨ar
k2 =hf (tn + αh, yn + βk1) = h(f (tn, yn) + αh∂f
∂t + βk1∂f
∂y + O(h2))
=h(f + αhft + βk1fy + O(h2)), varf¨or
yn+1 = yn + ak1 + bk2 = yn + (a + b)f h + b(αft + βf fy)h2 + O(h3).
Det lokala avrundningsfelet antas vara O(h3), dvs y(tn+1) − yn+1 = O(h3). H¨arav f¨oljer a + b =1
2bα =1 2bβ =1,
som har ett o¨andligt antal l¨osningar, men den enklaste ¨ar a = b = 1/2 och α = β = 1. Med detta val f˚ar vi Runge–Kutta metoden av andra ordningen:
k1 =hf (tn, yn)
k2 =hf (tn + h, yn + k1) yn+1 =yn + (k1 + k2)/2.
Ofta anv¨ands Runge–Kutta metoder av h¨ogre ordning. Den k¨andaste ¨ar Runge–Kutta metoden av fj¨arde ordningen:
k1 =hf (tn, yn) k2 =hf (tn + h
2, yn + 12k1) k3 =hf (tn + h
2, yn + 12k2) k4 =hf (tn + h, yn + k3) yn+1 =yn + 1
6(k1 + 2k2 + 2k3 + k4)
Denna metod beh¨over fyra f –ber¨akningar per steg.
H¨ar ¨ar en MATLAB–funktion som g¨or ett Runge–Kutta steg av angiven ordning:
function [tn, yn, fn] = RKsteg(fname, tc,yc,fc,h,k)
% Invariabler:
% fname : str¨ang som inneh˚aller namnet p˚a en funktion av formen
% f(t,y), d¨ar t ¨ar ett tal och y en kolumnvektor
% yc : en approximativ l¨osning av y’(t) = f(t,y(t)) i t=tc.
% fc : f(tc,yc).
% h : stegl¨angden.
% k : ordningen av Runge-Kutta metoden (1<=k<=4)
% Utvariabler:
% tn : tc+h, yn ¨ar en approximativ l¨osning i t=tn,och
% fn : f(tn,xn).
if k==1
k1 = h*fc;
yn = yc +k1;
elseif k==2 k1 = h*fc;
k2 = h*feval(fname,tc+(h/2),yc+(k1/2));
yn = yc + (k1+k2)/2;
elseif k==3 k1 = h*fc;
k2 = h*feval(fname,tc+(h/2),yc+(k1/2));
k3 = h*feval(fname,tc+h,yc-k1+2*k2);
yn = yc + (k1 + 4*k2 +k3)/6;
elseif k==4 k1 =h*fc;
k2 = h*feval(fname,tc+(h/2),yc+(k1/2));
k3 = h*feval(fname,tc+(h/2),yc+(k2/2));
k4 = h*feval(fname,tc+h,yc+k3);
yn = yc + (k1 + 2*k2 + 2*k3 +k4)/6;
end
tn = tc + h;
fn = feval(fname,tn,yn);
MATLAB har tv˚a inbyggda Runge–Kutta funktioner, ode23 och ode45 (rekommenderas), som kombinerar Runge–Kutta metoder av andra och tredje ordningen, resp. fj¨arde och femte ordningen.
Kapitel 2. Fortran–programmering
H¨arefter skall vi ¨overg˚a till att studera programmering i Fortran, som ¨ar det ¨aldsta programmeringsspr˚aket f¨or vetenskapliga ber¨akningar, som fortfarande anv¨ands vid kr¨avande numeriska ber¨akningar. Vi b¨orjar med en kort ¨oversikt av programmeringens historia.
2.1. Programmeringsspr˚ ak
Ursprungligen programmerades datorerna p˚a det enda spr˚ak de f¨orstod, n¨amligen bin¨arkod. Som ett exempel p˚a en dylik maskinkod visas nedan ett litet program f¨or en PC-kompatibel dator, som har till uppgift att filtrera bort den ˚attonde biten i en textfil:
1CED:0100 B407 MOV AH,07
1CED:0102 CD21 INT 21
1CED:0104 247F AND AL,7F
1CED:0106 88C2 MOV DL,AL
1CED:0108 B406 MOV AH,06
1CED:010A CD21 INT 21
1CED:010C 3C1A CMP AL,1A
1CED:010E 75F0 JNZ 0100
1CED:0110 CD20 INT 20
De nio f¨orsta kolumnerna till v¨anster i ovanst˚aende listning anger adressen i minnet d¨ar den maskinkodade instruktionen (kolumn 11-14) har lagrats. Instruktionen ¨ar angiven i hexadecimalkod, som har 16 som bas.
L¨angst till h¨oger st˚ar den motsvarande symboliska instruktionskoden, uttryckt p˚a assembler–spr˚aket.
Assemblerspr˚aket ¨ar maskinberoende, och ursprungligen bara ett s¨att att symboliskt uttrycka de maskinko- dade instruktionerna (senare inf¨ordes bl.a. ocks˚a makroinstruktioner i de olika assemblerspr˚aken, f¨or att underl¨atta programmeringen). P˚a grund av att ett program som skrivits p˚a ett assemblerspr˚ak inte kan
¨overf¨oras till en annan dator, och assemblerprogrammen dessutom oftast ¨ar l˚anga och invecklade, ins˚ag man redan tidigt vikten av att uppfinna h¨ogre programmeringsspr˚ak, som var enklare att anv¨anda, och dessutom ocks˚a m¨ojliggjorde ¨overf¨oring av program mellan olika datorer.
Det f¨orsta av dessa programmeringsspr˚ak var FORTRAN (namnet var en akronym f¨or IBM Mathematical FORmula TRANslation System), som utvecklades av IBM under ledning av John Backus ˚ar 1954 f¨or den nya datorn IBM 704, som hade h˚ardvara f¨or flyttalsber¨akningar. Ursprungligen var det meningen att anv¨anda spr˚aket p˚a bara en dator, men d˚a IBMs kunder fick h¨ora om det, ville alla ha det.
FORTRAN-spr˚aket ¨ar uppbyggt av enkla engelska ord och matematiska termer. F¨or att ett program skrivet p˚a FORTRAN skulle kunna f¨orst˚as av datorn, m˚aste det ¨overs¨attas till maskinkod, som ¨ar det enda spr˚ak som datorn kan f¨orst˚a. F¨or den skull m˚aste man utveckla ett s¨arskilt program, en kompilator.
Den f¨orsta programmeringshandboken f¨or FORTRAN kom ut 1956, och den f¨oljdes av en kompilator ˚aret d¨arp˚a. ˚Ar 1958 kom IBM ut med en ny f¨orb¨attrad version av spr˚aket, som kallades FORTRAN II, och som kunde anv¨andas p˚a IBMs nya datorer (709, 650, 1620 och 7070). Spr˚akets stora framg˚ang ledde till att ocks˚a andra datortillverkare b¨orjade skriva FORTRAN-kompilatorer f¨or sina datorer.
Man b¨orjade snart inse behovet av en allm¨ant erk¨and standard f¨or spr˚aket, som skulle g¨ora det l¨attare att ¨overf¨ora program mellan olika datorer. IBM gick ett steg i denna riktning genom FORTRAN IV, som blev f¨ardig 1962, och som var i det n¨armaste datoroberoende. Det amerikanska standardiseringsinstitutet (ANSI) f¨ardigsst¨allde den f¨orsta standarden f¨or FORTRAN ˚ar 1966 (som ibland kallas FORTRAN 66), och en ny standard, FORTRAN 77, blev godk¨and ˚ar 1978.
Trots alla sina brister (som under ˚arens lopp b¨attrats p˚a) ¨ar FORTRAN fortfarande ett av de popul¨araste spr˚aken f¨or vetenskapliga ber¨akningar. ˚Ar 1990 gjordes en uppskattning, enligt vilken 70 % av alla program var skrivna p˚a COBOL (”COmmon Business Oriented Language”, det vanligaste spr˚aket i aff¨arsv¨arlden), och ca 60 % av ˚aterstoden var skrivna p˚a FORTRAN, resten var skrivna p˚a andra spr˚ak. En ny standard, Fortran 90, publicerades i augusti 1991, och har s˚a m˚anga utvidgningar och f¨orb¨attringar, att den i viss m˚an kan karakt¨ariseras som ett nytt spr˚ak (observera ¨aven, att namnet skrivs med sm˚a bokst¨aver). Att Fortran kanh¨anda nu upplever en ren¨assans visas ocks˚a av att en f¨orb¨attrad standard, Fortran 2003, har blivit f¨ardig.
Bl.a. kritiken mot FORTRAN som programmeringsspr˚ak ledde till att en kommitt´e, d¨ar ¨aven John Backus ingick, ˚ar 1960 publicerade en beskrivning av ett nytt algoritmiskt spr˚ak ALGOrithmic Language, Algol 60, och man hoppades, att det skulle inneb¨ara en en f¨ornyelse av den vetenskapliga programmeringstekniken.
Bland annat skulle det vara l¨att att l¨asa ALGOL-program, s˚a att man skulle kunna anv¨anda detta spr˚ak f¨or att beskriva olika r¨aknemetoder.
Algol inneh¨oll b˚ade sm˚a och stora bokst¨aver, samt speciella matematiska symboler, s˚asom + - = > <
≥ ≤. Tecknet ÷ angav en speciell heltalsdivision, och := betecknade substitution, s˚asom x := 5. Av n˚agon anledning blev dock inte Algol s˚a popul¨art som man hade v¨antat sig, ¨aven om det implementerades p˚a m˚anga datorer och anv¨andes l˚angt in p˚a 1970–talet. Id´eerna som l˚ag till grund f¨or Algol blev dock inspirationsk¨alla f¨or andra spr˚ak, s˚asom C och Pascal.
Pascal utvecklades av Niklaus Wirth i Z¨urich ˚ar 1971. Spr˚aket gavs avsiktligt fr˚an b¨orjan en systematisk och logisk uppbyggnad, s˚a att det skulle vara l¨attare att skriva ”bra”program. Ocks˚a en effektiv kompilator (¨overs¨attningsprogram) planerades. Pascal-kompilatorer introducerades p˚a m˚anga datorer, och det inl¨ardes ofta som f¨orsta programmeringsspr˚ak. F¨or verkligt kr¨avande numeriska uppgifter ¨ar Pascal dock inte lika effektivt som Fortran, och numera ¨aven C. En intressant vidareutveckling av Pascal ¨ar Modula-2, som Niklaus Wirth introducerade ˚ar 1980. Detta spr˚ak underst¨oder den moderna objektorienterade program- meringstekniken, och n¨armar sig ocks˚a i vissa fall maskinkoden, liksom C.
C-spr˚aket konstruerades av Dennis Ritchie i AT& T ˚ar 1972. Det utvecklades ur ett ¨aldre spr˚ak, som kallades BCPL. Detta spr˚ak bildade ¨aven grunden f¨or en f¨oreg˚angare till C-spr˚aket, som kallades ’B’ efter f¨orsta bokstaven i BCPL. C-spr˚aket fick sitt namn efter andra bokstaven i BCPL, och definierades i boken ”The C Programming Language”, skriven av Kernigan och Ritchie ˚ar 1978. 1990 utkom ocks˚a en ANSI-standard.
C har en mycket koncis syntax, antagligen beroende p˚a att det utvecklats p˚a datorer med l˚angsamma teletype-terminaler. C ¨ar ett mycket effektivt spr˚ak, men med C ¨ar det ocks˚a l¨att att g¨ora programmeringsfel (som kan vara sv˚ara att finna).
Genom objekt-orienterad programmering (OOP) som nu ¨ar p˚a modet, har ett antal nya begrepp, s˚asom klasser, objekt, metoder, etc. introducerats i programmeringen. Det f¨orsta spr˚aket som inneh¨oll s˚adana begrepp var Simula. C++, som numera anses vara ett av de popul¨araste programmeringsspr˚aken utvecklades av Stroustrup, och standardiserades 1997. D¨ar har man f¨ors¨okt kombinera Simulas funktionalitet med C- spr˚akets effektivitet.
BASIC (Beginner’s All-purpose Symbolic Instruction Code), som utvecklades i Dartmouth College ˚ar 1965 av John Kemeny och Thomas Kurtz, ¨ar ett spr˚ak, som har varit popul¨art p˚a grund av den l˚aga inl¨arningstr¨os- keln, samt genom att det kan tj¨ana som ink¨orningsport till FORTRAN. Ursprungligen fanns BASIC enbart som ett tolkande program, dvs instruktionerna ¨oversattes var f¨or sig, ist¨allet f¨or att hela programmet skulle
¨overs¨attas p˚a en g˚ang. Detta gjorde utf¨orandet av programslingor s¨arskilt l˚angsamma. Genom att BASIC alltid f¨orekom p˚a de f¨orsta mikrodatorerna under 1970–talet ¨okades intresset f¨or programmering m¨arkbart.
Efter denna kortfattade inledning skall vi diskutera hur man i allm¨anhet f¨orfar, n¨ar man skall skriva ett program p˚a ett h¨ogniv˚aspr˚ak s˚asom Fortran eller Pascal. F¨orst brukar man specificera problemet, s˚a att man f˚ar klart f¨or sig vad programmmet b¨or g¨ora. Utg˚aende fr˚an specifikationen v¨aljer man de metoder och algoritmer som man skall anv¨anda i programmet.
F¨oljande steg ¨ar att koda (skriva) programmet (i praktiken skrivs programmet in i en fil med hj¨alp av en editor), varp˚a det ¨ar klart f¨or kompilering (dvs ¨overs¨attning) till maskinkod. Under kompileringen granskas programmets syntax, dvs att man f¨oljt spr˚akets regler vid kodningen. Om kompilatorn uppt¨acker n˚agra fel (kompileringsfel), b¨or dessa r¨attas innan man kan g˚a vidare. Det ¨oversatta programmet kallas ofta relokerbart, eftersom programmets startadress ¨annu inte blivit best¨amd, utan alla adresser i koden ¨ar relativa. F¨orst n¨ar programmet laddas, r¨aknas startadressen ut.
Kompileringen ¨ager vanligen rum i flera faser. Innan syntaxgranskningen och den egentliga ¨overs¨attningen p˚ab¨orjas, uppst¨aller kompilatorn tabeller ¨over symboler som anv¨ands i programmet och ordnar dem i kat- egorier. Numera ¨ar det ocks˚a viktigt med optimering av programkoden. Det ¨ar oftast m¨ojligt att antingen optimera programmets snabbhet, eller det utrymme i minnet det upptar. Vilket man v¨aljer, beror p˚a vad programmet skall anv¨andas till. Kompilatorer p˚a moderna superdatorer kan dessutom vektorisera koden, eller g¨ora det m¨ojligt att k¨ora delar av den parallellt, varigenom programmet blir snabbare. F¨or att under- l¨atta programmeringen av massivt parallella datorer har man gjort en utvidgning av Fortran-spr˚aket (High Performance Fortran, HPF).
N¨ar programmet har ¨oversatts, skall det l¨ankas, dvs objektfilerna (som inneh˚aller relokerbar kod) kombin- eras med varandra och eventuellt med yttre biblioteksfiler. M˚anga kompilatorer, s¨arskilt p˚a UNIX-datorer, inneh˚aller en linkoption, som ofta ¨ar underf¨orst˚add, men p˚a m˚anga datorer m˚aste man starta ett s¨arskilt l¨ankningsprogram. Detta kan vara n¨odv¨andigt isynnerhet om programmet best˚ar av flere moduler.
Tidigare, n¨ar datorernas minne ofta var mycket begr¨ansat, kunde l¨ankningsprogrammet ocks˚a dela upp den exekverbara filen p˚a flere delar, eller ¨overlagringar (overlays), som l¨astes in i minnet efterhand som de beh¨ovdes. Detta beh¨over man numera s¨allan bekymra sig, eftersom m˚anga datorer har virtuellt minne, dvs prim¨arminnet inneh˚aller vanligen endast en del av programmet, men laddar vid behov automatiskt ner ytterligare ”sidor” (inneb¨ar ett s¨att att uppdela minnet).
N¨ar programmet ¨ar f¨ardigt ¨oversatt, b¨or det testas. Detta sker oftast med anv¨andning av s¨arskilda testdata.
Fel, som uppt¨ackts under testk¨orningen, kallas exekveringsfel, och de ¨ar ofta sv˚arare att hitta ¨an syntaxfelen.
Detta skede i programutvecklingen brukar kallas fels¨okningen (eng. ”debug”). N¨ar man r¨attat felen, upprepas testningen p˚a nytt, tills inga fel l¨angre visar sig. D˚a programmet till sist fungerar, brukar man dokumentera det (ett steg som stundom blir bortgl¨omt).
F¨orr skrevs program ofta som stora helheter, vilket ledde till att fels¨okningen f¨orsv˚arades n¨ar programmen v¨axte. Numera programmerar man oftast modul¨art, vilket inneb¨ar, att programmet delas upp i delar, som testas var f¨or sig. Slutligen sammanfogas delarna (modulerna) till en helhet, som underg˚ar den slutliga testningen. Detta g¨or det mycket l¨attare att skriva stora program. Modulerna kan g¨oras ganska sm˚a, de kan t.ex. best˚a av en eller ett par subrutiner. Modul¨ar programmering leder till separat kompilering, som numera ¨ar m¨ojlig med de flesta kompilatorer. M˚anga UNIX-datorer anv¨ander dessutom prekompilatorer, som har till uppgift att behandla s¨arskilda kompilatordirektiv, som finns i programtexten.