Чем bc отличается от dc?

27

Каковы различия между dcи bcкалькуляторами?

Когда я должен использовать dcи когда bc?

синтагма
источник
Я exprочень часто использую простые вычисления в командной строке и в скриптах.
MattBianco

Ответы:

34

dcэто очень архаичный инструмент и несколько старше, чем bc. Цитировать страницу Википедии :

Это одна из старейших утилит Unix, предшествовавшая даже изобретению языка программирования C; как и другие утилиты этого винтажа, он обладает мощным набором функций, но чрезвычайно кратким синтаксисом.

Синтаксис является обратной польской нотацией, которая в основном означает, что аргументы (то есть числа) идут первыми, а затем оператор. Основной пример dcиспользования:

echo '3 4 * p' | dc

Где pтребуется распечатать результат расчета. bcс другой стороны, используется более знакомая инфиксная нотация, что делает его более интуитивным в использовании. Вот пример bcиспользования:

echo '3 * 4' | bc

Какой использовать?

bcстандартизирован POSIX и, вероятно, является более переносимым из них (по крайней мере, в современных системах). Если вы выполняете ручную работу с калькулятором, то это определенно выбор (если вы не являетесь мазохистом). dcТем не менее, здесь можно найти применение, в данном случае пригодится обратная польская запись. Представьте, что у вас есть программа, которая выводит поток чисел, который вы хотите суммировать, например:

23
7
90
74
29

Сделать это dcочень просто (по крайней мере, в современных реализациях, где каждый оператор может принимать более двух чисел), поскольку вам нужно только добавить a +pв поток, например:

{ gen_nums; echo +p } | dc

Но с bcэтим сложнее, так как нам нужно не только поставить + между каждым число и убедиться, что все в одной строке, но и убедиться, что в конце есть новая строка:

{ gen_nums | sed '$ !s/$/+/' | tr -d '\n'; echo; } | bc
Graeme
источник
10
Вы использовали gen_numsужасно сложный пример bc. Это может быть упрощено до:gen_nums | paste -sd+ | bc
devnull
14
Забавный факт: Традиционно это bcбыл только инструмент внешнего интерфейса, который компилировал bcнотацию в нотацию dcи передавал ее dcдля получения результата. Во FreeBSD все еще есть -cфлаг, bcс которым вы все еще можете скомпилировать в dcнотацию . For example echo '3 * 4' | bc` невероятно похож на echo '3 * 4' | bc -c | dc. См. Linux.die.net/man/1/bc и freebsd.org/cgi/man.cgi?query=bc&sektion=1
Рафаэль Аренс
14
Хм, что dcвы используете? В Ubuntu 14.04 и OS X +оператор всегда оперирует ровно двумя значениями вне стека
Digital Trauma
2
Правильный пример dcиспользования: gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Этот скрипт для dcчтения и добавления чисел один за другим в цикле, а затем печатает результат. Смотрите примечание относительно отрицательных чисел.
ruvim
1
@RaphaelAhrens Интересно, что в macOS bc -cчто-то странное и необычное (а -cфлаг недокументирован). Если я пытаюсь передать это dc, я получаю кучу ошибок (и вывод без привязки dcявляется очень загадочным @iK3:K4:*W@r\n@i).
Конрад Рудольф
9

Основное различие между ними состоит в том, что dcиспользуется обратная польская запись . Это требует явных команд даже для того, чтобы произвести вывод.

Вы можете добавить два целых числа bc, сказав:

bc <<< "2+4"

и он будет производить 6на линии самостоятельно. Тем не менее, dcвам нужно сказать:

dc <<< "2 4 +p"

Вы также можете сделать много забавных вещей, используя dc, например, обратитесь к моему ответу здесь для производства

Hello World!

используя dc.

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

devnull
источник
«Bc был написан как фронтенд для Dc»
Адам
3

dcэто калькулятор, тогда bcкак фактический язык. Смотрите их справочные страницы.

Округ Колумбия

dc - это настольный калькулятор с обратной полировкой, который поддерживает арифметику с неограниченной точностью. Это также позволяет вам определять и вызывать макросы. Обычно DC читает со стандартного ввода; если ему даны какие-либо аргументы команды, они являются именами файлов, и dc читает и выполняет содержимое файлов перед чтением из стандартного ввода. Все нормальные выходные данные являются стандартными; все ошибки выводятся на стандартную ошибку.

До нашей эры

bc - это язык, который поддерживает числа произвольной точности с интерактивным выполнением операторов. Есть некоторые сходства в синтаксисе с языком программирования C. Стандартная математическая библиотека доступна в командной строке. Если требуется, математическая библиотека определяется до обработки любых файлов. bc начинает с обработки кода из всех файлов, перечисленных в командной строке, в указанном порядке. После того, как все файлы были обработаны, bc читает из стандартного ввода. Весь код выполняется так, как он читается. (Если файл содержит команду для остановки процессора, bc никогда не будет читать со стандартного ввода.)

Это действительно зависит от того, что вы в конечном итоге хотите сделать математически. Некоторые операции невозможны при использовании dc. Я использовал оба эти года в дополнение к нескольким другим инструментам калькулятора командной строки. Смотрите " Решатель выражений командной строки? " Для некоторых дополнительных примеров.

SLM
источник
3
@ REACHUS - Я не уверен, что понимаю, о чем ты спрашиваешь? Из-за dcтого, что я являюсь калькулятором обратной польской нотации, и поскольку я всегда использовал калькуляторы обратной польской нотации, я на самом деле предпочитаю использовать dcего, bcно я бы сказал, что они обе все еще используются в любое время, когда вам нужно выполнить сложный математический расчет. Я часто использую их для преобразования чисел от 10 ч / б до 16 и 2. Но я использовал их для подсчета столбцов в табличных данных также из скрипта AWK.
SLM
3
bcбыл язык в том смысле, что он сделал dcчеловека дружественным - не то, чтобы он был более мощным. В эти дни приложения разделяет LIBS, но bcназывали язык и dcс калькулятором , потому что dcсделали математику и bcговорили математика - к dc. Вот старая manстраница : был разработан язык BC[1], который принимает программы, написанные на языках более высокого уровня, и компилирует выходные данные, которые интерпретируются DC. Некоторые из команд, описанных ниже, были разработаны для интерфейса компилятора и не просты для манипулирования пользователем.
mikeserv
2
Я утверждаю, что dcэто также язык. например, codegolf.stackexchange.com/a/47921/11259
Цифровая травма
1
@DigitalTrauma Утверждать, что это не язык, было бы абсурдом, так как в нем есть лексер и парсер. Но утверждать, что это читабельно для человека, учитывая этот пример, было бы абсурдом. Я имею в виду ... черт.
Парфянский выстрел
1
@ParthianShot Согласен. Мое прочтение «dc - это калькулятор, в то время как bc - реальный язык» - это то, что slm подразумевает, что dc не является языком, с которым я не согласен. Но я могу просто неправильно прочитать ответ ...
Цифровая травма
0

По моему скромному мнению и в двух словах, насколько это возможно, GNU dc отличается от GNU bc тремя способами:

1) Если математическая библиотека bc не представляет проблемы, чтобы сохранить как можно больше нажатий клавиш (по словам Яна Лукасевича: нотация без скобок) при выполнении элементарной арифметики, сконцентрироваться больше на основных моментах и ​​избежать отвлекающих факторов.

2) В командной строке Microsoft Windows 7 GNU dc потребляет меньше памяти (~ 320 КБ), чем GNU bc (~ 360 КБ).

3) Более детальное управление в GNU dc, чем в GNU bc, например, команды стек и регистр отсутствуют в GNU bc.

Версия 1.07.1 win32 для обоих находится по адресу https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

bc_vs._dc
источник