drik's wiki informatique Languages Turbo Pascal Directives de compilation.html

Introduction

Les directives de compilation permettent de contrôler de nombreux aspects du fonctionnement du compilateur. Celles-ci sont placées dans le code source sous la forme de commentaires particuliers de la forme {$ directive}. Elles sont nécessairement placées entre accolades et le symbole $ indique qu'il s'agit d'une directive de compilation. Par exemple, {$B+} indique que les expressions booléennes doivent être évaluées complètement.

Le fonctionnement du compilateur est régi par trois niveaux de décision d'importance croissante : la valeur par défaut prévue à l'installation, la valeur donnée dans le menu option (à partir de la version 4) et les directives données dans le code source. Les directives données dans le code source l'emportent toujours sur celles du menu et celles définies par défaut.

Les directives ont deux types de champ d'action : elles peuvent être globales (affecter l'ensemble du programme ou de l'unité) ou locales (affecter un certain nombre d'instructions ou de déclaratives). Schématiquement, les directives globales doivent être placées au début du code, avant les déclaratives. Les directives locales peuvent être placées où on le désire dans le programme.

Il existe trois types de directives de compilation : les directives « bascule », « paramétrage » et « conditionnelle ».

Les directives de « bascule » ne peuvent prendre que deux valeurs : vrai (+) et faux (-). Les directives locales sont annulées par la directive inverse. Les directives de « paramétrage » peuvent prendre une infinité de valeurs différentes comme, par exemple, un nom de fichier à inclure ou la définition de l'utilisation de la mémoire. Elles peuvent également être globales ou locales. Les directives « conditionnelles » permettent une compilation différente du programme en fonction de symboles prédéfinis ou définis par l'utilisateur ou encore de la valeur d'une directive « bascule ». Elles sont toutes locales et doivent être placées où on le désire dans le programme.

Suivant le type de directive, sont donnés :

  • la syntaxe, le titre, la ou les versions supportées,
  • le type,
  • la valeur par défaut (si elle existe),
  • la portée (locale ou globale),
  • la description de la directive.

On remarquera qu'entre la version 3 et les versions ultérieures la plupart des directives ont été modifiées (exceptions : les directives {$I} et {$V}). Les versions 4, 5 et 6 apportent progressivement des directives supplémentaires bien que la directive {$U} ait changé de destination en cours d'évolution.

{$A signe} Alignement des données 5, 6

Type bascule

Valeur par défaut {$A+}

Portée globale

{$A+}  les variables et les constantes typées simples (non structurées} sont stockées à partir d'adresses paires en mémoire. Ceci permet un accès plus rapide à la mémoire par les processeurs 286, 386, 486 mais n'a aucun effet sur les machines à base de 8088. Cependant le programme risque d'être un peu plus gros en mémoire.

{$A-} les variables et les constantes typées sont mémorisées les unes à la suite des autres. Sur une machine à base du 8086 cela n'influence pas la vitesse de calcul et les programmes sont légèrement plus petits en mémoire.

{$B signe} Mécanisme des entrées-sorties   3

Type bascule

Valeur par défaut {$B-}

Portée globale

{$B+}  les fichiers standard INPUT et OUTPUT sont assignés à CON (meilleur contrôle des entrées-sorties}.

{$B-} les fichiers standard INPUT et OUTPUT sont assignés à TRM (entrées-sorties Pascal standard}.

{$B signe} Expressions booléennes 4, 5, 6

Type bascule

Valeur par défaut {$B-}

Portée locale

{$B+}  les expressions booléennes sont évaluées complètement même si le résultat est connu avant la fin de l'évaluation. C'est la règle en Pascal standard.

{$B-} l'évaluation des expressions booléennes est optimisée de manière à arrêter l'évaluation dès que le résultat de l'expression est connu. Le code généré est plus rapide et certaines expressions booléennes complexes peuvent être plus facilement évaluées.

{$C signe} Caractères de contrôle 3

Type bascule

Valeur par défaut {$C+}

Portée globale

{$C+}  les caractères de contrôle (Ctrl-c et Ctrl-s} sont pris en compte pendant le déroulement du programme.

{$C-} les caractères de contrôle ne sont pas pris en compte.

{$D signe} Vérification des organes logiques 3

Type bascule

Valeur par défaut {$D+}

Portée globale

{$D+}  le programme vérifie si une écriture est dirigée vers un organe logique (l'écran, par exemple). Dans ce cas, l'écriture est effectuée sans buffer, caractère par caractère.

{$D-} le programme ne vérifie pas s'il s'agit d'un organe logique et toutes les écritures se font à l'aide d'une mémoire tampon.

La taille des buffers d'entrée doit être nulle (Directives {$G} et {$P}).

{$D signe} Information de débogage 4, 5, 6

Type bascule

Valeur par défaut { $D+ }

Portée globale

{$D+}  le compilateur génère les informations nécessaires à l'utilisation d'un débogueur et permet d'utiliser celui qui est intégré à Turbo Pascal à partir de la version 5. Pour utiliser un débogueur externe, il est nécessaire de compiler le programme à destination du disque.

{$D-} les informations de mise au point ne sont pas générées, le code est donc plus petit.

{$DEFINE nom} Définition d'un symbole 4, 5, 6

Type conditionnel

Portée locale

La directive {$DEFINE nom} permet de définir un symbole conditionnel de compilation. Celui-ci est destiné à être utilisé dans des directives de compilation {$IFDEF nom} et est annulé par la directive {$UNDEF nom}. Cette directive n'a pas d'effet si « nom » a déjà été défini.

{$E signe} Émulation du coprocesseur 5, 6

Type bascule

Valeur par défaut {$E+}

Portée globale

{$E+} le compilateur génère une bibliothèque d'émulation du coprocesseur arithmétique. Ceci permet d'avoir accès aux types Single, Double, Extended et Comp même si l'on ne dispose pas du coprocesseur.

{$E-} le compilateur ne génère pas d'émulation, le code généré est plus petit mais ne peut être utilisé que si le coprocesseur arithmétique est présent.

{$ELSE} Sinon 4, 5, 6

Type conditionnel

Portée locale

La directive {$ELSE} est utilisée dans une structure de compilation conditionnelle à la manière du Else de Pascal.

Elle doit être reliée à une directive {$IFDEF nom}, {$IFNDEF nom} ou {$IFOPT} (voir ces directives).

{$ENDIF} Fin Si 4, 5, 6

Type conditionnel

Portée locale

La directive {$ENDIF} termine une structure de compilation conditionnelle commencée par {$IFDEF nom}, {$IFNDEF nom} ou {$IFOPT} (voir ces directives).

{$F nombre} Nombre de fichiers ouverts 3

Type paramétrage

Valeur par défaut {$F15}

Portée globale

Cette directive permet de contrôler le nombre de fichiers ouverts simultanément dans un programme. La valeur maximale qui peut être donnée dépend de la valeur indiquée dans le fichier CONFIG.SYS sous la rubrique FILES= et de la version du Dos utilisée. La valeur par défaut est F15, ce qui permet d'ouvrir 16 fichiers.

{$F signe} Portée des appels   4, 5, 6

Valeur par défaut {$F-}

Portée locale

{$F+} le compilateur génère toujours des appels de routines qui peuvent porter au-delà du segment, ils sont dits « Far » ou intersegments. Cette directive est nécessaire lorsque l'on utilise des fichiers de recouvrement ou des variables de type sous-programme.

{$F-} le compilateur détermine au mieux le mode d'appel (Near ou Far} des procédures et des fonctions.

{$G nombre} Taille du tampon d'Input 3

Type paramétrage

Valeur par défaut {$G0}

Portée globale

Cette directive permet de contrôler la taille du tampon d'entrée. La valeur 0 (par défaut} indique que les lectures au clavier se font directement sans passer par le handle de Ms-Dos. Une valeur différente indique qu'elles se font de la manière standard, ce qui permet la redirection des entrées au sens de Ms-Dos.

{$G signe} Instructions 286  6

Type bascule

Valeur par défaut { $G- }

Portée locale

{$G+}  le compilateur utilise certaines instructions machine supplémentaires qui ne sont présentes qu'à partir du processeur 80286. Autrement dit, si le code est plus rapide, il ne s'exécutera pas sur des machines à base de 8086 ou 8088.

{$G-} les instructions machine utilisées ne font appel qu'au jeu du 8086 et le programme compilé est exécutable sur tous les types de PC.

{$I signe} Erreurs d'entrées-sorties 3, 4, 5, 6

Type bascule

Valeur par défaut {$I+}

Portée locale

{$I+} les erreurs d'entrées-sorties provoquent l'arrêt de l'exécution et l'affichage d'un message d'erreur.

{$I-}   les erreurs d'entrées-sorties n'ont pas d'effet sur l'exécution, mais un code d'erreur peut être récupéré par l'intermédiaire de IoResult. C'est au programmeur de gérer la suite du déroulement du programme.

{$I nom_de_fichier} Inclure un fichier 3, 4, 5, 6

Type paramétrage

Portée locale

Cette directive permet d'inclure un fichier extérieur dans le code source. Par cet intermédiaire, l'utilisation de bibliothèques de procédures est rendue possible. Jusqu'à 5 niveaux d'imbrication de fichiers inclus sont possibles. Toutes les instructions comprises dans un bloc Begin - End doivent se trouver dans le même fichier source.

{$IFDEF nom} Compiler si défini 4, 5, 6

Type conditionnel

Portée locale

La ou les instructions qui suivent seront compilées si le symbole « nom » est défini. Le symbole de compilation « nom » peut être défini par le compilateur ou par l'utilisateur.

Les symboles définis par le compilateur sont :

VERXX où XX représente le numéro de la version de Turbo Pascal,

  (40 pour 4.0, 50 pour 5.0, etc.),

MSDOS  toujours défini pour les compilateurs du système d'exploitation Ms-Dos,

CPU86 toujours défini sur les machines dont le processeur est de la famille 86,

CPU87 défini si le coprocesseur arithmétique est présent lors de la compilation.

Des symboles peuvent être définis et annulés par le programmeur au moyen de {$DEFINE} et {$UNDEF}.

La structure typique d'une compilation conditionnelle est :

{$IFDEF nom} 
... {premier groupe d'instructions}
{$ELSE}
... {second groupe d'instructions} {$ENDIF}

Un {$ENDIF} doit nécessairement terminer une structure de compilation conditionnelle et la clause {$ELSE}, comme en Pascal, ne doit être utilisée que si elle est nécessaire.

{$IDNDEF nom} Compiler si non défini 4, 5, 6

Type conditionnel

Portée locale

La clause {$IDNDEF nom} permet de compiler une portion de programme si le symbole « nom » n'a pas été défini. Elle se comporte comme la négation de l'option {$IFDEF} (voir plus haut).

{$IFOPT directive} Compiler si la directive   4, 5, 6

Type conditionnel

Portée locale

La clause {$IFOPT directive} permet de compiler ou non un groupe d'instructions si une directive de compilation de type « bascule » est active. Comme en Pascal, un {$ENDIF} doit nécessairement terminer une structure de compilation conditionnelle et la clause {$ELSE} ne doit être utilisée que si elle est nécessaire.

Schéma :

{$IFOPT X+} 
... {premier groupe d'instructions}
{$ELSE}
... {second groupe d'instructions}
{$ENDIF}

Dans cet exemple, le premier groupe d'instructions est compilé si la directive de {$X+} est active, sinon, le second groupe d'instructions est compilé.

{$K signe} Contrôle de la pile   3

Type bascule

Valeur par défaut {$K+}

Portée locale

Cette directive permet d'induire les instructions machine nécessaires au contrôle de l'espace mémoire de la pile.

{$K+}  le code généré par le compilateur vérifie lors de l'appel d'une procédure ou d'une fonction si l'espace disponible dans la pile est suffisant pour effectuer la transmission des paramètres.

{$K-} aucune vérification de l'espace disponible dans la pile n'est effectuée lors de l'appel d'une procédure ou d'une fonction. Le code est plus rapide mais il y a risque de blocage du système en cas d'espace insuffisant.

{$L} Édition des liens   4, 5

Type bascule

Valeur par défaut { $L+ }

Portée globale

{$L+} lors de la phase édition des liens de la compilation, Turbo Pascal garde en mémoire centrale, entre les deux passes, les unités utilisées. Cette manière de procéder est plus rapide mais risque de conduire à un manque de mémoire.

{$L-} les unités sont lues deux fois sur le disque lors de l'édition des liens et ne sont pas conservées en mémoire. Cette manière de procéder est plus lente mais mieux adaptée aux très gros programmes.

{$L} Symboles locaux 6

Type bascule

Valeur par défaut {$L+}

Portée globale

{$L+} le compilateur génère les informations nécessaires à l'utilisation d'un débogueur sur les symboles (procédures, fonctions, variables,...) locaux d'un module.

{$L-} les informations ne sont pas générées, les performances globales sont meilleures, mais l'utilisation du débogueur est impossible sur les symboles locaux.

{$L nom_de_fich} Lien avec un fichier objet   4, 5, 6

Type paramétrage

Portée locale

La directive de compilation {$L} demande à Turbo Pascal de lier le programme principal avec un sous-programme externe écrit en assembleur et compilé comme un fichier relogeable (.OBJ} au format Intel. Ce sous-programme est habituellement écrit en assembleur.

{$M pile, tas_min, tas_max}   4, 5, 6

Type paramétrage

Valeur par défaut {$M 16384, 0, 655360}

Portée globale

La directive de compilation {$M} permet de spécifier les paramètres d'allocation de la mémoire d'un programme. Le premier paramètre donne, en octets, la taille de la pile; il doit être compris entre 1024 et 65 520. Le deuxième donne la taille minimale du tas; il doit être compris entre 0 et 655 360. Le troisième donne la taille maximale du tas; il doit être compris entre « tas_min » et 655 360.

{$N signe} Traitement des calculs 4, 5, 6

Type bascule

Valeur par défaut {$N-}

Portée globale

{$N+}  le compilateur effectue tous les calculs en utilisant les types de données du coprocesseur arithmétique, ce qui accroît leur précision. En version 4, pour que cette option soit valide, il faut que le coprocesseur soit physiquement présent. A partir de la version 5, on peut le simuler à l'aide de l'option de compilation {$E+}.

{$N-} les calculs sont effectués en n'utilisant que le type Real. Sur des machines dépourvues de coprocesseur, la vitesse d'exécution est plus grande mais la précision des calculs est plus faible. En version 4 c'est la seule possibilité, s'il n'y a pas de coprocesseur physiquement présent.

{$O signe} Compilation Overlay   5, 6

Type bascule

Valeur par défaut {$O-}

Portée globale

{$O+}  l'unité compilée peut toujours être utilisée en tant qu'Overlay. Le compilateur incorpore le code nécessaire à la transmission de certains types de paramètres aux fichiers de recouvrement. L'utilisation de cette directive n'oblige pas à employer l'unité en question comme Overlay dans tous les cas; compilée sur disque, elle pourra l'être si nécessaire.

{$O-} l'unité compilée ne peut, d'une manière sûre, être utilisée comme fichier de recouvrement, mais le code généré est légèrement plus petit.

{$O nom_de_fichier} Utilisation d'un overlay 5, 6

Type paramétrage

Portée locale

La directive de compilation {$O nom_de_fichier} permet de faire appel à un fichier de recouvrement. Cette directive doit nécessairement être placée dans un programme principal et référencer une unité. Celle-ci doit nécessairement avoir été compilée avec l'option {$O+}.

{$P nombre} Taille du tampon de sortie 3

Type paramétrage

Valeur par défaut {$P0}

Portée globale

Cette directive permet de contrôler la taille du tampon de sortie. La valeur 0 (par défaut) indique que les écritures se font, directement, sans passer par le canal de Ms-Dos. Une valeur différente de 0 indique qu'elles se font de manière standard, ce qui permet la redirection des entrées-sorties au sens de Ms-Dos.

{$R signe} Vérification des indices 4, 5, 6

Type bascule

Valeur par défaut {$R-}

Portée locale

{$R+}  les indices des variables tableaux, chaînes, scalaires et sous-intervalles sont vérifiés lors de chaque opération. Dans cet état, la vitesse d'exécution du programme est plus faible.

{$R-} les indices ne sont pas vérifiés, le risque d'erreur est plus grand, mais la vitesse d'exécution est plus élevée.

{$S signe} Contrôle de la pile   4, 5, 6

Type bascule

Valeur par défaut {$S+}

Portée locale

{$S+}  le code généré par le compilateur vérifie lors de l'appel d'une procédure ou d'une fonction si l'espace disponible dans la pile est suffisant pour effectuer la transmission des paramètres.

{$S-} aucune vérification de l'espace disponible dans la pile n'est effectuée lors de l'appel d'une procédure ou d'une fonction. Le code est plus rapide mais il y a risque de blocage du système en cas d'espace insuffisant.

{$V signe} Chaînes passées par variable 3, 4, 5, 6

Type bascule

Valeur par défaut {$V-} en Turbo Pascal 3 et {$V+} à partir de la version 4

Portée locale

{$V+}  les longueurs des paramètres formels et effectifs de type chaîne de caractères doivent être strictement identiques.

{$V-} les paramètres formels et effectifs doivent simplement être de type String, aucune vérification de longueur n'est effectuée.

{$U signe} Arrêt du programme par l'utilisateur   3

Type bascule

Valeur par défaut {$U-}

Portée globale

{$U+}  l'utilisateur peut interrompre le programme à n'importe quel moment à l'aide de la touche Ctrl-C, la vitesse d'exécution est plus faible.

{$U-} le programme ne peut être interrompu mais la vitesse d'exécution est plus élevée.

{$U nom_de_fich} Nom Ms-Dos d'une unité   4, 5

Type paramétrage

Portée locale

La directive {$U nom_de_fich} permet de demander l'utilisation d'un fichier contenant une unité dans le cas où le nom Ms-Dos de celle-ci serait différent de son nom Pascal ou son répertoire ne serait pas celui prévu dans les options de Turbo Pascal. Cette directive a disparu avec la version 6, il est nécessaire d'utiliser la rubrique Options / Directories / Unit directories des menus.

{$UNDEF nom} Annulation de définition d'un symbole conditionnel 4, 5, 6

Type conditionnel

Portée locale

La directive {$UNDEF nom} permet d'annuler la définition d'un symbole conditionnel défini par le programmeur à l'aide de la directive {$DEFINE nom}. Cette directive n'a pas d'effet si « nom » n'a pas été défini préalablement.

{$X signe} Syntaxe étendue 6

Type bascule

Valeur par défaut {$X-}

Portée globale

{$X+}  la syntaxe de l'appel des fonctions peut être la même que celle des procédures : la valeur renvoyée est négligée.

{$X-} la syntaxe de l'appel des fonctions est clairement différente de celle des procédures (Pascal standard).

compilation, informatique, directives, languages, pascal, turbo, drik, html, wiki, signe, fichier, nombre, compiler, controle, pile, verification, definition, directive, entrees, symbole, sorties, overlay, defini, tampon, taille, fich, coprocesseur, instructions, conditionnel, introduction, expressions, utilisation, information, utilisateur, traitement, booleennes, annulation, caracteres, alignement, mecanisme, programme, emulation, symboles, debogage, variable, logiques, fichiers, inclure, indices, etendue, organes, ouverts, chaines, passees, syntaxe, calculs, donnees, erreurs, edition, appels, sortie, portee, idndef, locaux, define, sinon, unite, undef, input, ifopt, arret, ifdef, liens, endif, objet, avec, lien, else