Что такое программа?

Программа – набор команд для компьютера (так упрощённо здесь назову комплект из процессор(а|ов), памяти, накопителей, плат расширения и т.п.). При всей современной сложности компьютеров, мы всё так же имеем дело с примитивным по сути своей калькулятором, не умеющим и не желающим (с чего бы ему «желать»? пластина с транзисторами и резисторами) по своей воле что-либо делать.

Калькулятор

(на фотографии, кстати, калькулятор 1957 года, Casio не всегда помещались в карман)

Практическая разница в следующем…

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

Во-вторых, калькулятором вы решаете короткие, быстрые и простые задачи («2 + 2 = ?» – командой здесь будет «сложение»), результат которых пропадает после выключения, компьютер же используется для продолжительных и сложных задач.

В-третьих, у калькулятора к [микро]процессору прилагается клавиатурка и экранчик, да и всё. Компьютер же предлагает едва ли не бесконечный набор подключаемого (и управляемого программами) оборудования – от всем привычного монитора до спутника на орбите (почему бы не представить, что спутник «подключён» к компьютеру ЦУПа не радиосвязью, но длиииииинным кабелем USB (которым вы смартфон подключаете)).

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


Надо сказать, программы (и программирование) эволюционируют вместе с компьютерами.

Когда компьютеры были огромными шкафами с простыми процессорами внутри, программа представляла собою простой по организации поток команд – вот буквально стопка перфокарт с отверстиями или рулон перфоленты с отверстиями. Сначала в тетради пишешь, рисуешь схемы квадратиками, бубнишь под нос. Потом дыроколом дырявишь картон. Относишь в зал. Там твою стопку принимают, скармливают калькулятору стоимостью в десятки миллионов рублей. Обратно приносят тоже картонку с дырками. Романтика! Чертовски неудобная при этом. Но хватало. Всё равно много команд не скормишь.

Перфокарта

(из этих перфокарт отлично плелись кнуты, которыми друг друга гоняли по дворам)

Процессоры стали сложнее, быстрее, наборы команд богаче. Теперь уже как-то грустно дырявить картон по центнеру ежедневно. Люди придумали клавиатуры и мониторы, а ранее сплошной поток команд на выполнение начал делиться на поднаборы команд, отражающие какой-нибудь один алгоритм. Пофантазируйте так…

Вот стопка перфокарт, в ней команды для жарки яичницы. Для удобства посчитаем, что каждая перфокарта – это одна команда, соответственно, разложенные на столе картонки выглядят примерно так.

Яйца

(команды яйцежарочного процессора)

А вот потолще стопка перфокарт, тут и «яичницу пожарить», и «посчитать интеграл», и «оптимизировать налоги за 2020 Q3» – да-да, автор всё это сунул в одну программу, имеет право, он так видит.

Стопка перфокарт

(стопка перфокарт для универсального процессора)

Разделите стопку на три стопки. На первую сверху положите бумажку с надписью «iaitsaZharit», на вторую «integralSchitat», на третью «nalogi2020Q3» – поздравляю, вы организовали исходный код программы в модули, которые в будущем назовут функциями, процедурами, модулями (ага), пакетами, подпрограммами и т.д. И ещё по две бумажки: сверху каждой стопки с надписью «вход» (сюда мы укладываем исходные данные вроде «количество яиц»), а снизу «выход» (результат выполнения вроде «143876 рублей»).

Программа

(фактически программы уже свыше полувека)

Учитывая, что нынче никто (надеюсь) не пишет программы в виде одного сплошного потока команд, мы можем сказать, что программа – это набор команд, организованных в подпрограммы. В конце концов, именно такую организацию кода под разными названиями вы увидите в современных программах, полезнее сразу видеть текст именно так.

Или не можем?


Дело в том, что вот раньше-раньше «программа» и «код программы» (те дырочки на картоне) были одним и тем же. Програмисты программировали в машинных кодах – командами, понимаемыми процессором. Выглядело это грустно, все устали, потому придумали язык ассемблера – спрятали за буквами все эти ‘0’ и ‘1’, теперь команды можно было набирать несколько человечнее.

Стало легче, но всё ещё грустно. Потому команды ассемблера спрятали под ещё более человечными названиями, да ещё и хитрее – теперь одна команда могла скрывать под собою много команд ассемблера, что позволило человечеству оформлять программы текстом (или же кодом по старинке).

Код программы

(чОрный прямоугольник с ножками – чОрная микросхема процессора)

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

Одна и много

(слева Вася написал программу, которая использует написанное Петей справа – прогресс!)

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


Итак, что же всё-таки «программа», если вы смотрите на текст современной (хорошо, на картинке ниже дань прошлому – текст на языке BASIC) программы? Какую формулировку вам правильнее будет приложить к тексту, чтобы понять его лучше?

BASIC

(когда не было JavaScript, сублимировали в BASIC)

Зависит от…

Если вам важно понять, что лежит в основе всего, программа – набор команд (‘0’ и ‘1’) процессору, пусть даже на экране вы видите понятные слова. После того, как специальные инструменты подготовят этот текст для исполнения, слова превратятся в цепочки ‘0’ и ‘1’.

Если проблемы железа вас не волнуют, программа – текст на одном или более языках программирования.

Если вы читаете Википедию, программа тоже в двух вариантах:

1) комбинация компьютерных инструкций и данных, позволяющая аппаратному обеспечению вычислительной системы выполнять вычисления или функции управления (стандарт ISO/IEC/IEEE 24765:2010);
2) синтаксическая единица, которая соответствует правилам определённого языка программирования, состоящая из определений и операторов или инструкций, необходимых для определённой функции, задачи или решения проблемы (стандарт ISO/IEC 2382-1:1993).

Кхм. Ну а что, вполне понятно и доступно написано, да.

Наконец, если вы работающий программист, написавший не одну программу, программа – комплекс из 1) исходного кода на N языках программирования, 2) ресурсов (картинки, например), 3) сценариев сборки, тестирования, копирования на сервера и т.п., 4) возможно, документации, 5) чего-нибудь ещё. И всё это работает на множестве компьютеров. Представьте, что поиск Google – это тоже программа. Представлять её набором команд правильно, но бесполезно.