- PVSM.RU - https://www.pvsm.ru -

Я считаю, что на любой подобный вопрос можно дать два основных ответа и некую их комбинацию:
Я не большой специалист по компьютерной истории (мне куда больше нравится использовать компьютеры, чем читать про них), но меня всегда интересовало, есть ли какая-то весомая причина, по которой мир компьютеров сегодня выглядит именно так, или это, по большому счёту, просто историческая случайность. Так что в этой статье речь пойдёт об истории компьютеров.
Приведу пример исторической случайности: в DNS есть поле class, которое может содержать одно из пяти значений – internet, chaos, hesiod, none и any). Для меня это явный пример исторической случайности – не могу представить себе, чтобы мы, воссоздавая это поле сегодня, определили его таким же образом, не беспокоясь об обратной совместимости. Не уверена, что мы бы вообще стали использовать поле класса.
В этой статье не приводятся однозначные объяснения, но я задала вопрос на Mastodon [1], и собрала из полученных ответов несколько возможных причин 8-битного размера байта. Думаю, что ответ представляет некое сочетание этих причин.
Начну с того, что в этой статье будут активно обсуждаться байты и слова. В чём же отличие между ними? Вот моё понимание этого вопроса:
0x20aa87c68 может быть адресом одного байта, а значит 0x20aa87c69 будет адресом следующего байта.Ну а теперь поговорим о возможных причинах использования именно 8-битных байтов.
Статья на Wikipedia [3] гласит, что 8-битный байт впервые начал использоваться в IBM System/360 в 1964 году.
Вот видео интервью [4] с Фредом Бруксом (руководителем проекта), в котором обсуждается причина этого. Вот часть его содержания:
… 6-битные байты по факту лучше подходят для научного вычисления, а 8-битные – для коммерческого. При этом каждый вариант можно приспособить для работы в роли другого. Поэтому всё свелось к принятию ответственного решения, и я склонился к варианту с 8 битами, который предложил Джерри.
[….]
Моим самым важным техническим решением за всю карьеру в IBM был переход на использование 8-битных байтов в модели 360. Это решение также подкреплялось моей верой в то, что обработка знаков станет более значимой, чем обработка десятичных цифр.
Идея о том, что 8-битный байт больше подходит для обработки текста, вполне логична: 2^6 равно 64, значит 6 бит оказалось бы недостаточно для букв нижнего/верхнего регистра и символов.
Для перехода на использование 8-битного байта в System/360 также была реализована кодировка 8-битных символов EBCDIC [5].
Похоже, что следующим значительным шагом в истории 8-битного байта стал процессор Intel 8008 [6], который создавался для использования в терминале Datapoint 2200. Терминалам необходима возможность представлять буквы, а также управляющие коды, поэтому в них есть смысл использовать 8-битные байты. В руководстве к Datapoint 2200 [7] из музея компьютерной истории на странице 7 сказано, что эта модель поддерживала кодировки ASCII (7 бит) и EBCDIC (8 бит).
Меня заинтересовал комментарий о том, что 6-битный байт оказался бы более подходящим для научных вычислений. Вот цитата из интервью с Джином Амдалем [8]:
Я хотел сделать его 24-х и 48-битным, а не 32-х и 64-х, поскольку тогда бы я получил более рациональную систему с плавающей запятой. Дело в том, что в системе с плавающей запятой при 32-битном слове вы оказывались ограничены всего 8 битами для знака возведения в степень, а чтобы это было практично в плане охватываемого численного диапазона, приходилось выполнять корректировку по 4 бита, а не по одному. В результате часть информации терялась быстрее, чем в случае двоичного сдвига.
Мне это рассуждение совсем непонятно – почему при использовании 32-битного слова возведение числа в степень должно быть 8-битным? Почему нельзя использовать 9 или 10 бит? Но это всё, что мне удалось найти в результате недолгого поиска.
Это также связано с 6-битным байтом: во многих мейнфреймах использовались 36-битные слова. Почему? Кто-то указал на прекрасное объяснение в статье Wikipedia [9], посвящённой 36-битному вычислению:
До появления компьютеров эталоном в точных научных и инженерных вычислениях был 10-циферный электромеханический калькулятор… В этих калькуляторах для каждой цифры присутствовал ряд клавиш, и операторы обучались использовать для ввода чисел все десять пальцев, поэтому, хоть в некоторых специализированных калькуляторах и было больше рядов, десять являлось практичным ограничением.
В связи с этим в первых двоичных компьютерах, нацеленных на тот же рынок, использовались 36-битные слова. Этой длины было достаточно для представления положительных и отрицательных целых чисел с точностью до десяти десятичных цифр (35 бит оказалось бы минимумом).
Получается, что поводом для использования 36 бит стал тот факт, что log_2(20000000000) равен 34.2.
Я предполагаю, что причина тому лежит где-то в 50-х годах – тогда компьютеры были невероятной роскошью. Поэтому, если вам требовалось, чтобы устройство поддерживало десять цифр, его нужно было спроектировать с поддержкой ровно достаточного для этого числа бит и не более.
Сегодня компьютеры стали быстрее и дешевле, поэтому, если вам по какой-то причине нужно представить десять цифр, то вы можете просто использовать 64 бита – потеря некоторого пространства памяти вряд ли станет проблемой.
Кто-то другой писал, что некоторые из этих машин с 36-битными словами позволяли выбирать размер байта – в зависимости от контекста можно было использовать 5, 6, 7 или 8-битные байты.
В 60-е годы существовала популярная кодировка целых чисел под названием BCD [10] (binary-coded decimal), которая кодировала каждую цифру в 4 бита. Например, если бы вам понадобилось закодировать 1234, то в BCD это бы выглядело так:
0001 0010 0011 0100
Поэтому в целях удобства работы с закодированным в двоичную форму десятичным значением размер байта должен был быть кратным 4 битам – например, 8 бит.
Такое представление целых чисел мне показалось реально странным – почему бы не использовать двоичную форму, которая позволяет намного более эффективно хранить целые числа? Ведь эффективность в первых компьютерах была крайне важна.
Лично я склоняюсь к тому, что причина заключалась в специфике дисплеев первых компьютеров, на которых содержимое байта отображалось непосредственно в состояние лампочек – вкл/выкл.
Вот картинка IBM 650 [11] с лампочками на дисплее (CC BY-SA 3.0 [12]):

Поэтому, если мы хотим, чтобы человеку было относительно удобно прочитывать десятичное число из его двоичного представления, то такой вариант будет намного более разумным. Я думаю, что сегодня кодировка BCD уже неактуальна, потому что у нас есть мониторы, и наши компьютеры умеют автоматически конвертировать числа из двоичной формы в десятичную, отображая итоговый результат.
Мне также было интересно, не из BCD ли родился термин «nibble» (полубайт), означающий 4 бита – в контексте BCD вы много обращаетесь к полубайтам (поскольку каждая цифра занимает 4 бита), поэтому есть смысл использовать слово для «4 бит», которые люди и прозвали «nibble». Сегодня для меня этот термин уже выглядит архаичным – если я его когда-то и использовала, то только смеха ради (оно такое забавное). Причём эта теория подтверждается статьёй в Wikipedia [13]:
Термин «полубайт» использовался для описания количества памяти, используемой в мейнфреймах IBM для хранения цифры числа в упакованном десятичном формате (BCD) .
В качестве ещё одной причины использования BCD кто-то назвал финансовые вычисления. Сегодня, если вам нужно сохранить какое-то количество долларов, то вы обычно просто используете целочисленное значение в центах и делите это значение на 100, если хотите получить его долларовую часть. Это несложно, деление выполняется быстро. Но в 70-х деление на 100 целого числа, представленного в двоичном формате, явно выполнялось очень медленно, поэтому был смысл перестроить систему представления целых чисел во избежание деления на 100.
Ладно, хватит о BCD.
Многие люди указали на важность того, чтобы размер байта был равен степени 2. Я не могу выяснить, правда это или нет, и меня не удовлетворило объяснение, что «компьютеры используют двоичную систему счисления, поэтому степень двойки подойдёт лучше всего». Это утверждение выглядит весьма правдоподобным, но мне хотелось разобраться глубже. За всю историю определённо было множество машин, в которых использовались байты с размером не кратным 2. Вот несколько примеров, взятых из темы о ретрокомпьютерах со Stack Exchange [14]:
А вот пара пока не понятных мне причин, названных в качестве объяснения, почему оптимальный размер байта должен быть кратен 2:
А вот причины, которые мне показались более обоснованными:
Возможно, я исказила некоторые из приведённых объяснений, так как в этой области знаний я не особо сильна.
Вы можете поинтересоваться: «Если 8-битные байты оказались лучше 4-битных, почему бы не продолжить увеличивать их размер? Можно же использовать 16-битные!»
Вот пара причин для сохранения небольшого размера байта:
Моё понимание архитектуры процессоров очень шаткое, поэтому углубляться в эту тему я не стану. Хотя причина «пустой траты пространства» выглядит для меня весьма убедительной.
Процессор Intel 8008 (1972 год) был предшественником модели 8080 (1974 год), которая предшествовала 8086 (1976 год) – первому процессору семейства x86. Похоже, что 8080 и 8086 были очень популярны, и именно с них пошли все современные компьютеры x86.
Думаю, здесь уместен принцип «не чини того, что не сломано» – мне кажется, что 8-битные байты отлично работали, поэтому в Intel не увидели необходимости менять их размер. Сохранение 8-битного байта позволяет повторно использовать более обширную часть набора инструкций.
К тому же, в 80-х начали появляться сетевые протоколы вроде TCP, в которых использовались 8-битные байты (обычно называемые «октеты»), и если вы соберётесь реализовать сетевые протоколы, то наверняка решите использовать в них 8-битный байт.
Вот и всё!
На мой взгляд, основные причины, по которым байт состоит из 8 бит, следующие:
Кто-то также отметил, что на 65-й странице этой книги 1962 года [19], объясняющей причины, по которым в IBM решили использовать 8-битный байт, по сути, говорится то же самое:
В целом у меня сложилось ощущение, что 8-битный байт является естественным выбором, если вы проектируете двоичный компьютер в англоязычной стране.
Автор: Дмитрий Брайт
Источник [20]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/staroe-zhelezo/385638
Ссылки в тексте:
[1] на Mastodon: https://social.jvns.ca/@b0rk/109976810279702728
[2] мануала по архитектурам Intel: https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
[3] Статья на Wikipedia: https://en.wikipedia.org/wiki/IBM_System/360
[4] видео интервью: https://www.youtube.com/watch?v=9oOCrAePJMs&t=140s
[5] EBCDIC: https://en.wikipedia.org/wiki/EBCDIC
[6] Intel 8008: https://en.wikipedia.org/wiki/Intel_8008
[7] руководстве к Datapoint 2200: https://archive.computerhistory.org/resources/text/2009/102683240.05.02.acc.pdf
[8] интервью с Джином Амдалем: https://archive.computerhistory.org/resources/access/text/2013/05/102702492-05-01-acc.pdf
[9] в статье Wikipedia: https://en.wikipedia.org/wiki/36-bit_computing
[10] BCD: https://en.wikipedia.org/wiki/Binary-coded_decimal
[11] картинка IBM 650: https://commons.wikimedia.org/wiki/File:IBM-650-panel.jpg
[12] CC BY-SA 3.0: http://creativecommons.org/licenses/by-sa/3.0/
[13] статьёй в Wikipedia: https://en.wikipedia.org/wiki/Nibble
[14] темы о ретрокомпьютерах со Stack Exchange: https://retrocomputing.stackexchange.com/questions/7937/last-computer-not-to-use-octets-8-bit-bytes
[15] Грэхем Сазерленд: https://poly.nomial.co.uk/
[16] симулятор делителей частоты: https://www.falstad.com/circuit/circuitjs.html?ctz=CQAgjCAMB0l3BWcMBMcUHYMGZIA4UA2ATmIxAUgpABZsKBTAWjDACgwEknsUQ08tQQKgU2AdxA8+I6eAyEoEqb3mK8VMAqWSNakHsx9Iywxj6Ea-c0oBKUy-xpUWYGc-D9kcftCQo-URgEZRQERSMnKkiTSTDFLQjw62NlMBorRP5krNjwDP58fMztE04kdKsRFBQqoqoQyUcRVhl6tLdCwVaonXBO2s0Cwb6UPGEPXmiPPLHhIrne2Y9q8a6lcpAp9edo+r7tkW3c5WPtOj4TyQv9G5jlO5saMAibPOeIoppm9oAPEEU2C0-EBaFoThAAHoUGx-mA8FYgfNESgIFUrNDYVtCBBttg8LiUPR0VCYWhyD0Wp0slYACIASQAamTIORFqtuucQAzGTQ2OTaD9BN8Soo6Uy8PzWQ46oImI4aSB6QA5ZTy9EuVQjPLq3q6kQmAD21Beome0qQMHgkDIhHCYVEfCQ9BVbGNRHAiio5vIltg8Ft9stXg99B5MPdFK9tDAFqg-rggcIDui1i23KZfPd3WjPuoVoDCiDjv4gjDErYQA
[17] инструкций тестирования битов в Z80: http://www.chebucto.ns.ca/~af380/z-80-h.htm
[18] сумматоры с опережением переноса: https://en.wikipedia.org/wiki/Carry-lookahead_adder
[19] на 65-й странице этой книги 1962 года: https://web.archive.org/web/20170403014651/http://archive.computerhistory.org/resources/text/IBM/Stretch/pdfs/Buchholz_102636426.pdf
[20] Источник: https://habr.com/ru/companies/ruvds/articles/743000/?utm_source=habrahabr&utm_medium=rss&utm_campaign=743000
Нажмите здесь для печати.