Я прочитал Где восьмеричные полезны? и кажется, что восьмеричные были когда-то полезными.
Многие языки рассматривают числа, начинающиеся с 0, как восьмеричные, поэтому литерал 010
на самом деле равен 8. Среди них есть JavaScript, Python (2.7) и Ruby.
Но я не очень понимаю, почему эти языки нуждаются в восьмеричном коде, особенно когда более вероятно использование нотации для обозначения десятичного числа с лишним 0.
JavaScript - это клиентский язык, восьмеричный код кажется довольно бесполезным. Все три довольно современны в другом смысле, и я не думаю, что было бы много кода с использованием восьмеричной нотации, которая была бы нарушена при удалении этой «функции».
Итак, мои вопросы:
- Есть ли смысл в этих языках, поддерживающих восьмеричные литералы?
- Если восьмеричные литералы необходимы, почему бы не использовать что-то подобное
0o10
? Зачем копировать старую запись, которая переопределяет более полезный вариант использования?
javascript
python
ruby
octal
Manishearth
источник
источник
chmod
с 0666 или 0777 для групп по 3 бита для пользователя, группы и других: чтение, запись, исполняемый файл.parseInt('010')
действительно возвращал 8, отсюда и все советы, которые всегда следует использоватьparseInt(foo, 10)
(и это все еще для меня привычка)Ответы:
Слепое копирование 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 - все представляют одно и то же значение. (Это, вероятно, даст мне по крайней мере три отрицательных голоса, только за упоминание Ады.)
источник
Они получают это от C. Зачем копировать? Поскольку базовая реализация всех 3 в C. Реализация Python по умолчанию - CPython . Рубин был построен в C , а также. Javascript - самый интересный случай здесь. Он запускается в браузере. Хотите угадать, в чем был написан первый веб-браузер ?
Так почему же все эти три языка должны быть реализованы в C? Потому что все они происходят из систем UNIX. Так что это тот случай, когда конвенцией управляет экосистема. Perl делает это тоже. Луа, вероятно, сделал бы, если бы Луа использовал целые числа, а не двойные .
Так что вопрос об окружающей среде этих языков записываются в C поэтому они берут их соглашение от C. Хорошего поддерживающего следствия является Visual Basic , который использует & O вместо. Насколько это необходимо, кажется, что утечка абстракций превратилась в конвенцию, чем что-либо еще.
источник
Существует значение для согласованности. Если вы не можете точно определить, как будет переводиться число, у вас будут реальные проблемы с использованием значения в разных контекстах.
Это также означает, что вам не нужно писать свой собственный парсер. Использование проверенных библиотечных процедур имеет большое значение.
Также, если вы не поддерживаете ведущий синтаксис 0, у вас нет простого способа записи восьмеричных значений.
Хотя мы не так сильно зависим от восьмеричных чисел, как раньше, они все еще имеют ценность. Хотя те же результаты могут быть получены с шестнадцатеричными числами, в некоторых случаях восьмеричный код легче понять.
До сих пор я видел только одно использование для ведущих нулей в десятичных числах. То есть при отображении и вводе десятичных полей фиксированной длины, таких как идентификационные номера. Прошли годы с тех пор, как я видел такие поля с ведущим нулем. Хотя это уменьшает доступные значения на 10%, это устраняет проблему, заключающуюся в том, что пользователи часто пропускают начальные нули при их вводе.
источник
chmod 438 ./myfile
страшным!0o10
синтаксис? Я считаю, что Python поддерживает это. Вы всегда можете сделать простой способ записать восьмеричные значения, которые не делают число больше нормальным числом. Я видел, как люди пытаются использовать конечные нули в коде для выравнивания и легкого манипулирования, и031
как Хэллоуин (31 октября), а не Рождество (25 декабря), может представлять определенный риск, если программисты копируют код, написанный на языке, который использует последнюю реализацию. Однако я не вижу причин, по которым язык не может достичь лучшего из обоих миров, поддерживая в0q31
качестве нотации, когда требуется восьмеричное, или0t025
для base-ten, чтобы разрешить макро-вставку значений с ведущими нулями, и просто запретить ведущие нули без базовых спецификаторов. ,