Что такое программирование
Предпосылки: нет.
Каждый день вы запускаете десятки программ: открываете браузер, отправляете сообщение, переводите деньги. За каждым действием — тысячи шагов, которые кто-то записал заранее. Но почему компьютер не может разобраться сам?
Потому что компьютер не понимает задач. Он не знает, что такое зарплата, налог или бонус. Он умеет только выполнять элементарные операции: сложить два числа, сравнить два числа, скопировать число из одного места в другое. Когда бухгалтерии нужно посчитать зарплату каждого из десяти тысяч сотрудников — взять оклад, вычесть налог, прибавить бонус — это тридцать тысяч арифметических действий. Человек потратит неделю и допустит ошибки. Компьютер выполнит те же действия за миллисекунды — но только если кто-то заранее разложит задачу на элементарные шаги и запишет их.
Набор таких шагов называется программой. Человек, который записывает эти шаги, — программист. А сам процесс записи — программирование.
Из чего состоит компьютер (упрощённо)
Чтобы понять, как записывать инструкции для компьютера, нужно знать, из чего он состоит. Полная картина сложна, но для начала достаточно трёх частей:
Память хранит данные и инструкции. Можно представить её как длинный ряд пронумерованных ячеек, в каждой из которых лежит число. В одних ячейках — данные (оклады сотрудников, ставка налога), в других — сами инструкции программы.
Процессор читает инструкции из памяти одну за другой и выполняет их. Он умеет складывать, вычитать, сравнивать числа и решать, какую инструкцию выполнить следующей. Процессор — единственная часть компьютера, которая что-то вычисляет. Всё остальное — хранение и передача данных.
Ввод и вывод — это способ общения компьютера с внешним миром. Клавиатура, файл на диске, сетевое соединение — способы ввода: через них данные попадают в память. Экран, принтер, тот же файл — способы вывода: через них результат попадает к человеку.
flowchart LR I["Ввод<br>(клавиатура, файл)"] --> M["Память<br>данные + инструкции"] M --> CPU["Процессор<br>(выполняет инструкции)"] CPU --> M CPU --> O["Вывод<br>(экран, файл)"]
Этих трёх частей достаточно, чтобы объяснить любую программу: данные приходят через ввод, ложатся в память, процессор обрабатывает их по инструкциям, результат уходит на вывод. Полная картина устройства процессора — в Computer.
Следующий шаг — понять, как программист общается с процессором напрямую: в Ассемблере.
Первая программа
Запишем шаги для задачи «сложить два числа и показать результат». Используем обычный русский язык — процессор его не поймёт, но сначала важно увидеть саму идею:
1. Возьми число из ячейки памяти №1
2. Возьми число из ячейки памяти №2
3. Сложи эти два числа
4. Положи результат в ячейку памяти №3
5. Покажи содержимое ячейки №3 на экранеПять шагов — и задача решена. Каждый шаг элементарен: процессор не складывает «зарплату» и «бонус» — он складывает число из одной ячейки с числом из другой. Слова «зарплата» и «бонус» существуют только в голове программиста.
Для десяти тысяч сотрудников программа будет длиннее, но принцип тот же: каждый шаг — одна элементарная операция. Сложность задачи не в одном шаге, а в том, что шагов тысячи, и каждый должен быть записан правильно.
Как всё начиналось
Идея записывать инструкции для вычислительной машины появилась задолго до первых компьютеров. В 1843 году Ада Лавлейс (Ada Lovelace) описала последовательность операций для аналитической машины Чарльза Бэббиджа — механического устройства, которое так и не было построено при его жизни. Этот набор шагов считается первой программой в истории.
Через сто лет появились электронные компьютеры. ENIAC (Electronic Numerical Integrator and Computer, 1945) занимал целую комнату и программировался вручную: операторы переключали провода и устанавливали переключатели, чтобы задать последовательность операций. Каждая новая задача требовала физической перенастройки машины.
Следующий шаг — хранимая программа: инструкции записываются в ту же память, что и данные. Компьютер читает инструкции из памяти, а не из проводов. Чтобы сменить задачу, достаточно загрузить в память другой набор инструкций. Эта идея, предложенная Джоном фон Нейманом (John von Neumann) в 1945 году, лежит в основе всех современных компьютеров.
Но сами инструкции записывались в виде чисел — единственном формате, понятном процессору. Программа для сложения двух чисел выглядела как последовательность кодов: 0010 0001, 0100 0010, 0001 0011. Каждый код — одна операция, но человеку они ничего не говорят. Чтение, написание и отладка такой программы превращались в мучительную работу с таблицами кодов. Первые люди, пытавшиеся упростить это, назвали читаемые имена для каждого кода — в Ассемблере. Подробнее о двоичной записи — в Двоичная система и байты.
Эта проблема — как сделать инструкции читаемыми для человека, не теряя точности для машины — определила всю дальнейшую историю языков программирования.
Sources
- Dasgupta, S., 2014, It Began with Babbage: The Genesis of Computer Science. Oxford University Press.
- Campbell-Kelly, M. et al., 2013, Computer: A History of the Information Machine. Westview Press.