En quoi BC est-il différent de DC?

27

Quelles sont les différences entre dcet les bccalculatrices?

Quand dois-je utiliser dcet quand bc?

syntagme
la source
J'utilise exprtrès souvent des calculs simples sur la ligne de commande et dans les scripts.
MattBianco

Réponses:

34

dcest un outil très archaïque et un peu plus ancien que bc. Pour citer la page Wikipedia :

Il est l'un des plus anciens utilitaires Unix, antérieur à l'invention du langage de programmation C; comme les autres utilitaires de ce millésime, il possède un ensemble puissant de fonctionnalités mais une syntaxe extrêmement laconique.

La syntaxe est une notation polonaise inversée, ce qui signifie essentiellement que les arguments (c'est-à-dire les nombres) viennent en premier, suivis de l'opérateur. Un exemple de base de l' dcutilisation est:

echo '3 4 * p' | dc

pest requis pour imprimer le résultat du calcul. bcd'autre part utilise la notation infixe plus familière et est donc plus intuitive à utiliser. Voici un exemple d' bcutilisation:

echo '3 * 4' | bc

Lequel utiliser?

bcest normalisé par POSIX et est probablement le plus portable des deux (au moins sur les systèmes modernes). Si vous faites un travail manuel sur une calculatrice, c'est certainement le choix (sauf si vous êtes un peu masochiste). dcpeut encore avoir ses utilisations, voici un cas où la notation de polissage inversé est utile. Imaginez que vous ayez un programme qui génère un flux de nombres que vous souhaitez totaliser, par exemple:

23
7
90
74
29

Pour ce faire, dcc'est très simple (au moins avec les implémentations modernes où chaque opérateur peut prendre plus de deux nombres) puisque vous n'avez qu'à ajouter un +pau flux, par exemple:

{ gen_nums; echo +p } | dc

Mais bcc'est plus complexe car nous devons non seulement mettre un + entre chaque numéro et nous assurer que tout est sur la même ligne, mais aussi s'assurer qu'il y a une nouvelle ligne à la fin:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc
Graeme
la source
10
Vous avez transformé l' gen_numsexemple horriblement complexe en utilisant bc. Il pourrait être simplifié comme gen_nums | paste -sd+ | bc
suit
14
Fait amusant: Traditionnellement, ce bcn'était qu'un outil frontal qui compilait la bcnotation dcet la canalisait dcpour obtenir le résultat. Sur FreeBSD, il y a toujours le -cdrapeau bcavec lequel vous pouvez toujours compiler à la dcnotation . For example echo '3 * 4' | bc` est égal à echo '3 * 4' | bc -c | dc. Voir le linux.die.net/man/1/bc et freebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens
14
Hmm, lequel dcutilisez-vous? Sur Ubuntu 14.04 et OS X, l' +opérateur opère toujours sur exactement deux valeurs hors de la pile
Digital Trauma
2
L'exemple correct de l' dcutilisation: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Ce script pour dclit et ajoute les nombres un par un en boucle, puis imprime le résultat. Voir la note concernant les nombres négatifs.
ruvim
1
@RaphaelAhrens Intéressant, sur macOS bc -cfait quelque chose de bizarre et différent (et le -cdrapeau n'est pas documenté). Si j'essaye de le canaliser dc, j'obtiens un tas d'erreurs (et la sortie sans canalisation dcest très cryptique @iK3:K4:*W@r\n@i).
Konrad Rudolph du
9

Une différence fondamentale entre les deux est celle qui dcutilise la notation polonaise inverse . Il nécessite des commandes explicites même pour produire une sortie.

Vous pouvez ajouter deux entiers en bcdisant:

bc <<< "2+4"

et il produirait 6sur une ligne par lui-même. Cependant, dcvous devez dire:

dc <<< "2 4 +p"

Vous pouvez également faire beaucoup de choses amusantes en utilisant dc, par exemple, référez-vous à ma réponse ici pour produire

Hello World!

en utilisant dc.

dc <<< "8 9 * P101P108P108P111P4 8 * P81 6 + P111P114P108P100P33P"

devnull
la source
"Bc a été écrit comme front-end pour Dc"
Adam
3

dcest une calculatrice alors que bcc'est une langue réelle. Voir leurs pages de manuel.

dc

dc est une calculatrice de bureau à polissage inversé qui prend en charge l'arithmétique de précision illimitée. Il vous permet également de définir et d'appeler des macros. Normalement, dc lit à partir de l'entrée standard; si des arguments de commande lui sont donnés, ce sont des noms de fichiers, et dc lit et exécute le contenu des fichiers avant de lire à partir de l'entrée standard. Toute sortie normale est vers la sortie standard; toute sortie d'erreur correspond à l'erreur standard.

avant JC

bc est un langage qui prend en charge des nombres de précision arbitraires avec exécution interactive d'instructions. Il y a quelques similitudes dans la syntaxe avec le langage de programmation C. Une bibliothèque mathématique standard est disponible par option de ligne de commande. Si demandé, la bibliothèque mathématique est définie avant de traiter les fichiers. bc commence par traiter le code de tous les fichiers répertoriés sur la ligne de commande dans l'ordre indiqué. Une fois tous les fichiers traités, bc lit à partir de l'entrée standard. Tout le code est exécuté lors de sa lecture. (Si un fichier contient une commande pour arrêter le processeur, bc ne lira jamais à partir de l'entrée standard.)

Cela dépend vraiment de ce que vous voulez finalement faire mathématiquement. Certaines opérations ne sont pas possibles en utilisant dc. J'ai utilisé les deux au fil des ans en plus de plusieurs autres outils de calculatrice en ligne de commande. Voir « Solveur d'expression de ligne de commande? » Pour des exemples supplémentaires.

slm
la source
3
@REACHUS - Je ne suis pas sûr de comprendre ce que vous demandez? En raison d' dcêtre une calculatrice de notation polonaise inverse et comme je l' ai toujours utilisé les calculatrices de notation inverse polonais HP , je préfère en utilisant dcpour bcmais je dirais qu'ils sont tous les deux en tout temps encore utilisé vous devez effectuer un calcul mathématique complexe. Je les utilise souvent pour convertir des nombres n / b base 10 en base 16 et base 2. Mais je les ai utilisés pour additionner des colonnes dans des données tabulaires à partir d'un script AWK.
slm
3
bcétait une langue dans le sens où elle était dcconviviale pour les humains - pas qu'elle était plus puissante. Ces jours-ci, les applications partagent des bibliothèques, mais bcétaient appelées une langue et dcune calculatrice parce dcqu'elles faisaient des mathématiques et bcparlaient des mathématiques dc. Voici une manpage plus ancienne : Un langage appelé BC[1] a été développé qui accepte les programmes écrits dans des langages de niveau supérieur et compile la sortie qui est interprétée par DC. Certaines des commandes décrites ci-dessous ont été conçues pour l'interface du compilateur et ne sont pas faciles à manipuler pour un utilisateur humain.
mikeserv
2
Je prétends que dcc'est aussi une langue. par exemple codegolf.stackexchange.com/a/47921/11259
Digital Trauma
1
@DigitalTrauma Prétendre que ce n'est pas une langue serait absurde car elle a un lexer et un analyseur. Mais argumenter que c'est lisible par l'homme, étant donné cet exemple, serait absurde. Je veux dire ... putain.
Parthian Shot
1
@ParthianShot Accepté. Ma lecture de "dc est une calculatrice alors que bc est une langue réelle" est que slm implique que dc n'est pas une langue, avec laquelle je ne suis pas d'accord. Mais je suis peut-être en train de lire la mauvaise réponse ...
Digital Trauma
0

À mon humble avis et en aussi peu de mots que possible, GNU dc diffère de GNU bc de 3 façons:

1) Si la bibliothèque mathématique de bc ne vous préoccupe pas, enregistrez autant de frappes que possible (selon les mots de Jan Łukasiewicz: une notation sans parenthèses) lorsque vous faites de l'arithmétique élémentaire, pour vous concentrer davantage sur l'essentiel et éviter les distractions.

2) Dans la ligne de commande de Microsoft Windows 7, GNU dc consomme moins de mémoire (~ 320K) que GNU bc (~ 360K).

3) Beaucoup de contrôle granulaire dans GNU dc que dans GNU bc, par exemple, les commandes de pile et de registre sont absentes de GNU bc.

La version 1.07.1 win32 pour les deux est sur https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

bc_vs._dc
la source