Владимир Цай - Я нашел смысл жизни: Автореферат мировоззрения с эпизодами автобиографии
Например, если связи номеров сети из 99 пересечений представить множеством фактов типа:
связаны (1, 2),
связаны (2, 5),
…
связаны (9, 17),
……
связаны (81, 99),
то путь через лес можно представить списком номеров – (1, 2, 5, …, 9, 17, …, 81, 99).
Если человек не видит леса с высоты, то он будет искать путь, перебирая все варианты. Этот процесс можно описать следующим образом: найти путь из начального узла в конечный узел равносильно тому, что необходимо дойти до ближайшего доступного узла и затем найти путь из этого ближайшего узла до конечного. Естественно, если из этого ближайшего узла пути нет, то необходимо попробовать другой ближайший узел. Таким образом, перебирая все возможные варианты, можно найти путь через лес, если этот путь существует. Описанное знание можно представить логически:
найти_путь (Начало, Конец, Путь), если связаны (Начало,
Конец), Путь = Начало. Конец. найти_путь (Начало, Конец, Путь), если связаны (Начало,
Ближний) и найти_путь (Ближний, Конец, Путь).
Первое предложение фиксирует тот факт, что если Начало и Конец связаны, то их список и есть искомый Путь. В противном случае во втором предложении выбирается Ближний узел и уже от него строится Путь до узла Конец. Имея перечисленные выше факты и знания, можно задать запрос: найти_путь (1, 99, Путь) и получить соответствующий список номеров.
Если человек видит лес сверху, он может сразу построить путь и в готовом виде ввести его в компьютер. Это равносильно тому, что человек решает задачу и вводит решение в компьютер.
Итак, существует два подхода к программированию компьютера, составляющие основное противоречие программирования – составление программ и представление знаний.
В первом случае инженер знаний представляет знания о ситуации или предметной области в виде предложений на языке логики, используя которые, компьютер выводит необходимый результат. Инженер знаний пытается описать лес со всеми его тропинками в виде набора деклараций, а поиск тропинки, ведущей в необходимое место, оставляет компьютеру. Логический способ представляет необходимость. При таком подходе достигается максимальное обобщение, но время получения решения непредсказуемо.
Во втором случае программист решает задачу и составляет программу (последовательностей команд на алгоритмическом языке), выполняя которую, компьютер получает необходимый результат. Программист находит одну тропинку и представляет ее в виде программы – набора императивов. Алгоритмический способ представляет свободу. Конкретные решения легче представляются алгоритмами, а алгоритм всегда можно эффективно запрограммировать.
Противоречие между составлением программ и представлением знаний составляет основное противоречие между свободой и необходимостью в программировании и является основной причиной развития его методологии.
В настоящее время преобладает составление программ. Основные причины:
– архитектура компьютера до сих пор ориентирована на выполнение программ;
– программа всегда выдает результат намного быстрее, чем любой логический интерпретатор;
– программистов намного больше, чем инженеров знаний, так как для представления знаний требуется более высокий уровень, чем для составления программ;
– практическое использование логического подхода свелось к логическому программированию, основные особенности которого – рекурсия и управление бэктрекингом (сокращение пространства перебора) – сложны в освоении и, к сожалению, существенно снижают именно логическое содержание.
Тем не менее, будущее за балансом между логическим (представлением) и алгоритмическим (исполнением). Хороший программист старается максимально обобщить конкретный случай. С одной стороны, в алгоритмическом программировании доля декларативного постоянно увеличивается, что способствует ограничению свободы в составлении программ и устранению связанных с ней недостатков. Именно декларативность лежит в основе его эволюции, включающей в себя модульное, структурное, объектно-ориентированное, сервис-ориентированное программирование и т. д. С другой стороны, в логические представления вводятся алгоритмические элементы, сокращающие перебор вариантов во время вывода. Они нарушают логику, но позволяют создавать эффективные программы.
Вряд ли Бог стал бы составлять программы поведения для всех объектов – на Его уровне, наверное, можно описать общие законы существования Вселенной, включающие и правила поведения объектов, и принципы эволюции, и даже правила составления программ поведения конкретных объектов и т. д.
Вопрос: чем Бог отличается от программиста?
Ответ: Бог надеется, что он никогда не станет программистом.
Профессиональный опыт
Непрерывной математики я не понимал, и вся моя учеба была практически бесполезной с точки зрения получения полезных знаний – университет дал последний импринтинг интеллекту, без которого молодые люди, попадающие в армию вместо университета, просто тупеют.
На пятом курсе у нас появился новый предмет – программирование для ЭВМ (если бы это было на первом, как теперь, я провел бы пять лет с гораздо большей пользой). Машина была «Урал-2», ламповая, занимала огромный зал, а чтобы ввести в нее программу, надо было замкнутую фотоленту установить на сложное устройство, напоминавшее стиральную машину. Система команд была примитивная, например, для модификации адреса данных внутри цикла приходилось изменять адрес ячейки памяти непосредственно в команде – программа изменяла себя по мере выполнения (какая свобода для творчества!).
Тем не менее, принципы работы компьютера не изменились с тех пор и, соответственно, программирование, несмотря на все современные парадигмы, требует от человека тех же качеств, что и в те далекие годы. Суперпрограммист 60—70-х был бы суперпрограммистом и сегодня.
Программировать я стал сразу. На зачетах писал программы за всех друзей и других желающих. Мне это нравилось и получалось легко. Чисто случайно я попал по распределению в вычислительный центр вместо аспирантуры и фактически почти двадцати пять лет программировал. Это моя профессия.
В 1970 году мне пришлось программировать для ЭВМ «Минск-22» в машинных кодах, и я до сих пор помню систему команд «Минск-22». Например, программа вычисления факториала целого числа N! = N * (N-1) * … * 3 * 2 * 1 выглядит приблизительно следующим образом (аргумент N передается в ячейке 0040, результат N! возвращается в ячейке 0041):
7000) – 10 00 7005 0041 переслать 1 в ячейку 0041 (Здесь будет N!)
7001) – 32 00 0040 0041 умножить 0041 на N (Далее в 0040 будет N–1)
(adsbygoogle = window.adsbygoogle || []).push({});