Category: отзывы

Category was added automatically. Read all entries about "отзывы".

RB32-2. Ортогональная система языков в проекте "Роса"

Начало заметки см. RB32-1.

Базовый язык-микроядро

Проф. Вирт, на мой взгляд, очень верно нащупал важное направление развития инструментария. В то время как все помчались насыщать языки всё новыми могучими средствами и переносить центр тяжести на графические среды, он понял, что идти надо в противоположном направлении. Вычленяя квинтэссенцию и вынося за рамки компетенции данного языка паразитную нагрузку. Это напоминает выделение в наборе команд процессора базового минимума, из которого строится остальное (RISC), напоминает идею микроядра ОС (в противовес моноядру), напоминает Форт-системы… Микроядро - это один из важных принципов создания программных и технических систем. Чтобы подчеркнуть эту аналогию, я решил использовать название "микроядро" в отношении как языка, так и ортогональной системы языков.

Оберон - это удачный вариант микроядерного языка традиционного императивного программирования, ориентированного на самую распространённую процессорную модель Эккерта-Неймана. Другим языком-микроядром можно назвать классический Си. Отличительной особенностью Оберона является сбалансированность языка, опирающаяся на принцип концептуальной экономии и внутреннюю ортогональность: механизм расширения типов (type extension), обобщение процедур (процедурные типы), концепция модуля.

Вообще говоря, число языков-ядер (не обязательно микроядер) существенно меньше общего числа языков, но тем не менее представляет возможности выбора с учётом исповедуемого ими понятийного пространства (так или иначе отражаемого в парадигмах языков). В дополнение к упомянутым Оберону и Си можно отметить классику (а не современные вариации): Лисп, Рефал, Пролог, Форт, Smalltalk, Паскаль, Occam.

Графические средства, ориентированные в большей степени на человека, очень полезны (особенно для общения людей между собой), но как только мы вспомним о том, что человеческий фактор является ахиллесовой пятой контроля сложности, то поймём, что чувство меры здесь должно превалировать над желанием облегчить труд. Мы нередко тем самым облегчаем труд создания новых сложностей. Автоматике нужны языки и совсем не графические. Графика (в широком смысле) - это просто удобная форма, позволяющая человеку на том или ином участке работы. Мы внимательно изучаем это направление прежде всего с точки зрения поддержки языков спецификаций и моделирования. Для каждого формального "графического" языка у нас будет соответствующий текстовый эквивалент. Мы изучаем самые разные варианты на сей счёт. Отечественные ДРАКОН(ы) для разработки программного обеспечения отечественного "Бурана" и других масштабных космических проектов - лишь один из изучаемых вариантов. Впрочем, история их создания весьма интересна и с ней стоит поближе познакомиться.

Но вернёмся к языку-микроядру, к языку-чемоданчику под названием Оберон. Каким бы замечательным и компактным ни был язык-чемоданчик, он не в силах адекватно решать все проблемы. И здесь не стоит впадать в крайность - обожествлять язык. Давайте смотреть правде в глаза: Вирт со своей командой из ETH Zurich во многом абстрагировались от проблемы коллективной работы многих десятков специалистов над одним проектом. Система Oberon (да и BlackBox, хоть и в меньшей степени) - это системы индивидуального программирования. "Эгоцентрические". Не удивительно, что Вирт и его коллеги не заморачивались проблемами масштабирования разработки (а тем более, промышленной разработки). Сам язык Оберон (включая и его последующие диалекты), ушедший от приоритета интерфейса и полноценного разделения модуля на интерфейс и реализацию (как было в Modula-2), сделал шаг в направлении эгоцентризма. В результате процесс перевернулся с ног на голову: интерфейс стал результатом того, что разметили в реализации. Тогда как в распределённых коллективах (да ещё в тех задачах, которые делаются не под кальку) нужно жёсткое фиксирование интерфейсов (в первую очередь) и вариативность реализаций под тот же интерфейс (во вторую). Впрочем, внести соответствующие коррективы в тот же BlackBox не столь трудно.

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

Поясню свою позицию. Меня удивляет, когда начинают возводить в абсолют инструмент и отвергать всё остальное. Зачем? Вопрос квалификации и умения грамотно оперировать разными инструментами (понимая их сильные и слабые стороны). Маргинальность, оторванность от масс произрастает из попытки навязать непременно своё (пусть самое лучшее), отвергая привычное. Это, на мой взгляд, тупиковый путь. Поясню и то, что понимаю под словом "эгоцентризм" в отношении Оберона: это попытка сделать Оберон центром мироздания. Вирт просто (ради научного интереса) облегчил себе жизнь (и решил задачу получения минимального, полезного, универсального языка весьма элегантно). Он облегчил жизнь и многим программистам-индивидуалам, особенно "непрофильным" (физикам, биологам, астрономам и т.п.). Но осложнил программистам, которые должны работать в большой команде на современном производстве ПО. Впрочем, он и не мог этим заниматься, поскольку надо знать соответствующие потребности и иметь немалое число разработчиков-исполнителей. Я рассматриваю Оберон вполне прагматично. Это хорошее приближение к идее языка-ядра (даже микроядра). А чем меньше "паразитных" связей, тем более устойчивее система. И тем дольше она проживёт в мире постоянных изменений.

Оберону нет смысла лезть туда, куда их просто никто не пустит - в "жирную" инфраструктуру, созданную Microsoft, Sun, IBM и др. Но это и не надо. Во-первых, он может её "нагло" пользовать. Во-вторых, он может применяться в качестве универсального чемоданчика с инструментами для программиста-индивидуала. В-третьих, он показывает себя во всём блеске там, где инфраструктуры нет (наш проект).

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

Эти слова следует распространять и на инструментарий (языки), и на саму ОС. Нужен наращиваемый базис. При этом сам базис должен быть тщательно продуман и сбалансирован. Это лежит в русле идеи настраиваемых (конфигурируемых, адаптируемых) сущностей и систем.

Но Оберон - не панацея (для программирования в целом). Потому после многих лет исследований разных языков (включая реализацию в 1980-х годах языковой системы "Модула-Пролог" с примкнувшим к ним Лиспом) я пришёл к идее ортогонального базиса языков (сбалансированный набор взаимодополняющих, минимально пересекающихся в понятийном пространстве - языки-ядра разных парадигм). Нельзя сказать, что ортогональность как внутри языка (по концепциям и средствам), так и между языками - откровение в программировании. В той или иной мере этот принцип использовали ранее. Но в том виде и контексте, как это задумано для нашего проекта, - подход весьма нешаблонный. Просто идея ортогональности, воплощённая Виртом в одном языке (внутренняя ортогональность и сбалансированность классического Оберона), развивается в сторону языков-ядер (внешняя ортогональность и сбалансированность системы языков). Развивается в понимании того, что синтаксис - не просто внешняя форма, во многом он связан с семантикой, и только в такой органичности может давать существенный выигрыш в процессе программирования. Иными словами, не надо парадигмы и разнообразные конструкции языков затаскивать в один синтаксис. Это прокрустово ложе. Оно отсечёт немало ценного и полезного. При этом желательно иметь чувство меры. Если создаются новые диалекты известных языков, которые планируется объединять в устойчивые языковые системы, то по возможности нужно нивелировать синтаксические расхождения. Хотя это тонкая, непростая работа.


Понятие ортогональности

В контексте вопросов, поднятых в этой заметке, хотел бы обратить внимание читателя на одну статью 10-летней давности известного в мире специалиста - Луки Карделли (Luca Cardelli).

Несколько слов о нём. Итальянец. Получил европейское образование в университете Эдинбурга (Шотландия), затем попал в знаменитую AT&T Bell Labs (1982-1985), откуда перешёл в крупнейший исследовательский центр некогда могущественной корпорации DEC (DEC Systems Research Center), где проработал с 1985 по 1997 гг. После развала исследовательской базы DEC был приглашён 1997 г. в новоявленный исследовательский центр Microsoft Research (европейское отделение в Кембридже). Там он ныне является ведущим научным сотрудником и возглавляет группу по инструментам и принципам программирования (Programming Principles and Tools), а также группу по информационной безопасности (Security), совмещая эту деятельность с преподавательской (приглашённый профессор в ряде университетов). Начинал с реализации компилятора для функционального языка ML. В свете нашего проекта важно учитывать его большую роль в проектировании языка Modula-3 (1986-1995), который стал развитием идей виртовской Модулы-2 (прообраза Оберона) и неафишируемым внутренним языком разработок в Xerox, DEC и Olivetti.

Обратимся к его статье. Она называется "Неудачные инженерные качества ОО-языков" ("Bad Engineering Properties of Object-Oriented Languages" // ACM Computing Surveys, December 1996). Статья написана через 15 лет после шумной рекламной кампании Smalltalk, в эпоху доминирования C++ в этой сфере и на фоне едва народившейся Java, создавшей основу для разработки C#. На фоне примерно 5-летней практики не известных широкой общественности, родственных языков Eiffel (1986), Оберон (1988) и Modula-3 (1988).

Карделли пишет: "Парадигма объектно-ориентированного программирования (ООП) вышла из эпохи 1960-х годов, примерно в то самое время, когда такие важные понятия, как абстрагирование данных, полиморфизм и модуляризация уже применялись для парадигмы процедурного программирования. В конечном счёте, ОО-языки вобрали в себя эти понятия, но не таким образом и не столь эффективно. За последнее десятилетие ОО-языки нашли широкое применение в качестве инженерного инструментария благодаря своему преимуществу в отношении гибкости программного обеспечения, которая является критическим инженерным свойством. Значительная, всё возрастающая часть программной инженерии теперь выполняется в ОО-языках, вытеснив из этой ниши традиционно там доминировавшие процедурные языки. Однако, ОО-языки не воплотили в себе все те инженерные решения, которые были успешно проработаны в процедурных языках. В частности, они делают упор на обобщении кода в ущерб модуляризации и на динамическом контроле в ущерб статическому.

Лука Карделли выделил в этой статье пятёрку неформальных метрик для оценки качества языка программирования:
1. Экономия выполнения, Economy of execution (как быстро работает программа).
2. Экономия компиляции, Economy of compilation (сколько времени занимает переход от исходных текстов к исполняемому коду).
3. Экономия индивидуальной разработки, Economy of small-scale development (насколько тяжело работать с языком программисту-индивидуалу).
4. Экономия коллективной разработки, Economy of large-scale development (сколь трудно работать с языком команде программистов).
5. Экономия выразительных средств языка, Economy of language features (сколь трудно изучить и использовать язык).

Карделли отмечает: "Языки, ориентированные на прототипы (Prototype-based languages), уже пытаются уменьшить сложность языков, ориентированных на классы (Class-based languages), путём предоставления более простых, более композиционно удобных средств. Даже в рамках ориентированных на классы языков мы теперь имеем лучшее понимание того, как достичь простоты и ортогональности, но многое ещё остается сделать".

Карделли в своей статье высказал важную мысль: "Ортогональность средств языка уменьшает сложность языков программирования". Мысль, которую давно осознал проф. Вирт, продемонстрировавший миру практическое её воплощение.

Небольшой терминологический комментарий. Важно делать различия между обобщающим понятием объектоцентрического языка (object-based language, где объекты просто поддерживаются на уровне сущностей языка) и уточняющими понятиями классоцентрического языка (class-based language, где каждый объект должен быть отнесен к определенному классу) и объектно-ориентированного языка (object-oriented language, где к иерархии классов добавляется наследование). Группа языков, ориентированных на механизм делегирования (Delegation-based languages), включает в себя и языки, ориентированные на прототипы (Prototype-based languages). Прототип рассматривается как объект, который одновременно является экземпляром и шаблоном. Детально это изложено в статье 20-летней давности "Dimensions of Object-Based Language Design" // OOPSLA'87, написанной Питером Вегнером (Peter Wegner), профессором университета Брауна (Brown University, США).

Наряду с этим Вегнер дает определения понятиям "согласованность" (consistency) и "ортогональность" (orthogonality) в отношении языка программирования (я это называю внутренней согласованностью и внутренней ортогональностью).

Согласованность. Набор языковых средств является согласованным, если они могут сосуществовать, т.е. если существует "язык-модель", который реализует эти средства.

Ортогональность. Набор языковых средств является ортогональным (независимым), если для каждого подмножества средств существует язык, который обладает этим подмножеством и не имеет средств в дополняющем подмножестве.
Вегнер пишет: "Объекты, классы и наследование далеки от ортогональности. Классы определяются через объекты, а наследование, в свою очередь, через классы..." Очевидно, что подобные понятия согласованности и ортогональности можно распространить на интегрированные наборы/системы языков и говорить, в частности, о внешней ортогональности (в системе интегрированных языков).



Архитектура ортогональной системы языков

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

Надо отметить, что предпосылки к подобной ортогональной схеме были заложены как минимум 30 лет назад. Речь идет о знаменитом исследовательском центре Xerox PARC, колыбели многих важнейших достижений в области аппаратного и программного обеспечения. В рамках проекта Cedar осуществлялась интеграция базового языка системного программирования (Mesa/Cedar) со средствами взаимно дополняющих языков - Лиспа (Interlisp-D) и Smalltalk. Только это был единый язык (Cedar), который сращивался со средой (Cedar). Дополнительную информацию можно найти в материалах, опубликованных на сайте Европейского центра программирования - http://www.europrog.ru/ilog.html#210207

После годовой командировки Вирта и Гуткнехта в Xerox PARC (в начале 1980-х годов) проект Cedar и стал отправной точкой проекта Oberon.

Разумеется, в отборе кандидатов основных языков в нашей ортогональной системе не последнюю роль играют не только их технологические качества и уровень сбалансированности при интеграции, но и перспективы языков (с прицелом на 5-7 лет), нынешняя популярность этих языков, наличие понятных спецификаций и открытых реализаций). Компромисс реализуется через принцип "базис-надстройка".

На одном из интернет-форумов я уже в шутку говорил, что "Роса" - это будущий кровопивец с милым и ласковым названием. Он присосётся к армии Си и UNIX-разработчиков (к Linux), к Java-сообществу, к Haskell-сообществу, к Python-сообществу. Подтянет их к себе (новое - это всегда интересно и приковывает внимание). При этом даст им в руки действительно новый инструмент. Весьма и весьма полезный. Технологичный, открытый, бесплатный, без ограничений на коммерческое использование... Для каждого из этих миров появится масштабируемая перенацеливаемая ОС, которая фактически предложит солидную, продуманную подпорку их ран-таймов. Через них пойдут на общих основаниях и остальные языки.

Попутно будет заметно улучшен инструментарий BlackBox (поскольку станет основой для макетирования нашей ОС и трамплином для запуска базиса). Т.е. его модернизация (или даже кардинальная переработка) будет практически востребована масштабным проектом.

Открытая разработка в течение длительного времени позволит создать хорошие подъездные пути к новой ОС и подготовить будущих разработчиков приложений для "Росы" к такому переходу. Для языков ортогонального базиса будет создан инструментарий нового поколения, более сильный, нежели существующие в индустрии сегодня. С возможностями использования приложениями "бортовых" микро-ОС (как в случае BlackBox). Мы будем некоторое время сохранять альтернативу Лисп-Рефал, хотя всё идет к тому, что в нашем ортогональном базисе из этих двух кандидатов будет в итоге выбран именно Рефал.

UNIX-программисты заполучат уникальные средства мультипрограммирования и компонентного программирования, которые они до этого не имели. Как известно, всё познается в сравнении. И новое - особенно. Выделенные в мэйнстриме технологические зоны прорыва (UNIX, Си, Haskell, Python) помогут встать новой ОС и её инструментарию на ноги. А потом - путем мягкой миграции (совмещения старого и нового) - заполучить много новой крови для своего развития.

Поясню планируемую структуру ортогональной системы языков в "Росе".

Ортогональный базис (Rosa-M, Rosa-R, Rosa-S, Rosa-T):

  • M - язык низкоуровневого программирования (близкий к классической Модуле-2, псевдомодуль SYSTEM сливается с языком, нет классов/объектов и сборки мусора);
  • R -  язык программирования с расширяемыми типами (близкий к классическому Оберону, есть сборка мусора, псевдомодуль SYSTEM исключается из Оберона, его роль переходит к M);
  • S - язык ООП (близкий к классическому Smalltalk Алана Кея);
  • T - язык метавычислений (близкий к Рефалу В.Ф.Турчина).

    В качестве настройки фундамента (M) на разные процессорные архитектуры (включая виртуальные процессоры) всесторонне изучается вариант использования диалекта классического Форта (Forth); это пятый язык базиса: Rosa-F.

    Основными языками системного программирования будут M и R (последний отражает в названии первую букву ОС - Rosa). Язык M близок по уровню работы к Си. Возможности препроцессорной обработки (и не только) возлагаются на язык T (+ специальные сервисные средства в поддержку удобства трансформации исходных текстов). Язык S в максимальной степени заточен под работу с ООП (в классике - динамическое связывание через интерпретацию сообщений).

    M и R - не ортогональные языки: это двухэтажный вариант одного языка, герметизация низкоуровневых средств. Это как нож (M) и вилка (R). Они под рукой. Кому-то удобно пользоваться одной вилкой. Но нож - всегда на столе. Один и тот же программист реализует нужный ему низкоуровневый функционал на M и просто импортирует в R. Сам. Может попросить коллегу. Если сущности (в разных гранях) можно разнести по отдельным языкам (напр., нижнего, среднего и верхнего уровня), то "протаивание" сущностей с новыми отношениями (операциями) над ними в другом понятийном пространстве позволит добиться герметичности (по надёжности и контролю сложности), которая сродни герметичности отсеков подводной лодки. Здесь нужно иметь чувство меры. Один язык, в который впихивается всё - это крайность (опять же учитывая разделение труда в промышленном производстве ПО). Разбиение на множество языков - это введение соответствующего числа понятийных уровней. В нашем случае пока видится оптимальным вариант из трёх уровней - "железячный" (M), алгоритмический (R) и архитектурный (Metasys), со скрытым уровнем настройки на "железо" (F). Язык Metasys во многом служит основой интеграции и прокладывает мостик к композиции с сущностями других языков.

    При импорте сущностей источник импорта из другого языка будет префиксироваться именем соответствующего языка реализации. Обработка исключений (с учетом её косвенной формы через настраиваемое поведение ASSERT-инвариантов) будет фундаментом всех языков ортогонального базиса.

    На системном уровне будет задействована пара "Оберон-Рефал" (наши диалекты этих языков). При этом Рефал будет нести на первых порах минимальную нагрузку - он понадобится для различных сценарных вещей и высокоуровневых (мета)манипуляций. Несмотря на всю свою простоту его реализация таит массу подводных камней (по эффективности и тюнингу движка). Рефал рассматривается нами как альтернатива Лиспу (и Прологу). Кроме того, хорошо зарекомендовавшая себя технологически схема "Ада-Лисп", используемая в NASA и в Минобороне США, очевидно имеет у нас иное, микропредставление - "Оберон-Рефал". По Рефалу надо понимать, что многие задачи можно на нём решать, имея в виду возможность почти мгновенного расширения языка за счёт встроенных функций, реализованных на Обероне (M+R).

    Синтаксис языков. Вводится модель вариативного синтаксиса. Для M и R, в частности, поддерживаются как равноправные Паскаль-подобный синтаксис (Модула-2, Оберон) и Си-подобный синтаксис. Автоматически (нажав конпку) можно переключиться из одного представления синтаксиса в другое. В отношении зарезервированных слов/идентификаторов поддерживаются два варианта: верхний регистр (MODULE) или нижний регистр (module). Допускается смешение в одном модуле разных режимов выделения зарезервированных слов (будут выделяться за счет настройки среды программирования). Альтернативные формы синтаксиса смешиваться в одном модуле не могут.

    Синтаксис языка T (назван в честь Турчина, автора Рефала) будет переработкой синтаксиса Рефала. Семантика в основе своей будет сохранена. Язык S по семантике будет близок Smalltalk, но синтаксис планируется вариативный.

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

    Следующий ортогональный уровень (надстройка): Haskell, Java, Python. Он также приводится к единой основе (кластерам). Оперирование композицией экспортируемых сущностей - через Metasys. Metasys будет отвечать и за высокоуровневую хинтовку параллельного (асинхронного) программирования, а также за контроль инвариантов и протоколов, фиксируемых на уровне интерфейсов.

    При проработке описания параллелизма/асинхронности учитывается опыт языков БАРС и ПОЛЯР из проекта МАРС (Модульные асинхронные развиваемые системы, 1985-1988, ВЦ СО АН СССР, ВЦ АН СССР, Институт кибернетики Эстонской ССР, НПО "Импульс") и используемый там механизм управляющих сетей (модификация сетей Петри).

    Таким образом, распределение языков по уровням ОС видится примерно таким:

  • Микроядро: M
  • Ядро: M, R, Metasys
  • Сервисный уровень: M, R, S, T, Metasys
  • Прикладной уровень: R, S, T, Java, Haskell, Python, Metasys.

    Новый язык R (преемник классического Оберона) намеренно идёт по пути ужесточения ограничений, по пути повышенной надёжности, герметизации.

    Важная особенность - все языки-ядра ортогонального базиса (M, R, T, S) имеют технологическую независимость от внешних лиц и организаций. Они будут находиться полностью под нашим контролем. Это наши языки (диалекты) и наши реализации. При этом переход на них с языков-оригиналов достаточно прост (близки и по синтаксису, и по семантике), возможна и реализация соответствующих миграционных конверторов. Мы минимизируем риски. Критериями модификаций исходных языков будет устранение "заусенцев", избыточных при интеграции в ортогональном базисе, а также выделение интерфейсных (общих базовых) сущностей (в контексте экспорта-импорта).

    Развитие языков прикладного ортогонального уровня (Haskell, Java, Python - где степень ортогональности много слабее базовой четвёрки) находится вне нашей компетенции. А потому мы будем брать под контроль мониторинг их эталонных открытых реализаций, синхронизацию публичных релизов с нашей реализацией. Будем вырабатывать механизм быстрого погружения нового релиза в нашу ортогональную систему.

    Каждый прикладной язык этой тройки будет снабжен охватывающей сущностью высшего уровня (программным кластером). Безопасность их работы будет обеспечиваться виртуализирующим слоем. Он имеет как вариант трансляции исполняемого кода в набор команд виртуального процессора (саркофаг), так и перенацеливаемую форму представления (не обязательно схема семантического словаря Михаэля Франца), которая может на лету конкретизироваться под целевой процессор (включая виртуальный). При этом перенацеливаемая форма может статически анализироваться на предмет безопасности выполняемых действий. Аналогичные шаги будут предприняты в отношении языка Си, который будет обеспечивать POSIX-шлюз совместимости с UNIX.

    Если программисту нужны свои любимые языки (как-то C++, C#, Ada и др.) - вполне вероятно, что со временем они появятся в "Росе". Просто наша группа ими заниматься не планирует по целому ряду причин. У нас два уровня языков - свой (M, R, S, T, F, Metasys) и для массового разработчика (Java, Haskell, Python, Си).

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

    На этапе макетирования новой ОС мы планируем параллельно прорабатывать и реализовывать новые языки (2-3 года) и писать на Компонентном Паскале в среде BlackBox (диалект Оберона, адаптация в направлении Java) с учётом продвижения по линии новых языков. Подробная информация об инструментальной системе BlackBox представлена в центре компетенции BlackBox в России (компания "Метасистемы", г.Орёл) - http://www.oberoncore.ru/ С имитацией языка M на стадии макета успешно справится XDS Modula-2 новосибирской компании Excelsior, созданной участниками проекта МАРС. Эта система программирования оттачивалась для заказных работ с крупнейшими телекоммуникационными компаниями мира и в ходе реализации отечественного проекта СОКРАТ, результаты которого многие годы успешно применяются в НПО Прикладной Механики им.М.Ф.Решетнева, для разработки бортового программного обеспечения российских спутников связи (система Глонасс).

    RB30-3. В.Ф.Турчин, теория метасистемных переходов и метасистемное программирование

    Начало заметки см. RB30-1.
    Продолжение заметки см. RB30-2.

    После изучения ряда позабытых работ у меня возникла идея выделить особое направление в программировании, которое затрагивало бы (объединяло в определённом аспекте) теоретическое, системное и прикладное программирование в контексте синтеза и анализа программных систем. Термин "метасистемное программирование" подсказала книга Валентина Фёдоровича Турчина "Феномен науки. Кибернетический подход" (1970). Продолжим изучать субъективный срез по этой книге применительно к термину "метасистемное программирование".

    ------


    Метасистемный переход

    Постепенно мы подошли к ключевому моменту в теории Турчина.

    Вот как он разъясняет суть трансформации систем в ходе их эволюции: “Описание следующих этапов развития нервной системы мы будем проводить в плане более феноменологическом. Для этого нам надо подытожить результаты исследования механизма эволюции на ранних этапах в терминах общих кибернетических понятий. Начав думать в этом направлении, мы легко обнаружим одну общую черту в переходах от низшего этапа к высшему. А именно: все эти переходы совершаются следующим образом. На каждом этапе биологическая система имеет подсистему, которая может быть названа высшим управляющим устройством и которая имеет наиболее позднее происхождение и наиболее высокую организацию. Переход на следующий этап происходит путём размножения этих подсистем (путем многократной редупликации) и интеграции их, т.е. объединения в одно целое с образованием (по методу проб и ошибок) системы управления, во главе которой стоит новая подсистема, которая теперь является высшим управляющим устройством нового этапа эволюции. Систему, состоящую из управляющей подсистемы Х и управляемых ею многих однородных подсистем A1, A2, A3,… мы назовём метасистемой по отношению к системам A1, A2, A3,… Переход с этапа на этап мы назовём, следовательно, метасистемным переходом (рис. 3.1).


    Это понятие будет играть решающую роль в последующем изложении. Метасистемный переход создает высший уровень организации — метауровень по отношению к уровню организации интегрируемых подсистем. С точки зрения функциональной метасистемный переход состоит в том, что деятельность, являющаяся управляющей на низшем этапе, становится управляемой на высшем этапе и появляется качественно новый (высший) вид деятельности, заключающийся в управлении деятельностью. Редупликация и отбор приводят к созданию необходимых структур. Первый метасистемный переход, который мы усматриваем в истории животных, это возникновение движения. Интегрируемыми подсистемами являются части клетки, обеспечивающие обмен веществ и размножение. Положение этих частей в пространстве до поры до времени случайно, неуправляемо. Но вот появляются органы, соединяющие остальные части клетки и приводящие их в движение: клеточная мембрана, реснички, жгутики. Происходит метасистемный переход, который можно определить формулой (1) "Управление положением = Движение".

    На этом этапе движение неуправляемо, никак не коррелировано с движением внешней среды. Сделать его управляемым — следующая задача природы. Управлять движением — значит сделать его определённой функцией состояния среды. Так возникает раздражимость — изменение состояния каких-то участков клетки под действием внешних факторов и распространение этого изменения на другие участки, в частности обеспечивающие движение. Итак, формула метасистемного перехода от второго к третьему этапу такова: (2) "Управление движением = Раздражимость".

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

    Здесь необходимо указать на одну важную черту метасистемного перехода. Когда интегрируемые подсистемы объединяются в метасистему, то вследствие разделения функций между ними происходит их специализация, т.е. приспособление к определённой частной деятельности и утрата способности к другим видам деятельности. Специализация особенно отчётливо проявляется при интеграции целых организмов. Каждая интегрируемая подсистема содержит в этом случае много «лишнего» того, что было необходимо ей для самостоятельной жизни, но не нужно в сообществе, ибо соответствующие функции выполняются другими подсистемами. Так, в многоклеточном организме появляются специализированные мышечные и нервные клетки. Вообще надо отметить, что интеграция подсистем отнюдь не является концом их эволюционирования. Нельзя представить дело таким образом, что системы A1, A2, A3, … размножаются в больших количествах, после чего «над ними» вдруг возникает управляющее устройство X. Напротив, зачатки системы управления образуются, когда число подсистем Ai невелико — всего несколько штук. Только при таком условии, как мы видели выше, может работать метод проб и ошибок. Уже после того, как наметилась управляющая подсистема X, происходит массовая редупликация подсистем Ai, в процессе которой совершенствуются как Ai, так и X. Возникновение структуры управления подсистемами Ai, не завершает, а вызывает бурный рост числа подсистем Ai, и предшествует ему, ибо при этом размножение Ai, становится нужным для организма. Носитель определённого уровня организации разрастается лишь после того, как начинает образовываться новый, более высокий уровень. Эту черту можно назвать законом разрастания предпоследнего уровня. Поэтому и при феноменологическом функциональном описании метасистемный переход проявляется не тотчас же вслед за закладкой нового уровня, а несколько позже, когда предпоследний уровень «войдёт в силу». Метасистемный переход всегда затрагивает два уровня организации.

    Продолжим наш обзор этапов эволюции. Применим принцип метасистемного перехода к уровню раздражимости. На этом уровне возбуждение каких-то участков одноклеточного организма или специализированной нервной клетки в многоклеточном организме происходит непосредственно внешней средой и это возбуждение непосредственно (один к одному) вызывает возбуждение мышечной активности. Что может означать управление раздражимостью? Очевидно, создание нервной сети, элементы которой, в частности эффекторы, возбуждаются не прямо внешней средой, а через посредство сложной управляющей системы. Это тот этап эволюции, который мы связали с понятием сложного рефлекса. Особенно отчётливо виден факт управления раздражимостью на этом этапе в том, что при наличии цели возбуждение эффекторов зависит не только от состояния внешней среды, но и от этой цели, т. е. от состояния каких-то внутренних нейронов сети. Итак, формула этого метасистемного перехода (от третьего к четвертому этапу): (3) "Управление раздражимостью = Сложный рефлекс".
    <…>
    Управление рефлексами надо понимать как создание под действием индивидуального опыта любых переменных связей между этими объектами. Такие связи называют ассоциациями представлений или просто ассоциациями. Термин «представление» понимается здесь в широком смысле — как состояние любых подсистем мозга, в частности классификаторов и эффекторов. Образование ассоциаций мы будем называть ассоциированием (терминология тяжеловатая, зато точная). Итак, пятый этап эволюции — этап ассоциаций. Формула метасистемного перехода на этом этапе: (4) "Управление рефлексами = Ассоциирование".
    <…>


    Понятия рефлекса и ассоциации — не структурные, а функциональные понятия. Связь между стимулом S и реакцией R в рефлексе (рис. 3.2) — не передача информации от одной подсистемы к другой, а переход из одного обобщенного состояния в другое. Это разграничение необходимо, чтобы не смешивать рефлекс как определённую функциональную схему, описывающую поведение, с воплощением этой схемы, т.е. с кибернетическим устройством, обнаруживающим эту схему поведения.

    Путаница легко может возникнуть, ибо простейшее воплощение рефлекторного поведения имеет структурную схему, совпадающую по внешности со схемой на рис. 3.2, только под S и R надо в ней понимать материальные подсистемы, фиксирующие стимул и реакцию. Такое совпадение не совсем случайно. Как мы уже говорили при определении функциональной схемы, разбиение множества всех состояний системы на подмножества, приписываемые вершинам графа, тесно связано с разбиением системы на подсистемы. В частности, с каждой подсистемой, которая может находиться в двух состояниях («да» и «нет»), можно связать множество всех состояний системы в целом, при которых эта система находится в определённом состоянии, скажем «да». Проще говоря, при определении обобщённого состояния мы учитываем только состояние данной подсистемы, а что делается с остальными подсистемами, нам безразлично".


    Ассоциации представлений

    Что есть ассоциация, ассоциирование? Как возникают ассоциации представлений?

    Турчин пишет: “Поскольку с каждым классификатором можно связать одно или несколько обобщённых состояний, иерархии классификаторов соответствует иерархия обобщённых состояний. Вводя понятие классификатора, мы указываем, что каждому состоянию классификатора (теперь мы можем сказать: каждому обобщённому состоянию системы в целом) соответствует наличие определённого понятия на входе системы, т.е. принадлежность входной ситуации к определённому множеству. Понятия «понятие» (аристотелевское) и «обобщённое состояние» близки между собой: и то и другое — множества состояний. Но «обобщённое состояние» — более общее понятие, оно может учитывать состояние не только рецепторов, но и любых других подсистем, в частности классификаторов. Последнее необходимо, чтобы следить за динамикой состояния системы в процессе обработки информации.
    <…>
    Возвратимся от врождённых ассоциаций к вырабатываемым, т.е. собственно к ассоциированию представлений. В различии между суффиксами этих однокоренных слов — вся суть метасистемного перехода от четвёртого к пятому этапу эволюции. Ассоциация — это просто один из аспектов сложного рефлекса, ассоциирование — это управление ассоциациями: образование новых ассоциаций и исчезновение старых. Наиболее полно способность к ассоциированию представлений проявляется как способность к образованию (и, следовательно, распознаванию) новых понятий.
    <…>
    Процесс обучения, если он не сводится к выработке нескольких условных рефлексов (т.е. затрагивает только распознавательную иерархию), включает в себя ещё элемент научения — выработки умения, навыка. Процесс научения также укладывается в схему ассоциирования представлений при том общем смысле, который мы придаём этому понятию. Ведь научение — это выработка и закрепление детального плана для достижения цели, нового плана, которого раньше не было. План можно представить как организованную совокупность ассоциаций".


    Управление ассоциированием

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

    В.Ф.Турчин так это поясняет: “Логика нашего повествования побуждает нас связать возникновение мышления с очередным метасистемным переходом. В настоящее время мы ещё так мало знаем о процессе мышления и о структуре мыслящего мозга, что всякую теорию, претендующую на объяснение этого явления в целом, надо рассматривать как гипотетическую. Следовательно, и к нашей концепции мышления надо относиться как к гипотезе. Однако эта концепция указывает место мышления в ряду естественных явлений и, как мы увидим, приводит в систему обширное множество фактов. В её пользу говорит также полное отсутствие произвольных допущений частного характера, которое обычно приходится делать, когда теория включает структурное описание мало изученного объекта. Ядром нашей концепции является не какая-либо гипотеза о конкретной структуре и механизме работы мозга, а выбор таких функциональных понятий, через которые становится возможным последовательное и достаточно убедительное объяснение фактов, относящихся к мышлению. Итак, мы утверждаем, что появление мыслящих существ, знаменующее начало нового этапа эволюции и даже новой эры — Эры Разума, есть не что иное, как очередной метасистемный переход, происходящий по формуле (5) "Управление ассоциированием = Мышление".

    Чтобы доказать это утверждение, мы будем анализировать следствия, вытекающие из управления ассоциированием, и отождествлять эти следствия с теми формами поведения, которые мы наблюдаем у мыслящих существ. Прежде всего, что такое управление ассоциированием? Представления Х и Y ассоциируются у животного только в том случае, когда они совместно появляются в его опыте. Если не будет их совместного (как правило, многократного) появления, то не возникает и ассоциации. Животное не вольно управлять своими ассоциациями. Оно имеет только те ассоциации, которые ей навязывает среда. Управление ассоциированием означает наличие в мозгу механизма, позволяющего ассоциировать любые два или несколько представлений, которые вовсе не имеют тенденции встречаться в опыте совместно. Иначе говоря, это произвольное, не навязанное внешней средой ассоциирование. Казалось бы, эта акция совершенно бессмысленна. В огороде бузина, а в Киеве дядька — к чему связывать эти два факта, которые на самом деле никак не связаны между собой? Тем не менее, произвольное ассоциирование имеет глубокий смысл. Оно действительно было бы бессмысленным, если деятельность мозга сводилась бы к пассивному восприятию впечатлений, их сортировке, компоновке и т.п. Но у него есть и другая задача, кстати основная, — управлять организмом, осуществлять активное поведение, которое меняет окружающую среду, создаёт новый опыт.

    При метасистемном переходе то, что раньше было зафиксированным и однозначно определённым внешними условиями, становится изменяемым, подверженным действию метода проб и ошибок. Управление ассоциированием — это, как и всякий метасистемный переход, в высшей степени революционный шаг, направленный против рабского послушания организма диктатуре внешней среды. Как всегда в методе проб и ошибок, только какая-то небольшая часть произвольных ассоциаций оказывается полезной и закрепляется, но это такие ассоциации, которые не могли бы возникнуть непосредственно под влиянием внешней среды. Они-то и обеспечивают разумному существу такие формы поведения, которые недоступны животному, застывшему на предыдущем этапе.
    <…>
    Метасистемный переход в системе мозга — управление ассоциированием — породил новый процесс — социальную интеграцию, т.е. объединение человеческих индивидуумов в некую целостность нового типа: человеческое общество. Вся история человечества проходит под знаком социальной интеграции, связи между людьми возрастают в количественном и качественном отношении. Этот процесс протекает и в настоящее время, причём весьма интенсивно, и вряд ли кто-либо может уверенно ответить на вопрос, как далеко он пойдёт. Социальная интеграция — это метасистемный переход, она приводит к новому уровню возникновения материи — социальной сфере.

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

    Возникновение человеческого общества — крупномасштабный метасистемный переход, при котором интегрируемые подсистемы — это целые организмы. В этом плане его можно сравнить с возникновением многоклеточных организмов из одноклеточных. Однако его значение, его революционность неизмеримо больше… Можно рассматривать общество как единое сверхсущество. Его «тело» — это тела всех людей плюс предметы, созданные и создаваемые людьми: одежда, жилища, машины, книги и т.д. Его «физиология» — это физиология всех людей плюс культура общества, т.е. определённый способ управлять предметным компонентом общественного тела и образом мышления людей. Возникновение и развитие человеческого общества знаменуют начало нового (седьмого по нашему счету) этапа эволюции жизни. Функциональная формула метасистемного перехода от шестого к седьмому этапу такова: (6) "Управление мышлением = Культура".

    Химическая эра
    1. Химические основы жизни
    2. Движение
    3. Раздражимость (простой рефлекс)

    Кибернетическая эра
    4. Нервная сеть (сложный рефлекс)
    5. Ассоциирование (условный рефлекс)

    Эра разума
    6. Мышление
    7. Социальная интеграция, культура

    Язык входит в культуру в качестве важнейшей составной части, выполняя функции нервной системы. Как и у нервной системы многоклеточного организма, его первая, исторически и логически, функция — коммуникативная — обмен информацией между подсистемами, координация их деятельности. В процессе выполнения этой функции язык — опять-таки в точности так же, как и нервная система «этажом ниже», — получает вторую функцию — моделирование окружающей среды. И подобно тому, как в развитии мозга можно выделить этапы, связанные с метасистемными переходами, развитие языковых моделей происходит (как мы увидим дальше) путём последовательных метасистемных переходов в структуре языка.

    Параллели между обществом и многоклеточным организмом были подмечены давно. Но вот вопрос: как относиться к этим параллелям? Можно считать их если и не случайными, то, во всяком случае, поверхностными и малозначительными, что-то вроде сходства стрелы подъёмного крана с руками человека. Однако кибернетический подход приводит нас к другой точке зрения, согласно которой аналогия между обществом и организмом имеет глубокий смысл, свидетельствуя о наличии чрезвычайно общих законов эволюции, действующих на всех уровнях организации материи, и указывая нам направление развития общества".


    Формализация и метасистемный переход

    Появление языка ведёт к постепенной формализации, к появлению формальных языков и метаязыков, новых теорий и метатеорий.

    Турчин пишет: “Превращение языка в независимую от создавшего его человеческого мозга реальность, происходящее благодаря формализации, имеет далеко идущие последствия. Только что созданная языковая машина (теория) становится, как часть окружающего человека мира, объектом изучения и описания с помощью нового языка. Происходит, таким образом, метасистемный переход. Новый язык называют по отношению к описываемому языку метаязыком, а теории, сформулированные на этом языке и касающиеся теорий на языке-объекте, — метатеориями. Если метаязык формализованный, то он в свою очередь может стать объектом изучения с помощью языка следующего уровня и этот метасистемный переход может повторяться неограниченно… Подобно тому, как овладение общим принципом производства орудий для воздействия на предметы приводит к многократному повторению метасистемного перехода и созданию иерархической системы промышленного производства, так и овладение общим принципом описания (моделирования) действительности с помощью формализованного языка приводит к созданию иерархической системы формализованных языков, на которой основаны современные точные науки. Обе иерархии имеют значительную высоту. Невозможно построить реактивный самолет голыми руками. То же относится и к инструментам, необходимым для постройки самолета. Надо начинать с простейших орудий и пройти всю иерархию сложности инструментов, чтобы добраться до самолёта. Точно так же, чтобы обучить дикаря квантовой механике, придется начать с арифметики.

    Углублённое изучение математической теории порождает новые математические теории, которые рассматривают исходную теорию в её различных аспектах. Следовательно, каждая из этих теорий в некотором смысле проще (фундаментальнее), чем исходная теория, подобно тому, как исходная теория проще, чем действительность, которую она рассматривает всегда лишь в каком-то одном аспекте. Происходит расщепление моделей, выделение из сложной модели набора более простых моделей. Формально новые теории столь же универсальны, как исходная теория: их можно применять к любым объектам, которые удовлетворяют аксиомам независимо от их природы. При аксиоматическом подходе различные математические теории образуют, строго говоря, не иерархию по управлению, а иерархию по сложности. Однако, рассматривая те модели, которые на самом деле выражают законы природы (т.е. используются в приложениях математики), мы видим, что математические теории вполне отчётливо делятся на уровни сообразно характеру объекта, к которому они в действительности применяются. Арифметика и элементарная геометрия непосредственно контактируют с неязыковой действительностью, а какая-нибудь теория групп используется для создания новых физических теорий, из которых извлекаются следствия, выраженные на языке алгебры и анализа, которые затем «доводятся до числа» и только после этого сравниваются с экспериментом. И это распределение теорий по уровням соответствует в целом тому порядку, в котором они возникали исторически, ибо возникали они путём последовательных метасистемных переходов. Ситуация здесь в сущности такая же, как и в иерархии орудий производства. Ведь и отвёрткой можно при желании ковырять землю. Однако изобретена она была не для того и нужна в действительности лишь тому, у кого есть винты, болты или шурупы. Теорию групп можно иллюстрировать простыми примерами из обыденной жизни или элементарной математики, но по-настоящему её используют лишь математики и физики-теоретики. Продавцу в магазине или инженеру-практику теория групп нужна не больше, чем отвёртка первобытному человеку".


    Комментарии

    Попробуем немного подытожить сказанное.

    Аркадий Климов (SuperCompilers) сформулировал следующие тезисы, вытекающие из теории В.Ф.Турчина. Их он разбил на два направления: (1) роль в анализе творений природы (и, возможно, других людей), а также (2) роль при совершении собственного творческого акта (конструирования чего-либо).

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

    • 1. Большое число подобных друг другу подсистем (т.н. закон разрастания предпоследнего уровня).


    • 2. Расслоение, специализация изначально однородных подсистем (примеры: многоклеточные организмы, муравейник, общество).


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


    • 4. Способность связывать свободу изменения изменчивого параметра до значений с нужными полезными свойствами, как бы решение уравнений (регулирование, обучаемость по методу проб и ошибок).


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


    Второе направление (конструирование):
    • 1. Создание сложной системы с новыми формами сложного поведения не обязательно должно включать непосредственную реализацию схемы этого поведения, но можно, и это эволюционно предпочтительнее, создавать механизмы координации базисных подсистем, ни одна из которых сама по себе не обладает нужными свойствами, так, что нужные свойсва появляются как результат этой координации. (Этот тезис сформулирован в статье Бена Гертцеля "Internet Supermind and beyond".).


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

    Тезисы Аркадия Климова вносят определённую ясность в прагматическую ценность теории Турчина. Но нас интересует её преломление в отношении программирования и создания программных систем.

    Мышление – это создание ментальных моделей процессов окружающего нас мира, восприятие процессов как переходов между базовыми обобщёнными состояниями. Эволюция биологических систем (и не только) подразумевает (по Турчину) постепенно готовящиеся революционные скачки (т.н. метасистемные переходы). Они происходят не сами по себе. Нужен внешний инициатор, катализатор этого процесса. Турчин в своей теории предложил наряду с традиционной схемой "система-подсистема" (традиционной для общей теории систем, теории управления и кибернетики) использовать схему "метасистема-система". В чём разница? В самоорганизации, в формировании (интеграции) из совокупности реплицированных подобных систем более высокой организации — метасистемы — с последующей специализацией подчинённых систем внутри нового "сообщества".

    Метасистема оперирует понятиями (абстракциями, конструктами) находящихся в её ведении систем, которые на новом уровне (метауровне) становятся объектами изучения и воздействия. При этом можно говорить как о восходящем процессе (ре)организации систем, так и о нисходящем.

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

    Интересно отметить то, как соотносится (исторически и идейно) суперкомпиляция Турчина с теорией частичных (смешанных) вычислений, одним из важных результатов которой является автоматическое построение компилятора на основе имеющегося интерпретатора того или иного языка. В.Ф.Турчин в своей статье "A Supercompiler System Based on the Language REFAL" пишет: "В 1976 г. А.П.Ершов сделал в Институте прикладной математики (Москва) доклад о своей работе в области частичных вычислений для трансляции и оптимизации программ. Ершов пришёл к своим идеям независимо от меня и безотносительно контекста какого-либо конкретного языка. После выступления Ершова я с ним встретился и проинформировал о работе по теории компиляции в контексте языка Рефал. В частности, я сделал акцент на важности понятия метасистемного перехода и того, как это может быть использовано для автоматического создания компиляторов. Последнее было упомянуто Ершовым в его работе "О сущности трансляции" (1977)… "

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

    В контексте метасистемного программирования (в нашем понимании) открывается немало интересного и полезного. Отмечу, в частности, идею достижения контроля сложности за счёт упрощения языков программирования с одновременным созданием "многоэтажных" языков (работающих по схеме "метасистема-система"). Такие языки, как Лисп, Рефал, Пролог, Форт, Си, Оккам, Оберон можно рассматривать как языки-ядра. Современные тенденции постоянного наращивания мощи за счёт экстенсивного развития встроенных языковых средств привели к существенному усложнению универсальных языков: C++, Ada, Java, C# и др. пытаются вобрать в себя множество парадигм с максимальным сервисом на уровне языка. Плата за это – потеря контроля над сложностью. Попытки использовать регламентируемые в рамках внутрикорпоративных соглашений подмножества этих языков наталкиваются на очевидные проблемы: надёжность такой регламентации должна обеспечиваться соответствующим компилятором (а не директивными указаниями, костылями и подпорками), т.е. по сути это новый язык с новой реализацией. Подмножества же, формируемые в голове тем или иным разработчиком, наталкиваются на естественные проблемы при коллективной разработке.

    Проф. Вирт при создании трёх своих последних языков (Паскаль, Модула-2, Оберон) шёл в направлении, обратном тенденциям ИТ-индустрии: в каждом новом языке отсекал лишнее (второстепенное) предыдущего языка с добавлением минимума новых ключевых сущностей (модули, расширяемые записи). Эволюция привела его к компактному Оберону, который можно считать эдаким языком-микроядром (по аналогии с микроядерной архитектурой ОС). Для обеспечения эффективного использования этого языка в условиях уже не индивидуального, а промышленного программирования соответствующие средства (прежде всего, архитектурно-инфраструктурного плана) можно вынести на уровень языка, оперирующего сущностями Оберона. Т.е. на архитектурный метаязык (по отношению к Оберону и ряду других языков). Подобная идея прорабатывается в рамках проекта создания новой ОС "Роса". Более того, можно говорить о том, что ранее эскизно обозначенный ортогональный базис языков может быть устроен по многоэтажному принципу: "микроядерные" языки системного программирования (модификации Оберона и Рефала), поверх которых располагаются популярные прикладные языки (в частности, Haskell, Java, Python) с архитектурным метаязыком Metasys.

    Не могу не обратить внимание читателя на очень важную мысль, имеющую самое непосредственное отношение ко всему изложенному. В своей работе "Два взгляда на программирование" (1975, EWD540) Эдгар Дейкстра отмечал: "Похоже, что иерархические системы обладают тем свойством, что нечто, рассматриваемое как неделимое целое на одном уровне, рассматривается как составной объект на следующем, более низком уровне с большей детализацией; в результате дискретность пространства или времени, применимая на каждом уровне, уменьшается на порядок величины при переходе от одного уровня к другому, следующему за ним более низкому. Мы воспринимаем стену через понятие кирпичей, кирпичи – через понятие кристаллов, кристаллы – через понятие молекул и так далее. В результате количество уровней, которые могут быть осмысленно выделены в иерархической системе, в некотором роде пропорционально логарифму отношения между наибольшим и наименьшим дискретами, и поэтому, если только это соотношение не чрезмерно велико, мы можем ожидать появления не слишком большого числа уровней. В области компьютерного программирования наш базовый строительный блок имеет дискретность времени менее микросекунды, но наша программа может потребовать несколько часов вычислений. Я не знаю никакой другой технологии, перекрывающей отношение 1010 и более: компьютер, благодаря его фантастической скорости, кажется, впервые предоставил нам среду, в которой артефакты с высокой степенью иерархичности одновременно и возможны, и необходимы. Этот вызов, а именно противостояние задаче программирования, столь уникален, что новый опыт может рассказать нам очень много нового о нас самих. Он может углубить наше понимание процессов разработки и созидания, он может дать нам лучший контроль над организацией нашего мышления. Если бы он не сделал этого, на мой взгляд, мы вообще не заслуживаем компьютеров! Он уже преподал нам несколько уроков, и один из них, который я выбрал, чтобы акцентировать внимание в этом докладе, заключается в следующем. Мы будем программировать гораздо лучше, если только подойдём к задаче, полностью оценивая её потрясающую сложность, если только мы будем придерживаться скромных и элегантных языков программирования, если только мы примем во внимание свойственные человеческому разуму ограничения и подойдём к задаче как Очень Смиренные Программисты".