Неделя 1 · Foundation

Компьютер и основы программирования

Прежде чем учиться программировать, ответим на один вопрос: как компьютер на самом деле «думает»? На этом уроке мы интерактивно разберём двоичную систему (0 и 1), то, как хранятся текст и цвет, а также как написанный нами код превращается в язык, понятный компьютеру, то есть компиляцию.

1.1 Что такое программирование?

В программировании мы шаг за шагом говорим компьютеру, что делать. Компьютер сам ничего не придумывает; он выполняет ваши указания точно, по порядку и без всяких догадок.

Представьте: вы объясняете другу, как заварить чай. Человеку достаточно сказать «завари чай». Но компьютер не настолько умён, поэтому ему нужно сказать так:

  • Налей воду в чайник
  • Нагревай воду, пока она не закипит
  • Положи чайные листья и подожди 5 минут
  • Налей в пиалу

Вот такая последовательность точных указаний называется алгоритм, а запись её на компьютерном языке называется программа. На этом курсе мы научимся писать такие указания. Но сначала нам нужно понять, как компьютер «слышит» эти указания.

1.2 Компьютер и два состояния: 0 и 1

Внутри компьютера есть миллионы очень маленьких «переключателей» (транзисторов). У каждого переключателя только два состояния: есть ток или нет тока. Мы обозначаем их так:

  • 0 означает нет тока (выключено)
  • 1 означает есть ток (включено)

Один такой 0 или 1 называется бит (наименьшая частица данных). Восемь бит вместе образуют байт. Всё в компьютере, то есть числа, буквы, изображения, видео и музыка, в конечном счёте — просто набор нулей и единиц.

Возникает вопрос: как всего лишь нулями и единицами хранятся большие числа, целая книга или цветное изображение? Ответ — в двоичной системе ниже. Давайте попробуем вручную.

1.3 Двоичная система счисления

В повседневной жизни мы используем десятичную систему, в ней 10 цифр (от 0 до 9). А компьютер использует двоичную систему, в ней всего 2 цифры: 0 и 1. Не бойтесь, секрет обеих в одной простой идее: важно, на каком месте стоит каждая цифра.

Сначала знакомое: десятичное число

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

сотни
3
десятки
4
единицы
2
= 342

3×100 + 4×10 + 2×1 = 300 + 40 + 2 = 342

Обратите внимание: справа налево каждый разряд увеличивается в 10 раз: единицы, десятки, сотни...

А теперь та же идея в двоичной системе

В двоичной точно так же, только каждый разряд увеличивается не в 10, а в 2 раза: 1, 2, 4, 8, 16, 32, 64, 128. Один байт (8 бит) состоит из этих восьми разрядов. Правило простое: разрядная ценность там, где стоит 1, прибавляется, а там, где стоит 0, не прибавляется.

Например, «прочитаем» вместе число 00001101:

128
0
64
0
32
0
16
0
8
1
4
1
2
0
1
1
= 13

Прибавляем только включённые (1) разряды: 8 + 4 + 1 = 13

Теперь ваша очередь. В игре ниже нажимайте на биты и своими глазами наблюдайте, как складывается число:

Поиграйте, нажимая на биты включите/выключите бит
Результат: 0
0b00000000

Видите? Каждый включённый бит прибавляет свою «разрядную ценность». Например, 01000001 = 64 + 1 = 65. Одним байтом можно выразить от 0 до 255, всего 256 разных чисел.

«Зачем мне это, я ведь буду писать код?» Это правильный вопрос. Успокойтесь: при программировании вы не будете писать 0 и 1 вручную. Но если вы знаете эту основу, то позже память, типы данных, цвета и ошибки не будут казаться вам «магией»; вы будете понимать, что происходит. Именно это отличает сильного программиста от остальных.

Конвертер двоичное ↔ десятичное

Напишите любое число, и на другой стороне появится его двоичное представление (и наоборот).

Конвертер

1.4 Единицы измерения данных: байт, КБ, МБ, ГБ

Один байт — это почти ничего, всего одна буква. Но байты складываются и образуют огромные вещи. Вы видели на телефоне надпись «128 ГБ памяти»; этот ГБ тоже на самом деле состоит из байтов. Каждая следующая единица примерно в 1000 раз больше предыдущей:

1 байт1 буква
×1000
1 КБкороткое сообщение
×1000
1 МБ1 изображение
×1000
1 ГБ~30 мин видео
×1000
1 ТБтысячи фильмов

Значит, размер файла («изображение 3 МБ»), память («256 ГБ»), скорость интернета («50 Мбит/с») — всё это измеряется этими байтами. Теперь, когда вы увидите эти числа, они будут для вас осмысленными.

Для точности: поскольку компьютер двоичный, 1 КБ = 1024 байта (2¹⁰), а не 1000. Но в повседневной жизни для удобства округляют до «примерно 1000».

1.5 Как хранятся буква, цвет и hex?

Если байтом мы можем хранить число в диапазоне 0–255, значит, мы можем хранить и буквы: каждой букве просто присваиваем одно число. Например, латинская A = 65, B = 66, a = 97, пробел = 32.

Вопрос «почему именно 65?» возникает естественно. Ответ простой: это таблица, о которой договорился весь мир (как общий словарь), её название — ASCII. Поскольку все следуют этой таблице, текст, написанный на одном компьютере, другой тоже может прочитать точно так же.

Напишите ниже какое-нибудь слово, и вы увидите число, стоящее за каждой буквой, и его 8-битное двоичное представление:

ASCII-анализатор

Цвет — это тоже три числа

Цвет каждой точки на экране (пикселя) состоит из трёх байтов: сколько красного, сколько зелёного, сколько синего (каждый 0–255). Это называется RGB.

Важный момент: это не краска, а смесь света (экран излучает свет). Поэтому всё наоборот по сравнению с краской: если все три равны 0, света нет, то есть чёрный; если все три равны 255, свет полный, то есть белый. Двигайте ползунки и смотрите, как цвет «рождается из чисел»:

RGB-микшер цвета
R9101011011
G9101011011
B21411010110
#5B5BD6

А как же узбекский? Unicode

В таблице ASCII всего 128 символов: латинские буквы, цифры и знаки препинания. Но в мире существуют тысячи символов: кириллические буквы, узбекские oʻ и gʻ, китайские иероглифы, даже эмодзи 😀. Чтобы вместить их все, есть таблица побольше — Unicode. В ней один символ может занимать не 1, а несколько байтов (самый распространённый вид — UTF-8).

Напишите в ASCII-анализаторе выше эмодзи или кириллическую букву, и её код окажется больше 255, то есть не помещается в один байт.

Hex: краткий язык чисел

В результате с цветом вы увидели запись вида #5B5BD6. Это шестнадцатеричная (hex) система. В ней 16 «цифр»: 0–9, затем A, B, C, D, E, F (то есть 10, 11, 12, 13, 14, 15). Зачем это нужно? Потому что 2 hex-символа ровно представляют 1 байт (8 бит), это очень компактно. Например, FF = 255 (наибольший байт), 5B = 91. Поэтому цвета записывают в hex: #RRGGBB, то есть байтовые значения красного, зелёного и синего.

Значит, текст, изображение, видео и музыка — всё это числа, а числа — это биты (0 и 1). Вся «магия» компьютера основана на этой простой идее.

1.6 Компиляция: перевод кода на машинный язык

Мы пишем программу на языке, который может прочитать человек. Например, на языке C программа, выводящая «Salom, dunyo!», выглядит так:

// salom.c (код, который пишет человек) #include <stdio.h> int main(void) { printf("Salom, dunyo!\n"); }

Но процессор не понимает этот текст, он знает только двоичный машинный код (0 и 1). Поэтому посередине нужен «переводчик»; он называется компилятор (для C известен gcc). Компилятор читает ваш код целиком и превращает его в двоичный файл, который может выполнить процессор.

Нажмите кнопку ниже и понаблюдайте, через какие этапы проходит код:

Процесс компиляции
salom.c
код человека
gcc
компилятор
salom
машинный код · 01001
Запуск
программа работает
$ нажмите кнопку...

А если вы ошибётесь?

Компилятор очень требователен: если в коде есть ошибка (например, пропущена точка с запятой), он вообще не соберёт программу и скажет, в какой именно строке находится ошибка. Это хорошо: ошибка находится до того, как программа запустится. Например:

salom.c:4:31: error: expected ';' before '}' token

Эта запись означает «в строке 4 забыли поставить ;». В следующие недели мы научимся читать и исправлять такие ошибки.

Компиляция против интерпретации

Не все языки компилируются. Языки вроде C заранее полностью преобразуются в машинный код (компиляция), благодаря чему работают быстро. А языки вроде Python читаются интерпретатором построчно во время выполнения (отдельного шага компиляции нет); это удобно, но медленнее. Основы мы изучаем на C: он наиболее открыто показывает, что происходит внутри компьютера.

Поэтому C называют «компилируемым языком». Если вы измените код, нужно скомпилировать заново. В следующие недели мы будем писать настоящий код на C и компилировать его в браузере.

1.7 Практическое упражнение: решите сами

Лучший способ закрепить знания — сделать самому. В этом упражнении каждый раз появляется одно число, и возможен один из двух случаев:

  • Если число состоит только из 0 и 1 (двоичное), преобразуйте его в десятичное.
  • Если число обычное (десятичное), преобразуйте его в 8-битное двоичное.

При решении используйте опору ниже, это разрядные ценности. Читая двоичное, складывайте ценности включённых (1) разрядов. Например: 1010 = 8 + 2 = 10; и наоборот, 10 = 00001010. Напишите ответ и нажмите Enter (или «Проверить»). Цель: набрать 10 правильных ответов.

Тренажёр упражнений 0 / 10 правильно
Опора (разрядные ценности):1286432168421
🎉 Отлично! 10 правильных ответов. Теперь вы прочно освоили двоичную систему!

1.8 Глубже: вычисления в двоичной системе advanced

Этот раздел более глубокий и необязательный. Он переводит вас от «хранения данных» к «как компьютер вычисляет». Настоящее понимание начинается отсюда.

Сложение в двоичной системе

Складываем как в десятичной: 0+0=0, 0+1=1, а 1+1 в двоичной — это «10», то есть вы пишете 0 и переносите 1 в следующий разряд (как «перенос» в десятичной при 9+1=10). Пример: 3 + 1 = 4:

0011 (3) + 0001 (1) ------ 0100 (4)

Маленькие схемы внутри процессора выполняют именно эту операцию миллиарды раз в секунду. Вот это и есть «вычисление» компьютера.

Отрицательные числа и дополнительный код

С одними лишь 0 и 1 нет знака «минус». Хитрость такая: самый левый бит используется как знак, а отрицательные числа записываются особым способом, то есть дополнительным кодом (two's complement). Красота этой хитрости в том, что процессор вычисляет и +5, и −5 одной и той же схемой сложения, отдельное вычитание не нужно. Подробности рассмотрим в следующие недели.

Битовые операции (bitwise)

Иногда программист выполняет операции непосредственно над битами. Основные: AND (если оба равны 1 → 1), OR (если хотя бы один равен 1 → 1), XOR (если ровно один равен 1 → 1), NOT (меняет 0 и 1 местами), сдвиг (смещает биты влево/вправо). Двигайте ползунки и попробуйте операции:

Лаборатория битовых операций
A0101101090
B0011110060
Результат: 00011000
= 24 (десятичное)

Логические элементы: всё из них

Эти операции выполняются внутри процессора маленькими электронными схемами, которые называются логическими элементами (logic gates: AND, OR, NOT). Из них собирается «сумматор» (adder), а из сумматоров — целый процессор. Значит, компьютер состоит из миллионов элементов AND/OR/NOT. Вот так из одних лишь 0 и 1 строится весь цифровой мир.

Не переживайте, если вы не до конца поняли этот раздел, в следующие недели мы к нему ещё вернёмся. Главное, теперь вы знаете, что «компьютер — не волшебная коробка, а машина, которая вычисляет с помощью 0 и 1».

1.9 Тест знаний

Перед тестом: новые термины

Основные понятия, изученные на этой неделе. Пробегитесь по ним глазами перед тестом:

Битнаименьшая частица данных, 0 или 1.
Байт8 бит; одно число в диапазоне 0–255.
Двоичная системасистема счисления только из 0 и 1.
Разрядная ценностьместо, на котором стоит цифра (1, 2, 4, 8...).
ASCIIобщая таблица, присвоившая число каждой букве.
RGBцвет = красный+зелёный+синий (каждый 0–255).
Машинный коддвоичные команды, понятные процессору.
Компиляторпереводит код человека в машинный код (gcc).

Теперь попробуем

15 вопросов. Чтобы завершить неделю, ответьте правильно как минимум на 11.

Поздравляем! Неделя 1 завершена

Теперь вы знаете, что внутри компьютера всё — это 0 и 1, как хранятся числа, буквы и цвета, а также что такое компиляция. Это прочный фундамент программирования.