Ильченко Эдуард писал(а):
Абстрактный исполнитель требует своего определения.
Мне он до конца не понятен.
Да вы что, сговорились?
Что такое абстрактное? Это значит, что сформулирован ряд существенных критериев, которым соответствует потенциально неограниченное множество конкретных объектов. У этих объектов есть куча разных свойств, но все они, кроме отвечающих заданным критериям, в данном случае несущественны.
Если мы говорим: "человек может пообедать в кафе" - это означает, что абстрактное (то есть любое) живое существо, отвечающее критерию "человек", может (но не обязано) выполнить абстрактное действие под названием "пообедать в" с абстрактным объектом под названием "кафе".
Кроме того, здесь имеются неявные критерии, которые целесообразно отнести к контексту (или конкретной реализации, в отличие от абстрактной рассматриваемой фразы):
- наличие денег у человека;
- рабочее время кафе;
- меню и вкусовые предпочтения;
- ...
При этом мы абстрагируемся от несущественных критериев (имя, пол и т.п.).
Если мы говорим: "приглашённый может войти в кафе" - получается почти то же самое, только добавляется ещё один явный критерий "приглашение" (и одновременно из контекста исчезает часть - наличие денег).
Получается, что понятие абстрактного не абсолютно, а относительно. Одно выражение по отношению к другому либо снижает, либо повышает степень абстрактности, соответственно меняя размер множества пригодных объектов.
Если мы говорим: "компьютер с процессором Intel i5 может выполнить код для Intel 8080" - мы говорим об абстрактном компьютере, удовлетворяющим критерию "процессор Intel i5", и т.д. и т.п.
Если мы говорим про "компьютер" и "программу на С" - мы повышаем уровень абстракции для исполнителя (при этом расширяется доступное множество объектов). За счёт чего повышается уровень абстракции? За счёт критерия "есть копилятор С в нативный код".
А теперь подойдём немного с другой стороны и будем сравнивать системы команд исполнителей, считая инвариантом наличие программы, которую этот исполнитель может выполнить.
Например, код для процессора 8080 будет проще кода для 386 (прямой совместимости нет, обратная есть). Идя по пути упрощения кода, мы одновременно расширяем множество потенциальных исполнителей.
К примеру, псевдокод IL из стандарта программирования ПЛК является более абстрактным, чем интеловский ассемблер.
Наконец, если мы рассмотрим предельно возможное упрощение системы команд, то получим то, о чём я писал выше: помимо элемента "действие" - обязательность, последовательность и развилка (ОПР). Этой простейшей системе команд соответствует... а что ей соответствует?
Да ей соответствуют все современные процессоры и даже человек с листом бумаги (или даже без, но развитым сознанием)!
Тогда мы имеем не что иное, как крайнюю степень абстракции "системы команд" и, соответственно, исполнителя.
Если мы говорим: "Исполнитель может выполнить программу на языке ОПР", то подразумеваем абстрактного исполнителя, критерием для отбора которого будет знание системы команд ОПР.
Причём
степень абстракции в данном случае максимальна.
В реальности мы используем алгоритмы на языке более сложном, чем ОПР. Например, добавляются операции ввода/вывода (т.е. происходит детализация действий). Степень абстракции при этом, конечно, снижается, но, так или иначе, потенциальное множество исполнителей остаётся куда шире, чем, скажем, для системы команд i8080.
Заметим, что рассуждения с плавным движениям по шкале сложность-простота я производил ДЛЯ ОДНОГО И ТОГО ЖЕ УРОВНЯ системной иерархии.
Причём без всяких дополнительных когнитивных аспектов и заморочек вроде сознания, смысла и описания предписаний!
Так вот, фишка получается в том, что программа на языке, близком к ОПР, очень удачно годится для описания программы на ЯВУ, и может служить для придания ей смысла на верхнем уровне, где тусуется субъект (разработчик, или вообще "восприниматель" из рассуждений Эдуарда).
И вот это самое описание сегодня и называют алгоритмом.
Если же учитывать исторический аспект, то незамутнённый техникой ум математиков уже давно довёл процесс абстрагирования (и упрощения системы команд) до предела, близкого к ОПР - что и было названо алгоритмом.
Так что в равной мере (и даже в первую очередь) следует говорить о поиске оптимальных (эффективных) языков (систем команд и соответствующих исполнителей) для решения конкретных задач, для которых уже есть матмодель и на её основе написан алгоритм (программа на языке, близком к ОПР).
В общем, в итоге предлагаю зафиксировать, что разница понятий "алгоритм" и "программа" возникает при сопоставлении двух соседних уровней, и никак иначе. На одном уровне что "программа", что "алгоритм" - не более чем разные языки.
В дополнение замечу, что прямого взаимодействия уровней через один и дальше обычно не бывает. Так, привычный нам алгоритм как код на языке ОПР вряд ли применим к описанию нативного кода. От одного к другому можно прийти через длинную цепочку последовательных трансляций (детализаций).
Посмотрим, к тому же, что такое ассемблер по отношению к нативному коду?
Сюрприз! Это не что иное, как "описание предписаний", то есть по определению Эдурада - это алгоритм!
Аналогично, программу на ЯВУ можно рассматривать как алгоритм по отношению к ассемблеру, причём соответствие будет уже не совсем тривиальным (ибо пофиг технические детали оптимизации, которые заботят только транслятор).
О чём говорит это рассуждение? Да всего-навсего о том, что алгоритм есть понятие относительное.
С точки зрения субъекта, рассматривающего более низкий уровень - это описание (алгоритм).
С точки зрения объекта - исполнителя текущего уровня - это предписание (программа).
Вот.