Чому так багато мов трактують числа, починаючи з 0, як восьмери?


22

Я читав Де корисні восьмерики? і, схоже, восьмерики - це щось, що колись було корисним.

Багато мов трактують числа, що передують 0, як восьмери, так що буквальне значення 010є насправді 8. Кілька з них - JavaScript, Python (2.7) та Ruby.

Але я не розумію, чому для цих мов потрібен восьмеричний, особливо коли більш імовірне використання позначень полягає у позначенні десяткового числа із зайвим 0.

JavaScript є мовою на стороні клієнта, восьмерика здається досить марною. Всі три досить сучасні в іншому розумінні, і я не думаю, що було б багато коду, використовуючи восьмеричні позначення, які були б порушені шляхом видалення цієї "функції".

Отже, мої запитання:

  • Чи є якась точка з цих мов, що підтримують восьмі літери?
  • Якщо потрібні восьмеричні літерали, чому б не використати щось подібне 0o10? Навіщо копіювати старі позначення, які переосмислюють корисніший варіант використання?

24
Чи приймете ви "відповідь плутати молодих людей під час інтерв'ю" як відповідь?
янніс

11
відповідно до синтаксису C + сліпе копіювання
храповик виродка

1
@Manishearth C успадкував його від своїх предків. У Java є, тому що в C є. Більшість інших є, тому що це мають C і Java.
Інго

2
Ще спостерігаються зміни chmodвосьмигранних файлів Unix у праві: з 0666 або 0777 для груп із 3 біт для користувача, групи та інших: читати, записувати, виконувати.
Joop Eggen

3
@Llepwryd У старих веб-переглядачах parseInt('010')справді повертався 8, отже, всі поради, які завжди потрібно використовувати parseInt(foo, 10)(і це для мене ще звичка)
Izkata

Відповіді:


34

Сліпо копіювання C, як сказала у своєму коментарі храповик

Переважна більшість "мовних дизайнерів" в наші дні ніколи не бачила нічого, окрім C та його копій (C ++, Java, Javascript, PHP і, мабуть, кілька десятків інших, про які я ніколи не чув). Вони ніколи не торкалися FORTRAN, COBOL, LISP, PASCAL, Oberon, FORTH, APL, BLISS, SNOBOL.

Колись вплив декількох мов програмування було ОБОВ'ЯЗКОВО у навчальній програмі з інформатики, і це не включало підрахунок C, C ++ та Java як трьох окремих мов.

Октал використовувався в попередні дні, оскільки це полегшувало читання двійкових значень інструкцій. Наприклад, PDP-11, В основному, мав 4-розрядний код, 2 3-бітні регістрові номери та 2 3-бітні поля механізму доступу. Висловлення слова в восьмериці зробило все очевидним.

Через ранню асоціацію C з PDP-11 було включено восьмеричні позначення, оскільки це було дуже часто в PDP-11.

На інших машинах були набори інструкцій, які не відповідали шістнадцятковій. CDC 6600 мав 60-бітове слово, причому кожне слово містило, як правило, від 2 до 4 інструкцій. Кожна інструкція складала 15 або 30 біт.

Що стосується читання і запису значень, то це вирішена проблема, з відомою найкращою практикою в галузі, принаймні в галузі оборони. Ви ДОКУМЕНТИ свої формати файлів. Немає двозначності, коли формат задокументований, тому що документ ВІДПОВІдає, чи шукаєте ви десятковий номер, шістнадцятковий чи восьмеричний номер.

Також зверніть увагу: Якщо ваша система вводу / виводу за замовчуванням позначає 0, що означає восьмерину, вам потрібно використовувати деякі інші умовні позначення на виході для позначення шістнадцяткових значень. Це не обов'язково виграш.

На мою особисту думку, Ада зробила це найкраще: 2 # 10010010 #, 8 # 222 #, 16 # 92 # і 146 - це однакова цінність. (Це, мабуть, отримає мені щонайменше три поточні записи прямо там, лише згадуючи про Ада.)


11
Заперечив тебе за те, що згадуєш про Ада ... просто жартую
kufi

12
Мені цікаво дізнатись, як ви зрозуміли, що цифра, що значно більше 50% "мовних дизайнерів" - чому це лякає цитати? - не мають досвіду ні з чим, окрім нащадків С. Я щодня провів добрі шістнадцять років свого життя, розмовляючи з професійними дизайнерами мови, і жоден з них не відповідає вашому опису.
Ерік Ліпперт

Javascript був описаний як "ми хочемо зробити lisp у браузері", щоб зацікавити свого дизайнера, якщо я правильно пам'ятаю це інтерв'ю ...
Izkata

2
@Izkata: Дійсно, Вальдемар Хорват одного разу сказав мені, що він розглядає JavaScript як по суті звичайний Lisp із синтаксисом подібного С. Насправді Вальдемар визначив метамову, написав інтерпретатора для свого метамовлення у Common Lisp, а потім написав специфікацію JavaScript у свій метамов, тим самим дозволивши йому реально запустити специфікацію. Це була розумна техніка.
Ерік Ліпперт

Чому було використано 0? Чи не було б сенсу використовувати нечисловий символ? Чи стандарт ANSI просто не мав передбачення помилок, спричинених цифрами, які мають бути базовими десятьма?
Старий Бадман Сірий

6

Вони отримують його від C. Навіщо копіювати? Тому що базова реалізація всіх 3 знаходиться в C. Python за замовчуванням реалізація - CPython . Рубін був побудований в C , а також. Javascript - найцікавіший випадок тут. Запускається в браузері. Хочете вгадати, про що було написано перший веб-браузер ?

То чому б усі три ці мови були реалізовані на мові C? Тому що всі вони походять із систем UNIX. Тож це випадок конвенції, керований екосистемою. Perl робить це також. Lua, швидше за все, якби Lua використовував цілі числа, а не парні .

Отож, питання про те, в яких середовищах ці мови пишуться на C, тому вони приймають свої умови від C. Хорошим допоміжним наслідком є ​​Visual Basic, який натомість використовує & O. Наскільки це потребує, здається, це більше конвенція, що витікає з абстракції, ніж все інше.


Чи підтримувала Mosaic JavaScript? Якщо ні, то як згадування про це актуально?
svick

2
@svick Це базовий рівень для Netscape Navigator, який це зробив.
Світовий інженер

2

Є цінність консистенції. Якщо ви не можете надійно визначити, як переводиться число, у вас виникнуть реальні проблеми з використанням значення в різних контекстах.

Це також означає, що вам не потрібно писати власний парсер. Використання добре перевірених процедур бібліотеки має велике значення.

Крім того, якщо ви не підтримуєте провідний синтаксис 0, у вас немає простого способу запису восьми значень.

Хоча ми не так сильно залежимо від восьмеричних чисел, як колись, вони все ще мають значення. Незважаючи на те, що однакові результати можна отримати з шістнадцятковими числами, у деяких контекстах восьмикутник легше зрозуміти.

Поки що я бачив лише одне використання для провідних нулів у десяткових числах. Це у відображенні та введенні десяткових полів фіксованої довжини, як ідентифікаційні номери. Минуло роки, як я бачив подібні поля з першим нулем. Хоча це зменшує доступні значення на 10%, це усуває проблему, що користувачі часто залишають провідні нулі при введенні в них.


3
Поля з провідними нулями - це рядки, візуальні зображення із власним значенням, а не числами.
Пітер Б

1
+1 вважай chmod 438 ./myfileжахливим!
Інго

2
Чому не дозволити 0o10синтаксис? Я вважаю, що Python це підтримує. Завжди можна зробити простий спосіб запису восьми значень, який не робить число більше нормальним числом. Я бачив, як люди намагаються використати кінцеві нулі в коді для вирівнювання та легкої маніпуляції, і покусали в ногу восьмеричними позначеннями
Manishearth

Я можу зрозуміти бажання мати засоби для запису восьми значень, окрім бінарних та шістнадцяткових. Я також можу зрозуміти, що наявність компілятора інтерпретувати 031як Хеллоуїн (31 жовтня), а не Різдво (25 грудня) може спричинити певні ризики, якщо програмісти копіюють код, написаний мовою, яка використовує останню реалізацію. Однак я не бачу жодної причини, чому мова не могла б досягти найкращого з обох світів, підтримуючи 0q31як позначення, коли потрібен восьмерик, або 0t025для базової десятки, щоб дозволити значення макросклеювання з провідними нулями, а також просто заборонити ведучі нулі без базових специфікаторів .
supercat

@supercat Використовуйте провідний 0, щоб представити восьмеричні дати, принаймні, для юності. Випадки, коли його часто використовують, - це випадки, коли біти мають значення, а інтерпретація числа як десяткового числа є правильним лише для значень менше 8. Додавання додаткових символів (включаючи провідні нулі на десяткових числах) може бути більш заплутаним, ніж корисним . Я б точно запитував, чому дата була написана 012 031, 010 031 або 012 025.
BillThor
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.