Tilgængelighed: Alle maskiner
Kort beskrivelse:
cc er C-compileren. Den følger endnu ikke den nyeste version af ansi-C, men ligger tæt på.
fc og f77 er fortran compileren. Fortran compileren har to navne, og som det fremgår følger den fortran 77 standarden.
pc er navnet på pascal compileren. pc ligner grundlæggende alle andre pascal compilere, men specielt omkring filbehandling er pascal standarden lidt uklar, og det afspejler sig også i denne compiler.
Eksempel på programafvikling: Det følgende eksempel består af tre rutiner, en for hvert sprog. Eksemplet beregner variansen for 1000 normal-fordelte tal.
program main(output); type realarray = array[1..1000] of real; var f : text; n : integer; ssum : real; r_array : realarray; { n_normals is an external procedure written in fortran. Notice that the arguments are var-specified (call by reference) } procedure n_normals(var n : integer; var r : realarray); external; begin rewrite(f,'outfile.dat'); { open output file } n := 1000; { when var-spec. you can't } n_normals(n, r_array); { write n_normals(1000,r_array) } ssum := 0; for n:=1 to 1000 do { calculate square sum } ssum := ssum + sqr(r_array[n]); ssum := ssum/1000; writeln('Varians = ',ssum); { write result to screen } writeln(f,'Varians = ',ssum); { write result to output file } close(f); end.
#include <values.h> /* include value of pi */ #include <math.h> /* declaration of math-functions */ /* such as cos and log */ extern double drand48(); /* drand48 is not declared anywhere else */ gauss(r) float *r; /* use "call by reference */ { *r = sqrt(-2*log(drand48()))*cos( 2*M_PI*drand48()); }
subroutine n_normals(n,s) integer n real*4 s(1000) integer i do 10, i=1,n c Fill the array with N(0,1) numbers 888 call gauss(s(i)) 10 continue return end
Man skal være opmærksom på, at der ikke findes nogle værktøjer til at kontrollere syntaksen på tværs af programmeringssprog, men se i øvrigt næste afsnit om lint og lintfor.
Ved oversættelse fra kildetext til objektkode og videre til eksekverbar kode er der en række options man kan bruge til compilerne.
De vigtigste er
De enkelte filer oversættes til objektkode
vip:/usv2/nn $ f77 -c -O n_normals.f <CR> vip:/usv2/nn $ cc -c -O gauss.c <CR> vip:/usv2/nn $ pc -c -O main.p <CR>Det er et tilfælde, at filerne hedder det samme som procedurerne, men læg mærke til at fortran, c og pascal filer ender på hhv .f, .c og .p. Efter der er genereret objektkode for hver fil, skal de linkes sammen. Det gøres i dette tilfælde med pascal compileren, da hovedprogrammet er skrevet i pascal. Hvis hovedprogrammet var skrevet i fortran eller C ville man linke med hhv. fortran- eller C-compilerne. pc includerer de nødvendige biblioteksrutiner af sig selv.
vip:/usv2/nn $ pc -O n_normals.o gauss.o main.o <CR>Den eksekverbare kode hedder per default a.out.
I UNIX findes der subrutinebiblioteker, som bl.a. indeholder matematiske rutiner, sorterings rutiner, i/o rutiner, osv. Disse biblioteker bliver normalt linket sammen med fortran og pascal programmmer, men for C-programmer skal man specificere de fleste af dem explicit.
Bemærkninger: Hvis man begynder at blande flere programmeringssprog, som i ovennævnte eksempel, be'r man om problemer. Men nogle gange kan det være nødvendigt, f.eks hvis man skal benytte biblioteksrutiner, som andre har skrevet.
Blandt de ting man skal tage hensyn til, er at fortran benytter "call by reference" for argumenterne ved subrutinekald. Det svarer til at argumenterne er var-specificerede i pascal, og at argumenterne er pointere i C. Desuden skal man være opmærksom på størrelsen af variable. F.eks fylder en real i pascal det samme som en real*4 i fortran og en float i C. Man skal også tage hensyn til indicering af flerdimensionale variable. I pascal og C løber det sidste index hurtigst, mens i fortran løber det første index hurtigst.
Biblioteksrutiner: IMSL er et subrutinebibliotek med bl.a. statistiske funktioner. I IMSL findes der en funktion "RNNOF" som generer et N(0,1) normalfordelt tal. Derfor kunne vi have undgået selv at skrive C-rutinen i eksemplet, men i stedet benyttet IMSL-rutinen. Linje 888 i fortran-programmet skal skiftes ud med
888 s(i) = RNNOF()og programmet linkes vha kommandoen
vip:/usv2/nn $ pc -O main.o n_normals.o -limslib <CR>hvor -limslib betyder at vi skal inkludere IMSL biblioteket. (Bemærk at -limslib står til sidst). Hvis hovedprogrammet var skrevet i C ville kommandoen have set således ud:
vip:/usv2/nn $ cc -O main.o n_normals.o -limslib -lcl -lm <CR>