Bc khác với dc như thế nào?


27

Sự khác biệt giữa dcbcmáy tính là gì?

Khi nào tôi nên sử dụng dcvà khi bcnào?


Tôi sử dụng exprrất thường xuyên cho các tính toán đơn giản trên dòng lệnh và trong các kịch bản.
MattBianco

Câu trả lời:


34

dclà một công cụ rất cổ xưa và có phần cũ hơn bc. Để trích dẫn trang Wikipedia :

Nó là một trong những tiện ích Unix lâu đời nhất, trước cả việc phát minh ra ngôn ngữ lập trình C; Giống như các tiện ích khác của cổ điển đó, nó có một bộ tính năng mạnh mẽ nhưng cú pháp cực kỳ ngắn gọn.

Cú pháp là một ký hiệu đánh bóng ngược, về cơ bản có nghĩa là các đối số (tức là số) đến trước theo sau bởi toán tử. Một ví dụ cơ bản về việc dcsử dụng là:

echo '3 4 * p' | dc

Trường hợp pđược yêu cầu để in kết quả tính toán. bcmặt khác sử dụng ký hiệu infix quen thuộc hơn và do đó trực quan hơn để sử dụng. Dưới đây là một ví dụ về bcviệc sử dụng:

echo '3 * 4' | bc

Nên dùng cái nào?

bcđược chuẩn hóa bởi POSIX và do đó có lẽ là tính di động cao hơn của cả hai (ít nhất là trên các hệ thống hiện đại). Nếu bạn đang làm công việc tính toán thủ công thì đó chắc chắn là sự lựa chọn (trừ khi bạn có phần nào đó là một masochist). dcVẫn có thể sử dụng được, đây là trường hợp ký hiệu đánh bóng ngược có ích. Hãy tưởng tượng bạn có một chương trình tạo ra một luồng số mà bạn muốn tổng cộng, ví dụ:

23
7
90
74
29

Để thực hiện việc này dcrất đơn giản (ít nhất là với các triển khai hiện đại, trong đó mỗi toán tử có thể mất nhiều hơn hai số) vì bạn chỉ phải nối một +pluồng vào luồng, ví dụ:

{ gen_nums; echo +p } | dc

Nhưng với bcnó phức tạp hơn vì chúng ta không chỉ cần đặt một số + giữa mỗi số và đảm bảo mọi thứ nằm trên cùng một dòng, mà còn đảm bảo có một dòng mới ở cuối:

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

10
Bạn đã biến gen_numsví dụ phức tạp khủng khiếp bằng cách sử dụng bc. Nó có thể được đơn giản hóa thành:gen_nums | paste -sd+ | bc
devnull

14
Sự thật thú vị: Theo truyền thống bcchỉ là một công cụ mặt trước biên soạn bcký hiệu cho ký hiệu dcvà đưa nó vào dcđể có được kết quả. Trên FreeBSD vẫn có -ccờ bcmà bạn vẫn có thể biên dịch thành tiếng vang dcký hiệu . For example '3 * 4' | bc` bằng echo '3 * 4' | bc -c | dc. Xem linux.die.net/man/1/bcfreebsd.org/cgi/man.cgi?query=bc&sektion=1
Raphael Ahrens

14
Hmm, dcbạn đang sử dụng? Trên Ubuntu 14.04 và OS X, +nhà điều hành luôn vận hành chính xác hai giá trị ngoài ngăn xếp
Chấn thương kỹ thuật số

2
Ví dụ chính xác về dcviệc sử dụng : gen_nums_nonnegative | dc -e '0 0 [+?z1<m]dsmxp'. Kịch bản này để dcđọc và thêm từng số một trong vòng lặp và sau đó in kết quả. Xem ghi chú liên quan đến số âm.
ruvim

1
@RaphaelAhrens Thật thú vị, trên macOS bc -ccó một cái gì đó kỳ lạ và khác biệt (và -ccờ không có giấy tờ). Nếu tôi cố gắng đưa nó vào dc, tôi sẽ gặp một loạt lỗi (và đầu ra mà không có đường ống vào dclà rất khó hiểu @iK3:K4:*W@r\n@i).
Konrad Rudolph

9

Một sự khác biệt cơ bản giữa hai là dcsử dụng ký hiệu Ba Lan ngược . Nó đòi hỏi các lệnh rõ ràng ngay cả để tạo ra một đầu ra.

Bạn có thể thêm hai số nguyên bcbằng cách nói:

bc <<< "2+4"

và nó sẽ tự sản xuất 6trên một dây chuyền. Tuy nhiên, trong dcbạn cần phải nói:

dc <<< "2 4 +p"

Bạn cũng có thể làm nhiều thứ thú vị bằng cách sử dụng dc, ví dụ tham khảo câu trả lời của tôi ở đây để sản xuất

Hello World!

sử dụng dc.

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


"Bc được viết dưới dạng mặt trước của Dc"
Adam

3

dclà một máy tính trong khi đó bclà một ngôn ngữ thực tế. Xem trang người đàn ông của họ.

đc

dc là một máy tính bàn đánh bóng ngược hỗ trợ số học chính xác không giới hạn. Nó cũng cho phép bạn xác định và gọi macro. Thông thường dc đọc từ đầu vào tiêu chuẩn; nếu bất kỳ đối số lệnh nào được đưa cho nó, chúng là tên tệp và dc đọc và thực thi nội dung của tệp trước khi đọc từ đầu vào tiêu chuẩn. Tất cả đầu ra bình thường là đầu ra tiêu chuẩn; tất cả đầu ra lỗi là lỗi tiêu chuẩn.

bc

bc là một ngôn ngữ hỗ trợ các số chính xác tùy ý với việc thực hiện các câu lệnh tương tác. Có một số điểm tương đồng trong cú pháp với ngôn ngữ lập trình C. Một thư viện toán học tiêu chuẩn có sẵn bằng tùy chọn dòng lệnh. Nếu được yêu cầu, thư viện toán học được xác định trước khi xử lý bất kỳ tệp nào. bc bắt đầu bằng cách xử lý mã từ tất cả các tệp được liệt kê trên dòng lệnh theo thứ tự được liệt kê. Sau khi tất cả các tệp đã được xử lý, bc đọc từ đầu vào tiêu chuẩn. Tất cả các mã được thực thi khi nó được đọc. (Nếu một tệp chứa lệnh dừng bộ xử lý, bc sẽ không bao giờ đọc từ đầu vào tiêu chuẩn.)

Nó thực sự phụ thuộc vào những gì cuối cùng bạn muốn làm toán học. Một số thao tác không thể sử dụng dc. Tôi đã sử dụng cả hai năm qua cùng với một số công cụ tính toán dòng lệnh khác. Xem " Bộ giải biểu thức dòng lệnh? " Để biết thêm một số ví dụ.


3
@REACHUS - Tôi không chắc là tôi hiểu bạn đang hỏi gì? Do dclà một máy tính Kí pháp Ba Lan đảo ngược và vì tôi đã luôn luôn sử dụng HP ngược tính Kí pháp Ba Lan Tôi thực sự thích sử dụng dcđể bcnhưng tôi sẽ nói rằng họ đang cả bất cứ lúc nào vẫn sử dụng bạn cần phải thực hiện một phép tính toán học phức tạp. Tôi thường sử dụng chúng để chuyển đổi số b / w cơ sở 10 sang cơ sở 16 và cơ sở 2. Nhưng đã sử dụng chúng để kiểm tra các cột trong dữ liệu dạng bảng cũng như trong tập lệnh AWK.
slm

3
bclà một ngôn ngữ theo nghĩa nó làm cho dccon người trở nên thân thiện - không phải là nó mạnh hơn. Những ngày này các ứng dụng chia sẻ libs, nhưng bcđược gọi là một ngôn ngữdcmột máy tínhdcđã làm toán và bcphát biểu toán - để dc. Đây là một mantrang cũ hơn : Một ngôn ngữ có tên BC[1] đã được phát triển để chấp nhận các chương trình được viết bằng ngôn ngữ cấp cao hơn và biên dịch đầu ra được DC giải thích. Một số lệnh được mô tả dưới đây được thiết kế cho giao diện trình biên dịch và không dễ để người dùng thao tác.
mikeerv 15/2/2015

2
Tôi khẳng định dccũng là một ngôn ngữ. ví dụ: codegolf.stackexchange.com/a/47921/11259
Chấn thương kỹ thuật số

1
@DigitalTrauma Để tranh luận rằng đó không phải là một ngôn ngữ sẽ là vô lý vì nó có một từ vựng và trình phân tích cú pháp. Nhưng để tranh luận rằng con người có thể đọc được, cho ví dụ đó, sẽ là vô lý. Ý tôi là ... chết tiệt.
Bắn Parthian

1
@ParthianShot Đồng ý. Tôi đọc "dc là một máy tính trong khi bc là một ngôn ngữ thực tế" là slm đang ám chỉ rằng dc không phải là một ngôn ngữ, điều mà tôi không đồng ý. Nhưng tôi chỉ có thể đọc sai câu trả lời ...
Chấn thương kỹ thuật số

0

Theo ý kiến ​​khiêm tốn của tôi và càng ít từ càng tốt, GNU dc khác với GNU bc theo 3 cách:

1) Nếu thư viện toán học của bc không được quan tâm, để lưu càng nhiều tổ hợp phím càng tốt (theo cách nói của Jan Łukasiewicz: một ký hiệu không có dấu ngoặc đơn) khi làm số học cơ bản, để tập trung hơn vào các yếu tố cần thiết và để tránh phiền nhiễu.

2) Trong dòng lệnh của Microsoft Windows 7, GNU dc tiêu thụ ít bộ nhớ (~ 320K) hơn GNU bc (~ 360K).

3) Nhiều điều khiển chi tiết trong GNU dc hơn trong GNU bc, ví dụ, các lệnh stack và register không có trong GNU bc.

Phiên bản 1.07.1 win32 cho cả hai có tại https://embedeo.org/ws/command_line/bc_dc_calculator_windows/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.