Мы готовы начать программировать. Подытожим, что было в предыдущих выпусках. Если вы их не читали, то рекомендую сначала ознакомиться:
- Перед тем, как учить любой язык программирования, нужно научиться программировать. Язык и программирование – не одно и то же.
- Программирование – это не печать строчек на экране, а представление о том, в каких состояниях может находиться ваш объект, и как эти состояния менять.
- Состояние объекта доводится до абстрактного представления.
- В один элемент компьютерной памяти можно записать только 0 или 1, но элементов много, и мы можем взять их столько, сколько нужно.
Пора уже потихоньку начинать разговаривать по-программистски. Итак, один элемент компьютерной памяти, тот самый крохотный переключатель, который может только в 0 и 1, называется "бит". Это название, как и все остальные компьютерные термины, произошло из английского языка и значит "кусочек" (bit).
В предыдущих выпусках я приводил пример уборки комнаты как вполне себе процесс программирования. Сейчас, в самом начале этого процесса, ситуация такая: я придумал простейшее состояние комнаты, которое выражается одной цифрой 5. Для меня это значит: в комнате есть 5 книг. Я буду работать с этим состоянием дальше, но для начала я должен поместить его в память компьютера, чтобы с ним вообще можно было работать.
Вот память компьютера, которая состоит из большого количества элементов, или битов:
Число 5 в двоичной системе это 101. То есть для его записи в память нужно три бита. Я беру в памяти первые три бита и устанавливаю их в состояние 101:
Конечно, я не буду делать это всё вручную, это сделает компьютер за меня, но для глобального понимания вообще всего программирования важно понять эту одну операцию и ее последствия.
Сразу возникают вопросы: А куда можно записать еще одно число? А если это число будет занимать не 3 бита, а 12 бит? Как потом в памяти найти наше число 5? Как мы отделим запись одного числа от записи другого числа? Как мы узнаем, какое число сколько бит занимало?
Все эти вопросы решены следующим образом:
Все биты в памяти поделили на группы. Каждая группа состоит из 8 бит и называется "байт" (byte). Мы не можем записать в память меньше, чем один байт.
Даже если для записи числа 5 требуется всего 3 бита, мы всё равно потратим 8 бит, чтобы записать туда 5. Выглядеть оно будет не как 101, а как 00000101, потому что слева добавятся старшие биты, которые просто не используются.
То есть 5 бит из 8 пропадут зря. Это расточительство, но зато границы между соседними числами теперь хорошо известны – всем им выделено ровно по 8 бит.
Отсюда растут корни такого явления, как 8-битные игры, 8-битная графика, 8-битная музыка и прочее. Когда что-то называют 8-битным, имеют в виду, что оно старое и примитивное. Так оно и есть.
В 8 бит можно записать максимальное двоичное число 11111111, или в десятичном виде 255. Вместе с нулем получится 256 чисел. Так возникает главное ограничение. У картинки не может быть больше 256 цветов, у звука не может быть больше 256 уровней оцифровки, у игрока не может быть больше 256 предметов и так далее.
Конечно, все это можно решить с помощью изложенного ранее способа – если не хватает вместимости одной ячейки памяти, возьми ещё ячеек. Но тогда все значения в таких ячейка придется вычислять только вручную, учитывая, что и куда перенеслось. Это и медленно, и неудобно. Поэтому 8-битные игры такие примитивные и простые.
Сейчас такой проблемы уже нет. Потому что кроме 8 бит, ячейки памяти стали объединять в более крупные группы – сначала по 16 бит, затем по 32 бита, и наконец по 64 бита, а в современных видеокартах используется даже 128 бит. В 16 бит можно записать максимальное число 65535, в 32 бита можно записать уже около 4-х миллиардов, а в 64 бита – уже совсем немыслимое число. Так что ограничений, можно сказать, уже нет. Но минимальный размер ячейки памяти по-прежнему остался 8 бит, или 1 байт.
Ну, с записью числа в память справились, но из виду упущено кое-что важное, а именно – адресация. Но это тема еще на пару страниц, так что я сделаю для нее отдельный выпуск.