Логики и стили программирования

Понятие стиля программирования. Базовые концепции языков программирования и их сочетания. Использование операторов goto либо объектов, обменивающихся информацией через общее поле памяти. Функциональный и объектно-ориентированный стиль программирования.

Рубрика Программирование, компьютеры и кибернетика
Вид статья
Язык русский
Дата добавления 02.10.2012
Размер файла 18,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Логики и стили программирования

Современная логика и философия накопила громадный потенциал высокоуровневых понятий, концепций и результатов. Этот потенциал просится в дело. Здесь показано, как он был применен при создании книги к анализу сложнейшей области - современного программирования. Задача анализа в данном случае была затруднена большим объемом информации, изложенной таким образом, что на первый план выступают случайные внешние особенности аппарата. Она облегчалась, во-первых, тем, что в программировании создаются настоящие искусственные объекты, в принципе подчиняющиеся лишь законам классической первоуровневой логики (в первую очередь закону противоречия), и во-вторых, тем, что теория, которая используется для обоснования принятых решений, очевидно и грубо неадекватна, а принципиальное методологическое невежество создателей заставляет их допускать очевидные концептуальные ошибки.

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

Стиль программирования реализуется через методологии программирования, заключающиеся в совокупности соглашений о том, какие базовые концепции языков программирования и какие их сочетания считаются приемлемыми или неприемлемыми для данного стиля. Методология включает в себя, в частности, модель вычислителя для данного стиля.

Методология реализуется через методики, которые состоят из следующих компонент:

a) Поощрение (или прямое предписание) использования некоторых базовых концепций программирования.

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

c) Требования и рекомендации по оформлению и документированию программ.

d) Совокупность инструментальных и организационных средств, поддерживающих все вышеперечисленные требования и рекомендации.

Заметим, что в программировании происходит систематическая `возгонка' понятий. То, что в других местах называется орудием, здесь называется методом; то, что называется методом или методикой, называется методологией; то, что называется методологией, возводится в ранг парадигмы, и т.д. Здесь мы придерживаемся выражений, более адекватно передающих смысл используемых понятий.

Можно выделить, в частности, следующие стили программирования.

Четыре или пять стилей первого уровня:

a) Программирование от состояний;

b) Структурное программирование;

c) Сентенциальное программирование;

d) Программирование от событий;

e) Программирование от процессов и приоритетов;

С программистской точки зрения эти стили различаются по следующим характеристикам.

В программировании от состояний процесс представляется как смена состояний системы. Новое состояние возникает в результате действия, изменяющего старое состояние, а выбор этого действия зависит от проверки условий. Математической моделью программы служит конечный автомат. Инвариантом применимости данного стиля является следующая характеристика задачи:

Действия глобальны, условия локальны.

Естественным способом программирования такой задачи на современных языках программирования является использование операторов goto либо объектов, обменивающихся информацией через общее поле памяти.

В структурном программировании, которому сейчас учат как монопольному первоуровневому стилю, действия и условия локальны. Управляющие действия образуют иерархическую структуру, а потоки передачи данных в принципе должны согласовываться с данной структурой. Этот стиль поддерживается структурами современных традиционных языков программирования (например, Pascal, C). Математической моделью программ являются здесь вычислимые функции.

В сентенциальном стиле (Рефал, Пролог) действия и условия глобальны. Каждый шаг программы проверяет все поле зрения на соответствие образцу, находит тем самым применимое правило преобразования, и, согласно найденному правилу, преобразует все поле памяти.

В программировании от событий и от приоритетов действия локальны, условия глобальны. Условие состоит в том, что в системе произошло некоторое событие, лучшим обработчиком которого оказалось данное действие. Но в программировании от событий такое событие (например, щелчок мыши) снабжает процесс-обработчик важной информацией (например, о месте щелчка). А при программировании от приоритетов событие состоит в том, что все более приоритетные процессы ничего не могут сделать, и никакой позитивной информации активизируемому процессу не дает.

Большинство этих стилей с точки зрения управления соответствуют разным вариантам пропозициональных конструктивных логик. Программирование от состояний соответствует нильпотентной логике. Структурное программирование в первом приближении соответствует фрагменту линейной логики с одной линейной импликацией в формуле. Сентенциальное программирование соответствует интуиционистской логике, ограниченной одной импликацией. Программирование от событий соответствует фрагменту линейной логики, в котором формулы содержат две импликации: внешняя из них интуиционистская, внутренняя находится в заключении внешней импликации и является линейной. Программирование от процессов и приоритетов пока что адекватного логического описания не имеет. Видимо, релевантные логики могут оказаться здесь полезными.

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

Ни один стиль программирования не описывается чисто логически. Это связано прежде всего с наличием в языках программирования фиксированных типов данных, например, чисел. Наличие хотя бы одного фиксированного типа данных вызывает к жизни все затруднения теоремы Геделя о неполноте и парадокса изобретателя. Итак, первый нетривиальный вывод:

Нужно четко разделить композицию понятий и их конструирование. Работу с исходными типами данных нужно помещать в среду суровых ограничений на правила композиции, а там, где требуется создавать сложные структуры понятий, конкретные данные нужно полностью отбросить, имея лишь косвенные ссылки на них через используемые модули низшего уровня. Итак, вычисления и рассуждения концептуально противоречат друг другу.

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

На уровне понятий более высокого уровня возникают другие стили.

Функциональный стиль программирования, когда программа представляет собой функционал высокого уровня, преобразующий функции, представлен языками ЛИСП и ML. Если функции типизированы, то этот подход, сохраняя возможности понятий высших уровней исключительно компактно выразить сложную структуру, вдобавок крайне эффективен по использованию ресурсов. Но нынешние реализации функционального программирования не могут удержаться от использования рекурсий и нетипизируемых конструкций типа оператора вычисления произвольного выражения или оператора неподвижной точки. Это создало функциональному программированию репутацию крайне неэффективного стиля, подходящего лишь для прототипов программ. Функциональному стилю соответствуют интуиционистская логика предикатов (типизированный вариант) и комбинаторная логика (нетипизированный вариант).

Рассмотрение функционального стиля приводит к выводу о губительном влиянии на современную высокоуровневую практику двух факторов. Во-первых, это иллюзия универсальности. Пора рассматривать слова `универсальная система' как нечто подобное философскому камню (как рениксу). Иллюзия универсальности заставляет вводить в систему возможности, губительным образом расширяющие ее. Во-вторых, это игнорирование отрицательных результатов, или, в более общем виде, позитивное мышление и квазирелигия прогресса. Закрывание глаз на теоретические предупреждения никогда ни к чему хорошему не приводит, а их систематическое изгнание из учебных курсов в угоду душевному комфорту и `позитивности' вредно сказывается на способностях к творческому мышлению, один из приемов которого: превратить минус в плюс.

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

Далее, этот стиль великолепно иллюстрирует, как применяется в современной практике принцип Оруэлла «Невежество - сила». Даже там, где известны хорошие решения, принимаются случайные, а влияние монополистов мешает развитию альтернатив.

Вообще, наблюдение за состоянием дел в современном «искусственном интеллекте» и информатике приводит к следующему закону экологии искусственных систем:

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

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

Несколько слов о роли глобализации. Глобализация усиливает монополизацию, в том числе и в интеллектуальной схеме. В связи с этим исключительно интересен пример сентенциального программирования. Этот стиль возник независимо в СССР и на Западе, и созданные его конкретизации оказались ортогональными. При множестве общих черт Рефал и Пролог несовместимы по механизму сопоставления поля зрения с образцом и механизму управления. Если Рефал великолепно приспособлен для &-параллелизма, когда параллельно запускается несколько процессов и результат получается обобщением всех полученных частных результатов, то Пролог столь же великолепно приспособлен к V-параллелизму, когда несколько процессов соревнуются в том, кто быстрее достигнет цели. Ввиду «железного занавеса» обе концепции выжили, встали на ноги, актуальны до сих пор.

Если же рассмотреть, скажем, структурное программирование, то ввиду свободного обмена идеями и единого информационного пространства одна из его разновидностей прочно монополизировала экологическую нишу. В результате развитие параллельных компьютеров сдерживается прежде всего тем, что студентов с самого начала приучают программировать последовательно. Более того, структурное программирование практически задавило совершенно другой, применимый в других условиях, стиль: программирование от состояний. Goto было объявлено вредным оператором. А оно просто плохо совместимо с оператором присваивания.

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

Сейчас видно, что, так же, как абсурдно ставить задачу доказательства правильности программы после того, как программа написана, абсурдно решать задачу распараллеливания написанной на обычном языке программы. Очевидно, что логические системы, соответствующие структурному программированию, после некоторой модификации великолепно описывают модификацию этого стиля, параллельную с самого начала. Но по закону экологической ниши такая модификация уже не могла появиться, тем более, что успехи структурного программирования отнюдь не были мнимыми, и теория, на которую оно опирается, является (редчайшее исключение!) релевантной. Тем самым глобализация сыграла здесь отрицательную роль. А сколько еще подобных случаев, невидимых невооруженным глазом!

Наконец, заметим, что переход к следующему уровню понятий невозможен без запрещения многих методов, действовавших на предыдущем уровне. Но в программировании этому препятствует иллюзия универсальности, конкретизирующаяся в предрассудок совместимости, который заставляет при развитии системы тянуть за собой шлейф концептуально несовместимых устаревших понятий. Случаи, когда от этого предрассудка отказались, считаны.

И ко всему этому я присовокупляю, что пора логике перестать быть разделом математики либо философии, и встать и в педагогике, и в практике на свое место самостоятельной науки высшего порядка, связывающей точное и гуманитарное знание.

Литература

1. Н.Н. Непейвода, И.Н. Скопин. Основания программирования. Ижевск-Москва, РХД, 2003, 926 с.

2. Н.Н. Непейвода. Квазиискусственные объекты. Современная логика-2002. СПб, 2002, стр. 28-30.

3. А.А. Шалыто. SWITCH-технология. СПб: Наука. 1998, 626 с.

стиль программирование язык логика

Размещено на Allbest.ru


Подобные документы

  • Использование объектно-ориентированного программирования - хорошее решение при разработке крупных программных проектов. Объект и класс как основа объектно-ориентированного языка. Понятие объектно-ориентированных языков. Языки и программное окружение.

    контрольная работа [60,1 K], добавлен 17.01.2011

  • Характеристики и свойства языков программирования. Исследование эволюции объектно-ориентированных языков программирования. Построение эволюционной карты механизмов ООП. Разработка концептуальной модели функционирования пользовательского интерфейса.

    курсовая работа [2,6 M], добавлен 17.11.2014

  • Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.

    курсовая работа [275,9 K], добавлен 22.12.2011

  • Основные сведения о языках программирования и их состав. Программа для компьютера. Использование компилятора и операторы. Языки программирования высокого уровня. Концепции объектно-ориентированного программирования. Языки искусственного интеллекта.

    презентация [6,3 M], добавлен 14.08.2013

  • Описание современных языков программирования (Паскаль, Ассемблер, С++, Бейсик, Лого, Форт, Пролог, Рефал и Лекс). Понятие, назначение и составные элементы систем программирования (машинно-ориентированных и машинно-независимых систем программирования).

    курсовая работа [96,3 K], добавлен 18.08.2010

  • Характеристика языков программирования: краткая история, хронология. Основные виды языков программирования: ассемблер; бейсик. Создание и использование формул в Excel. Применение операторов в формулах. Использование функций в Excel. Сайт дома отдыха.

    отчет по практике [139,1 K], добавлен 03.06.2011

  • Характеристика базовых конструкций языков программирования. Изучение истории их развития и классификации. Определение основных понятий языков программирования. Описание основных операторов, которые используются в языках программирования высокого уровня.

    курсовая работа [400,6 K], добавлен 10.11.2016

  • Объектно-ориентированный язык программирования: общая характеристика и свойства. Базовый и производный классы, конструкторы производного класса. Конструкторы и неопределенность при множественном наследовании. Роль наследования при разработке программ.

    курсовая работа [688,3 K], добавлен 23.12.2013

  • История развития языков программирования; создание и распространение языка С++; новый подход к разработке объектно-ориентированного программного обеспечения. Применение моделирования предметных областей для структуризации их информационных отражений.

    реферат [29,1 K], добавлен 06.12.2010

  • История формирования традиционной технологии программирования. Задачи и предмет структурного программирования, как одного из крупнейших достижений в технологии программирования. Подпрограмма, типы управляющих структур. Понятие модульного программирования.

    презентация [1,8 M], добавлен 05.11.2016

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.