Next: Syntaks kontrol (lint Up: OVERSÆTTERE (COMPILERE) Previous: OVERSÆTTERE (COMPILERE)

C, Fortran og Pascal

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.

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>



Next: Syntaks kontrol (lint Up: OVERSÆTTERE (COMPILERE) Previous: OVERSÆTTERE (COMPILERE)


mr@imm.dtu.dk