Когда и где появилось соглашение $ для шестнадцатеричных литералов?
Мне показался интересным этот вопрос о происхождении 0x
шестнадцатеричного числа для обозначения шестнадцатеричного числа.
Однако, когда в начале 80-х я порезал свои зубы программированием на 8-битных системах 65xx, все, что я видел, использовалось $
для обозначения шестнадцатеричных цифр (ассемблеры, мониторы, книги, журналы и т. Д.). Только когда я получил свою первую Amiga 1000 и начал изучать C, я даже знал, что 0x
префикс - это вещь.
Если 0x
префикс явно предшествовал 8-битной революции , то (1) почему был $
принят так широко? И наоборот, (2) став вездесущим для целого поколения 8-битных программистов, почему он был внезапно исключен? (Не то чтобы это важно, но я все еще использую, $
когда комментирую код или пишу на мертвых деревьях.)
Ответы
Короткий ответ:
Motorola использовала его для своих 6800, а MOS (6500) унаследовала его от Motorola. В конце концов, 6500 членов команды вышли из проекта 6800, так что они уже привыкли к нему.
Длинный ответ:
Если префикс 0x явно предшествует 8-битной революции,
На самом деле это не так. Motorola использовала $
префикс уже с 6800 1974 года. Unix только недавно (1973) был переписан на C, что добавило 0x
соглашение примерно в то время и было показано за пределами AT&T.
тогда (1) почему $ получил такое широкое распространение?
Из-за линейки Motorola 6800/02/09, а также серии MOS 6500, используемых во многих младших микро (домашних) компьютерах. В первую очередь это Acorn, Apple, Atari и Commodore. Естественно, каждый, кто пишет программное обеспечение для этих машин / процессоров, будет использовать его обозначение.
Позже это было усилено популярностью 68000, используемой, например, в линейках машин Atari ST и Commodore Amiga.
И наоборот, (2) став вездесущим для целого поколения 8-битных программистов,
Теперь это очень сильно зависит от вашего «пузыря процессора», поскольку это верно только для пользователей машин на базе 65xx / 68xx. Кто бы ни вырос на машине на базе x80 (8080, 8085, Z80) или x86, такой как Altair (S100), Tandy TRS-80 и весь мир MSX, не согласится. Они будут достаточно твердыми в том H
смысле, что суффикс был единственным допустимым способом, а все остальное довольно экзотично :))
почему его резко упали?
Это не так. Нет мирового правящего органа, превосходящего его. В конце концов, использование префикса (или суффикса) не присуще шестнадцатеричному коду, а определяется используемым языком. Ассемблеры Motorola / MOS хотят иметь $
префикс, Intel - H
суффикс, C - 0x
префикс, а другие снова хотят иметь более математический префикс 16#
(Ada) или 16r
(Smalltalk).
(Не то чтобы это важно, но я все еще использую $, когда комментирую код или пишу на мертвых деревьях.)
Как и многие другие (* 3).
Итог: используемый язык определяет обозначения - и, как всегда, первое оставляет самое глубокое впечатление.
Преимущество префикса над постфиксом
Классическая математика использует постфиксное обозначение , имеющий радикс заднего ряд. Intel следовала их nnnnH
обозначениям. При написании компилятора это приводит к тому, что сначала нужно прочитать целое слово (константу), прежде чем можно будет решить, как его интерпретировать. Это означает, что необходим буфер, содержащий всю строку, так как он может быть преобразован только после продвижения до постфикса.
Используя префикс, с самого начала ясно, как интерпретировать следующие символы. Здесь нет необходимости в буфере (* 2). Это дает преимущество в дизайне парсера и значительно упрощает ассемблер. Это было особенно полезно для быстрого создания ранних кросс-ассемблерных инструментов в качестве первой начальной загрузки.
Немного истории
В первые годы шестнадцатеричное обозначение было довольно необычным. Вместо этого использовалось восьмеричное число, поскольку большинство машин было построено с размером, кратным 3 размеру слова , а также символы обычно обрабатывались как 6-битные.
Из нескольких машин / систем, которые очень рано предлагали шестнадцатеричный код, многие использовали различные буквы / символы, такие как последние 6 в алфавите
UVWXYZ
(* 2), часто даже прерывистые.IBM представила строковый формат с префиксом (
X'nnnn'
) с / 360 в 1965 году.Datapoint используется восьмеричный с префиксом ноль
Intel 4004 использовал шестнадцатеричный код с суффиксом
h
Intel 8008 использовал все восьмеричные числа в руководствах и документации, написанные как
nnnO
К 1973 году оба ассемблера использовали одни и те же суффиксы B / O / H.
* 1 - Уход за несколькими байтами буфера может показаться странным сегодня, когда весь исходный код обычно загружается в память, но тогда оперативная память была пугающим ресурсом. В результате предпочтение отдавалось алгоритмам, которые могли читать данные, например, с бумажной ленты, и напрямую работать с каждым считанным символом без буферизации.
Оптимальный ассемблер позволяет читать любой элемент за символом и сразу же обрабатывать его, не заглядывая вперед. Использование префикса поддерживает это.
* 2 - Условное обозначение, которое часто используется в инженерии, когда требуются символы.
* 3 - Здесь, на RC.SE, я стараюсь использовать нотацию в соответствии с темой, поэтому $
для 65/68, H
для Intel и т. Д. ... а когда нет четкой связи, я вернусь к нотации / 370 x'nn'
, поскольку это было то, что я использовал чаще всего, несмотря на то, что использовал $
сначала.