Δημοσιεύτηκε: 26 Φεβ 2010, 13:31
από Dimitris
FORTRAN
Ή "η νέα γλώσσα προγραμματισμού"

Ακούω γέλια; Ναι η FORTRAN είναι μια σύγχρονη γλώσσα προγραμματισμού που μαθαίνεται από πολλούς νέες και νέους στο forum μας, αλλά δυστυχώς δε διδάσκεται (τουλάχιστον σωστά). Και επειδή αυτοί που τη διδάσκουν δε ξέρουν από ελεύθερο λογισμικό, οπότε δε μπορούν να γράψουν έναν οδηγό και να τον διαθέσουν ελεύθερο, αποφάσισα να κάνω εγώ αυτή τη δουλειά. (Όχι ότι δε μου κάνει κέφι)

Πολλές από τις πληροφορίες που αναφέρω εδώ βρίσκονται ήδη στους οδηγούς της υπογραφής μου, αλλά τις επαναλαμβάνω για τους τεμπέληδες. Καταρχήν (επειδή έχω κουραστεί να ακούω το logari81 να τονίζει τη διαφορά μεταξύ compiler, IDE, κλπ κλπ) υπάρχει το IDE, Integrated Development Environment, με το οποίο δεν πρόκειται να ασχοληθώ καθόλου. Όπως λέει η λέξη είναι ένα ολοκληρωμένο περιβάλλον ανάπτυξης, τίποτε λιγότερο τίποτε παραπάνω. Δεν είναι compiler, δεν είναι linker. Παράδειγμα: geany.

Compiler: Είναι το πρόγραμμα εκείνο (γραμμής εντολών) που παίρνει τον πηγαίο κώδικα και το μετατρέπει σε δυαδικό εκτελέσιμο. Πάλι τίποτε λιγότερο τίποτε παραπάνω. Στον compiler ΔΕ γράφουμε κώδικα. Παραδείγμα: gfortran. Εγκατάσταση:
sudo apt-get install gfortran

Linker: Είναι το πρόγραμμα εκείνο (γραμμής εντολών) που "συνδέει" όλα τα δυαδικά αρχεία σε ένα εκτελέσιμο. Πάλι τίποτε λιγότερο τίποτε παραπάνω. Πολλές φορές ο compiler καλεί, ξανατονίζω καλεί, τον linker. Ο compiler ΔΕΝ κάνει linking. Kαλεί απλώς το linker. Παράδειγμα: ld.

Τώρα που ξεκαθαρίσαμε τις βασικές έννοιες μπορούμε να προχωρήσουμε με τη FORTRAN. Όπως είπαμε FORTRAN είναι μια γλώσσα προγραμματισμού. Άλλα έχει πολλά πρότυπα, standards, όπως fortran 66, fortran 77, fortran 90/95, fortran 2003.Όταν γράφεις ένα πρόγραμμα αποφασίζεις σε ποιο πρότυπο θα το γράψεις, ή άλλοι το έχουν αποφασίσει πριν από σένα. Σε γενικές γραμμές είναι backwards compatible. Δε θα μπω σε λεπτομέρειες. Το fortran 66 είναι απαρχαιωμένο, μην το χρησιμοποιείτε. Το fortran 77 είναι μεν παλιό αλλά υπάρχει πολύ "legacy" κώδικας εκεί έξω που είναι γραμμένο σε αυτό. Αν ξεκινάτε κάτι καινούριο, τότε fortran 90/95. To fortran 2003 είναι ακόμη καινούριο, μη δοκιμασμένο και είναι πολύ πιθανό ο compiler gfortran να μην έχει όλες τις δυνατότητες που προδιαγράφονται από το πρότυπο. Ο gfortran υποστηρίζει τα πρότυπα 77 και 90/95 (για τα άλλα δεν είμαι σίγουρος). Ο g77 μόνο το 77 (όπως μαντεύετε και από το όνομα)

Αυτά και με τα πρότυπα. Μία άλλη σημαντική παρατήρηση είναι το format. Στο fortran 77 επειδή είχαν ακόμη κάρτες διάτριτες (τώρα μπορείτε να δείτε σε μουσεία τέτοιες) το πρότυπο προέβλεπε οι πρώτες 6 στήλες να είναι κενές και επιτρέπεται να γράφεις μέχρι την εβδομικοστή κάτι στήλη. Αυτό ονομάζεται fixed format, ενώ το ελεύθερο ονομάζεται free format. O compiler gfortran υποστηρίζει και τα δύο ανάλογα με την κατάληξη του αρχείου ή το command line argument: -ffree-form -ffixed-form και άλλα που μπορούν να βρεθούν εδώ http://linux.die.net/man/1/gfortran

Για να σκεφτούμε, τι άλλο χρειάζεται; Α ναι, ένα παράδειγμα. Γράφουμε στο αρχείο foo.f:
print*, "hello world"
end

Ανοίγουμε το τερματικό και προσπαθούμε να το κάνουμε compile με:
gfortran foo.f
σφάλμα

ξαναπροσπαθούμε:
gfortran -ffree-form foo.f
οκ

το μετονομάζουμε το αρχείο σε foo.f90 και ξαναπροσπαθούμε:
gfortran foo.f90
οκ

Τώρα στο αρχείο foo.f προσθέτουμε 6 κενά σε κάθε γραμμή:
print *, "hello, world"
end
και ξαναπροσπαθούμε
gfortran foo.f
οκ

You got the point? Ωραία αλλάζουμε κεφάλαιο. (Με προσοχή τις σελίδες γιατί είναι παλιές και ευαίσθητες)

Πριν αλλάξουμε κεφάλαιο (με προσοχή τις σελίδες είπαμε) ας δούμε τη διαφορά compiling και linking. Mέχρι στιγμής λέγαμε στον compiler να κάνει τη όλη δουλειά μόνος του, δηλαδή και το compile και να καλέσει το linker (αν έχετε ανοιχτό το top σε άλλο τερματικό θα δείτε που τρέχει στιγμιαία η εντολή ld). Aν όμως εκτελέσουμε την εντολή
gfortran -c foo.f
Εδώ γίνεται μόνο compile, δημιουργείται το *.ο αρχείο του πηγαίου κώδικα.

Τώρα με
gfortran -o a.out foo.o
λέμε στον compiler να συνδέσει το εκτελέσιμο a.out με το δυαδικό foo.o.

Αυτά. Happy crunching!