Tại sao dấu mũ được sử dụng cho XOR thay vì lũy thừa?


32

Không phải nó thực sự là một vấn đề đối với bất kỳ ai đã phải đối mặt với vấn đề cú pháp này trước đây, nhưng tôi thấy một sự nhầm lẫn lớn xuất phát từ việc sử dụng dấu mũ ( ^) như là phép toán XOR thay cho phép toán lũy thừa toán học được chấp nhận rộng rãi.

Tất nhiên, có rất nhiều nơi mà việc sử dụng (mis-) của dấu mũ được giải thích và sửa chữa, nhưng tôi không tìm thấy bất kỳ nguồn chính xác nào về lý do tại sao dấu mũ được đưa ra một ý nghĩa khác.

Đó có phải là một vấn đề thuận tiện? Tai nạn? Rõ ràng lý luận có thể khác nhau đối với các ngôn ngữ khác nhau, vì vậy thông tin trong bất kỳ vấn đề nào cũng sẽ rất sâu sắc.


Câu trả lời:


58

Mặc dù có những tiền thân cũ hơn, nhà toán học người Pháp có ảnh hưởng Rene Descartes thường được ghi nhận đã đưa các số mũ được viết lại (a b ) vào văn bản toán học, trong tác phẩm Geometrie được xuất bản năm 1637. Đây là ký hiệu vẫn được sử dụng phổ biến trong toán học ngày nay.

Fortran là ngôn ngữ lập trình lâu đời nhất được sử dụng rộng rãi cho các tính toán số cung cấp toán tử lũy thừa, nó có từ năm 1954. Hoạt động lũy ​​thừa được biểu thị bằng dấu hoa thị kép **. Cần lưu ý rằng nhiều máy tính tại thời điểm đó đã sử dụng mã hóa ký tự 6 bit không cung cấp ký tự dấu mũ ^. Việc sử dụng **sau đó đã được chấp nhận bởi những người tạo ra các ngôn ngữ lập trình gần đây hơn cung cấp một hoạt động lũy ​​thừa, chẳng hạn như Python.

Bộ ký tự được chấp nhận rộng rãi đầu tiên có chứa dấu mũ ^là mã hóa ASCII 7 bit được chuẩn hóa lần đầu tiên vào năm 1963. Ngôn ngữ lập trình lâu đời nhất mà tôi biết là đã sử dụng dấu mũ để biểu thị lũy thừa là BASIC, xuất hiện từ năm 1964. thời gian IBM chấp nhận mã hóa ký tự EBCDIC , bao gồm cả dấu mũ ^.

Ngôn ngữ C ra đời vào năm 1972. Nó không cung cấp toán tử lũy thừa, thay vào đó nó hỗ trợ lũy thừa thông qua các hàm thư viện như pow(). Do đó, không có ký hiệu nào cần được đặt sang một bên cho phép lũy thừa trong C và các ngôn ngữ khác, sau này, các ngôn ngữ trong họ C, chẳng hạn như C ++ và CUDA.

Mặt khác, và không phổ biến cho các ngôn ngữ lập trình cho đến thời điểm đó, C cung cấp các ký hiệu cho các hoạt động theo bit. Số lượng ký tự đặc biệt có sẵn trong ASCII 7 bit bị giới hạn và do có "mối quan hệ tự nhiên" với các hoạt động khác đối với một số ký tự đặc biệt, ví dụ &cho AND và ~KHÔNG, không có nhiều sự lựa chọn cho biểu tượng cho XOR .

Tôi không biết về một lý do được công bố do Ritchie hoặc Kernighan cung cấp về lý do tại sao họ chọn ^biểu thị XOR một cách cụ thể; Lịch sử ngắn về C của Ritchie im lặng về vấn đề này. Một cái nhìn tại các đặc điểm kỹ thuật cho các tiền thân của C, ngôn ngữ B , cho thấy rằng nó không có một nhà điều hành XOR, nhưng đã sử dụng tất cả các ký tự đặc biệt khác hơn ^, $, @, #.

[Cập nhật] Tôi đã gửi email đến Ken Thompson, người tạo ra B và là một trong những người đồng sáng tạo của C, tìm hiểu về lý do chọn ^làm nhà điều hành XOR của C và xin phép chia sẻ câu trả lời tại đây. Trả lời của anh ấy (hơi được định dạng lại để dễ đọc):

Từ: Ken Thompson
gửi: Thứ 5 29 Tháng Chín, 2016 04:50
Để: Norbert Juffa
Subject: Re: Lý do đằng sau sự lựa chọn của caret như XOR điều hành trong C?

đó là một sự lựa chọn ngẫu nhiên của các nhân vật còn lại.

nếu tôi có nó để làm lại (mà tôi đã làm) tôi sẽ sử dụng cùng một toán tử cho xor (^) và bit bổ sung (~).

vì ^ bây giờ là toán tử được biết đến nhiều hơn, nên, ^ là xor và cũng là bổ sung.

Việc sử dụng ^lũy thừa trong "toán học" mà bạn đề cập thực ra là việc sử dụng được thiết lập vào một ngày sau đó cho các hệ thống sắp chữ như Knuth's TeX có từ năm 1978, giao diện dòng lệnh cho các hệ thống đại số như Mathicala có từ năm 1988 và vẽ đồ thị máy tính vào đầu những năm 1990.

Tại sao các sản phẩm này chấp nhận sử dụng ^cho lũy thừa? Trong trường hợp máy tính tôi nghi ngờ ảnh hưởng của BASIC. Trong suốt những năm 1980, đây là ngôn ngữ lập trình đầu tiên rất phổ biến và cũng được nhúng vào các sản phẩm phần mềm khác. Do đó, ký hiệu sẽ quen thuộc với nhiều người mua máy tính. Trí nhớ của tôi rất mơ hồ, nhưng tôi tin rằng thậm chí còn có các máy tính thực sự chạy các trình thông dịch BASIC đơn giản.


4
Đó là một số bài học lịch sử tốt đẹp. Vì vậy, câu hỏi thực sự sẽ là "Tại sao phần mềm của Tex (và khác từ thời kỳ đó) đã quyết định sử dụng biểu tượng XOR theo cấp số nhân?" ;)
AxelH

5
@AxelH Thật ra thì không. TeX sử dụng ^cho siêu ký tự . Và nó có ý nghĩa với tôi để sử dụng một ký tự "lên" cho siêu ký tự và một ký tự "xuống" ( _) cho đăng ký.
Svick

2
@AxelH Tôi đồng ý với svick rằng ^gợi ý một mũi tên hướng lên, từ đó gợi ý về vị trí truyền thống của số mũ được mô tả lại, vì vậy nó có một chút phù hợp tự nhiên. Tôi chắc chắn Donald Knuth sẽ trả lời email hỏi về quyết định sử dụng ^lũy thừa của anh ấy trong TeX, nhưng cho rằng anh ấy đang bận rộn với những việc quan trọng hơn, chẳng hạn như hoàn thành TAOCP, tôi không muốn thực hiện bước đó (tôi đã xem xét nó).
njuffa

7
Theo en.wikipedia.org/wiki/Caret , Algol 60 đã sử dụng một mũi tên hướng lên trên để lũy thừa và lưu ý rằng ban đầu ASCII cũng có một mũi tên hướng lên tại cùng một điểm mã nơi nó hiện có ký hiệu dấu mũ, vì vậy hai cái này rõ ràng tương đương với nhau trong cùng một thời gian.
Periata Breatta

4
Câu trả lời lịch sử thực sự tốt đẹp. Tôi chỉ muốn thêm một lý do có khả năng cho C triển khai các toán tử bit thay vì lũy thừa: Mục tiêu của C là ngôn ngữ cấp thấp cho phép lập trình viên dễ dàng truy cập vào một phần lớn các công cụ mà CPU hỗ trợ nguyên bản. Và CPU luôn cung cấp các hướng dẫn thao tác bit, nhưng tôi không biết về một CPU có các hướng dẫn đặc biệt về lũy thừa. Như vậy, lũy thừa luôn yêu cầu một vòng lặp (ít nhất là với số học số nguyên) và không có một tính năng nào trong C ẩn một vòng lặp đằng sau cấu trúc ngôn ngữ.
cmaster
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.