| bc(1) | General Commands Manual | bc(1) |
bc – Un langage de calculatrice à précision arbitraire
bc [ -hlwsqv ] [options_longues] [ fichier ... ]
bc est un langage qui prend en charge les nombres en précision arbitraire ainsi qu'une exécution interactive des instructions. Il y a quelques similitudes au niveau de la syntaxe avec le langage de programmation C. Une bibliothèque mathématique standard est disponible à l’aide d’options de ligne de commande. Si nécessaire, la bibliothèque mathématique peut être définie avant de prendre en compte le moindre fichier. bc démarre en traitant le code de tous les fichiers listés sur la ligne de commande dans leur ordre d'apparition. Après que tous les fichiers ont été traités, bc lit à partir de l'entrée standard. Tout le code est exécuté dès qu'il est lu (si un fichier contient une commande indiquant d'arrêter le processeur, bc ne lira jamais à partir de l'entrée standard).
Cette version de bc contient plusieurs extensions en sus des implémentations traditionnelles de bc et du document de travail de la norme POSIX. Les options de ligne de commande peuvent faire afficher un avertissement par ces extensions ou les rejeter. Ce document décrit le langage accepté par ce processeur. Les extensions seront considérées selon cela.
L'élément le plus basique dans bc est le nombre. Les nombres sont des nombres en précision arbitraire. Cette précision vaut à la fois pour la partie entière et pour la partie fractionnaire. Tous les nombres sont représentés de façon interne en décimal et tous les calculs sont effectués en décimal (cette version tronque les résultats des opérations de division et de multiplication). Les nombres ont deux attributs : la longueur et l'échelle. La longueur est le nombre total de chiffres décimaux utilisés par bc pour représenter un nombre et l'échelle est le nombre total de chiffres décimaux après le point décimal. Par exemple :
.000001 a une longueur de 6 et une échelle de 6.
1935.000 a une longueur de 7 et une échelle de 3.
Les nombres sont stockés dans deux types de variables : les variables simples et les variables de tableau. Toutes deux sont nommées. Les noms commencent par une lettre suivie d'un nombre quelconque de lettres, de chiffres ou de caractères de soulignement (« _ »). Toutes les lettres doivent être en minuscule. Les noms entièrement alphanumériques sont une extension. Dans le bc POSIX, tous les noms sont constitués d'une seule lettre minuscule. Le type de variable est rendu évident grâce au contexte, car tous les noms de variables de tableau sont suivis de crochets ([]).
Il y a quatre variables spéciales : scale, ibase, obase et last. scale définit la façon dont certaines opérations utilisent les chiffres après le point décimal. La valeur par défaut pour scale est 0. ibase et obase définissent la base de conversion pour les nombres en entrée et en sortie. La base par défaut est 10, que ce soit pour l'entrée ou pour la sortie. last (une extension) est une variable ayant pour valeur le dernier nombre affiché. Ces variables seront commentées plus en détail quand cela sera approprié. Toutes ces variables peuvent se voir affecter des valeurs et être utilisées dans des expressions.
Les commentaires dans bc débutent par les caractères /* et se terminent par les caractères */. Les commentaires peuvent démarrer n'importe où et apparaître comme une simple espace en entrée. Cela conduit les commentaires à délimiter les autres éléments de l'entrée. Par exemple, un commentaire ne peut être trouvé au milieu d'un nom de variable. Les commentaires incluent tous les sauts de ligne (fin de ligne) situés entre le début et la fin du commentaire.
Pour que bc prenne en charge l'utilisation de scripts, un commentaire d'une seule ligne a été ajouté comme extension. Un commentaire d'une seule ligne débute par un caractère # et continue jusqu'à la fin de la ligne. Le caractère de fin de ligne ne fait pas partie du commentaire et est traité normalement.
Les nombres sont manipulés par des expressions et des instructions. Puisque le langage a été conçu pour être interactif, les instructions et les expressions sont exécutées le plus tôt possible. Il n'y a pas de programme « main ». Au lieu de cela, le code est exécuté dès qu'il est rencontré. Les fonctions, expliquées en détail ci-après, sont définies quand elles sont rencontrées.
Une expression simple est simplement une constante. bc convertit les constantes en nombres décimaux internes en utilisant la base courante de l’entrée courante, spécifiée par la variable ibase. Une exception existe pour les fonctions. Les valeurs valables pour ibase vont de 2 à 36, celles supérieures à 16 sont une extension. Affecter une valeur en dehors de cet intervalle à ibase résultera en une valeur de 2 ou 36. Les nombres d'entrée peuvent contenir les caractères 0-9 et A-F (remarque : ils doivent être en capitales, les lettres minuscules étant des noms de variables). Les nombres d'un seul chiffre ont toujours la valeur de ce chiffre quelle que soit la valeur de ibase (c’est-à-dire A = 10). Pour les nombres composés de plusieurs chiffres, bc remplace tous les chiffres d'entrée supérieurs ou égaux à ibase par la valeur de ibase - 1. Cela fait en sorte que le nombre ZZZ est toujours le plus grand nombre de 3 chiffres dans la base d'entrée.
Les expressions complètes sont similaires à celles de nombreux autres langages de haut niveau. Puisqu'il n'y a qu'un seul type de nombre, il n'y a pas de règle pour mélanger des types. Au lieu de cela, il existe des règles portant sur l'échelle des expressions. Chaque expression possède une échelle. Elle est dérivée de l'échelle des nombres originaux, de l'opération effectuée et, dans de nombreux cas, de la valeur de la variable scale. Les valeurs valables pour la variable scale vont de 0 au plus grand nombre représentable par un entier C.
Dans les descriptions suivantes des expressions valables, « expr » fait référence à une expression complète, et « var » à une variable simple ou de tableau. Une variable simple est juste un
Les expressions relationnelles sont un cas particulier des expressions qui sont toujours évaluées à 0 ou 1 : 0 si la relation est fausse et 1 si la relation est vraie. Elles peuvent apparaître dans n'importe quelle expression valable. Le bc POSIX requiert que les expressions relationnelles ne soient utilisées que dans les instructions if, for et while, et qu'un seul test relationnel y soit effectué. Les opérateurs relationnels sont
Les opérations booléennes sont également valables. Le bc POSIX NE possède PAS d’opérations booléennes. Le résultat de toutes les opérations booléennes est 0 ou 1 (pour faux ou vrai) comme dans les expressions relationnelles. Les opérateurs booléens sont :
La priorité dans les expressions est la suivante (de la plus basse à la plus haute) :
opérateur ||, associatif à gauche opérateur &&, associatif à gauche opérateur !, non associatif opérateurs relationnels, associatifs à gauche opérateur d'affectation, associatif à droite opérateurs + et - , associatifs à gauche opérateurs *, / et %, associatifs à gauche opérateur ^, associatif à droite opérateur - unaire, non associatif opérateurs ++ et --, non associatifs
Cette priorité a été choisie de telle sorte que les programmes bc conformes à POSIX s'exécutent correctement. Cela conduira à ce que l'utilisation des opérateurs relationnels et logiques mène à un comportement inhabituel lors de leur utilisation dans des expressions d'affectation. Considérez l'expression :
La plupart des programmeurs C supposeraient que cela affecte le résultat de « 3 < 5 » (la valeur 1) à la variable « a ». Dans bc, cela affecte la valeur 3 à la variable « a » et compare ensuite 3 à 5. Il vaut mieux utiliser des parenthèses lors de l'utilisation d'opérateurs relationnels ou logiques en présence d'opérateurs d'affectation.
Il y a quelques expressions spéciales supplémentaires qui sont fournies dans bc. Elles se rapportent à des fonctions définies par l'utilisateur et à des fonctions standard. Elles apparaissent toutes sous la forme « nom(paramètres) ». Consulter la section sur les fonctions pour les fonctions définies par l'utilisateur. Les fonctions standard sont :
Les instructions (comme dans la plupart des langages algébriques) fournissent l’ordre d’évaluation d'une expression. Dans bc, les instructions sont exécutées « le plus tôt possible ». L'exécution se produit quand un saut de ligne est rencontré et qu'il y a une ou plusieurs instructions complètes. À cause de cette exécution immédiate, les sauts de ligne sont très importants dans bc. En fait, le point-virgule et le saut de ligne sont utilisés comme séparateurs d'instructions. Un saut de ligne mal placé provoquera une erreur de syntaxe. Puisque les sauts de ligne sont des séparateurs d'instructions, il est possible de cacher un saut de ligne en utilisant une barre oblique inverse. La séquence « \<nl> », où <nl> est le saut de ligne, apparaît à bc comme un espace blanc au lieu d'un saut de ligne. Une liste d'instructions est une série d'instructions séparées par des points-virgules et des sauts de ligne. Voici une liste des instructions de bc et ce qu'elles font (les éléments entre crochets ([]) sont des parties facultatives de l'instruction) :
expression1;
while (expression2) {
instruction;
expression3;
}
Ces instructions ne sont pas des instructions au sens traditionnel du terme. Elles ne sont pas des instructions exécutées. Leur fonction est effectuée au moment de la compilation.
Les fonctions fournissent une méthode pour définir un calcul pouvant être exécuté ultérieurement. Les fonctions de bc calculent toujours une valeur et la renvoient à l'appelant. Les définitions de fonction sont « dynamiques » dans le sens où une fonction n'est pas définie avant que sa définition ait été rencontrée en entrée. Cette définition est ensuite utilisée jusqu'à ce qu'une définition de fonction de même nom soit rencontrée. La nouvelle définition remplace ensuite l'ancienne. Une fonction est définie comme suit :
define nom ( paramètres ) { saut_de_ligne liste_auto liste_instructions }
Un appel de fonction est simplement une expression de la forme « nom(paramètres) ».
Les paramètres sont des nombres ou des tableaux (une extension). Dans la définition de fonction, zéro paramètres ou plus sont définis en fournissant leurs noms séparés par des virgules. Tous les paramètres sont passés par valeur. Les tableaux sont spécifiés dans la définition des paramètres par la notation « nom[] ». Dans l'appel de fonction, les paramètres réels sont des expressions complètes pour les paramètres nombres. La même notation est utilisée pour passer des tableaux et pour définir des paramètres de tableau. Le tableau nommé est passé par valeur à la fonction. Puisque les définitions de fonctions sont dynamiques, le nombre de paramètres et leur type sont vérifiés quand une fonction est appelée. Toute erreur dans le nombre ou le type des paramètres provoquera une erreur à l'exécution. Une erreur à l'exécution se produit également lors de l'appel d'une fonction non définie.
La liste_auto est une liste facultative de variables destinées à une utilisation « locale ». La syntaxe de la liste_auto (si elle est présente) est « auto nom, ... ; », le point-virgule étant facultatif. Chaque nom est le nom d'une variable automatique. Les tableaux peuvent être spécifiés en utilisant la même notation que celle utilisée pour les paramètres. Ces variables voient leur valeur empilée au début de la fonction. Les variables sont ensuite initialisées à zéro et utilisées tout au long de l'exécution de la fonction. À la sortie de la fonction, ces valeurs sont dépilées afin que leur valeur originale (au moment de l'appel de la fonction) soit restaurée. Les paramètres sont réellement des variables automatiques qui sont initialisées à une valeur fournie dans l'appel de fonction. Les variables automatiques sont différentes des variables locales traditionnelles car, si une fonction A appelle une fonction B, B peut accéder aux variables automatiques de A en utilisant simplement le même nom, à moins que la fonction B en ait fait des variables automatiques. Étant donné que les variables automatiques et les paramètres sont placés sur une pile, bc prend en charge les fonctions récursives.
Le corps de la fonction est une liste d'instructions de bc. À nouveau, les instructions sont séparées par des points-virgules ou des sauts de ligne. Les instructions return provoquent l'arrêt d’une fonction et le renvoi d'une valeur. Il y a deux versions de l'instruction return. La première forme, « return », renvoie la valeur 0 à l'expression appelante. La seconde forme, « return (expression ) », calcule la valeur de l'expression et la renvoie à l'expression appelante. Il y a un « return (0) » implicite à la fin de chaque fonction. Cela permet à une fonction de se terminer et de renvoyer 0 sans avoir besoin d'une instruction return explicite.
Les fonctions modifient également l'utilisation de la variable ibase. Toutes les constantes dans le corps de la fonction seront converties en utilisant la valeur de ibase au moment de l'appel de fonction. Les changements d'ibase seront ignorés durant l'exécution de la fonction sauf pour la fonction standard read, qui utilise toujours la valeur actuelle de ibase pour les conversions de nombres.
Plusieurs extensions ont été ajoutées aux fonctions. D’abord, le format de la définition a été rendu légèrement moins astreignant. La norme requiert que l'accolade d'ouverture soit placée sur la même ligne que le mot-clé define et que toutes les autres parties se situent sur les lignes suivantes. Cette version de bc permet un nombre quelconque de sauts de ligne avant et après l'accolade d'ouverture de la fonction. Par exemple, les définitions suivantes sont valables :
define d (n) { return (2*n); } define d (n) { return (2*n); }
Les fonctions peuvent être définies comme void. Une fonction void ne renvoie aucune valeur et par conséquent ne peut être utilisée dans toute place nécessitant une valeur. Une fonction void ne produit aucune sortie lorsqu’appelée par elle-même sur une ligne d’entrée. Le mot-clé void est placé entre le mot-clé define et le nom de fonction. Par exemple, en considérant la session suivante :
define py (y) { print "--->", y, "<---", "\n"; } define void px (x) { print "--->", x, "<---", "\n"; } py(1) --->1<--- 0 px(1) --->1<---
L’appel par variable a été aussi ajouté pour les tableaux. Pour déclarer un appel par variable, la déclaration du paramètre de tableau dans la définition de fonction ressemble à « *nom[] ». L’appel de la fonction reste le même que l’appel par tableaux de valeurs.
Si bc est invoqué avec l'option -l, une bibliothèque mathématique est préchargée et l'échelle par défaut est fixée à 20. Les fonctions mathématiques calculeront leur résultat à l'échelle établie au moment de leur appel. La bibliothèque mathématique définit les fonctions suivantes :
Dans /bin/sh, le code suivant affectera la valeur de « pi » à la variable d’interpréteur pi.
Le code suivant est la définition de la fonction exponentielle utilisée dans la bibliothèque mathématique. Cette fonction est écrite en bc POSIX.
scale = 20 /* Utilisation du fait que e^x = (e^(x/2))^2 Quand x est suffisamment petit, la série suivante est utilisée : e^x = 1 + x + x^2/2! + x^3/3! + ... */ define e(x) { auto a, d, e, f, i, m, v, z /* Vérification du signe de x. */ if (x<0) { m = 1 x = -x } /* Précondition x. */ z = scale; scale = 4 + z + .44*x; while (x > 1) { f += 1; x /= 2; } /* Initialisation des variables. */ v = 1+x a = x d = 1 for (i=2; 1; i++) { e = (a *= x) / (d *= i) if (e == 0) { if (f>0) while (f--) v = v*v; scale = z if (m) return (1/v); return (v/1); } v += e } }
Le code suivant utilise les fonctionnalités avancées de bc pour implémenter un programme simple de calcul des soldes de chéquier. Ce programme est conservé de préférence dans un fichier pour qu'il puisse être réutilisé à maintes reprises sans avoir à le retaper à chaque fois.
scale=2 print "\nProgramme de chéquier !\n" print " Rappelez-vous, les dépôts sont des transactions négatives.\n" print " Quittez par une transaction 0.\n\n" print "Solde initial ? "; bal = read() bal /= 1 print "\n" while (1) { "solde actuel = "; bal "transaction ? "; trans = read() if (trans == 0) break; bal -= trans bal /= 1 } quit
Le code suivant est la définition de la fonction factorielle récursive :
define f (x) { if (x <= 1) return (1); return (f(x-1) * x); }
GNU bc peut être compilé (à l’aide d’une option de configuration) pour utiliser soit la bibliothèque d'éditeur d'entrée GNU readline, soit la bibliothèque BSD libedit. Cela permet à l'utilisateur d'éditer des lignes avant de les envoyer à bc. Cela permet également un historique des lignes précédemment tapées. Quand cette option est sélectionnée, bc possède une variable spéciale supplémentaire. Cette variable spéciale, history, est le nombre de lignes d'historique mémorisées. Pour readline, une valeur de -1 signifie qu'un nombre illimité de lignes d'historique sont mémorisées. Fixer la valeur de history à un nombre positif restreint le nombre de lignes d'historique au nombre fourni. La valeur 0 désactive cette fonctionnalité d'historique. La valeur par défaut est 100. Pour plus d'informations, lisez les manuels d'utilisateur des bibliothèques GNU readline et history, et BSD libedit. Il n’est pas possible d’activer à la fois readline et libedit.
Cette version de bc a été implémentée sur la base du document de travail POSIX P1003.2/D11 et contient plusieurs différences et extensions par rapport au document de travail et aux implémentations traditionnelles. Elle n'a pas été implémentée de la façon traditionnelle en utilisant dc(1). Cette version est un unique processus qui analyse et exécute une traduction en code intermédiaire (byte code) du programme. Il y a une option « non documentée » (-c) qui fait émettre par le programme le code intermédiaire sur la sortie standard au lieu de l'exécuter. Elle a été principalement utilisée pour déboguer l'analyseur syntaxique et pour préparer la bibliothèque mathématique.
Une source majeure de différences est constituée par les extensions, où une fonctionnalité est étendue pour offrir plus de fonctionnalités et des ajouts pour de nouvelles fonctionnalités. Voici la liste des différences et des extensions :
a = 1 b = 2
{ a = 1
b = 2 }
en possède un. Toute erreur à l'exécution terminera l'exécution du bloc d'exécution courant. Un avertissement à l'exécution ne terminera pas l'exécution du bloc d'exécution courant.
Voici les limites actuellement en vigueur pour ce processeur bc. Certaines d'entre elles peuvent avoir été modifiées par une installation. Utilisez l'instruction limits pour voir les valeurs réelles.
Les variables d’environnement suivantes sont prises en compte par bc :
Si l'un des fichiers de la ligne de commandes ne peut être ouvert, bc indiquera que le fichier n'est pas disponible et se terminera. Il y a également des diagnostics lors de la compilation et de l'exécution qui devraient être suffisamment auto-explicites.
La récupération après erreur n'est pas encore très bonne.
Envoyez vos rapports de bogues par courriel à bug-bc@gnu.org. Assurez-vous d'inclure le mot « bc » quelque part dans le champ « Sujet : ».
Philip A. Nelson philnelson@acm.org
L'auteur veut remercier Steve Sommars (Steve.Sommars@att.com) pour son aide intensive lors des tests de l'implémentation. Il a fourni beaucoup de suggestions géniales. C'est un produit bien meilleur grâce à son implication.
La traduction française de cette page de manuel a été créée par Frédéric Delanoy <delanoy_f@yahoo.com> et Jean-Paul Guillonneau <guillonneau.jeanpaul@free.fr>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à debian-l10n-french@lists.debian.org.
| 11 juin 2006 | Projet GNU |