</motto<
/null/vskip55truemm

      -- -- Codex Serafinianus
>>

/chapter<Muut ohjelmointikielet>

Crayll{ on k{ytett{viss{ my|s vektoroivat C- ja Pascal-k{{nt{j{t.
C-k{{nt{j{st{ on kaksi versiota: perinteinen Kernighanin ja
Ritchien C (jossa kuitenkin on muutamia /ii<ANSI-C>:n ominaisuuksia),
jota k{ytet{{n toistaiseksi systeemiohjelmien k{{nt{miseen,
ja uudempi ANSI-standardiehdotusta noudattava C-k{{nt{j{.

/section</ii<C>>

Perinteinen C-k{{nt{j{ k{ynnistyy komennolla

</copymode
      cc /opt<optio>/iter </sl file>.c
>

T{m{ k{{nt{{ ja linkitt{{ tiedostossa </sl file>.c olevan
ohjelman suoritettavaksi ohjelmaksi </tt a.out>.
ANSI-C-k{{nt{j{ puolestaan k{ynnistet{{n komennolla </tt scc>.
Emme kuitenkaan t{ss{ puutu siihen, koska k{{nt{j{{ ei
ollut viel{ asennettu oppaan menness{ painoon.

Crayn C:ss{ kaikki muuttujat merkkijonoja lukuunottamatta
viev{t tilaa yhden sanan. Erilaisten kokonaislukujen
(</tt<short>>, </tt int>, </tt long>) lukualueet ovat
kuitenkin erilaiset; k{ytett{vien bittien m{{r{ riippuu
laitteistosta ja k{{nt{j{n optioista. 
Kaikissa Cray-toteutuksissa </tt float> ja </tt double>
ovat samoja yksinkertaisen tarkkuuden reaalilukuja.

K{{nt{j{n optiolista voi sis{lt{{ valtaisan m{{r{n erilaisia
optioita, joista seuraavassa muutamia mahdollisesti
hy|dyllisi{: /iii<C-k{{nt{j{n optiot>

</tt -F>

/ii<J{ljitys>-optio (/ii<flowtrace>); vastaa
</sc fortran>in </tt -ef> -optiota.

</tt -g>

Tuotetaan debuggerin tarvitsema symbolitaulu.

</tt -I> </sl dir>

Ilmoittaa, ett{ </tt/#<include>>-direktiivill{ ilmoitettuja
tiedostoja haetaan my|s hakemistosta </sl dir>.
Jos tiedoston nimi on lainausmerkeiss{ (</tt "...">),
sit{ haetaan ensin samasta hakemistosta kuin k{{nnett{v{
ohjelma, sitten hakemistosta </sl dir> ja lopuksi
systeemihakemistoista. Jos tiedoston nimi on ymp{r|ity
kulmasuluilla, sit{ haetaan ensin </sl dir>-hakemistosta
ja sitten systeemihakemistoista.

</tt -o /sl output>

Talletetaan suoritettava ohjelma tiedostoon </sl output>.
Ellei t{ll{ optiolla toisin m{{ritell{, on tiedoston
nimi oletusarvoisesti se perinteinen </tt a.out>.

</tt -Zu>

K{sitell{{n rinnakkaistusdirektiivit ja tuotetaan
mahdollisesti rinnakkaistettua koodia.

/iii<C:n direktiivit> /iii</#pragma>
Esiprosessorin direktiivit ovat </tt/#>-merkill{
alkavia rivej{ (kuten </tt/#<define>> ja </tt/#<include>>)
Erikoistarkoituksiin on varattu my|s
</tt/#<pragma>>-direktiivit. Crayll{ </tt/#<pragma>>-direktiiveill{
ohjataan mm. vektorointia ja rinnakkaistamista.
Crayn suositus k{{nt{j{n versiosta 5.0 l{htien on, 
ett{ ne kirjoitetaan muotoon

</copymode
      /#pragma /_CRI </sl direktiivi>
>

Vaikka </tt/_CRI>-m{{re ei toistaiseksi ole pakollinen, se
varmistaa, ett{ kysymyksess{ on todella Crayn
erityisominaisuuksia koskeva direktiivi.  /ii<Vektorointi>in
ja /ii<optimointi>in vaikuttavia direktiivej{ ovat:

</tt/#pragma /_CRI /ii<novector>>

Estet{{n vektorointi.  Direktiivi vaikuttaa vain seuraavaan
</tt for>-silmukkaan. 

</tt/#pragma /_CRI /ii<ivdep>>

Ilmoittaa, ettei seuraavassa </tt for>-silmukassa esiinny
vektoroinnin est{vi{ riippuvuuksia. C:ss{ t{t{ tarvinnee
useammin kuin </sc fortran>issa, koska osoittimien k{ytt|
tekee automaattisen riippuvuusanalyysin mahdottomaksi ja
est{{ siten vektoroinnin monissa sellaisissakin tapauksissa, joissa
mit{{n todellisia riippuvuuksia ei ole.


</tt/#pragma /_CRI /ii<taskloop> private (/sl<var>/opt<,/sl<var>>/iter)>

Seuraava </tt for>-silmukka rinnakkaistetaan. Direktiivi
vaikuttaa vain k{{nnett{ess{ ohjelma optiolla </tt -Zu>.
Rinnakkaistaminen muistuttaa l{hinn{ </sc fortran>in
automaattista rinnakkaistamista (</tt<cf77 -Zp ...>>).
Direktiivi{ voi seurata koko joukko lis{m{{reit{, mutta niist{ vain
</tt private> on aina pakollinen. Sill{ ilmoitetaan, mitk{
silmukassa esiintyvist{ muuttujista ovat yksityisi{.
T{llaisia ovat ainakin silmukan indeksimuuttuja ja kaikkien
sisempien silmukoiden indeksit.
M{{reell{ </tt shared> voidaan vastaavasti ilmoittaa, mitk{
muuttujat ovat jaettuja. Globaalit muuttujat ovat automaattisesti
jaettuja, joten niit{ ei tarvitse erikseen sellaisiksi ilmoittaa.

</tt/#pragma /_CRI /ii<guard>>/nl
</tt/#pragma /_CRI /ii<endguard>>

M{{rittelev{t kriittisen alueen. 

Seuraava esimerkki rinnakkaistetusta matriisien kertolaskusta
on per{isin Crayn C-manuaalista:

<
/catcode`/{=12
/catcode`/}=12
/catcode`/[=12
/catcode`/]=12
/catcode`/\=12
/beginverbatim

#define SIZE 800
float a[SIZE][SIZE], b[SIZE][SIZE], c[SIZE][SIZE] ;
main()
{
  int i,j,k ;
#pragma _CRI taskloop private(i,j) shared(a,b)
  for(i=0 ; i<SIZE ; i++)    /* rinnakkaistettava silmukka */
  {
    for(j=0 ; j<SIZE ; j++)  /* vektoroitava silmukka      */
    {
       a[i][j] = 1.0 ;
       b[i][j] = 2.0 ;
    }
  }
#pragma _CRI taskloop private(i,j,k)
  for(i=0 ; i<SIZE ; i++)    /* rinnakkaistettava silmukka */
  {
    for(j=0 ; j<SIZE ; j++)  /* ei vektoroidu              */
    {
      c[i][j] = 0.0 ;
      for(k=0 ; k<SIZE ; k++)   /* vektoroituu             */
      {
         c[i][j] = c[i][j] + a[i][k] * b[k][j] ;
      }
    }
/* tulostetaan joka 50:s tulos; vain yhden prosessorin     */
/* kerrallaan annetaan tulostaa; #pragmasta generoituu     */
/* suoritettavaa koodia, joten ehdollinen osuus on pantava */
/* sulkuihin                                               */
    if (i%50 == 0)
    {
#pragma _CRI guard
      printf("c[%d][50] = %7.3f\n",i,c[i][50]) ;
#pragma _CRI endguard
    }
  }
}

/endverbatim>


/section</ii<Pascal>>


Crayn Pascal on ISO-standardin 7185 tason 1 mukaista.

Muista k{{nt{jist{ poiketen
Pascal-k{{nt{j{ lukee l{hdekielisen ohjelman tiedostosta
</tt stdin>, ellei sit{ ilmoiteta erikseen k{{nt{j{n
optiolla. K{{nn|slista tulee vastaavasti tiedostoon </tt stdout>.
Objektitiedoston nimen oletusarvo on </tt a.o>.
Yksinkertaisimmassa tapauksessa ohjelman k{{nt{minen,
linkitys ja suoritus tapahtuu seuraavasti:

</copymode
      pascal -i prog.p
      segldr a.o
      a.out
>

/iii<Pascal-k{{nt{j{n optiot>
K{{nt{j{n optioista t{rkeimpi{ ovat:

</tt -i </sl infile>>

Ilmoittaa l{hdekielisen ohjelman sis{lt{v{n tiedoston.

</tt -l </sl listfile>>

K{{nn|slistaus ohjataan tiedostoon </sl listfile>.

</tt -b </sl objectfile>>

Ilmoittaa syntyv{n objektitiedosto nimen.

/page

</tt -o </sl list>>

T{ss{ </sl list> on lista pilkulla toisistaan erotettuja
valitsimia. Muutamia mahdollisesti tarpeellisia ovat:

/beginitemss<3truecm><27truemm>

/itemm<BT+> 
Asetetaan j{ljitys (flowtrace) p{{lle.

/itemm<G+>
Alustetaan paikalliset muuttujat ep{kelvoilla luvuilla.

/itemm<I46>
K{ytet{{n 46 bitin kokonaislukuja. Oletusarvo on 64 bitti{,
mik{ on huomattavasti hitaampaa.

/enditems


