Wie unterscheidet sich bc von dc?

27

Was sind die Unterschiede zwischen dcund bcTaschenrechner?

Wann soll ich verwenden dcund wann bc?

syntagma
quelle
Ich benutze es exprsehr oft für einfache Berechnungen in der Kommandozeile und in Skripten.
MattBianco

Antworten:

34

dcist ein sehr archaisches Werkzeug und etwas älter als bc. So zitieren Sie die Wikipedia-Seite :

Es ist eines der ältesten Unix-Dienstprogramme vor der Erfindung der Programmiersprache C; Wie andere Dienstprogramme dieses Jahrgangs verfügt es über eine Reihe leistungsstarker Funktionen, jedoch über eine äußerst knappe Syntax.

Die Syntax ist eine umgekehrte polnische Notation, was im Grunde bedeutet, dass die Argumente (dh Zahlen) zuerst vom Operator gefolgt werden. Ein grundlegendes Beispiel für die dcVerwendung ist:

echo '3 4 * p' | dc

Wo pist das erforderlich, um das Ergebnis der Berechnung zu drucken. bcAuf der anderen Seite wird die vertraute Infix-Notation verwendet und ist daher intuitiver zu bedienen. Hier ist ein bcAnwendungsbeispiel:

echo '3 * 4' | bc

Welches verwenden?

bcist von POSIX standardisiert und wahrscheinlich auch portabler (zumindest auf modernen Systemen). Wenn Sie manuelle Taschenrechnerarbeiten ausführen, ist dies definitiv die Wahl (es sei denn, Sie sind ein Masochist). dckann immer noch verwendet werden, hier ist ein Fall, in dem die umgekehrte polnische Notation nützlich ist. Stellen Sie sich vor, Sie haben ein Programm, das einen Zahlenstrom ausgibt, den Sie summieren möchten, z.

23
7
90
74
29

Dies zu tun dcist sehr einfach (zumindest bei modernen Implementierungen, bei denen jeder Operator mehr als zwei Zahlen annehmen kann), da Sie nur ein +pan den Stream anhängen müssen , z.

{ gen_nums; echo +p } | dc

Dies bcist jedoch komplexer, da wir nicht nur + zwischen die einzelnen Zahlen ein Trennzeichen setzen und sicherstellen müssen, dass sich alle in derselben Zeile befinden, sondern auch sicherstellen müssen, dass am Ende eine neue Zeile steht:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc
Graeme
quelle
10
Sie haben das gen_numsBeispiel mit schrecklich komplex gedreht bc. Es könnte vereinfacht werden:gen_nums | paste -sd+ | bc
13.
14
Witzige Tatsache: Traditionell bcwar es nur ein Front-End-Tool, das die bcNotation in die Notation von kompilierte dcund in diese umwandelte, dcum das Ergebnis zu erhalten. Unter FreeBSD gibt es noch das -cFlag, bcmit dem Sie noch das dcNotationsecho . For example '3 * 4' | übersetzen können bc` ist unglaublich ähnlich zu echo '3 * 4' | bc -c | dc. Siehe linux.die.net/man/1/bc und freebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens
14
Hmm, welche verwendest dcdu? Unter Ubuntu 14.04 und OS X bearbeitet der +Bediener immer genau zwei Werte vom Stapel
Digital Trauma
2
Das richtige Beispiel für dcNutzung: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Dieses Skript dcliest und addiert die Zahlen nacheinander in einer Schleife und gibt dann das Ergebnis aus. Beachten Sie den Hinweis zu negativen Zahlen.
Ruvim
1
@RaphaelAhrens Interessant, unter macOS bc -cmacht man etwas komisches und anderes (und die -cFlagge ist undokumentiert). Wenn ich versuche, es weiterzuleiten dc, erhalte ich eine Reihe von Fehlern (und die Ausgabe ohne Weiterleitung dcist sehr kryptisch @iK3:K4:*W@r\n@i).
Konrad Rudolph
9

Ein grundlegender Unterschied zwischen den beiden ist, dass dcdie umgekehrte polnische Notation verwendet wird . Es werden explizite Befehle benötigt, um eine Ausgabe zu erzeugen.

Sie können zwei Ganzzahlen hinzufügen, bcindem Sie sagen:

bc <<< "2+4"

und es würde 6auf einer Linie von selbst produzieren. In dcwürden Sie jedoch sagen müssen:

dc <<< "2 4 +p"

Sie können auch viel Spaß damit machen dc, z. B. finden Sie in meiner Antwort hier Informationen zum Produzieren

Hello World!

mit dc.

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

devnull
quelle
"Bc wurde als Front-End für Dc geschrieben"
Adam,
3

dcist ein Taschenrechner, während bceine tatsächliche Sprache ist. Siehe ihre Manpages.

dc

dc ist ein umgekehrter Tischrechner, der unbegrenzte arithmetische Präzision unterstützt. Außerdem können Sie Makros definieren und aufrufen. Normalerweise liest DC von der Standardeingabe; Wenn Befehlsargumente angegeben werden, handelt es sich um Dateinamen, und dc liest und führt den Inhalt der Dateien aus, bevor von der Standardeingabe gelesen wird. Alle normalen Ausgaben erfolgen auf Standardausgabe. Alle Fehlerausgaben beziehen sich auf Standardfehler.

bc

bc ist eine Sprache, die willkürlich genaue Zahlen mit interaktiver Ausführung von Anweisungen unterstützt. Die Syntax weist einige Ähnlichkeiten mit der Programmiersprache C auf. Eine Standard-Mathematikbibliothek ist über die Befehlszeile verfügbar. Auf Wunsch wird die Mathematikbibliothek definiert, bevor Dateien verarbeitet werden. bc beginnt mit der Verarbeitung von Code aus allen in der Befehlszeile aufgeführten Dateien in der angegebenen Reihenfolge. Nachdem alle Dateien verarbeitet wurden, liest bc von der Standardeingabe. Der gesamte Code wird beim Lesen ausgeführt. (Wenn eine Datei einen Befehl zum Anhalten des Prozessors enthält, liest bc niemals von der Standardeingabe.)

Es kommt wirklich darauf an, was Sie letztendlich mathematisch machen wollen. Einige Operationen sind mit nicht möglich dc. Ich habe beide im Laufe der Jahre zusätzlich zu mehreren anderen Befehlszeilen-Rechner-Tools verwendet. Weitere Beispiele finden Sie unter " Solver für Befehlszeilenausdrücke? ".

slm
quelle
3
@ REACHUS - Ich bin nicht sicher, ob ich verstehe, was Sie fragen? Da dcich ein Umkehrpolitur-Notationsrechner bin und ich immer HP Umkehrpolitur-Notationsrechner verwendet habe, bevorzuge ich die Verwendung von dc, bcaber ich würde sagen, dass beide immer noch verwendet werden, wenn Sie eine komplexe mathematische Berechnung durchführen müssen. Ich verwende sie oft, um Zahlen s / w Basis 10 in Basis 16 und Basis 2 umzuwandeln. Aber ich habe sie auch verwendet, um Spalten in Tabellendaten aus einem AWK-Skript heraus zu zählen.
SLM
3
bcwar eine Sprache in dem Sinne, dass sie dcmenschenfreundlich machte - nicht, dass sie mächtiger war. In diesen Tagen die Apps teilen libs, aber bcwurde eine gerufene Sprache und dceinen Rechner , weil dcMathe tat und bcsprach Mathematik - zu dc. Hier ist eine ältere manSeite : Es wurde eine Sprache namens BC[1] entwickelt, die Programme akzeptiert, die in höheren Sprachen geschrieben sind, und die von DC interpretierte Ausgabe kompiliert. Einige der nachfolgend beschriebenen Befehle wurden für die Compiler-Oberfläche entwickelt und sind für einen menschlichen Benutzer nicht einfach zu manipulieren.
mikeserv
2
Ich behaupte, dcist auch eine Sprache. zB codegolf.stackexchange.com/a/47921/11259
Digitales Trauma
1
@DigitalTrauma Zu argumentieren, dass es keine Sprache ist, wäre absurd, da sie einen Lexer und Parser hat. Aber zu argumentieren, dass es für Menschen lesbar ist, wäre angesichts dieses Beispiels absurd. Ich meine ... verdammt.
Parthian Shot
1
@ParthianShot Einverstanden. Meine Lektüre von "dc ist ein Taschenrechner, während bc eine tatsächliche Sprache ist" besagt, dass slm impliziert, dass dc keine Sprache ist, mit der ich nicht einverstanden bin. Aber ich könnte nur die falsche Antwort einlesen ...
Digitales Trauma
0

Meiner bescheidenen Meinung nach und in so wenigen Worten wie möglich unterscheidet sich GNU dc in drei Punkten von GNU bc:

1) Wenn die Mathematikbibliothek von bc kein Interesse hat, so viele Tastenanschläge wie möglich zu speichern (in Jan Łukasiewiczs Worten: eine Notation ohne Klammern), wenn elementare Arithmetik ausgeführt wird, um sich mehr auf das Wesentliche zu konzentrieren und Ablenkungen zu vermeiden.

2) In der Befehlszeile von Microsoft Windows 7 verbraucht GNU dc weniger Speicher (~ 320K) als GNU bc (~ 360K).

3) In GNU dc gibt es eine weitaus genauere Steuerung als in GNU bc, zum Beispiel fehlen Stapel- und Registerbefehle in GNU bc.

Version 1.07.1 win32 für beide ist unter https://embedeo.org/ws/command_line/bc_dc_calculator_windows/ verfügbar.

bc_vs._dc
quelle