• No results found

Kapitel 2. Fortran–programmering

N/A
N/A
Protected

Academic year: 2021

Share "Kapitel 2. Fortran–programmering"

Copied!
23
0
0

Loading.... (view fulltext now)

Full text

(1)

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):

(2)

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.

(3)

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.

(4)

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

(5)

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).

(6)

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

(7)

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 -

(8)

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(θ),

(9)

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.

(10)

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.

(11)

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,

(12)

(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,

(13)

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)

(14)

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;

(15)

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.

(16)

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.

(17)

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.

(18)

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.

(19)

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.

(20)

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.

(21)

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.

(22)

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.

(23)

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.

References

Related documents

att all str¨ om som flyter i en halvledare kommer antingen fr˚ an h˚ al i valensbandet eller elektroner i ledningsbandet, kallas dessa kollektivt f¨ or laddningsb¨ ararna

83 Som beskrevs där så anses denna ansvars- frihetsgrund existera oberoende av lagstiftning (eller snarare bristen på sådan). Det finns dock även andra oskrivna

dels via egenv¨ardesmetoden (beskriven i avsnitt 56, dock utan anv¨andande av de- terminanter m.m.), dels via ¨overs¨attning till en andra ordningens ekvation (denna metod ¨ar

Det ¨ar d¨arf¨ or b¨attre om man kan kontrollera anv¨andningen av komponenterna av en h¨arledd typ i programmet, s˚ a att de antingen ¨ar fritt tillg¨angliga i hela

Med en funktion menar vi en regel som till varje reellt tal (i någon given delmängd av R) ordnar precis ett reellt tal.. Funktionen f sägs då ha definitionsmängd

»gotländsk» s-runa, där både det vänstra och högra ledet avslutas på samma höjd. På den högra sidan går två svaga linjer snett nedåt höger, men de tillhör av allt att

Ni har visat att de algebraiska talen ¨ ar uppr¨ akneligt m˚ anga, och f¨ oljdaktligen att det finns ¨ overuppr¨ akneligt m˚ anga transcendenta tal: d¨ aremot har ni inte visat

” Sospesi betecknar det m ellantillstånd, det svälvande mellan salighet och fördömelse, bvari de fromina hedningarna befinna sig efter döden... På d elta ställe