Как работает компьютер?

Компьютер - что это?

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

Согласно википедии, компьютер - устройство или система, способная выполнять заданную, чётко определённую, изменяемую последовательность действий. Такая последовательность действий называется программой. Иначе говоря, компьютер - электронное устройство, которое можно программировать.

Компьютер - электронное устройство, которое работает по-разному, в зависимости от заложенной в него программы. Программу можно менять, не изменяя само устройство.

Электронные устройства, которые всегда работают одинакового, мы будем называть аналоговыми.

Например, следующие устройства являются компьютерами:

  • мобильные телефоны;
  • bluetooth-наушники;
  • веб-камеры;
  • сим-карты;
  • цифровой телевизор;
  • умные часы...

А вот несколько примеров аналоговых устройств:

  • электрический чайник;
  • проводная колонка;
  • аналоговый синтезатор;
  • проводные наушники;
  • пленочный фотоаппарат (он, кстати, может быть и не электронным)...

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

Выходит, управляем компьютерами - управляем миром! 💪

Что внутри коробки?

Несмотря на то, что современные компьютеры внешне очень непохожи, внутри почти все они устроены одинакого.

Внутри каждого современного компьютера есть:

  • вычислительное устройство - процессор;
  • кратковременная память;
  • долговременная память;
  • вспомогательные устройства, датчики, устройства ввода и вывода.

Процессор

Сердце компьютера - это его центральное вычислительное устройство - процессор (CPU). Именно процессор является исполнителем команд, которые мы даем компьютеру.

Современные процессоры различаются тактовой частотой и числом ядер.

Тактовая частота - число примитивных операций (или тактов), которое процессор выполняет за секунду. Например, процессор с частотой 3 мегагерца может выполнять три миллиона операций в секунду. Примитивных, потому что для выполнения некоторых операций (умножения, например) требуется несколько тактов.

Внутри современных процессоров на самом деле часто помещается несколько вычислительных устройств, которые работают параллельно - ядер. Например, шестиядерный процессор может выполнять шесть действий одновременно.

Но, кстати говоря, добавление дополнительных ядер не всегда ускоряет компьютер, все зависит от решаемой задачи. Представь, что ты чистишь картошку: если позвать на помощь еще 10 друзей, скорее всего вместе вы управитесь гораздо быстрее. А вот если ты пишешь сочинение по русскому языку, поручить разные части разным людям будет уже сложнее...

Иначе говоря, некоторые задачи можно распараллелить, а некоторые нет.

Память

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

Кратковременная, или оперативная, память - это относительно небольшая по объему, энергозависимая (при отключении питания данные теряются) память, которая работает очень быстро.

В персональных компьютерах такая память обозначается, как RAM - random access memory, память, в которой можно за несколько тактов обратиться к любой ячейке (поэтому он и быстрая).

Средний объем оперативной памяти в современном компьютере - 8 гигабайт.

Долговременная память в современных компьютерах - это SSD (Solid State Drive) или HDD (жесткий диск). Эти устройства не теряют данные при отключении питания, хранят большой объем данных, но работают медленее оперативной памяти.

Типичный размер современного жесткого диска - 1 терабайт.

Зачем нужная разная память? Представь ученика на уроке. Сейчас идет урок математики, и на парте лежит открытый учебник по алгебре. Все остальные учебники - по русскому и другим предметам лежат в рюкзаке. Все учебники сразу на парту не поместятся, а каждые пять минут доставать учебник из рюкзака долго.

Так вот парта с открытым учебником - это оперативная память, а рюкзак со всеми остальными - жесткий диск. А мозг ученика - центральный процессор.

Как устроены процессор и память?

Итак, процессор и память - это два основных компонента любого компьютера. Но как они устроены внутри?

Память состоит из маленьких ячеек, которые называются битами. Биты похожи на конденсаторы, в один момент времени каждый бит может находиться в одном из двух состояний: заряжен или не заряжен.

Если мы обозначим "заряженный" бит единицей, а "разряженный" - нулем, получится, что оперативная память состоит из маленьких ячеек, в каждой из которых может лежать 0 или 1.

По аналогии процессор общается с внешним миром с помощью контактов на его задней стенке, на каждый из которых можно подать низкое или высокое напряжение - 0 или 1 соответственно.

Отсюда возникает понятие бинарного кода (кода из 1 и 0).

Выходит, что все программы и данные в компьютере - это последовательности из единиц и нулей. Кажется, что этого должно быть мало, но с другой стороны, четырех аминокислот природе хватает чтобы описать все разнообразие жизни на земле (речь про ДНК). А значит и для компьютера как-нибудь получится.

А вот как с помощью двух символов описать все что угодно, мы рассмотрим далее.

Бинарный код

Как общаться с устройством, которое понимает только цифры? Как положить в оперативную память текст, если нам доступны только нули и единицы? Нам на помощь приходит двоичная система счисления.

Используя двоичную систему счисления можно записать любое число в виде последовательности единиц и нулей, например число 123 (в привычной нам десятичной системе) - это 1111011 в двоичной системе счисления.

Как сохранить в памяти число? Перевести его в двоичную систему счисления!

Как сохранить в памяти букву? Договориться, что у каждой буквы будет номер, и перевести этот номер в двоичную систему счисления.

Как передать команду процессору? Договориться, что у каждой команды будет номер, и перевести номер команды в двоичную систему счисления. Последовательность 1 и 0 передать процессору в виде напряжений на разных контактах.

Иными словами и данные (числа, буквы, графика...) и программы (указания, что нужно сделать с данными) внутри компьютера представляются в виде бинарного кода - больших последовательностей из 1 и 0.

Перевод в двоичную систему

В обычной жизни мы привыкли использовать десятичную систему счисления. В ней нам доступны десять цифр: 0, 1, 2 ... 8, 9. Если девяти нам уже не достаточно, мы используем перенос через разряд - дописываем слева единицу и продолжаем считать.

Например, как ты знаешь из начальной школы, 9 + 1 = 10, т.е. когда цифры закончились, мы дописали единицу левее и начали считать с нуля. По аналогии, 10 + 1 = 11, 19 + 1 = 20, а 99 + 1 = 100.

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

Но принцип сложения точно такой же: 0 + 1 = 1, 1 + 1 = 10 (т.к. цифры два нет, мы переносим через разряд), 10 + 1 = 11, 11 + 1 = 100.

Есть несколько алгоритмов, как можно просто переводить числа из одной системы счисления в другую, о них можно прочитать здесь: wikiHow.

Единицы измерения информации

Итак, оперативная память состоит из маленьких ячеек, битов, который могут содержать или 1 или 0.

Исходя из предыдущих размышлений про системы счисления, чтобы сохранить в память число больше чем 2, нам понадобится сразу несколько битов.

  • Группу из 8 бит называют байтом. Один байт может принимать значения от 00000000 до 11111111, а значит хранить число от 0 до 255.
  • 1024 (два в десятой степени) байта называются килобайтом. Обратите внимание, что в отличие от физики, приставка кило означает не 1000, а 1024 (на чем, кстати, любят спекулировать производители жестких дисков).
  • 1024 килобайта - это 1 мегабайт.
  • 1024 мегабайта - это 1 гигабайт.
  • 1024 гигабайта - это 1 терабайт.

Кстати, интернет провайдеры часто указывают скорость подключения не в килобайтах, а в килобитах (1024 бита), поэтому скорость и оказывается в 8 раз меньше ожидаемой. 😒

Пробуем писать машинный код

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

По ссылке https://calc.geekclass.ru/ находится "пещерный калькулятор" - модель компьютера, который умеет совершать основные математические операции, но понимает только бинарный код. И сам калькулятор, и систему команд придумал я (не благодари!), она описана в инструкции по ссылке.

Пропробуй на нем что-нибудь посчитать, например, (45 - 13) * 15 / 24.

Сперва, конечно, можно мозг сломать, но в итоге - не так уж и страшно. Именно так и писали код программисты в во второй половине 20го века.

Как создать программу?

Итак, процессор понимает только фиксированное количество команд, которые записываются в виде последовательности 1 и 0. Они специфичны для конкретного семейства процессоров (или архитектуры) и называются машинными кодами. Например, у моего "пещерного калькулятора" одна система команд, а у процессоров Intel - совсем другая.

У каждой команды есть свой номер, и в конечном итоге любая программа представляет из себя последовательность цифр - номеров команд для процессора.

Но писать машинные коды самому, как ты уже убедился, довольно накладно, поэтому довольно скоро появилась идея - обозначить машинные коды буквенными обозначениями и писать их в виде текста. Так появились ассемблеры (их много, свой для каждого семейства процессоров) - языки программирования низкого уровня.

Код на ассемблере для Intel, который выводит на экран надпись "Привет, мир!", выглядит вот так:

SECTION .text
    org 0x100

    mov ah, 0x9
    mov dx, hello
    int 0x21

    mov ax, 0x4c00
    int 0x21

SECTION .data
    hello: db "Hello, world!", 0xD, 0xA, '$'

Согласитесь, мало что понятно. А главное - это долго и неудобно писать.

Как мы еще ни раз увидим в процессе работы, двигатель всей ИТ индустрии - это лень. Если кто-то придумает, как сделать задачу проще и быстрее, все в дальнейшем будут делать именно так.

Чтобы решить проблему сложности ассемблера, были придуманы языки высокого уровня. Идея в том, чтобы писать программы на языке, который будет более понятен человеку, а затем переводить их в ассемблер/машинный код с помощью программы "переводчика" - транслятора. Сегодня 99.999% всех программ пишется именно так, а ассемблер тебе пригодится разве что в разработке железа или анализе программ без исходного кода (это про хакеров). 🕵️‍♂️

Например, на одном из таких языков, питоне, тот же самый код записывается так:

print("Hello, world!")

Согласись, это куда короче, понятнее и удобнее!

Более того такой подход решает вопрос привязки к конкретному процессору: одну и туже программу высокого уровня можно перевести (или транслировать) в ассемблер разных процессоров с помощью разных переводчиков. Один раз пишем - много раз используем. Именно поэтому программы на питоне можно запускать как на windows, так и на маке или линуксе (процессоры там могут быть и одинаковые, но у каждой операционной системы тоже есть свои особенности).

Далее на этом курсе мы познакомимся с одним из самых популярных языков высокого уровня - python 3.