Options et directives du compilateur
Le compilateur peut être contrôlé de trois manières : en utilisant les options du compilateur disponibles depuis la ligne de commande MPW, en utilisant les directives du compilateur que vous écrivez directement dans votre texte source Pascal, ou en utilisant l'outil Commando du MPW Shell. L'outil Commando est une série de boîtes de dialogue affichant toutes les fonctions, paramètres et options des commandes MPW, y compris Pascal.
La ligne de commande MPW Pascal
Voici la syntaxe pour spécifier les options sur la ligne de commande Pascal :
Pascal [option...][file...] |
Vous pouvez spécifier zéro ou plusieurs noms de fichiers. Chaque fichier est compilé séparément - le fichier de compilation Name.p crée le fichier objet Name.p.o. Par convention, les noms de fichiers sources Pascal se terminent par un suffixe ".p". Si vous ne spécifiez pas de nom de fichier, l'entrée standard est compilée dans un fichier nommé "p.o".
Les erreurs du compilateur sont écrites dans la sortie de diagnostic, un fichier prédéclaré de type texte, pouvant être écrit dans un autre fichier ou redirigé. Les informations de progression et de résumé sont également écrites dans la sortie de diagnostic, si demandé, à l'aide des directives du compilateur décrites dans la section de ce nom. Les résultats du diagnostic sont entièrement décrits dans la référence Macintosh Programmer's Workshop.
Options du compilateur
Les options du compilateur MPW Pascal sont des symboles dans la ligne de commande MPW envoyant des instructions au compilateur. Le MPW 3.0 Pascal fournit une option, -sym, émettant des enregistrements pour le débogueur symbolique et une option, -mbg, incluant des symboles pour MacsBug. De plus, l'option -h supprime les messages d'erreur concernant l'utilisation de descripteurs non sécurisés, l'option -m autorise plus de 32 000 globaux, l'option -k place les ressources de la table de symboles dans le répertoire spécifié par prefixpath et l'option -n génère des modules de données globaux séparés. pour une meilleure répartition. Enfin, trois nouvelles options de ligne de commande, -noload, -clean et -rebuild, prennent en charge la fonction de chargement automatique du compilateur. Le MPW 3.0 Pascal n'offre plus l'option -z. Le tableau suivant présente une liste alphabétique des options du compilateur pour MPW 3.0 Pascal :
Option | Description |
---|---|
-b | Générez des références A5-relatives chaque fois que l'adresse d'une procédure ou d'une fonction est requise. (Par défaut, les références relatives au PC sont générées dans les routines du même segment.) Cette option équivaut à spécifier {$B-} dans le code source. |
-c | Vérification de la syntaxe uniquement : aucun fichier objet n'est généré. |
-clean | Effacez toutes les ressources de la table de symboles. |
-d name=true | false | Définissez le nom de la variable de compilation sur true ou false (par exemple, -d Elems881=true demande au compilateur d'émettre des appels directs au 68881 pour les fonctions transcendantales. Cette option équivaut à spécifier {$SETC name:=true | false} dans le code source. |
-e file | Écrivez toutes les erreurs dans le fichier journal des erreurs. Une copie du rapport d'erreur sera toujours envoyée à la sortie de diagnostic. Cette option équivaut à spécifier {$E file} dans le code source. |
-h | Supprimez les messages d'erreur concernant l'utilisation de descripteurs non sécurisés. |
-i pathname [, pathname] ... | Recherchez les fichiers d'inclusion ou USES dans les répertoires spécifiés. Plusieurs options -i peuvent être spécifiées. Au maximum, 15 répertoires seront
recherchés. L'ordre de recherche est le suivant :
|
-k | Placez les ressources de la table de symboles dans le répertoire spécifié par prefixpath. |
-m | Autorisez plus de 32 000 globaux en utilisant des références 32 bits. |
-mbg ch8 | Inclure les symboles MacsBug compatibles v2.0 (huit caractères seulement, dans un format spécial). |
-mbg full | Inclure des symboles complets (non tronqués) pour MacsBug. |
-mbg off | N'incluez pas de symboles pour le débogueur MacsBug. |
-mbg number | Inclure les symboles MacsBug tronqués à la longueur number. |
-MC68020 | Générez le code 68020. Le compilateur génère des instructions 68020 ou des modes d'adressage sélectionnés pour être plus rapides et/ou plus petits que l'équivalent 68000. Lorsque le compilateur génère du code 68020 pour le programme principal, il insère une instruction TRAPF dans le code du préambule du programme. L'instruction TRAPF ne fait rien sur le 68020 et provoque une interruption d'instruction illégale sur un 68000 afin que vos programmes puissent détecter précocement s'ils sont exécutés sans 68020. Cette option équivaut à spécifier {$MC68020+} dans le code source. |
-MC68881 | Générez le code 68881 fichier par fichier. Le compilateur alloue 12 octets pour chaque variable étendue et attribue jusqu'à 4 variables étendues (locales ou paramètres) par procédure aux 68881 registres FP4 à FP7. Le compilateur génère du code 68881 chaque fois que cela est possible pour les opérations arithmétiques et les conversions de données binaires (mais pas de chaînes de caractères). Lorsque le compilateur génère du code pour appeler une routine externe, le code passe les paramètres $ en utilisant les conventions MPW Pascal 1.0 à une exception près : les types étendus ont une largeur de 12 octets. Cependant, le compilateur s'attend à ce qu'une fonction C renvoyant un type étendu renvoie la valeur du résultat dans le registre FP0. Si -MC68881 et -d Elems881=true sont tous deux spécifiés sur la ligne de commande, alors le compilateur reconnaît et génère également du code en ligne pour les routines Sin, Cos, Ln, Exp, Arctan et ces routines supplémentaires prises en charge par le 68881 : Arctanh, Cosh, Sinh, Tanh, Log10, Exp10, Arccos, Arcsin, SinCos, Tan, Exp1, Log2. L'option -MC68881 équivaut à spécifier {$MC68881+} dans le code source. |
-n | Générez des modules de données globaux distincts pour une meilleure allocation. |
-noload | N'utilisez ni ne créez de ressources de table de symboles. |
-o objname | Spécifiez le chemin d'accès du fichier objet généré. Si objname se termine par deux points (: ), il indique un répertoire pour le fichier de sortie, dont le nom est ensuite formé par la règle normale (c'est-à-dire inputFilename.o). Si le nom du fichier source contient un chemin, il est supprimé et remplacé par objname: comme préfixe. (Dans ce cas, un seul fichier source doit être spécifié.) Si objname ne se termine pas par deux points, le fichier objet est écrit dans le fichier objname. |
-ov | Activez la vérification du débordement. (Attention : cela peut augmenter considérablement la taille du code.) Cette option équivaut à spécifier {$OV+} dans le code source. |
-p | Fournissez des informations de progression et de résumé à la sortie de diagnostic, y compris les informations d'entête du compilateur (avis de droit d'auteur et numéro de version), les noms de modules et la taille des codes en octets, ainsi que le nombre d'erreurs et le temps de compilation. |
-r | Supprime la vérification de la portée. Cette option équivaut à spécifier {$R-} dans le code source. |
-rebuild | Reconstruit toutes les ressources de la table de symboles. |
-sym off | N'émet pas d'informations sur le fichier objet SADE. |
-sym on | full | Émettez des informations complètes sur le fichier objet SADE. Pour limiter cette option, spécifiez également un ou plusieurs novars, nolines, notypes pour omettre respectivement les informations de variable, de ligne ou de type du fichier objet. |
-t | Signaler le temps de compilation à la sortie de diagnostic. L'option -p indique également l'heure de compilation. |
-u | Initialise toutes les données (globales et locales) avec le modèle $7267. Cette option est utile pour déboguer des programmes susceptibles d'utiliser des données non initialisées. |
-w | Arrête le fonctionnement de l'optimiseur de fichier par fichier. Le compilateur n'exécute plus de passe finale sur le code généré et ne tente plus de remplacer certaines séquences de code par des séquences plus efficaces. Cette option équivaut à spécifier {$W-} dans le code source. |
-y pathname | Place les fichiers intermédiaires («.o.i») du compilateur dans le répertoire spécifié par le chemin. |
Directives du compilateur
Les directives du compilateur sont des commandes que vous intégrez directement dans le code source Pascal.
Chaque directive du compilateur commence par un signe dollar ($) et doit être entourée de délimiteurs de commentaires. Vous ne pouvez placer qu'une seule directive dans chaque paire de délimiteurs.
Les directives du compilateur MPW Pascal sont répertoriées par ordre alphabétique dans le tableau suivant, les conditions par défaut étant marquées par des astérisques. Les directives individuelles sont discutées dans le reste de cette page.
Directive | Effet |
---|---|
$A1 | Autoriser les sections de données globales de l'unité à être non contiguës. |
$A5 | Laissez le compilateur résoudre les références aux données globales de l'unité. |
$B+ | Générer du code relatif au PC |
$B- | Générer du code relatif à A5 |
$C+ | Générer du code |
$C- | Ne pas générer de code |
$D- | Ne pas intégrer les noms de routine dans le code objet |
$D+ | Intégrer les noms de routine dans le code objet |
$E filename | Envoyer les erreurs de compilation au nom de fichier. |
$ELSEC | Compile le texte source si comp-expr dans $IFC précédent est false. |
$ENDC | Fin de l'intervalle du texte source compilé de manière conditionnelle. |
$H+ | Vérifie le déréférencement des descripteurs d'objet. |
$H- | Suppose que tous les descripteurs d'objets soient valides. |
$I filename | Inclure un fichier source séparé dans la compilation. |
$IFC comp-expr | Compile le texte source suivant si la valeur de comp-expris est true. |
$IFC OPTION (option-name) | Cette version de $IFC vous permet de déterminer les paramètres actuels des options du compilateur. |
$J- | Les définitions de données globales doivent se trouver dans le fichier source Pascal. |
$J+ | Les données globales peuvent être définies dans un autre fichier. |
$K[pathname] | Contrôler la destination des ressources de la table de symboles. |
$MC68020+ | Générer du code 68020 par procédure. |
$MC68020- | Arrête la génération du code 68020 pour chaque procédure. |
$MC68881+ | Génère du code 68881 fichier par fichier |
$MC68881- | Arrête la génération du code 68881 fichier par fichier |
$N- | Identifie toutes les routines du Linker comme anonymes. |
$N+ | Envoyez les noms réels des routines au Linker. |
$OV- | Ignorer les débordements arithmétiques. |
$OV+ | Détecte les débordements arithmétiques. |
$P | Dire à PasRef de faire une éjection de page. |
$PUSH | Enregistre les paramètres d'option actuels |
$POP | Restaure les paramètres d'options enregistrés |
$R+ | Effectue une vérification de l'intervalle de chaînes de caractères, d'ensembles et de tableaux. |
$R- | N'effectue pas de vérification de l'intervalle de chaînes de caractères, d'ensembles et de tableaux. |
$SC- | Évaluation normale de AND et OR |
$SC+ | Évaluation en court-circuit de AND et OR |
$S segname | Place les routines suivantes dans le segment segname |
$SETC id:=comp-expr | Déclare une variable à la compilation et lui attribue une valeur. |
$U filename | Spécifie le nom de fichier pour l'unité suivante dans la déclaration USES. |
$W+ | Activez l'optimiseur de judas. |
$W- | Arrête le fonctionnement de l'optimiseur de judas. |
$Z- | Identifie toutes les routines et variables du Linker comme locales. |
$Z* | Identifie toutes les routines au niveau supérieur du Linker comme étant externes. |
$Z+ | Identifiez toutes les routines et variables du Linker comme externes. |
Le compilateur MPW Pascal prend en charge la directive $K plaçant les ressources de la table de symboles dans le répertoire spécifié par prefixpath.
Le MPW Pascal ne propose plus la directive $LOAD Compiler. La syntaxe $LOAD est toujours prise en charge, mais ignorée. Si des informations sur la progression du compilateur sont demandées, le compilateur déclare que l'utilisation de la fonctionnalité est "obsolète mais inoffensive". Si vous avez inclus des dépendances pour les fichiers $LOAD dans vos makefiles, vous pouvez les supprimer; cependant, si vous ne les supprimez pas, ils restent inoffensifs car ils répètent simplement ce que le compilateur fait automatiquement.
Contrôle du fichier d'entrée
La directive $I
{$I filename} |
La directive $I demande au compilateur de récupérer l'entrée source suivante à partir du fichier spécifié. Le compilateur lira le nouveau fichier jusqu'à la fin de ce fichier, après quoi le compilateur continuera à partir du fichier source original. Le nom de fichier peut inclure des préfixes si vous le souhaitez; cependant, le compilateur ouvrira le fichier en utilisant ses règles de recherche. Les fichiers inclus peuvent être imbriqués jusqu'à cinq profondeurs. Ce nombre inclut les unités accessibles par les déclarations USES dans les fichiers inclus ou les unités imbriquées. Une unité ne peut pas utiliser la directive $I dans sa section interface.
La directive $U
{$U filename} |
Dans une instruction USES, le compilateur lira chaque nom d'unité et recherchera le fichier correspondant unitname.p. Ce mécanisme peut être surchargé en utilisant la commande $U pour spécifier un nom de fichier dans lequel trouver l'unité suivante. Dans les deux cas, le compilateur utilisera ses règles de recherche pour ouvrir le fichier. La directive $U n'est valable qu'une seule fois, pour le nom d'unité suivant spécifié dans le texte source.
Substitution de variables Shell dans les noms de fichiers et de segments
Quatre directives ({$E}, {$I}, {$S} et {$U} nécessitent une chaîne de caractères étant interprétée comme un nom de fichier (ou dans le cas de {$S} comme un nom de segment). Pour celles-ci directives, la valeur de la chaîne de caractères peut être contrôlée par une variable MPW Shell. Dans l'exemple suivant, {$I} est utilisé, mais la discussion est valable pour les cinq directives.
Normalement, la directive a la forme {chaîne $I}, auquel cas la chaîne de caractères est exactement telle que spécifiée. Par exemple, {$I foo.p} inclut le fichier foo.p.
Deux autres possibilités sont :
- {$I $$Shell (shell-variable)}, auquel cas la valeur de la chaîne de caractères est la valeur de la variable Shell spécifiée. Par exemple, {$I $$Shell(myvar)} équivaut à {$I foo.p} si la variable Shell myvar est définie sur foo.p.
- {$I $$Shell (shell-variable) string}, auquel cas la valeur de la chaîne de caractères est la valeur de la variable chaîne de caractères spécifiée avec la valeur de la chaîne de caractères spécifiée ajoutée. Par exemple, {$I $$Shell(myVar)foo.p} équivaut à {$I hd:includes:foo.p} si la variable Shell myVar est définie sur 'hd:includes:'.
C'est une erreur si le compilateur ne peut pas accéder à une variable Shell spécifiée. Une façon de spécifier la variable Shell myvar dans l'exemple ci-dessus serait :
set myVar 'hd:includes:' export myVar |
Contrôle de la génération de code
La directive $B±
{$B+} |
{$B-} |
Lorsqu'un programme prend l'adresse d'une routine (par exemple, avec l'opérateur @) se trouvant dans le même segment, le compilateur génère du code relatif au PC. La directive $B- force le compilateur à générer du code relatif à A5 à la place. La valeur par défaut $B+ revient au code relatif au PC.
La directive $C±
{$C+} |
{$C-} |
Lorsque cette commande est désactivée {$C-}, le compilateur ne produira pas de code objet pour les instructions suivantes, bien que la vérification de la syntaxe se poursuive. La génération de code peut être reprise en spécifiant $C+. $C+ est la condition par défaut. Cette directive n'affecte que des procédures ou des fonctions entières.
La directive $J±
{$J+} |
{$J-} |
La directive $J+ permet de définir dans un autre fichier les données globales déclarées dans le fichier source, les connexions étant effectuées par le Linker. Ces connexions sont sensibles à la casse. La directive par défaut $J- requiert que toutes les définitions soient dans le fichier source Pascal.
La directive $MC68020±
{$MC68020+} |
{$MC68020-} |
La directive $MC68020+ permet au compilateur de générer du code 68020. La directive par défaut $MC68020- arrête la génération du code 68020.
La directive $MC68881±
{$MC68881+} |
{$MC68881-} |
La directive $MC68881+ permet au compilateur de générer du code 68881 fichier par fichier. La directive par défaut $MC68881- arrête la génération du code 68881 fichier par fichier.
La directive $OV±
{$OV-} |
{$OV+} |
La condition par défaut $OV- empêche le compilateur de générer du code pour détecter un débordement arithmétique lors des affectations et de l'évaluation des expressions. La directive $OV+ lui fait produire un tel code.
La directive $R±
{$R+} |
{$R-} |
La commande $R- demande au compilateur de renoncer à la génération de code pour effectuer une vérification de plage des limites de chaîne de caractères, d'ensemble et de tableau. La valeur par défaut, SR+, consiste à produire un tel code.
La directive $S
{$S [segname]} |
Par défaut, le compilateur demandera à l'éditeur de liens de placer toutes les routines dans un seul segment (avec l'identificateur Main sensible à la casse). La commande $S permet au programmeur de spécifier que les routines suivantes soient dirigées vers le segment spécifié. La commande $S ne peut apparaître qu'entre les routines globales. Si le nom du segment est omis, le nom du segment Main est utilisé.
La directive $SC±
{$SC-} |
{$SC+} |
La directive $SC+ demande au compilateur d'évaluer AND et OR en tant qu'opérateurs de court-circuit. Dans ce cas, le processus d'évaluation commence par l'opérande de gauche et se termine lorsqu'une valeur vraie a été atteinte pour l'expression. La directive par défaut $SC- amène le compilateur à évaluer les deux opérandes de AND et OR.
La directive $W±
{$W-} |
{$W+} |
La directive par défaut $W+ active l'optimiseur de judas. La directive $W- arrête le fonctionnement de l'optimiseur de judas.
Débogage
La directive $D±
{$D+} |
{$D-} |
Le débogueur Macintosh MacsBug est capable de lire les noms de routine intégrés dans le code objet. Par défaut, le compilateur intègre le nom de la procédure (ou de la fonction) dans le code objet. $D- désactive cette fonctionnalité; $D+ le rallume.
La directive $H±
{$H+} |
{$H-} |
Lorsque la valeur par défaut $H+ est effective, le compilateur teste chaque expression déréférençant un descripteur dans le texte source orienté objet, pour s'assurer qu'il est actuellement valide. Il génère une erreur du compilateur si ce n'est pas le cas. La directive SH- désactive une telle vérification.
Compilation conditionnelle
Le MPW Pascal vous permet de compiler des sections de votre texte source de manière conditionnelle au moyen des directives $IFC, $ELSEC et $ENDC. La directive $IFC est contrôlée par la valeur d'une expression compile-time. Les sections du texte source contrôlées par ces directives peuvent être imbriquées.
Vous pouvez former des expressions de compilation à partir de variables de compilation ou de constantes de type entier ou booléen. La valeur finale de l'expression contrôlant une directive $IFC doit être booléenne. Vous pouvez utiliser tous les opérateurs Pascal dans les expressions de compilation, à l'exception de IN et @. Si vous utilisez l'opérateur /, le compilateur le changera automatiquement en DIV.
La directive $SETC
{$SETC id := comp-expn} |
La directive $SETC déclare une variable de compilation nommée id et lui attribue la valeur comp-expr.
La directive $IFC
{$IFC comp-expr} |
La directive $IFC oblige le compilateur à compiler le texte source suivant jusqu'à la prochaine directive $ELSEC ou $ENDC, uniquement si la valeur booléenne de comp-expr est true.
Vous pouvez écrire cette directive sous la forme {$IFC UNDEFINED varname}. Cela agira comme {$IFC true} si varname n'a pas encore été déclaré avec une directive $SETC ; sinon, il agira comme {$IFC false}.
Vous pouvez également écrire cette directive {$IFC OPTION (option-name)} pour tester le paramètre actuel des options du compilateur. Par exemple, {$IFC OPTION (MC68881)} agit comme {$IFC true} si {$MC68881+} avait été spécifié avant $IFC.
La directive $ELSEC
{$ELSEC} |
La directive $ELSEC marque le début du texte source étant compilé uniquement si la valeur du comp-expr contrôlant sa directive $IFC correspondante est false.
La directive $ENDC
{$ENDC} |
La directive $ENDC marque la fin d'une section de texte source compilé de manière conditionnelle, correspondant à une directive $IFC.
Contrôle de sortie
La directive $Z±
{$Z*} |
{$Z+} |
{$Z-} |
Le compilateur identifie toutes les routines et variables (autres que celles d'une interface d'unité) auprès du Linker comme locales (c'est-à-dire non accessibles de l'extérieur du programme). En spécifiant $Z+, le programmeur forcera le compilateur à identifier les routines et variables suivantes comme externes. La commande $Z- ramène le compilateur à son action par défaut. Un sous-ensemble de $Z+ est disponible : $Z* force le compilateur à identifier les routines suivantes au niveau d'imbrication supérieur (et non les variables) comme externes. L'utilisation de $Z+ augmente considérablement la taille du fichier de code.
La directive $N±
{$N+} |
{$N-} |
Par défaut, toutes les routines sont identifiées par Linker comme anonymes. Lorsque $N+ est spécifié, le compilateur transmet les noms réels des routines suivantes au Linker. Cela peut être utile pour traquer les erreurs de temps de liaison, car l'éditeur de liens pourra signaler le nom de la routine impliquée dans l'erreur. $N- renvoie le compilateur à son comportement par défaut.
Remarque : La directive $N± opère sur un fichier source entier ; $Z± peut être utilisé dans des zones sélectionnées d'un fichier source.
Autres directives
La directive $A1
{$A1} |
Par défaut, les données globales de la section interface et implémentation d'une unité sont allouées de manière contiguë en mémoire. En spécifiant $A1 (1 vaut un) dans l'interface d'une unité, le programmeur peut permettre aux deux sections de données d'être allouées de manière non contiguë.
La directive $A5
{$A5} |
Normalement, les données globales du programme principal sont situées immédiatement sous le registre A5, et toutes les références de données dans cette zone sont résolues par le Linker. En spécifiant $A5 dans une unité (avant toute déclaration de données d'interface), le programmeur s'assure que les données de l'unité sont situées immédiatement sous le registre A5 et que les références aux données de cette unité sont résolues par le compilateur. Ceci est utile lorsque la plupart des données globales sont déclarées dans une unité distincte. La directive $A5 ne peut être utilisée que dans une unité et seulement dans une unité au sein d'une compilation.
La directive $E
{$E filename} |
Lorsque la commande $E est utilisée, les erreurs de compilation ultérieures sont envoyées au fichier spécifié ; ils sont également repris dans le diagnostic standard. Par défaut, les erreurs de compilation ne sont pas envoyées vers un fichier d'erreurs. Le nom de fichier spécifié doit inclure les préfixes nécessaires; aucun ne sera fourni par le compilateur.
La directive $K
{$K [dirname]} |
Normalement, les ressources de la table de symboles d'une unité seront entreposées dans la branche de ressources du fichier source de l'unité. Avec la directive $K, si un répertoire est spécifié, les ressources de la table de symboles seront entreposées dans un fichier du même nom que l'unité d'où elles proviennent, mais dans le répertoire dirname. Si aucun répertoire n'est spécifié, les ressources de la table des symboles seront entreposées dans le fichier source de l'unité. La directive $K diffère de l'option du compilateur -k en ce sens qu'elle vous permet de spécifier quelles unités seront entreposées dans quel répertoire. La directive $K peut être utile si vos unités se trouvent dans un emplacement dans lequel il est impossible d'écrire.
Par exemple, vous pouvez utiliser la directive $K lors de la lecture d'unités à partir d'un serveur de fichiers. Si vous donnez une directive $K et un nom de répertoire, le compilateur lira le code source sur le serveur de fichiers de l'unité qu'il recherche. Ensuite, le compilateur crée un fichier portant le même nom que l'unité dans le répertoire spécifié et y entreposera et lira les ressources de la table des symboles.
La directive $P
{$P} |
La directive $P indique à PasRef d'effectuer une éjection de page. Pour plus d'informations sur PasRef, voir L'utilitaire PasRef.
Les directives $PUSH et $POP
{$PUSH} |
{$POP} |
La directive $PUSH vous permet de sauvegarder les paramètres d'option actuels. La directive $POP vous permet de restaurer les paramètres d'options enregistrés. Ces directives sont utilisées avec des instructions d'inclusions ou USES. C'est une erreur d'avoir plus de {$POP} que de {$PUSH}.