Компьютер и основы программирования
Прежде чем учиться программировать, ответим на один вопрос: как компьютер на самом деле «думает»? На этом уроке мы интерактивно разберём двоичную систему (0 и 1), то, как хранятся текст и цвет, а также как написанный нами код превращается в язык, понятный компьютеру, то есть компиляцию.
1.1 Что такое программирование?
В программировании мы шаг за шагом говорим компьютеру, что делать. Компьютер сам ничего не придумывает; он выполняет ваши указания точно, по порядку и без всяких догадок.
Представьте: вы объясняете другу, как заварить чай. Человеку достаточно сказать «завари чай». Но компьютер не настолько умён, поэтому ему нужно сказать так:
- Налей воду в чайник
- Нагревай воду, пока она не закипит
- Положи чайные листья и подожди 5 минут
- Налей в пиалу
Вот такая последовательность точных указаний называется алгоритм, а запись её на компьютерном языке называется программа. На этом курсе мы научимся писать такие указания. Но сначала нам нужно понять, как компьютер «слышит» эти указания.
1.2 Компьютер и два состояния: 0 и 1
Внутри компьютера есть миллионы очень маленьких «переключателей» (транзисторов). У каждого переключателя только два состояния: есть ток или нет тока. Мы обозначаем их так:
- 0 означает нет тока (выключено)
- 1 означает есть ток (включено)
Один такой 0 или 1 называется бит (наименьшая частица данных). Восемь бит вместе образуют байт. Всё в компьютере, то есть числа, буквы, изображения, видео и музыка, в конечном счёте — просто набор нулей и единиц.
1.3 Двоичная система счисления
В повседневной жизни мы используем десятичную систему, в ней 10 цифр (от 0 до 9). А компьютер использует двоичную систему, в ней всего 2 цифры: 0 и 1. Не бойтесь, секрет обеих в одной простой идее: важно, на каком месте стоит каждая цифра.
Сначала знакомое: десятичное число
Возьмём число «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:
Прибавляем только включённые (1) разряды: 8 + 4 + 1 = 13
Теперь ваша очередь. В игре ниже нажимайте на биты и своими глазами наблюдайте, как складывается число:
Видите? Каждый включённый бит прибавляет свою «разрядную ценность». Например, 01000001 = 64 + 1 = 65. Одним байтом можно выразить от 0 до 255, всего 256 разных чисел.
Конвертер двоичное ↔ десятичное
Напишите любое число, и на другой стороне появится его двоичное представление (и наоборот).
1.4 Единицы измерения данных: байт, КБ, МБ, ГБ
Один байт — это почти ничего, всего одна буква. Но байты складываются и образуют огромные вещи. Вы видели на телефоне надпись «128 ГБ памяти»; этот ГБ тоже на самом деле состоит из байтов. Каждая следующая единица примерно в 1000 раз больше предыдущей:
Значит, размер файла («изображение 3 МБ»), память («256 ГБ»), скорость интернета («50 Мбит/с») — всё это измеряется этими байтами. Теперь, когда вы увидите эти числа, они будут для вас осмысленными.
1.5 Как хранятся буква, цвет и hex?
Если байтом мы можем хранить число в диапазоне 0–255, значит, мы можем хранить и буквы: каждой букве просто присваиваем одно число. Например, латинская A = 65, B = 66, a = 97, пробел = 32.
Вопрос «почему именно 65?» возникает естественно. Ответ простой: это таблица, о которой договорился весь мир (как общий словарь), её название — ASCII. Поскольку все следуют этой таблице, текст, написанный на одном компьютере, другой тоже может прочитать точно так же.
Напишите ниже какое-нибудь слово, и вы увидите число, стоящее за каждой буквой, и его 8-битное двоичное представление:
Цвет — это тоже три числа
Цвет каждой точки на экране (пикселя) состоит из трёх байтов: сколько красного, сколько зелёного, сколько синего (каждый 0–255). Это называется RGB.
Важный момент: это не краска, а смесь света (экран излучает свет). Поэтому всё наоборот по сравнению с краской: если все три равны 0, света нет, то есть чёрный; если все три равны 255, свет полный, то есть белый. Двигайте ползунки и смотрите, как цвет «рождается из чисел»:
А как же узбекский? 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, то есть байтовые значения красного, зелёного и синего.
1.6 Компиляция: перевод кода на машинный язык
Мы пишем программу на языке, который может прочитать человек. Например, на языке C программа, выводящая «Salom, dunyo!», выглядит так:
Но процессор не понимает этот текст, он знает только двоичный машинный код (0 и 1). Поэтому посередине нужен «переводчик»; он называется компилятор (для C известен gcc). Компилятор читает ваш код целиком и превращает его в двоичный файл, который может выполнить процессор.
Нажмите кнопку ниже и понаблюдайте, через какие этапы проходит код:
А если вы ошибётесь?
Компилятор очень требователен: если в коде есть ошибка (например, пропущена точка с запятой), он вообще не соберёт программу и скажет, в какой именно строке находится ошибка. Это хорошо: ошибка находится до того, как программа запустится. Например:
Эта запись означает «в строке 4 забыли поставить ;». В следующие недели мы научимся читать и исправлять такие ошибки.
Компиляция против интерпретации
Не все языки компилируются. Языки вроде C заранее полностью преобразуются в машинный код (компиляция), благодаря чему работают быстро. А языки вроде Python читаются интерпретатором построчно во время выполнения (отдельного шага компиляции нет); это удобно, но медленнее. Основы мы изучаем на C: он наиболее открыто показывает, что происходит внутри компьютера.
1.7 Практическое упражнение: решите сами
Лучший способ закрепить знания — сделать самому. В этом упражнении каждый раз появляется одно число, и возможен один из двух случаев:
- Если число состоит только из 0 и 1 (двоичное), преобразуйте его в десятичное.
- Если число обычное (десятичное), преобразуйте его в 8-битное двоичное.
При решении используйте опору ниже, это разрядные ценности. Читая двоичное, складывайте ценности включённых (1) разрядов. Например: 1010 = 8 + 2 = 10; и наоборот, 10 = 00001010. Напишите ответ и нажмите Enter (или «Проверить»). Цель: набрать 10 правильных ответов.
1.8 Глубже: вычисления в двоичной системе advanced
Этот раздел более глубокий и необязательный. Он переводит вас от «хранения данных» к «как компьютер вычисляет». Настоящее понимание начинается отсюда.
Сложение в двоичной системе
Складываем как в десятичной: 0+0=0, 0+1=1, а 1+1 в двоичной — это «10», то есть вы пишете 0 и переносите 1 в следующий разряд (как «перенос» в десятичной при 9+1=10). Пример: 3 + 1 = 4:
Маленькие схемы внутри процессора выполняют именно эту операцию миллиарды раз в секунду. Вот это и есть «вычисление» компьютера.
Отрицательные числа и дополнительный код
С одними лишь 0 и 1 нет знака «минус». Хитрость такая: самый левый бит используется как знак, а отрицательные числа записываются особым способом, то есть дополнительным кодом (two's complement). Красота этой хитрости в том, что процессор вычисляет и +5, и −5 одной и той же схемой сложения, отдельное вычитание не нужно. Подробности рассмотрим в следующие недели.
Битовые операции (bitwise)
Иногда программист выполняет операции непосредственно над битами. Основные: AND (если оба равны 1 → 1), OR (если хотя бы один равен 1 → 1), XOR (если ровно один равен 1 → 1), NOT (меняет 0 и 1 местами), сдвиг (смещает биты влево/вправо). Двигайте ползунки и попробуйте операции:
Логические элементы: всё из них
Эти операции выполняются внутри процессора маленькими электронными схемами, которые называются логическими элементами (logic gates: AND, OR, NOT). Из них собирается «сумматор» (adder), а из сумматоров — целый процессор. Значит, компьютер состоит из миллионов элементов AND/OR/NOT. Вот так из одних лишь 0 и 1 строится весь цифровой мир.
1.9 Тест знаний
Перед тестом: новые термины
Основные понятия, изученные на этой неделе. Пробегитесь по ним глазами перед тестом:
Теперь попробуем
15 вопросов. Чтобы завершить неделю, ответьте правильно как минимум на 11.
Поздравляем! Неделя 1 завершена
Теперь вы знаете, что внутри компьютера всё — это 0 и 1, как хранятся числа, буквы и цвета, а также что такое компиляция. Это прочный фундамент программирования.
Перейти к следующему модулю