От намерения к точным действиям
Во введении мы уже смотрели на интернет-магазин как на пример того, где может работать C#: он умеет обрабатывать заказ — проверять, что выбрал покупатель, и передавать эту информацию дальше. Сегодня стоит разобраться, что вообще происходит в этот момент, потому что за словом «обработать заказ» скрывается целая цепочка.
Представьте: покупатель добавил в корзину два товара и нажал кнопку «Подтвердить заказ». У него в голове в этот момент — простое намерение: он хочет купить именно эти товары именно в этом количестве. Но само по себе намерение ничего не делает. Компьютер не понимает желание купить — он понимает только последовательность точных действий: проверить, что корзина не пуста, посчитать сумму по каждому товару, сложить итоговую стоимость, зафиксировать заказ. Каждое из этих действий должно быть описано настолько однозначно, что не остаётся места для «наверное» или «скорее всего».
К моменту, когда покупатель нажимает кнопку, программа интернет-магазина уже работает: сама кнопка лишь запускает внутри неё нужную последовательность действий — ту самую обработку заказа. Программа как таковая не привязана к этой кнопке: можно представить программу, которая вообще не показывает никакого окна, а просто где-то в фоне обрабатывает уже поступившие заказы один за другим. У неё нет визуального образа, но она всё равно программа, потому что выполняет ту же самую точную последовательность действий.
Значит ли это, что программа сама «понимает» заказ так же, как понимает его человек? Нет — и здесь стоит быть честными. Программа может обработать запрос покупателя, потому что для этого запроса заранее продумана и записана последовательность действий. Но это не то же самое, что понимание человеческой речи или свободное рассуждение о ситуации: применительно к нашей программе обработки заказа это означает, что она выполняет ровно те шаги, которые в ней записаны для этой конкретной задачи, — ни на шаг больше и ни на шаг меньше.
Язык программирования и то, что на нём пишут
А как вообще записать для компьютера последовательность действий вроде «посчитать сумму заказа»? Здесь и нужен язык программирования.
C#, о котором шла речь во введении, — это как раз один такой набор правил.
Пока это просто текст — набор строк, который можно открыть, прочитать, отредактировать, как любой другой текстовый файл. Например, будущий исходный код нашей программы обработки заказа опишет по шагам: проверить корзину, посчитать сумму, зафиксировать заказ. Но одна важная вещь: написать такой текст и заставить его работать — это два разных действия. Само по себе написание кода ничего не делает с реальным заказом покупателя. Заказ по-настоящему обрабатывается только тогда, когда соответствующие инструкции действительно выполняются, а это не обязательно происходит ровно в момент запуска приложения — это может случиться и позже, когда до нужного шага дойдёт очередь.
Получается небольшой парадокс: мы написали текст по правилам языка, но компьютер ведь не читает C# так, как человек читает книгу. Как же тогда исходный код превращается в реально работающую программу?
Как исходный код становится работающей программой
Здесь важно разделить две вещи: то, что понимает процессор компьютера, и то, что понимаем мы, когда пишем код. Процессор — это часть компьютера, которая непосредственно выполняет команды, — но эти команды устроены совсем не так, как строки на C#. Процессор работает с машинными инструкциями — предельно простыми и жёсткими указаниями, которые он способен выполнять напрямую. C# процессор напрямую не выполняет — он его попросту «не понимает» в том виде, в каком мы его написали.
Значит, между исходным кодом и его исполнением должен быть кто-то, кто переведёт один язык в другой.
Стоит сразу предупредить: путь от исходного кода до машинных инструкций не всегда представляет собой один прямой шаг «сразу в машинный код». На практике перевод может проходить через несколько промежуточных этапов — но подробности этого устройства мы оставим для более позднего урока, когда у вас уже будет на руках реальный код, на котором это станет понятнее. Сейчас достаточно знать главное: между текстом, который пишете вы, и действиями, которые выполняет компьютер, всегда стоит перевод, и он выполняется не человеком, а специальными инструментами.
Откуда берутся эти инструменты для C#? Здесь на сцену выходит .NET — платформа, которая как раз и предоставляет всё необходимое для работы с программами на C#: сам компилятор и те средства, которые нужны уже запущенной программе, чтобы она могла работать. Можно сказать проще: .NET — это то окружение, в котором ваш будущий C#-код превращается в реально работающую программу и затем исполняется. В следующих уроках мы установим и увидим эти инструменты на практике, а пока важно только само место .NET в этой картине — посредник между написанным вами текстом и его выполнением.
Два разных вида ошибок на одном и том же примере
Вернёмся к нашему заказу и разберём вопрос, который рано или поздно возникает у каждого: если программа выдала не тот результат, значит ли это, что где-то есть одна и та же по природе ошибка?
Нет, и разница здесь принципиальная. Представим, что при описании шага «посчитать сумму заказа» была нарушена сама запись по правилам языка. Тогда компилятор просто не сможет перевести такой код в исполняемую форму и сообщит об ошибке ещё до того, как программа хоть раз запустится. Это ошибка в допустимости записи: неважно, что именно хотел сделать автор кода, — сама формулировка не соответствует правилам языка.
А теперь другая ситуация: запись полностью корректна с точки зрения правил C#, компилятор её без проблем переводит, программа запускается и даже отрабатывает без каких-либо жалоб. Но при этом, скажем, при подсчёте суммы заказа один из товаров случайно не учли, и итоговая сумма получилась меньше настоящей. С точки зрения языка здесь всё в порядке — ошибки нет. А вот с точки зрения задачи, которую программа должна была решить, результат неверный. Это ошибка в решении задачи, и компилятор о ней ничего не скажет, потому что она не имеет отношения к правилам языка — она имеет отношение к тому, насколько верно замысел человека воплощён в конкретных шагах программы. Заметить такую ошибку можно, сверив полученный результат с изначальным замыслом, а часто и раньше — при внимательном чтении самого исходного кода, ещё до того, как программа выдаст неверную сумму.
Вот почему знать правила C# и уметь правильно решать задачу — это две разные вещи, и обеим предстоит учиться отдельно.
Программа выполняет точные действия, а не понимает намерение человека напрямую; кнопка запускает конкретную последовательность действий внутри уже работающей программы, а не саму программу. Исходный код — текст, написанный по строгим правилам языка программирования; его написание само по себе ничего не меняет — заказ обрабатывается, когда выполняются нужные инструкции. Компилятор переводит исходный код в форму, которую в конечном счёте может выполнить процессор, а .NET — платформа, которая предоставляет инструменты для этого перевода и для работы уже запущенной C#-программы. Ошибка в записи по правилам языка и ошибка в решении самой задачи — два разных вида ошибок: первую находит компилятор ещё до запуска, вторую можно заметить и по итоговому результату, и раньше — сверив замысел с самим исходным кодом.
Теперь программа для нас — не просто окно на экране, а понятный путь от записанных человеком инструкций до действий процессора. Закрепим главные роли в этой цепочке и убедимся, что новые термины не смешались между собой.
От программы до компилятора
Сначала проверим основу урока: что называется программой, зачем понадобился язык программирования и какую работу выполняет компилятор.
Какое описание точнее всего передаёт смысл программы?
Почему процессор не выполняет исходный C#-код напрямую?
Что происходит во время компиляции C#-программы?
Кто за что отвечает
Основные идеи вспомнили. Теперь свяжем каждый новый термин с его собственной ролью, прежде чем собирать весь путь по порядку.
Соотнесите элемент цепочки с его описанием.
Путь C#-программы
Роли больше не смешиваются. Осталось расположить их так, как они действительно включаются в работу — от текста программиста до действия процессора.
Расположите этапы в правильном порядке.
Подсказка
Подсказка: Начните с того, что создаёт человек, а закончите тем, что выполняет процессор.
Объясняем без заучивания
Порядок можно запомнить механически, но важнее увидеть смысл каждого перехода. Теперь ассистент задаст несколько вопросов и при необходимости попросит уточнить ответ, чтобы новые термины действительно сложились в одну картину.
Ответьте на четыре вопроса своими словами. Точные формулировки из урока повторять не нужно — главное правильно передать смысл.
Ответьте на вопросы собеседника и получите итоговую оценку по теме.
Проходной результат: 70%. Попыток: 3.
Начать собеседование