</motto<

>>

/chapter<Ohjelman /ii<k{{nt{minen> ja /ii<linkitys>>

/iii<fortran-ohjelma>
</sc Fortran>-ohjelman k{{nt{minen, linkitt{minen ja suoritus
tapahtuu Crayn </sc unicos>issa suunnilleen seuraavasti:

1) Jos l{hdekielinen ohjelma on tiedostossa </tt fyle.f>,
se k{{nnet{{n komennolla
/iii<cft77>

</copymode
      cft77 fyle.f
>

Tuloksena syntyy objektimoduli </tt fyle.o>.

2) Linkitet{{n /ii<objektikoodi>t suoritettavaksi ohjelmaksi
/iii<segldr>

</copymode
      segldr fyle.o
>

T{m{ tuottaa tiedoston </tt/ii<a.out>>, joka voidaan suorittaa.
Jos ohjelma halutaan tallettaa my|hemp{{ k{ytt|{ varten,
se kannattaa nimet{ </tt mv>-komennolla.

3) Ohjelma suoritetaan yksinkertaisesti antamalla
suoritettavan koodin sis{lt{v{n tiedoston nimi:

</copymode
     .//a.out
>

Koska /ii<hakupolku> ei sis{ll{ oletusarvoisesti /ii<nykyhakemisto>a,
on ohjelman nimen eteen lis{tt{v{ nykyhakemiston nimi,
jota </sc unix>issa voi merkit{ pisteell{. Mik{li olet muuttanut
hakupolkua siten, ett{ nykyhakemisto sis{ltyy siihen,
riitt{{ ohjelman suorittamiseksi sanoa pelk{st{{n </tt a.out>.

/section<Fortran-k{{nt{j{n optiot>

/iii<k{{nt{j{n optiot> 
K{{nt{j{ k{ynnistet{{n komennolla

</copymode
     cft77 /opt<</sl optio>>/iter </sl ohj>.f
>

T{ss{ </sl ohj>.f on l{hdekielisen ohjelman sis{lt{v{
tiedosto. Optiolista voi sis{lt{{ seuraavia optioita:

/page
</tt -a /sl/ii<alloc>> 

T{ll{ optiolla vaikutetaan /ii<muuttujien tilanvaraus>tapaan.
</sl alloc> voi olla joko </tt/ii<stack>> (oletusarvo
X-MP EA ja Y-MP -laitteistoilla) 
tai </tt/ii<static>> (oletusarvo muilla Cray-laitteistoilla). 

/beginitemss<2truecm><0pt>

/entry<</tt -a stack>>
Muuttujat talletetaan /ii<pino>on (lukuunottamatta vakioita,
</tt/ii<common>>-alueella, </tt/ii<data>>- ja </tt/ii<save>>-lauseissa
esiintyvi{ muuttujia). /ii<Automaattiset taulukot> talletetaan
nytkin /ii<keko>on.

/entry<</tt-a static>>
Kaikille muuttujille varataan kiinte{t muistipaikat, 
joissa ne s{ilyv{t koko ohjelman ajan (lukuunottamatta
kekoon (/ii<heap>) talletettavia automaattisia taulukoita).
Aliohjelmien paikallisten muuttujien arvot eiv{t
kuitenkaan s{ily kutsusta toiseen, ellei niit{ 
talleteta </tt save>-lauseella.

/enditems

</tt -b /sl object>

/iii<objektitiedoston nime{minen>
T{m{ optio tallettaa objektikoodin tiedostoon </sl object>.
Jos valitaan </tt -b 0>, objektitiedostoa ei tehd{ lainkaan.
Jos l{hdekielinen ohjelma on tiedostossa </tt ohj.f>, on
objektitiedoston nimen oletusarvo </tt ohj.o>.


</tt -d> ja </tt -e>

/iii<k{{nt{j{n valitsimet>
Optio </tt -e> (/ii<enable>) asettaa valitsimia toimintaan ja </tt -d> pois 
toiminnasta (/ii<disable>). Oletusarvot ovat </tt -d ADILPSafghjmoswxz -e Bpqr>.
Valitsimien merkitykset ovat:

/beginitemss<2truecm><17truemm>

/itemm<L> /iii<k{{nn|slistaus>
Tuottaa kaiken mahdollisen listauksen tiedostoon </sl ohj.l>.
Listaus sis{lt{{ mm. l{hdekielisen ohjelman, assemblerin
ja ristiviitelistan. Yleens{ kannattaa valita tulostus
hieman selektiivisemmin.

/itemm<D>
Talletetaan objektikoodin mukaan /ii<debuggeri>n tarvitsema
/ii<symbolitaulu>.

/itemm<B>
Tuotetaan objektikooditiedosto.

/itemm<A>
Annetaan varoitus kaikista /ii<ANSI-standardi>n vastaisista rakenteista.

/itemm<S>
Tuotetaan /ii<assembler>-koodin (</sc/ii<cal>>) sis{lt{v{ tiedosto </sl ohj.s>.

/itemm<a>
Tapetaan ty| k{{nn|ksen j{lkeen, jos k{{nn|ksess{ ilmenee
yksikin vakava virhe.

/itemm<c>
Tulostetaan </tt/ii<common>>-alueiden nimet ja pituudet.

/itemm<f>
/ii<J{ljitys>-optio (/ii<flowtrace>) tuottaa ohjelmaa ajettaessa 
tilaston mm. tiedostossa olevien aliohjelmien vaatimasta
ajasta ja niiden kutsujen lukum{{rist{. Optiosta on paljon hy|ty{ ohjelmaa
optimoitaessa. J{ljitys hidastaa ohjelman suoritusta
tuntuvasti, joten lopullisissa tuotantoajoissa sit{ ei
pid{ k{ytt{{.

/itemm<g>
Listataan ohjelmakoodi tiedostoon </sl ohj.l>.

/itemm<h>
Tulostetaan kunkin ohjelmamodulin ensimm{inen rivi ja
virheilmoitukset.

/itemm<j>
Pakotetaan </tt/ii<do>>-lauseet suoritettaviksi ainakin kerran.

/itemm<m>
K{{nn|slistauksen viereen merkit{{n kunkin silmukan laajuus
ja tieto sen vektoroituvuudesta (/ii<loopmark>): V = vektoroitu silmukka,
Vs = lyhyt vektorisilmukka, Vc = ehdollinen vektorisilmukka,
S = skalaarisilmukka. T{m{ muistuttaa aika paljon
IBM:n tuottamaa /ii<vektorointiraportti>a.

/itemm<o>
Tarkistetaan suoritusaikana taulukkoindeksin rajat.

/itemm<p>
Sallitaan kaksoistarkkuuden muuttujien k{ytt|. Jos asetetaan
</tt -dp>, kaikki /ii<kaksoistarkkuuden muuttuja>t muunnetaan
automaattisesti yksinkertaisen tarkkuuden muuttujiksi.
K{{nt{j{ antaa joka tapauksessa varoituksen esimerkiksi
muotoa </tt real*8> olevista m{{rittelyist{.

/itemm<q>
Keskeytet{{n k{{nn|s 100 vakavan virheen j{lkeen.

/itemm<r>
Py|ristet{{n kertolaskujen tulokset.

/itemm<s>
Tulostetaan l{hdekielinen ohjelma.

/itemm<x>
Tulostetaan /ii<ristiviitelista> (/ii<cross reference>).

/itemm<z>
Talletetaan objektikoodiin tieto l{hdekoodin rivinumeroista
debuggeria varten.

/enditems


</tt -i 46> ja </tt -i 64>

/iii<kokonaislukuaritmetiikka>
Kokonaisluvuille k{ytet{{n 46 (oletus) tai 64 bitin aritmetiikkaa.
K{yt{ 64 bitin aritmetiikkaa vain, jos ohjelmassasi todella
esiintyy niin isoja lukuja, ettei 46 bitti{ riit{.

</tt -l /sl lfile>

K{{nn|slistaus yms. tulostukset ohjataan tiedostoon </sl lfile>.

</tt -m 1>, ... </tt -m 4>

K{{nt{j{n ilmoitusten taso. </tt -m 4> ilmoittaa vain vakavista
virheist{, </tt -m 3> (oletus) sallii my|s ilmoitukset todenn{k|isesti
virheellisist{ ohjelmakohdista, </tt -m 2> varoitukset mahdollisista
virheist{, </tt -m 0> huomautukset tehottomasta ohjelmoinnista.

</tt -o>

Asetetaan /ii<optimointitaso>. Mahdollisia arvoja ovat:

/beginitemss<3truecm><27truemm>

/itemm</ii<full>>
Optimoidaan koodia mahdollisimman paljon (oletus).

/itemm</ii<off>>
Ei optimoida lainkaan.

/itemm</ii<novector>>
Optimoidaan vain skalaarikoodia.

/itemm</ii<zeroinc>>
Tehd{{n suoritusaikainen tarkastus </tt/ii<do>>-lauseissa 
mahdollisesti esiintyvien 0:n suuruisten induktiomuuttujien
lis{ysten havaitsemiseksi.

/itemm</ii<nozeroinc>>
Uskotaan, ett{ induktiomuuttujien lis{ykset ovat aina nollasta
poikkeavia. Nopeuttaa suoritusta, koska ajoaikaista tarkistusta 
ei tarvita.

/enditems

</tt -s /sl calfile>

</sc Cal>-kielinen /ii<assembler>-ohjelma tulostetaan 
tiedostoon </sl calfile>.

</tt -t 0>, ..., </tt -t 47>

/iii<tulosten katkaisu> /iii<stabiilisuus>
Liukulukuoperaatioissa katkaistavien bittien m{{r{, oletus 0.
T{st{ on hy|ty{ tutkittaessa ohjelman numeerista stabiilisuutta.
Jos esimerkiksi </tt -t 0> ja </tt -t 3> antavat kovin erilaisia
tuloksia, perustuvat laskut jossakin kohtaa luvun kolmeen
viimeiseen bittiin.

</tt -I> </sl ifile>

(/ii<Inlining>). Aliohjelmakutsut korvataan inline-koodilla.
Tiedosto </sl ifile> sis{lt{{ n{iden aliohjelmien
l{hdekieliset versiot. Se voi my|s olla sama kuin 
k{{nnett{v{ tiedosto, jolloin kaikki kutsupuun
lehdet (ne aliohjelmat, jotka eiv{t en{{ kutsu
muita aliohjelmia) korvataan inline-koodilla. T{ll|in
p{{ohjelman on alettava </tt program>-lauseella.

Inline-koodin tuottamisen est{v{t mm. aliohjelmassa
esiintyv{t </tt data>, </tt save>, </tt entry> ja
</tt assign>-lauseet.

/section</ii<Direktiivit>>

Direktiivit ovat ohjelmatekstiin kirjoitettavia 
k{{nt{j{lle annettavia ohjeita.
Niiden avulla voidaan paikallisesti muuttaa k{{nt{j{lle
komentorivill{ annettujen optioiden vaikutusta, ohjata
tulostusta, vaikuttaa vektorointiin, optimointiin ja
rinnakkaistamiseen.

Komentorivin optiot vaikuttavat koko k{{nnett{v{{n ohjelmaan.
Direktiivin vaikutus sen sijaan rajoittuu ohjelmamoduliin.

Direktiivi tunnistetaan sarakkeilla 1--5 olevasta
merkkijonosta </tt cdir/$> (tai </tt cmic/$>, jos kyseess{
on mikrotason rinnakkaistamista ohjaava direktiivi).
T{m{ on periaatteessa kommentti, eik{ siten haittaa
k{{nt{mist{ muilla k{{nt{jill{.

/ii<Vektorointi>in ja /ii<optimointi>in vaikuttavia direktiivej{ ovat:

</tt /ii<vector>, /ii<novector>>

Sallitaan  tai kiellet{{n vektorointi.
Direktiivin </tt novector> vaikutus alkaa
seuraavasta silmukasta ja jatkuu ohjelmamodulin 
loppuun tai seuraavaan </tt vector>-direktiiviin.
Direktiivi{ tarvitaan l{hinn{ silloin, kun
silmukan kierrosm{{r{ ei ole k{{nt{j{n tiedossa
ja seurauksena on /ii<ehdollinen vektorikoodi>.
Jos ohjelmoija tiet{{, ett{ silmukka suoritetaan
useimmissa tapauksissa vain yhden tai kaksi kertaa, sen
vektorointi kannattaa est{{. Vektoroinnin voi
joutua est{m{{n my|s, jos vektorikoodi antaa
selv{sti erilaisia tuloksia kuin skalaarikoodi.
T{llaisissa tapauksissa on kuitenkin syyt{
etsi{ luotettavammin toimivaa algoritmia.

</tt /ii<ivdep>>

(Ignore vector dependencies). T{m{ vaikuttaa vain
siihen silmukkaan, jota se v{litt|m{sti edelt{{.
K{{nt{j{ ei tutki silmukassa mahdollisesti esiintyvi{
riippuvuuksia, vaan vektoroi sen, mik{li se muuten
on mahdollista. Jos silmukassa kuitenkin on riippuvuuksia,
ei ohjelma en{{ toimi oikein. 

Tyypillinen tilanne, jossa </tt ivdep>-direktiivist{ on
hy|ty{, on ehdollisesti vektoroitu silmukka.
Seh{n on silmukka, joka vektoroituu, mutta palasina,
joiden pituus on laskettava suoritusaikana.
Mik{li ohjelmoija tiet{{ varmasti, ettei silmukka
sis{ll{ riippuvuuksia, voi t{ll{ direktiivill{
poistaa suoritusaikaisen testin, ja tuloksena on
hieman nopeampaa koodia.

</tt /ii<vfunction> /sl f>

T{m{ ilmoittaa, ett{ funktio </sl f> on CAL-/ii<assembler>illa
kirjoitettu /ii<vektorifunktio>, jolla ei saa olla mit{{n
sivuvaikutuksia ja jonka on muutenkin noudatettava
varsin tiukkoja s{{nt|j{. 

</tt /ii<shortloop>>

Ilmoittaa, ett{ seuraava </tt/ii<do>>-silmukka suoritetaan
ainakin kerran ja korkeintaan 64 kertaa.
Koodista tulee hieman tehokkaampaa, koska
silmukan mahdollista paloittelua /ii<vektorirekisteri>n mittaisiin
osiin ei tarvitse tutkia.

</tt /ii<no side effects> /sl f>

Aliohjelma tai funktio </sl f> ei muuta kutsuvan
(eik{ mink{{n muunkaan kutsuketjussa edelt{v{n) ohjelmamodulin
muuttujia parametriensa tai </tt common>-alueiden v{lityksell{.
Ellei t{llaisia sivuvaikutuksia ole, k{{nt{j{ saattaa pysty{
siirt{m{{n aliohjelmakutsun </tt do>-silmukan ulkopuolelle,
edellytt{en, ett{ parametrit ovat invariantteja.

/page
</tt /ii<suppress>>

Tavallisesti muistiviittausten m{{r{{ pyrit{{n minimoimaan
s{ilytt{m{ll{ muuttujia mahdollisimman kauan rekistereiss{. 
Joissakin harvoissa tapauksissa t{ll{ voi olla haitallisia
sivuvaikutuksia.  T{llaisissa tilanteissa voidaan </tt
suppress>-direktiivill{ tallettaa rekistereiss{ olevat
muuttujat muistiin.  Direktiivill{ voidaan ilmoittaa, mitk{
muuttujat talletetaan.  Jos muuttujaluettelo puuttuu,
talletetaan kaikki rekistereiss{ olevat muuttujat. 
Direktiivi vaikuttaa vain, jos se sijaitsee
suoritusreitill{. 

</tt /ii<bl>, /ii<nobl>>

Skalaarisilmukassa seuraavalla kierroksella tarvittavia arvoja
aletaan hakea muistista jo edellisen kierroksen aikana ennenkuin
silmukan p{{ttymist{ on ehditty testata (/ii<bottom loading>).  T{m{
saattaa aiheuttaa viittauksen k{ytt{j{n muistialueen ulkopuolelle ja
ajon kaatumisen ilmoitukseen "operand range error".
Ongelmia voi tulla erityisesti, jos silmukan askel on hyvin pitk{,
jolloin ylim{{r{inen viittaus todenn{k|isemmin osuu luvattomalle
alueelle. Direktiivill{ </tt nobl> t{m{ voidaan est{{.


/section<Ohjelmien linkitt{minen>

/iii<linkitys>
K{{nt{j{n tuottamat objektimodulit linkitet{{n suoritettavaksi
ohjelmaksi ohjelmalla </tt/ii<segldr>> (/ii<segment loader>).
Samalla voidaan my|s rakentaa paljon muistia tarvitsevien
ohjelmien edellytt{m{ /ii<overlay>-rakenne (virtuaalimuistia kun
ei ole).

Linkitys tapahtuu komennolla

</copymode
     segldr </sl<option>>/iter </sl<infile>>/iterr
>

Seuraavassa muutamia hy|dyllisi{ /ii<linkitt{j{n optio>ita:

</tt -o> </sl file>

/iii<suoritettavan tiedoston nime{minen>
Optiolla </tt -o> voidaan antaa syntyv{n suoritettavan tiedoston nimi.
Ellei sit{ ilmoiteta, tulee ohjelman nimeksi </tt/ii<a.out>> (t{m{ voidaan
muuttaa my|s </tt/ii<abs>>-direktiivill{, jolloin optiota </tt -o> ei tarvita).

</tt -f> </sl value>

T{m{n tarkoitus olisi t{ytt{{ /ii<initialisoimattomat muuttujat>
</sl value>:n ilmoittamalla arvolla.
Optiolla ei kuitenkaan n{yt{ olevan mit{{n vaikutusta, joten
eip{ sit{ kannata k{ytt{{. T{m{ siis varoituksena niille,
jotka luottavat liikaa manuaaleihin.

</tt -g>

Generoidaan /ii<debuggeri>n tarvitsemat /ii<symbolitaulu>t suoritettavan
ohjelman mukaan.

</tt -i> </sl dirfile>

Luetaan linkitt{j{n direktiivit tiedostosta </sl dirfile>.
Tiedoston nimen voi antaa my|s komennon lopussa olevien
tiedostonimien yhteydess{. Suositeltavampi tapa on
kuitenkin k{ytt{{ </tt -i>-optiota.

</tt -l </sl name>/opt<,</sl<name>>>/iter>

Mukaan linkitett{v{t /ii<kirjasto>t. Jos </sl name> alkaa pisteell{
tai kauttaviivalla, oletetaan, ett{ </sl name> sis{lt{{
t{ydellisen hakupolun ja tiedostonimen. Muuten tutkitaan,
l|ytyyk| tiedostoa </tt //lib//lib</sl<name>>.a>; ellei
sit{ l|ydy, haetaan kirjastoa </tt //usr//lib//lib</sl<name>>.a>.

</tt -L </sl ldir>/opt<,</sl<ldir>>>/iter>

M{{ritell{{n, mist{ hakemistoista optio </tt -l> hakee
kirjastoja. Vaikuttaa vain komentorivill{ </tt L>:n j{lkeen
tuleviin </tt -l>-optioihin.

Sy|tt|tiedostot </sl infile> voivat olla joko objektimoduleita tai
linkitt{j{n komentoja sis{lt{vi{ tiedostoja. /ii<Objektitiedosto>n nimen on
p{{tytt{v{ </tt .o>:hon; kaikki muut tiedostot tulkitaan linkitt{j{n
komentotiedostoiksi.

/iii<linkitt{j{n komentotiedosto>
Jos linkitett{vi{ moduleita on runsaasti, tai linkitys on jotenkin
muuten monimutkainen, kannattaa tehd{ linkitt{j{n direktiivej{
sis{lt{v{ komentotiedosto.  Oletetaan, ett{ olemme
kotihakemistomme alla olevassa hakemistossa, meill{ on ohjelman objekti
tiedostossa </tt prog.o> ja haluamme linkitt{{ siihen aliohjelmia
tiedostosta </tt sub.o> ja omassa hakemistossamme </tt mylib>
olevan kirjaston </tt lib1> rutiineja.  Tehd{{n
tiedosto </tt ohjelma>:

</copymode
     bin=prog.o,sub.o
     lib=..//mylib//lib1
     abs=prog
>
Linkitys tapahtuu nyt yksinkertaisesti sanomalla
</copymode
     segldr -i ohjelma
>
ja tuloksena syntyy (ainakin niin sopii toivoa) tiedosto
</tt prog>, joka voidaan suorittaa.

Edell{ esiintyiv{tkin t{rkeimm{t linkitt{j{n direktiivit:

</tt bin=/sl file/optional<,file>/iter>

Linkitett{vien objektitiedostojen luettelo.  Direktiivej{ voi olla
useampia; kaikki </tt/ii<bin>>-direktiiveill{ ilmoitetut tiedostot
ker{t{{n ja linkitet{{n yhteen.  Jos samanniminen moduli l|ytyy
useammasta tiedostosta, k{ytet{{n ensiksi l|ydetty{. Moduleita, joihin
ei viitata, ei linkitet{ mukaan.

</tt lib=/sl file/optional<,file>/iter>

Lis{t{{n oletuskirjastoihin tiedostoja. N{m{ k{yd{{n l{pi
esiintymisj{rjestyksess{, ja mukaan poimitaan tarvittavat modulit. 
Oletetaan, ett{ on sanottu </tt/ii<lib>=file1,file2>. Jos nyt
jokin </tt file1>:n moduli kutsuu </tt file2>:n modulia, on </tt
file1>:n oltava listassa ennen </tt file2>:ta, koska kirjastot k{yd{{n
l{pi vain kerran. </tt bin>-direktiivill{ annettaville tiedostoille
j{rjestys on vapaampi.

</tt/ii<abs>=/sl file>

Muutetaan syntyv{n ohjelman nimen oletusarvoksi </sl file>.

/section<Ohjelmien /ii<segmentointi>>

Ohjelman segmentointi selvinnee helpoimmin pienest{ 
esimerkist{. Olkoon meill{ seuraava ohjelma:

</copymode
     program koe
       call sub1
       call sub2
     end
     subroutine sub1
       ...
     end
     subroutine sub2
       call sub3
       call sub4
     end
     subroutine sub3
       ...
     end
     subroutine sub4
       ...
     end
>

Jos haluamme jakaa t{m{n nelj{{n segmenttiin siten, ett{
ensimm{iseen tulee p{{ohjelma, toiseen </tt sub1>, kolmanteen
</tt sub2> ja nelj{nteen </tt sub3> ja </tt sub4>,
voisimme tehd{ seuraavanlaisen direktiivitiedoston:

</copymode
     bin=koe.o
     abs=koe
     *
     * m{{ritell{{n segmenttien puurakenne
     *
     tree
        root(seg1,seg2)
        seg2(seg3)
     endtree
     *
     * sitten m{{ritell{{n, mit{ mihinkin segmenttiin tulee
     *
     segment=root
             modules=koe
     endseg
     segment=seg1
             modules=sub1
     endseg
     segment=seg2
             modules=sub2
     endseg
     segment=seg3
             modules=sub3,sub4
     endseg
>

Tietyll{ hetkell{ muistissa ovat suoritettavan aliohjelman
sis{lt{v{ segmentti ja kaikki sen edelt{j{t aina
puun juureen saakka. Aliohjelma saa kutsua vain 
edelt{j{- tai seuraajasegmenteiss{ olevia aliohjelmia.
Esimerkiss{mme </tt sub2> siis ei voi kutsua </tt sub1>:t{,
koska ne ovat puun eri haaroissa. 

/section</ii<Oletuskirjastot>>

Linkitt{j{ l|yt{{ automaattisesti seuraaviin systeemi/ii<kirjasto>ihin
kuuluvat aliohjelmat ja funktiot:

</copymode
      libp.a
      libio.a
      libu.a
      libf.a
      libc.a
      libm.a
      libsci.a
>

Liitteess{ 9 on systeemikirjastojen referenssimanuaalin
sis{llysluettelo, josta n{kyy, mit{ kaikkia aliohjelmia
</sc fortran>-ohjelmasta voidaan kutsua ilman mit{{n lis{m{{rittelyj{.
N{m{ oletuskirjastot sis{lt{v{t jo huomattavan m{{r{n
rutiineja mm. lineaarialgebran, Fourier-muunnosten,
ja differentiaaliyht{l|iden k{sittelyyn.
N{ist{ aliohjelmista l|ytyy lis{{ tietoa </tt man>-komennolla
(ja kirjastorutiinien manuaalisivuthan ovat sektioissa
3f ... 3sci).

 
/section<Omat /ii<aliohjelmakirjasto>t>
  
Kirjasto on tiedosto, johon on koottu yhteen tiedostoon "moduleiksi" useita 
objektitiedostoja, josta linkitt{j{ ne sitten voi hakea. Tavallisesti 
/ii<kirjasto>n nimi p{{ttyy tyyppiin </tt .a>.

Kirjaston voi
muodostaa komennolla </tt/ii<bld>>. Voimme esimerkiksi koota
kaikki nykyhakemiston objektikoodit kirjastoksi </tt mylib.a>
komennolla:
 
</copymode
      bld q mylib.a *.o
>
 
Listan kirjastossamme olevista objektimoduleista saa nyt komennolla

</copymode
      bld t mylib.a
>

Jos </sc fortran>-ohjelman </tt merde.f> objekti on tiedostossa
</tt merde.o>, voimme linkitt{{ kirjastomme siihen sanomalla
 
</copymode
      segldr merde.o mylib.a
>

Jos on ehtinyt muodostaa itselleen paljon hy|dyllisi{ ohjelmia, niiden 
kirjaston voi sijoittaa sopivaan hakemistoon </tt/$HOME//ownlibs>, ja 
m{{ritell{ Bourne-shellin tapauksessa alustustiedostossa </tt .profile>
symbolin </tt libpath>

</copymode
      set libpath=/$HOME//ownlibs
      export libpath
>
 
jolloin linkityskomento lyhenee muotoon:
 
</copymode
      segldr merde.o /$libpath//mylib.a
> 



/section</ii<Muistin dynaaminen varaaminen>>

Crayn pienehk| keskusmuisti ja reaalimuistiarkkitehtuuri
rajoittavat monien virtuaalimuistikoneille
kirjoitettujen ohjelmien ajamista ja edellytt{v{t
muutoksia muistink{sittelyrutiineihin. 

Seuraavassa on esimerkki ohjelmasta, jossa varataan
kaiken varalta riitt{v{n iso taulukko:

</beginverbatim
      program main
      real a(1)
      common /alue/ a(1000000)
      ...
      n= ...
      ...
      do 1 i=1,n
         a(i)=...
  1   continue
      ...
      end
/endverbatim>

Koska taulukon </tt a> ei aina tarvitsisi olla n{in suuri,
se voidaan sijoittaa dynaamisesti laajenevalle
</tt common>-alueelle, jonka koko m{{r{ytyy suoritusaikana.
T{t{ varten ohjelmaa t{ytyy muuttaa seuraavasti:

</beginverbatim
      program main
      real a(1)
      common /alue/ a(1)

      n= ...
      call mremain(mem)
      if (n .gt. mem) goto 999
      call sbreak(n)
      ...
      do 1 i=1,n
         a(i)=...
   1  continue
      ...
 999  write(0,'('' cannot allocate enough memory'')')
      end
/endverbatim>

/iii<dynaaminen common>
T{ss{ aliohjelma </tt mremain> kertoo, kuinka paljon ty|lle varattua
muistia on j{ljell{. Jos sit{ on riitt{v{sti, varataan haluttu
m{{r{ aliohjelmalla </tt sbreak>. T{m{ laajentaa nimenomaan
dynaamista </tt common>ia, joita ohjelmassa saa olla vain yksi kappale.

Dynaaminen </tt common> saadaan aikaan linkitt{j{n direktiivill{.
Se varataan keon (/ii<heap>) per{st{, joten /iii<keko>
keko ei sitten en{{ pysty laajenemaan. Siksi keolle on 
linkitt{j{n direktiiveill{ varattava riitt{v{sti tilaa.

Linkitt{mist{ varten tehd{{n direktiivitiedosto
</tt dyn.d>, joka sis{lt{{ seuraavat rivit: 

</copymode
      DYNAMIC=ALUE
      HEAP=20000+0
>

Ensimm{isell{ rivill{ kerrotaan, ett{ </tt common>-alue nimelt{{n </tt
alue> on dynaaminen muistialue. (Huom: linkitt{j{ n{k|j{{n
haluaa, ett{ nimi on ISOILLA kirjaimilla!)
Toinen rivi tarkoittaa, ett{ ohjelman
keko ja pino saavat yhteens{ 20000 sanaa tilaa.  Parametrin osa </tt
+0> kertoo, ett{ keon kokoa ei saa suoritusaikana kasvattaa.

Jos ohjelma on tiedostossa </tt prog.f>, tapahtuu
k{{nt{minen ja linkitys sanomalla

</copymode
      cft77 prog.f
      segldr -i dyn.d -o prog prog.o
>

Keon koon m{{r{{minen on homman hankalin teht{v{. Sen koko riippuu oleellisesti
siit{, miten paljon v{liaikaista ty|tilaa ohjelma tarvitsee erilaisille
v{liaikaismuuttujille. Pieniss{ ohjelmissa yleens{ 5000--10000 on riitt{v{,
mutta joskus on tarpeen k{ytt{{ jopa arvoa 100~000.

