Почему так много языков рассматривают числа, начинающиеся с 0, как восьмеричные?

22

Я прочитал Где восьмеричные полезны? и кажется, что восьмеричные были когда-то полезными.

Многие языки рассматривают числа, начинающиеся с 0, как восьмеричные, поэтому литерал 010на самом деле равен 8. Среди них есть JavaScript, Python (2.7) и Ruby.

Но я не очень понимаю, почему эти языки нуждаются в восьмеричном коде, особенно когда более вероятно использование нотации для обозначения десятичного числа с лишним 0.

JavaScript - это клиентский язык, восьмеричный код кажется довольно бесполезным. Все три довольно современны в другом смысле, и я не думаю, что было бы много кода с использованием восьмеричной нотации, которая была бы нарушена при удалении этой «функции».

Итак, мои вопросы:

  • Есть ли смысл в этих языках, поддерживающих восьмеричные литералы?
  • Если восьмеричные литералы необходимы, почему бы не использовать что-то подобное 0o10? Зачем копировать старую запись, которая переопределяет более полезный вариант использования?
Manishearth
источник
24
Примете ли вы «смутить молодежь во время интервью» в качестве ответа?
Яннис
11
соответствует синтаксису C + слепое копирование
чокнутый урод
1
@Manishearth C унаследовал его от своих предков. У Java это есть, потому что у C это есть. У большинства других это есть, потому что у C и Java это есть.
Инго
2
Каждый по-прежнему видит восьмеричные изменения в файле Unix: chmodс 0666 или 0777 для групп по 3 бита для пользователя, группы и других: чтение, запись, исполняемый файл.
Joop Eggen
3
@Llepwryd В старых браузерах parseInt('010')действительно возвращал 8, отсюда и все советы, которые всегда следует использовать parseInt(foo, 10)(и это все еще для меня привычка)
Изката

Ответы:

34

Слепое копирование C, прямо как уродец с трещоткой сказал в своем комментарии

Подавляющее большинство «языковых дизайнеров» в наши дни никогда не видели ничего, кроме C и его копий (C ++, Java, Javascript, PHP и, возможно, несколько десятков других, о которых я никогда не слышал). Они никогда не прикасались к Фортрану, Коболу, Лиспу, Паскалю, Оберону, Форту, Аплу, Блиссу, Сноболу и многим другим.

Когда-то знакомство с несколькими языками программирования было ОБЯЗАТЕЛЬНЫМ в учебной программе по информатике, и это не включало в себя подсчет C, C ++ и Java как трех отдельных языков.

Octal использовался в более ранние дни, потому что это облегчало чтение двоичных значений команд. Например, PDP-11 BASICALLY имеет 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
Проголосовал за то, что упомянул Аду ... шучу
куфи
12
Мне любопытно узнать, откуда у вас эта цифра значительно больше, чем у 50% «языковых дизайнеров» - почему пугают цитаты? - не имею опыта ни с чем, кроме потомков С. Я провел хорошие шестнадцать лет своей жизни, разговаривая с профессиональными дизайнерами языков каждый день, и ни один из них не соответствует вашему описанию.
Эрик Липперт
Javascript был описан как «мы хотим сделать шутку в браузере», чтобы заинтересовать его дизайнера, если я правильно помню это интервью ...
Izkata
2
@Izkata: Действительно, Вальдемар Хорват однажды сказал мне, что он рассматривал JavaScript как по сути Common Lisp с синтаксисом, подобным C. Фактически Вальдемар определил метаязык, написал интерпретатор для его метаязыка в Common Lisp, а затем написал спецификацию JavaScript в своем метаязыке, что позволило ему фактически запустить спецификацию. Это была умная техника.
Эрик Липперт
Почему 0 был использован? Разве не имеет смысла использовать не числовые символы? Разве в стандарте ANSI не было предвидения ошибок, вызванных числами, которые намеревались стать основой десятой?
Старый Бадман Грей
6

Они получают это от C. Зачем копировать? Поскольку базовая реализация всех 3 в C. Реализация Python по умолчанию - CPython . Рубин был построен в C , а также. Javascript - самый интересный случай здесь. Он запускается в браузере. Хотите угадать, в чем был написан первый веб-браузер ?

Так почему же все эти три языка должны быть реализованы в C? Потому что все они происходят из систем UNIX. Так что это тот случай, когда конвенцией управляет экосистема. Perl делает это тоже. Луа, вероятно, сделал бы, если бы Луа использовал целые числа, а не двойные .

Так что вопрос об окружающей среде этих языков записываются в C поэтому они берут их соглашение от C. Хорошего поддерживающего следствия является Visual Basic , который использует & O вместо. Насколько это необходимо, кажется, что утечка абстракций превратилась в конвенцию, чем что-либо еще.

Мировой инженер
источник
Мозаика поддерживает JavaScript? Если нет, то как это упомянуть?
svick
2
@svick Это базовый уровень для Netscape Navigator.
мировой инженер
2

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

Это также означает, что вам не нужно писать свой собственный парсер. Использование проверенных библиотечных процедур имеет большое значение.

Также, если вы не поддерживаете ведущий синтаксис 0, у вас нет простого способа записи восьмеричных значений.

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

До сих пор я видел только одно использование для ведущих нулей в десятичных числах. То есть при отображении и вводе десятичных полей фиксированной длины, таких как идентификационные номера. Прошли годы с тех пор, как я видел такие поля с ведущим нулем. Хотя это уменьшает доступные значения на 10%, это устраняет проблему, заключающуюся в том, что пользователи часто пропускают начальные нули при их вводе.

BillThor
источник
3
Поля с ведущими нулями являются строками, визуальными представлениями со своим собственным значением, а не числами.
Питер Б
1
+1 считай chmod 438 ./myfileстрашным!
Инго
2
Почему бы не разрешить 0o10синтаксис? Я считаю, что Python поддерживает это. Вы всегда можете сделать простой способ записать восьмеричные значения, которые не делают число больше нормальным числом. Я видел, как люди пытаются использовать конечные нули в коде для выравнивания и легкого манипулирования, и
укушаются
Я могу понять желание иметь средства записи восьмеричных значений, в дополнение к двоичным и шестнадцатеричным. Я также могу понять, что компиляция, интерпретируемая 031как Хэллоуин (31 октября), а не Рождество (25 декабря), может представлять определенный риск, если программисты копируют код, написанный на языке, который использует последнюю реализацию. Однако я не вижу причин, по которым язык не может достичь лучшего из обоих миров, поддерживая в 0q31качестве нотации, когда требуется восьмеричное, или 0t025для base-ten, чтобы разрешить макро-вставку значений с ведущими нулями, и просто запретить ведущие нули без базовых спецификаторов. ,
суперкат
@supercat Использование ведущих 0 для представления восьмеричных дат по крайней мере для вашей молодежи. Случаи, когда он часто используется, являются случаями, когда биты имеют значение, и интерпретация числа как десятичного числа является правильной только для значений меньше 8. Добавление дополнительных символов (включая начальные нули на десятичных числах) может быть более запутанным, чем полезным , Я бы, конечно, спросил, почему была написана дата 012 031, 010 031 или 012 025.
BillThor