Czym różni się BC od DC?


Odpowiedzi:


34

dcjest bardzo archaicznym narzędziem i nieco starszym niż bc. Cytując stronę Wikipedii :

Jest to jedno z najstarszych narzędzi uniksowych, nawet przed wynalezieniem języka programowania C; podobnie jak inne narzędzia tego rocznika, ma potężny zestaw funkcji, ale niezwykle zwięzłą składnię.

Składnia jest odwrotną notacją polską, co w zasadzie oznacza, że ​​argumenty (tj. Liczby) są poprzedzane przez operatora. Podstawowym przykładem dcużycia jest:

echo '3 4 * p' | dc

Gdzie pwymagane jest wydrukowanie wyniku obliczeń. bcz drugiej strony używa bardziej znanej notacji infiksowej i dlatego jest bardziej intuicyjny w użyciu. Oto przykład bcużycia:

echo '3 * 4' | bc

Którego użyć?

bcjest standaryzowany przez POSIX i prawdopodobnie jest bardziej przenośny z tych dwóch (przynajmniej w nowoczesnych systemach). Jeśli wykonujesz ręczną pracę kalkulatora, jest to zdecydowanie wybór (chyba że jesteś masochistą). dcwciąż może mieć swoje zastosowania, oto przypadek, w którym przydaje się odwrotna notacja polskiego. Wyobraź sobie, że masz program, który generuje strumień liczb, które chcesz zsumować, np .:

23
7
90
74
29

dcWykonanie tego jest bardzo proste (przynajmniej z nowoczesnymi implementacjami, w których każdy operator może pobrać więcej niż dwie liczby), ponieważ wystarczy dodać tylko +pdo strumienia, np .:

{ gen_nums; echo +p } | dc

Ale z bctym jest bardziej skomplikowane, ponieważ musimy nie tylko umieścić + między każdą liczbą i upewnić się, że wszystko jest w tej samej linii, ale także upewnić się, że na końcu jest nowa linia:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc

10
Pan przekręcił gen_numsprzykład strasznie skomplikowane użyciu bc. Można to uprościć:gen_nums | paste -sd+ | bc
devnull

14
Ciekawostka: tradycyjnie bcbyło to tylko narzędzie front-end, które kompilowało bcnotację do notacji dci wpuszczało ją w dccelu uzyskania wyniku. Na FreeBSD jest jeszcze -cflaga, bcdzięki której można kompilować do echa dcnotacji . For example „3 * 4” | bc` jest równa echo '3 * 4' | bc -c | dc. Zobacz linux.die.net/man/1/bc i freebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens

14
Hmm, którego dcużywasz? W systemie Ubuntu 14.04 i OS X +operator zawsze działa na dokładnie dwóch wartościach poza stosem
Digital Trauma

2
Prawidłowe Przykładem dcrejestracji: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Ten skrypt dcodczytuje i dodaje liczby jeden po drugim w pętli, a następnie drukuje wynik. Zobacz uwagę dotyczącą liczb ujemnych.
ruvim,

1
@RaphaelAhrens Interesujące, na macOS bc -crobi coś dziwnego i innego (a -cflaga jest nieudokumentowana). Jeśli spróbuję go dcwpakować, dostaję mnóstwo błędów (a wyjście bez wpakowania dcjest bardzo tajemnicze @iK3:K4:*W@r\n@i).
Konrad Rudolph

9

Podstawowa różnica między nimi polega na tym, że dcużywa odwrotnej notacji polskiej . Wymaga wyraźnych poleceń nawet w celu uzyskania wyniku.

Możesz dodać dwie liczby całkowite bc, mówiąc:

bc <<< "2+4"

i produkowałby sam 6na linii. Jednak dctrzeba powiedzieć:

dc <<< "2 4 +p"

Można również zrobić wiele rzeczy zabawa przy użyciu dcnp patrz moją odpowiedź tutaj do produkcji

Hello World!

za pomocą dc.

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


„Bc został napisany jako interfejs do Dc”
Adam

3

dcjest kalkulatorem, podczas gdy bcjest rzeczywistym językiem. Zobacz ich strony podręcznika.

dc

dc to odwrócony polski kalkulator biurkowy, który obsługuje arytmetykę o nieograniczonej precyzji. Pozwala także definiować i wywoływać makra. Normalnie DC odczytuje ze standardowego wejścia; jeśli podano mu argumenty polecenia, są to nazwy plików, a dc czyta i wykonuje zawartość plików przed odczytem ze standardowego wejścia. Wszystkie normalne dane wyjściowe są zgodne ze standardowymi danymi wyjściowymi; wszystkie dane wyjściowe błędu są zgodne z błędem standardowym.

pne

bc jest językiem obsługującym dowolne precyzyjne liczby z interaktywnym wykonywaniem instrukcji. Istnieją pewne podobieństwa w składni języka programowania C. Standardowa biblioteka matematyczna jest dostępna w opcji wiersza poleceń. Na żądanie biblioteka matematyczna jest definiowana przed przetwarzaniem jakichkolwiek plików. bc zaczyna się od przetworzenia kodu ze wszystkich plików wymienionych w wierszu poleceń w podanej kolejności. Po przetworzeniu wszystkich plików, bc odczytuje ze standardowego wejścia. Cały kod jest wykonywany podczas odczytu. (Jeśli plik zawiera polecenie zatrzymania procesora, bc nigdy nie będzie czytać ze standardowego wejścia.)

To naprawdę zależy od tego, co ostatecznie chcesz zrobić matematycznie. Niektóre operacje nie są możliwe przy użyciu dc. Przez lata korzystałem z obu tych narzędzi oprócz kilku innych narzędzi kalkulatora wiersza poleceń. Zobacz „ solver wyrażenia wiersza poleceń? ”, Aby uzyskać dodatkowe przykłady.


3
@ REACHUS - Nie jestem pewien, czy rozumiem, o co pytasz? Ze względu na dcbycie odwrotnej notacji polskiej kalkulator i od zawsze wykorzystywane HP kalkulatorów RPN I rzeczywiście wolą używać dcdo bc, ale chciałbym powiedzieć, że oboje nadal używany w każdej chwili trzeba wykonywać złożone obliczenia matematyczne. Często używam ich do konwertowania liczb b / w base 10 na base 16 i base 2. Ale użyłem ich do zsumowania kolumn w danych tabelarycznych również ze skryptu AWK.
slm

3
bcbył językiem w tym sensie, że uczynił go dcprzyjaznym człowiekowi - nie dlatego, że był potężniejszy. Te dni aplikacje dzielić bibliotekami, ale bczostał wezwany do języka i dcdo kalkulatora bo dczrobił matematyki i bcmówił - do matematyki dc. Oto starsza manstrona : Opracowano język o nazwie BC[1], który akceptuje programy napisane w językach wyższego poziomu i kompiluje dane wyjściowe interpretowane przez DC. Niektóre z opisanych poniżej poleceń zostały zaprojektowane dla interfejsu kompilatora i nie są łatwe w obsłudze dla użytkownika.
mikeserv

2
Twierdzę, że dcto także język. np. codegolf.stackexchange.com/a/47921/11259
Digital Trauma

1
@DigitalTrauma Argumentowanie, że to nie jest język, byłoby absurdalne, ponieważ ma leksykon i parser. Ale twierdzenie, że biorąc pod uwagę ten przykład, jest czytelne dla człowieka, byłoby absurdalne. Mam na myśli ... cholera.
Parthian Shot

1
@ParthianShot uzgodnione. Moje czytanie „dc jest kalkulatorem, podczas gdy bc jest rzeczywistym językiem” jest to, że slm sugeruje, że dc nie jest językiem, z którym się nie zgadzam. Ale może po prostu źle czytam odpowiedź ...
Cyfrowa trauma

0

Moim skromnym zdaniem i w jak najmniejszej liczbie słów, GNU dc różni się od GNU bc na 3 sposoby:

1) Jeśli biblioteka matematyczna bc nie ma znaczenia, aby zaoszczędzić jak najwięcej naciśnięć klawiszy (słowami Jana Łukasiewicza: notacja bez nawiasów) podczas wykonywania elementarnej arytmetyki, aby bardziej skoncentrować się na istotnych kwestiach i uniknąć rozpraszania uwagi.

2) W wierszu poleceń systemu Microsoft Windows 7 GNU dc zużywa mniej pamięci (~ 320 KB) niż GNU bc (~ 360 KB).

3) Wiele szczegółowych kontroli w GNU dc niż w GNU bc, na przykład polecenia GNU bc są niedostępne.

Wersja 1.07.1 win32 dla obu jest na https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.