Compilation, make

Transcription

Compilation, make
Compilation, make
École normale supérieure
L3 sciences de la planète
2016/2017
Lionel GUEZ
[email protected]
Laboratoire de météorologie dynamique
Langages interprétés versus
langages compilés (1/2)
programme
Python
(texte lisible)
exécution
interpréteur
Python
résultats
données
programme
Fortran
(texte lisible)
compilation
compilateur
Fortran
programme
machine,
fichier
exécutable
exécution
système
d'exploitation
résultats
données
2/27
Langages interprétés versus
langages compilés (2/2)

Interprétés : Python, Bash…

Compilés : Fortran, C, C++…

Un programme en langage compilé donne en
principe un exécutable plus rapide qu'un
programme équivalent en langage interprété.
3/27
Cas élémentaire



Un seul fichier à compiler
Noms à choisir pour le
fichier et le programme
principal
Nom de fichier pour
programme en Fortran,
convention : suffixe .f
(pas d'espace, de
caractères accentués,
etc. dans le nom)
1
fichier
1
programme
principal
Conseil :
my_program.f
program my_program
...
4/27
Fichier source et exécutable


Texte du programme en Fortran : ”fichier
source”
Compilation : traduction du Fortran en ”langage
machine”, langage du processeur
→ création d'un fichier ”exécutable”
5/27
make

Utilitaire UNIX (comme ls, cd, awk...)

Vocation première : aide à la compilation
–
Stockage dans un fichier, appelé GNUmakefile, de
toutes les informations nécessaires à la compilation
d'un programme, sous une forme directement
utilisable
–
Remarque : make n'est pas spécifique au Fortran, il
est conçu pour tous les langages compilés
6/27
Variables reconnues par make


FC : initiales de Fortran compiler, nom du
compilateur (à utiliser dans la commande de
compilation)
Exemple :
FC = gfortran
FFLAGS : Fortran flags, options de compilation
Exemple :
FFLAGS = -ffree-form -std=f95 -Wall
-fbounds-check …
Nota bene : -ffree-form : option format libre
7/27
Digression : format fixe ou libre



Format fixe du fichier source : façon d'écrire les
anciens programmes en Fortran (en Fortran 77
et avant). Instructions entre les colonnes 7 et
72, et autres règles de formattage.
Format libre du fichier source : introduit par
Fortran 90
Possibilité de dire le format fixe ou libre au
compilateur par une ”option du compilateur”.
8/27
Commande de compilation


make sait fabriquer l'exécutable plouf à partir
du fichier plouf.f.
On écrit seulement :
make plouf
(sans suffixe) qui signifie ”fabrique l'exécutable
plouf”

plouf.f et GNUmakefile doivent exister
dans le répertoire courant
plouf.f
source
make plouf
plouf
exécutable
9/27
Recette



Définir FC dans son environnement
(.profile)
Écrire seulement dans un fichier appelé
GNUmakefile la ligne :
FFLAGS = …
Utiliser ce GNUmakefile pour tous les
programmes à un seul fichier .f :
make plouf
make currency_2
make fibonacci
10/27
Commande d'exécution



chemin/plouf
Exemple :
~/Documents/plouf
Le répertoire courant, où l'exécution est lancée,
n'est donc pas forcément le répertoire où se
trouve le fichier exécutable.
Chemin = . pour le répertoire courant :
./plouf
11/27
make et les dates de modification


make ne compile que le nécessaire à partir des
dates de modification.
Donc si on refait make sans avoir modifié le
fichier source :
make plouf
On obtient le message :
make: `plouf' is up to date.
12/27
Importance des options de
compilation

Ne pas rater le meilleur du compilateur :
–
débogage
–
rapidité du programme

Deux fonctionnalités opposées : il faut choisir

Deux situations :
–
au début : mise au point sur de petits cas options
de débogage
–
pour produire des résultats options de rapidité
13/27
Options de débogage (1/2)


Pour signaler des instructions licites mais
parfois involontaires : conversion de type,
troncature d'une chaîne de caractères, calcul
donnant une valeur trop proche de 0, ligne
jamais exécutée
Pour détecter des erreurs : opération illicite sur
des réels (division par zéro, racine carrée d'un
nombre négatif, etc.), référence à un indice de
tableau hors limites, utilisation d'une variable
qui n'a pas reçu de valeur
14/27
Options de débogage (2/2)

Pour signaler un mauvais style de
programmation : un archaïsme du langage, une
extension du langage (peut-être pas acceptée
par tous les compilateurs)
15/27
Beaucoup d'options de débogage

Exemple pour gfortran :
-std=f95 -pedantic-errors -Wall
-Wconversion -Wimplicit-interface
-Wunderflow -Wextra -Wunreachable-code
-ffpetrap=invalid,zero,overflow,underflow -g3
-fbounds-check -O0 -fstack-protector-all

man gfortran pour la liste des options
(débogage et autres) avec explications
16/27
Des options de débogage qui
varient



En gros mêmes fonctionnalités de débogage
d'un compilateur à l'autre mais des options (ce
qu'il y a à écrire sur la ligne de commande) qui
changent beaucoup
Les options varient un peu dans le temps, pour
un compilateur donné, avec les versions du
compilateur.
Conseil : avoir une liste pour chaque
compilateur et la mettre à jour de temps en
temps (changements de version importants,
moins d'une fois par an)
17/27
Programme à deux fichiers
2
fichiers
1
programme
principal
1
module
1
procédure
18/27
Noms de fichiers et
identificateurs Fortran


Des noms à choisir pour : fichiers, programme
principal, module, procédure
Conseil : choisir une convention simple pour
que les correspondances soient évidentes
my_program.f
program my_program
use foo_m, only: foo
...
foo.f
module foo_m
...
contains
[subroutine | function] foo
...
19/27
Recette (1/2)


Le GNUmakefile va maintenant être spécifique
au programme.  Créer un répertoire
spécifique pour ce programme et y placer
GNUmakefile.
Ajouter dans GNUmakefile la ligne :
my_program: foo.o
(ligne ”de dépendance”).
20/27
Recette (2/2)

Dans le terminal, aller dans le répertoire du
programme et taper la commande :
make
tout court pour créer l'exécutable (ce qui doit
être créé, my_program, est maintenant écrit
dans le GNUmakefile, inutile de l'écrire sur la
ligne de commande).
21/27
Fichiers créés (1/2)
my_program.f
foo.f
GNUmakefile


make
foo.o
fichier
objet
foo_m.mod
my_program
exécutable
Un ”fichier objet”, en langage machine, non
exécutable, suffixe .o
Un fichier ”.mod”
foo_m.mod si le module s'appelle foo_m (le
nom du fichier .mod n'est pas formé à partir du
nom du fichier .f)
22/27
Fichiers créés (2/2)

Un fichier exécutable
nom de l'exécutable = nom du fichier
contenant le programme principal sans .f
23/27
GNUmakefile pour un programme
à 3 fichiers ou plus (1/3)

Écrire que l'exécutable dépend de tous les
objets (autres que l'objet correspondant au
programme principal). Exemple :
my_program: foo.o bar.o plouf.o
24/27
GNUmakefile pour un programme
à 3 fichiers ou plus (2/3)

Écrire les dépendances entre les objets (autres
que l'objet correspondant au programme
principal). Il y a dépendance s'il y a une
déclaration use. Par exemple, on écrit dans le
GNUmakefile :
foo.o: bar.o
s'il y a :
use bar
dans la procédure foo.
25/27
GNUmakefile pour un programme
à 3 fichiers ou plus (3/3)

Attention : la ligne de dépendance du
programme principal doit être avant les lignes
de dépendances entre les objets
26/27
Résumé : fichiers GNUmakefile
de complexité croissante
pour 1 fichier .f
FFLAGS = …
LDLIBS = …
GNUmakefile :
pour 2 fichiers .f
pour ≥ 3 fichiers .f
FFLAGS = …
LDLIBS = …
FFLAGS = …
LDLIBS = …
my_program: foo.o
my_program: foo.o bar.o …
foo.o: bar.o …
…
commande :
make my_program
make
make
27/27