Tại sao nhiều ngôn ngữ coi các số bắt đầu bằng 0 là bát phân?


21

Tôi đã đọc các octals hữu ích ở đâu? và có vẻ như quãng tám là thứ đã từng có ích.

Nhiều ngôn ngữ coi các số đứng trước 0 là số bát phân, vì vậy nghĩa đen 010thực sự là 8. Một vài trong số đó là JavaScript, Python (2.7) và Ruby.

Nhưng tôi không thực sự thấy lý do tại sao các ngôn ngữ này cần bát phân, đặc biệt là khi việc sử dụng ký hiệu có nhiều khả năng là biểu thị một số thập phân có 0 không cần thiết.

JavaScript là ngôn ngữ phía máy khách, bát phân có vẻ khá vô dụng. Cả ba đều khá hiện đại theo nghĩa khác và tôi không nghĩ rằng sẽ có nhiều mã sử dụng ký hiệu bát phân sẽ bị phá vỡ bằng cách loại bỏ "tính năng" này.

Vì vậy, câu hỏi của tôi là:

  • Có bất kỳ điểm của các ngôn ngữ này hỗ trợ chữ bát phân?
  • Nếu chữ bát phân là cần thiết, tại sao không sử dụng một cái gì đó như thế 0o10nào? Tại sao sao chép một ký hiệu cũ ghi đè trường hợp sử dụng hữu ích hơn?

24
Bạn có chấp nhận "nhầm lẫn các bạn trẻ trong một cuộc phỏng vấn" như một câu trả lời không?
yannis

11
tuân thủ cú pháp C + sao chép mù
ratchet freak

1
@M Biếnearth C thừa hưởng nó từ tổ tiên của nó. Java có nó, bởi vì C có nó. Hầu hết những người khác có nó, bởi vì C và Java có nó.
Ingo

2
Người ta vẫn thấy các tệp Unix bát phân thay đổi: chmodvới 0666 hoặc 0777 cho các nhóm 3 bit cho người dùng, nhóm và những người khác: đọc, ghi, thực thi.
Eggen

3
@Llepwryd Trong các trình duyệt cũ hơn, parseInt('010')thực sự đã trả về 8, do đó, tất cả các lời khuyên luôn luôn sử dụng parseInt(foo, 10)(và đó vẫn là thói quen của tôi)
Izkata

Câu trả lời:


34

Sao chép mù quáng của C, giống như ratchet freak nói trong bình luận của mình

Phần lớn các "nhà thiết kế ngôn ngữ" ngày nay chưa bao giờ thấy gì ngoài C và các bản sao của nó (C ++, Java, Javascript, PHP và có lẽ vài chục người khác mà tôi chưa từng nghe thấy). Họ chưa bao giờ chạm vào FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL, để kể tên một vài người.

Ngày xửa ngày xưa, tiếp xúc với nhiều ngôn ngữ lập trình là MANDATORY trong chương trình khoa học máy tính và điều đó không bao gồm việc đếm C, C ++ và Java là ba ngôn ngữ riêng biệt.

Octal đã được sử dụng trong những ngày trước vì nó làm cho việc đọc các giá trị hướng dẫn nhị phân dễ dàng hơn. Ví dụ, PDP-11, BASICALLY có opcode 4 bit, 2 số thanh ghi 3 bit và 2 trường cơ chế truy cập 3 bit. Thể hiện từ trong bát phân làm cho mọi thứ rõ ràng.

Do sự liên kết ban đầu của C với PDP-11, ký hiệu bát phân đã được đưa vào, vì nó rất phổ biến trên PDP-11 vào thời điểm đó.

Các máy khác có các bộ hướng dẫn không ánh xạ tốt đến hex. CDC 6600 có một từ 60 bit, với mỗi từ chứa từ 2 đến 4 hướng dẫn. Mỗi hướng dẫn là 15 hoặc 30 bit.

Đối với việc đọc và viết các giá trị, đây là một vấn đề được giải quyết, với một thực tiễn tốt nhất của ngành công nghiệp nổi tiếng, ít nhất là trong ngành công nghiệp quốc phòng. Bạn TÀI LIỆU định dạng tập tin của bạn. Không có sự mơ hồ khi định dạng được ghi lại, bởi vì tài liệu NÓI cho bạn biết bạn đang xem số thập phân, số thập lục hay số bát phân.

Cũng lưu ý: Nếu hệ thống I / O của bạn mặc định dẫn đến số 0 có nghĩa là bát phân, bạn phải sử dụng một số quy ước khác trên đầu ra của mình để biểu thị các giá trị thập lục phân. Đây không hẳn là một chiến thắng.

Theo ý kiến ​​cá nhân của tôi, Ada đã làm tốt nhất: 2 # 10010010 #, 8 # 222 #, 16 # 92 # và 146 đều đại diện cho cùng một giá trị. (Điều đó có thể sẽ giúp tôi có ít nhất ba lượt tải xuống ngay tại đó, chỉ để đề cập đến Ada.)


11
Đánh giá thấp bạn vì đã đề cập đến Ada ... chỉ đùa thôi
kufi

12
Tôi tò mò muốn biết làm thế nào bạn đến với con số lớn hơn 50% "nhà thiết kế ngôn ngữ" - tại sao các trích dẫn sợ hãi? - không có kinh nghiệm với bất cứ điều gì ngoại trừ con cháu C. Tôi đã dành mười sáu năm cuộc đời để nói chuyện với các nhà thiết kế ngôn ngữ chuyên nghiệp mỗi ngày và không một trong số họ phù hợp với mô tả của bạn.
Eric Lippert

Javascript được mô tả là "chúng tôi muốn làm điều cần thiết trong trình duyệt" để khiến nhà thiết kế của nó quan tâm, nếu tôi nhớ cuộc phỏng vấn đó một cách chính xác ...
Izkata

2
@Izkata: Thật vậy, Waldemar Horwat từng nói với tôi rằng ông đã xem JavaScript về cơ bản là Lisp thông thường với cú pháp giống như C. Trong thực tế, Waldemar đã định nghĩa một ngôn ngữ kim loại, đã viết một bộ giao thoa cho ngôn ngữ kim loại của mình trong Common Lisp, và sau đó viết thông số JavaScript bằng ngôn ngữ kim loại của mình, từ đó cho phép anh ta thực sự chạy đặc tả. Đó là một kỹ thuật thông minh.
Eric Lippert

Tại sao 0 được sử dụng mặc dù? Sẽ không có ý nghĩa khi sử dụng một ký tự không phải là số? Có phải tiêu chuẩn ANSI không có tầm nhìn xa về các lỗi gây ra bởi các con số dự định là cơ sở mười?
Old Badman Grey

6

Họ lấy nó từ C. Tại sao phải sao chép? Bởi vì triển khai cơ sở của cả 3 đều nằm trong C. Triển khai mặc định của Python là CPython . Ruby ban đầu được xây dựng trong C là tốt. Javascript là trường hợp thú vị nhất ở đây. Nó chạy trên trình duyệt. Muốn đoán xem trình duyệt web đầu tiên được viết bằng gì?

Vậy tại sao cả ba ngôn ngữ này sẽ được thực hiện trong C? Bởi vì tất cả chúng đều bắt nguồn từ các hệ thống UNIX. Vì vậy, đó là một trường hợp quy ước được thúc đẩy bởi hệ sinh thái. Perl cũng làm điều này. Lua có khả năng sẽ nếu Lua sử dụng số nguyên thay vì tăng gấp đôi .

Vì vậy, đó là một câu hỏi về môi trường của những ngôn ngữ này được viết bằng C để họ lấy các quy ước của họ từ C. Một hệ quả hỗ trợ tốt là Visual Basic sử dụng & O thay thế. Khi cần nó, nó dường như là một sự trừu tượng bị rò rỉ biến quy ước hơn bất cứ điều gì khác.


Mosaic có hỗ trợ JavaScript không? Nếu không, làm thế nào là đề cập đến nó có liên quan?
Svick

2
@svick Đó là đường cơ sở cho Netscape Navigator đã làm.
Kỹ sư thế giới

2

Có một giá trị cho sự nhất quán. Nếu bạn không thể xác định một cách đáng tin cậy cách một số sẽ được dịch, bạn sẽ gặp vấn đề thực sự khi sử dụng một giá trị trong các ngữ cảnh khác nhau.

Điều đó cũng có nghĩa là bạn không phải viết trình phân tích cú pháp của riêng mình. Có giá trị lớn trong việc sử dụng các thói quen thư viện được thử nghiệm tốt.

Ngoài ra nếu bạn không hỗ trợ cú pháp 0 hàng đầu, bạn không có cách đơn giản để viết các giá trị bát phân.

Mặc dù chúng tôi không phụ thuộc nhiều vào số bát phân như chúng tôi đã từng làm, nhưng chúng vẫn có giá trị. Mặc dù các kết quả tương tự có thể thu được với các số thập lục phân, nhưng trong một số bối cảnh bát phân thì dễ hiểu hơn.

Cho đến nay tôi chỉ thấy một lần sử dụng cho các số 0 đứng đầu trong số thập phân. Đó là trong màn hình và mục nhập của các trường thập phân có độ dài cố định như số nhận dạng. Đã nhiều năm kể từ khi tôi thấy các lĩnh vực như thế với số 0 đứng đầu. Mặc dù điều này làm giảm 10% giá trị khả dụng, nhưng nó giúp loại bỏ vấn đề người dùng thường bỏ đi các số 0 đứng đầu khi nhập chúng.


3
Các trường có số 0 đứng đầu là các chuỗi, biểu diễn trực quan với ý nghĩa riêng của chúng, không phải số.
Pieter B

1
+1 xem xét chmod 438 ./myfilekhủng khiếp!
Ingo

2
Tại sao không cho phép một 0o10cú pháp? Tôi tin rằng Python hỗ trợ điều đó. Bạn luôn có thể thực hiện một cách đơn giản để viết các giá trị bát phân không làm cho số không còn là số bình thường. Tôi đã thấy mọi người cố gắng sử dụng các số 0 trong mã để căn chỉnh và thao tác dễ dàng và bị cắn vào chân bởi ký hiệu bát phân
Manishearth

Tôi có thể hiểu một mong muốn có một phương tiện để viết các giá trị bát phân, ngoài nhị phân và hex. Tôi cũng có thể hiểu rằng có một trình biên dịch diễn giải 031là Halloween (ngày 31 tháng 10) thay vì Giáng sinh (ngày 25 tháng 12) có thể gây ra một số rủi ro nếu các lập trình viên sao chép mã được viết bằng ngôn ngữ sử dụng cách triển khai sau. Tuy nhiên, tôi không thấy lý do tại sao một ngôn ngữ không thể đạt được kết quả tốt nhất của cả hai thế giới bằng cách hỗ trợ 0q31ký hiệu khi muốn bát phân hoặc 0t025cho cơ sở mười để cho phép các giá trị dán vĩ mô với các số 0 đứng đầu và chỉ đơn giản là cấm các số 0 đứng đầu mà không cần các chỉ định cơ sở .
supercat

@supercat Sử dụng số 0 đứng đầu để thể hiện ngày trở lại bát phân ít nhất là cho tuổi trẻ của bạn. Các trường hợp thường được sử dụng là các trường hợp các bit có ý nghĩa và việc giải thích số dưới dạng số thập phân chỉ đúng với các giá trị nhỏ hơn 8. Thêm các ký tự bổ sung (bao gồm các số 0 đứng đầu trên số thập phân) có thể gây nhầm lẫn hơn là hữu ích . Tôi chắc chắn sẽ truy vấn tại sao một ngày được viết 012 031, 010 031 hoặc 012 025.
BillThor
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.