Switch-технология
Switch-технология — технология для поддержки автоматного программирования (технология автоматного программирования), была предложена А. А. Шалыто в 1991 году [1]. Она охватывает спецификацию, проектирование, реализацию, отладку, верификацию, документирование и сопровождение программ. При этом под термином «автоматное программирование» понимается не только построение и реализация конечных автоматов для использования в программах, но и проектирование и реализация программ в целом, поведение которых описывается автоматами.
Парадигма автоматного программирования[править | править код]
Основная идея излагаемого подхода состоит в том, что программы предлагается создавать так же, как производится автоматизация технологических (и не только) процессов.
При этом на основе анализа предметной области выделяются источники входных воздействий и автоматизированные объекты, каждый из которых содержит систему управления (систему взаимодействующих конечных автоматов) и объект управления. Этот объект реализует выходные воздействия и формирует значения второй разновидности входных воздействий, которые от него передаются по обратным связям к системе управления.
Объект управления может быть физическим или реализованным программно. В первом случае его логика изменена быть не может, а во втором — она, при необходимости, практически вся может быть вынесена в автоматы. Виртуальные объекты управления, как и система управления, могут быть реализованы с помощью рассматриваемой технологии.
Парадигма автоматного программирования состоит в представлении программ как систем автоматизированных объектов.
Автоматное программирование и машина Тьюринга[править | править код]
Универсальность предлагаемого подхода определяется тем, что он основан на расширении машины Тьюринга, которая позволяет реализовать произвольный алгоритм.
С точки зрения теории управления машина Тьюринга представляет собой автономную систему автоматизированных объектов, в которой конечный автомат, воздействующий на объекты управления (ячейки ленты), получает по обратной связи входные воздействия от управляемых объектов.
Сложность программирования на машине Тьюринга [2] определяется низким уровнем абстракции, так как в ней используются чрезвычайно простые объекты управления, которые могут выполнять только простейшие действия (операции) по записи и стиранию отдельных символов.
От машины Тьюринга к практическому программированию[править | править код]
Переход к практическому программированию при появлении первых вычислительных машин был осуществлен за счет повышения уровня абстракции, что было достигнуто усложнением объекта управления — введением в машину арифметическо-логического устройства, которое позволяет выполнять достаточно сложные действия определенной номенклатуры.
Несмотря на то, что в качестве устройства управления машины и в этом случае использовался конечный автомат, при ее программировании состояния и автоматы в явном виде не применялись, а логика программ реализовывалась на низком уровне абстракции с применением «флагов».
Повышение уровня абстракции в языках высокого уровня[править | править код]
При программировании с использованием императивных языков высокого уровня произошло дальнейшее повышение уровня абстракции за счет еще большего усложнения действий (операций) фиксированной номенклатуры, выполняемых «объектами управления». При этом, однако, при проектировании логики программ уровень абстракции по сравнению с низкоуровневыми языками практически не изменился.
Как автоматное программирование позволяет бороться со сложностью программ[править | править код]
Автоматное программирование позволяет повысить уровень абстракции не только в части выполняемых операций, но и при описании поведения программ. В рамках автоматного подхода объекты управления могут выполнять сколь угодно сложные действия, а система управления может содержать не один автомат, а систему взаимосвязанных автоматов. Это позволяет применять рассматриваемый подход на практике.
Применимость подхода обеспечивается тем, что:
- при проектировании программ выделяются процессы [3] (режимы), каждый из которых описывается конечным автоматом;
- каждый процесс (автомат) в общем случае может быть декомпозирован на более «мелкие» процессы (автоматы);
- каждый процесс (автомат) описывается в терминах состояний и переходов между состояниями;
- каждое состояние в общем случае может быть декомпозировано на более «мелкие» состояния;
- взаимодействие автоматов осуществляется «привязкой» одних автоматов к состояниям и/или переходам других автоматов;
- состояния декомпозируют множество входных воздействий, обеспечивающих переходы, на группы, каждая из которых определяет переходы из соответствующего состояния;
- номенклатура выходных воздействий автоматов, реализуемых объектами управления, не фиксирована и определяется предметной областью;
- выходные воздействия не являются процессами или не рассматриваются как процессы;
- выходные воздействия «привязываются» к состояниям и/или переходам автоматов;
- при совместном использовании объектной и автоматной парадигм программирования удается в наглядной форме описывать статические и динамические свойства программ;
- объектная декомпозиция позволяет эффективно реализовать автоматные программы;
- многоуровневая декомпозиция на базе конечных автоматов, выполняемая как описано выше, поддерживает основной принцип уменьшения сложности программ («разделяй и властвуй»), и позволяет визуально конструировать программы со сложным поведением.
Стили программирования[править | править код]
Стили программирования [4] различаются по базовым понятиям, в качестве которых используются такие понятия как «событие», «подпрограмма», «функция», «класс» («объект») и т. д.
В автоматном программировании и поддерживающей его Switch-технологии таким понятием является «состояние». При этом события рассматриваются лишь как средства для изменения состояний. Таким образом, понятие «состояние» по отношению к понятию «событие» является первичным, что отражается на структуре программ, которые проектируются на основе рассматриваемой технологии (см. раздел «Структура автоматных программ»).
Стиль программирования, основанный на явном выделении состояний и применении автоматов для описания поведения программ, назван «автоматное программирование», а соответствующий стиль проетирования программ — «автоматное проектирование программ».
Автоматное программирование можно рассматривать не только как самостоятельный стиль программирования, но и как дополнение к другим стилям, например, к объектному.
Автоматное программирование можно рассматривать также и в несколько другом «срезе», в котором стили программирования определяются математическим аппаратом, используемым при написании программ, как это имеет место, например, в генетическом программировании.
Так как эффективность рассматриваемого подхода снижается по мере упрощения логики программы и ее доли в общем объеме программы, автоматный подход можно рассматривать также и как ориентированный на учет специфики предметной области, которой в данном случае является управление в программах.
Вычислительные устройства и языки программирования[править | править код]
Технология может использоваться для различных управляющих устройств (программируемые логические контроллеры, микроконтроллеры, микропроцессоры) и различных языков программирования (языки лестничных схем, языки функциональных схем, процедурные языки, объектно-ориентированные языки и т. д.).
Технология поддерживает как процедурный, так и объектно-ориентированный стили программирования, однако не исключает применение и иных стилей. Например, при использовании программируемых логических контроллеров наряду с другими применяются такие экзотические языки программирования, как лестничные и функциональные схемы, определяющие стили программирования, отличные от традиционных.
Возражения против Switch-технологии[править | править код]
Применение Switch-технологии сдерживается тем, что многие считают, что область применения автоматов в программировании хорошо известна и является достаточно узкой, а их функциональность мала. Традиционно по этому поводу выдвигаются следующие соображения:
- автоматы обладают малой вычислительной мощностью, так как они позволяет описывать только регулярные языки;
- автоматы являются одной из моделей дискретной математики, которая наряду с другими применяется при необходимости.
Все эти утверждения, безусловно, верны. Однако ни одно из них не препятствует использованию автоматного программирования при создании систем со сложным поведением в различных предметных областях, тем более, что автоматы применяются:
- при проектировании устройств вычислительной техники (например, счетчиков) и при программировании аппаратных реализаций на больших интегральных схемах;
- для описания в языке UML жизненного цикла объектов при моделировании объектно-ориентированных программ [5];
- при программировании компиляторов и протоколов.
Основные положения[править | править код]
Автоматы и программирование[править | править код]
Справедливо соотношение: «Управляющие состояния + входные воздействия = конечный (детерминированный) автомат без выхода».
Справедливо также: «Автомат без выхода + выходные воздействия = автомат».
По входным воздействиям автоматы выполняют переходы между состояниями, которые должны быть явно выделены, и формируют в состояниях и/или на переходах выходные воздействия, реализуемые в объектах управления. Такой взгляд на программирование поведения компонент является естественным для решения задач управления различных уровней.
Автоматы могут быть абстрактными (входные и выходные воздействия формируются последовательно) и структурными (входные и выходные воздействия формируются «параллельно») [6]. В Switch-технологии, в отличие, например, от программирования компиляторов, применяются структурные автоматы.
Время в автоматах в явном виде не используется. Элементы задержки рассматриваются как объекты управления. При этом задержки запускаются и сбрасываются из автоматов, а информация об истечении времени поступает в автоматы в виде входных воздействий [7].
Состояния[править | править код]
Состояния делятся на два типа: управляющие (автоматные) и вычислительные (неавтоматные) [2].
Такое деление имеет место, например, в машине Тьюринга, в которой управляющее устройство с небольшим числом состояний (конечный автомат) может управлять практически бесконечным числом состояний на ленте, ячейки которой выступают в машине в качестве объектов управления. Как отмечалось выше, высокая трудоемкость программирования на машине Тьюринга связана с тем, что ячейки ленты слишком просты. Усложнение операций введением в процессор операционного устройства обеспечило преобразование машины Тьюринга в компьютер, который существенно проще программировать. При этом устройство управления компьютера с относительно небольшим числом состояний управляет памятью с огромным числом состояний, в которой хранятся результаты вычислений.
Идея разделения состояний на управляющие и вычислительные может быть перенесена в практическое программирование. Так, например, в задаче о ханойских башнях, несмотря на то, что число вычислительных состояний объекта управления (три стержня и n
дисков) растет как экспонента от n
, автомат, обеспечивающий перекладку дисков, имеет всего лишь два или три управляющих состояния.
Вычислительные состояния могут быть не только дискретными, но и непрерывными, что приводит к понятию «гибридный автомат» [8].
В рассматриваемой технологии основное внимание уделяется управляющим состояниям, которые выделяются и перечисляются явно, в то время как вычислительные состояния обычно описываются функциями выходных воздействий. В дальнейшем при использовании термина «состояние» понимается управляющее состояние.
Число состояний в автомате определяется числом управляющих состояний в автоматизируемом объекте. Например, объект управления клапан может находиться в четырех состояниях (закрыт, открывается, открыт, закрывается). При этом естественно, чтобы и автомат, управляющий клапаном, также имел четыре состояния, каждое из которых поддерживает объект управления в соответствующем состоянии. Таким образом, входные воздействия переводят автомат из одного состояния в другое, а выходные воздействия, формируемые в новом состоянии автомата, «перетягивают» клапан в соответствующее состояние.
Если разные состояния объекта управления можно поддержать с помощью одного и того же состояния автомата, то число состояний в нем может быть уменьшено. Так, например, клапан может иметь память, которая поддерживает его открытое и закрытое состояния при отсутствии управляющих сигналов, что может быть реализовано одним состоянием автомата. Таким образом, автомат, управляющий клапаном, может иметь, в отличие от самого клапана, не четыре состояния, а три. Поэтому автомат может иметь меньше состояний, чем управляемый им объект.
При программной реализации минимизировать состояния в построенном автомате обычно нецелесообразно, так как это может разрушить «образ» графа переходов, сложившийся у разработчика, не приводя ни к каким существенным улучшениям.
Явное выделение состояний позволяет обеспечить «устойчивость» программ, так как состояние, в отличие от флага, является интегральной характеристикой программы.
Кодирование состояний[править | править код]
Традиционно в программировании под термином «кодирование» понимается собственно процесс написания текста. В Switch-технологии, так же как и в теории автоматов [9], под этим термином понимается термин «кодирование состояний», так как при использовании рассматриваемого подхода есть что кодировать.
Состояния кодируются для того, чтобы различать их. Это особенно важно, когда в разных состояниях формируются одинаковые значения выходных переменных. Могут использоваться различные виды кодирования состояний, но в качестве основного используется многозначное кодирование, позволяющее кодировать состояния любого автомата с помощью только одной переменной [7]. При этом ее значность должна быть равна числу состояний рассматриваемого автомата, а каждому состоянию присваивается соответствующий номер. Кодирование состояний позволяет отказаться от флагов, которые неявно выполняют ту же функцию.
Возможность слежения за состояниями автомата по значениям одной многозначной переменной позволяет ввести в программирование (по аналогии с теорией управления) понятие «наблюдаемость» [10].
Схема связей[править | править код]
В качестве основного документа, определяющего структуру программы, как и при автоматизации технологических (и не только) процессов, в автоматном программировании используется схема связей [11], которая представляет собой детализацию схемы на рис.1. Она может совмещаться со схемой взаимодействия автоматов.
Схема связей определяет интерфейс автоматов и позволяет применять в графах переходов и в реализующих их программах символьные обозначения. Для объектно-ориентированных программ с явным выделением состояний диаграммы классов в рамках рассматриваемого подхода изображаются в виде схем связей.
Графы переходов[править | править код]
Поведение автоматов задается графами переходов [11] (диаграммами состояний [12]), на которых для их компактности входные и выходные воздействия обозначаются символами, а слова используются только для названий пронумерованных состояний. Расшифровка символов выполняется на схеме связей. Применение символов позволяет изображать сложные графы переходов весьма компактно — так, что человек может в большинстве случаев охватить каждый из них одним взглядом. Это обеспечивает когнитивное восприятие указанных графов.
Графы переходов в наглядной для человека форме отражают переходы между состояниями, а также «привязку» выходных воздействий и других автоматов к состояниям и/или переходам.
Для упрощения изображения графов переходов допустимо использование составных состояний, которые применяются в тех случаях, когда несколько вершин имеют одинаково помеченные исходящие дуги.
Задание поведения программ с помощью графов переходов позволяет проверять корректность их построения, например, полноту, непротиворечивость и отсутствие генерирующих контуров.
В программе, построенной по графам переходов, также, как и в этих графах, используются символьные обозначения, а не смысловые идентификаторы, как в других стилях программирования. Это связано с тем, что текст программы в рамках указанной технологии строится по графу переходов формально и изоморфно, а изменения вносятся не непосредственно в текст программы, а только после корректировки схемы связей и графа переходов. Изложенное позволяет обеспечить синхронность изменений программ и их проектной документации.
Структура программ, реализующих автоматы[править | править код]
Автоматные программы (их схемы) должны строиться, начиная с дешифратора состояний, а не с дешифратора входных воздействий, как это делается при использовании других стилей программирования [13].
Существуют три схемы реализации автоматов.
Четырехуровневая схема программ (дешифратор состояний — выходные воздействия — дешифратор входных воздействий — формирование следующих состояний) реализует автоматы Мура.
Четырехуровневая схема программ (дешифратор состояний — дешифратор входных воздействий — выходные воздействия — формирование следующих состояний) реализует автоматы Мили.
Пятиуровневая схема программ (дешифратор состояний — выходные воздействия — дешифратор входных воздействий — выходные воздействия — формирование следующих состояний) реализует смешанные автоматы.
Схемы программ с указанной структурой названы автоматными.
При таком построении граф переходов, автоматная схема программ и конструкция switch
изоморфны.
Взаимодействие автоматов[править | править код]
Автоматы могут взаимодействовать по вложенности (один автомат вложен в одно или несколько состояний другого автомата), по вызываемости (один автомат вызывается с определенным событием из выходного воздействия, формируемого при переходе другого автомата) и по номерам состояний (один автомат проверяет, в каком состоянии находится другой автомат).
Вложенность может рассматриваться как вызываемость с любым событием. Число автоматов, вложенных в состояние, не ограничено. Глубина вложенности также не ограничена.
Взаимодействие автоматов отражается на «схеме взаимодействия автоматов» [11], которая может совмещаться со «схемой связей».
Проверка взаимодействия автоматов может выполняться протоколированием их работы, осуществляемым в терминах автоматов.
Автоматы, нейронные сети, генетические алгоритмы[править | править код]
Области применения автоматов и нейронных сетей обычно различны. Однако существуют задачи, в которых целесообразно их совместное применение [14].
Известны также задачи, которые могут решаться с помощью любого из указанных средств. В этом случае применение автоматов более целесообразно, так как в них легко вручную вносить изменения. Это может быть важно, например, в случае, когда закон управления строится в два этапа, первый из которых состоит в генерации автоматов с помощью генетических алгоритмов, а второй — в корректировке автоматов в результате экспериментов.
Автоматы и параллельные программы[править | править код]
В программах, построенных традиционным путем, выделение фрагментов, которые могут быть реализованы параллельно, является весьма трудной задачей. Существует широкий класс задач, спецификация которых осуществляется с помощью параллельно работающих автоматов, которые обмениваются сообщениями. Такие автоматы эффективно реализовывать в разных потоках [15] и разных процессорах.
Проверка программ[править | править код]
Программа, изоморфная графу переходов, может быть проверена сверкой ее текста с этим графом.
Сертификация программы логического управления, которая реализована указанным образом по графу переходов автомата, являющегося автоматом Мура, может выполняться в два этапа: проверка в динамике по значениям многозначной внутренней переменной, кодирующей состояние автомата, наличия всех переходов в графе; проверка в статике соответствия значений выходных переменных с их значениями, указанными в вершинах графа переходов [7].
Такая проверка более корректна, чем традиционная проверка «вход-выход».
Отладка автоматных программ выполняется в автоматных терминах, что резко ее упрощает.
Верификация программ[править | править код]
Программы, создаваемые на основе Switch-технологии, могут быть эффективно верифицированы методом Model checking [16], так как в таких программах управляющие состояния явно выделены, а их количество обозримо. Это позволяет строить компактные модели Крипке даже для программ большой размерности.
Структура автоматных программ, в которых функции входных и выходных воздействий почти полностью отделены от логики программ, делает практичным верификацию этих функций на основе формальных доказательств с использованием пред- и постусловий [17,18].
Реализация и инструментальные средства[править | править код]
Реализация графов переходов[править | править код]
Графы переходов реализуются формально и изоморфно, например, с помощью конструкции switch
(например, языка Си) по соответствующим шаблонам. Поэтому предлагаемый подход был назван «Switch-технология».
В конструкции switch используются символы входных и выходных воздействий, а не функции их реализующие, которые размещаются отдельно. Такая декомпозиция упрощает понимание логики программы за счет компактного ее представления и соответствует правилу «отделения логики переключения от деталей того, что происходит» [19].
Для каждого автомата создается четыре документа: словесное описание алгоритма (декларация о намерениях), схема связей, граф переходов, изоморфная реализация.
Реализация выполняется так, что в каждом программном цикле или при каждом запуске автомата в нем выполняется не более одного перехода. Это делает номер каждого состояния автомата доступным для его «окружения» и позволяет не вводить новых переменных для обеспечения взаимодействия автоматов [7].
Инструментальные средства для поддержки автоматного программирования[править | править код]
Известно большое число инструментальных средств для генерации программ, реализующих графы переходов [20]. Два таких средства разработаны для решения этой задачи в рамках рассматриваемой технологии.
Инструментальное средство Visio2Switch [21] позволяет по графу переходов, построенному в определенной нотации и изображенному с помощью редактора Visio, автоматически реализовать его в виде изоморфной программы на языке С.
Инструментальное средство MetaAuto [22] позволяет по графу переходов, построенному в той же нотации и изображенному с помощью того же редактора, автоматически реализовать его в виде изоморфной программы на любом языке программирования, для которого предварительно построен шаблон.
Недостаток инструментальных средств этого класса — не решен вопрос о проектировании и реализации программ в целом.
Инструментальное средство UniMod [23] предназначено для поддержки автоматного программирования и построения и реализации не только автоматов, но и программ в целом.
Это средство характеризуется формулой: «UniMod = UML + Switch-технология + Eclipse + Java + Sourceforge». Оно является открытым и использует только два типа UML-диаграмм: диаграммы классов в форме схем связей (для описания структуры программы) и диаграммы состояний (для описания ее поведения) [24,25]. Валидация диаграмм состояний выполняется автоматически.
Указанное инструментальное средство позволяет создавать программы, поддерживая концепции «Исполняемый UML» (Executable UML) [26] и «Разработка на базе моделей» (Model Driven Architecture) [27].
При использовании инструментального средства UniMod программа состоит из указанных диаграмм и написанных вручную функций, соответствующих входным и выходным воздействиям. Таким образом, это инструментальное средство позволяет совмещать декларативный и процедурный подходы к написанию программ.
Реализация таких программ может быть выполнена как в режиме интерпретации, так и в режиме компиляции. Это средство реализует концепцию «Визуальное конструирование программ» [28].
Описанное средство поддерживает методологию проектирования и реализации объектно-ориентированных программ с использованием всего двух типов UML-диаграмм.
Применение Switch-технологии[править | править код]
Подход используется в четырех направлениях:
- логическое управление (события отсутствуют, входные и выходные переменные двоичны);
- программирование с явным выделением состояний;
- объектно-ориентированное программирование с явным выделением состояний;
- вычислительные алгоритмы (алгоритмы дискретной математики).
Для поддержки автоматного программирования создан сайт [29].
Впервые технология автоматного программирования применительно к логическому управлению изложена в книге [7] применительно к логическому управлению.
Программирование с явным выделением состояний для систем, реагирующих на события, впервые было использовано при автоматизации судовых дизель-генераторов [30].
Объектно-ориентированное программирование с явным выделением состояний впервые было применено в игре Robocode [31].
Проекты, созданные с использованием инструментального средства UniMod, приведены в [32].
Автоматный подход эффективен для реализации визуализаторов алгоритмов дискретной математики [33] и при реализации некоторых из таких алгоритмов (например, обход дерева [34]).
Автоматное программирование начинает все шире использоваться в рамках такого научного направления, как «искусственный интеллект» [35], и при программировании мобильных устройств [36].
Проект «Технология автоматного программирования: применение и инструментальные средства»[править | править код]
В 2005 году по результатам конкурса, проводимого в рамках Федеральной целевой научно-технической программы «Исследования и разработки по приоритетным направлениям развития науки и техники» на 2002—2006 годы, проект «Технология автоматного программирования: применение и инструментальные средства» был поддержан Федеральным агентством по науке и инновациям.
Проект вошел в список 15 наиболее перспективных и социально значимых проектов, выполняемых в рамках указанной программы (проект ИТ-13.4/004 [37], а также статья в приложении к газете КоммерсантЪ [38]).
Указанные выше работы в области Switch-технологии находятся в русле работ по обеспечению высокого качества программного обеспечения, проводимых в Западной Европе при создании синхронного программирования для ответственных систем [39] и в NASA при создании программного обеспечения для беспилотных космических аппаратов [40].
Движение за открытую проектную документацию[править | править код]
Организовано «Движение за открытую проектную документацию» [41], которое дополняет движения за открытые и свободные исходные коды. В рамках этого движения выполнятся работы [29] по совершенствованию Switch-технологии.
Ссылки[править | править код]
[1] Шалыто А. А. Программная реализация управляющих автоматов //Судостроительная промышленность. Серия «Автоматика и телемеханика». 1991. Вып.13, с.41,42. http://is.ifmo.ru/works/switch_prr/
[2] Шалыто А. А., Туккель Н. И. От тьюрингова программирования к автоматному //Мир ПК. 2002. № 2, c.144-149. http://is.ifmo.ru/works/turing/
[3] Романовский И. В. Дискретный анализ. СПб.: БХВ-Петербург, Невский диалект. 2003.
[4] Непейвода Н. Н. Стили и методы программирования. М.: Интернет-Университет Информационных технологий. 2005. http://is.ifmo.ru/foundation/moving
[5] Буч Г., Рамбо Дж., Якобсон И. Язык UML. Руководство пользователя. М.: ДМК пресс. 2007.
[6] Глушков В. М. Синтез цифровых автоматов. М.: Физматгиз. 1962.
[7] Шалыто А. А. Switch-технология. Алгоритмизация и программирование задач логического управления. СПб.: Наука. 1998. http://is.ifmo.ru/books/switch/1
[8] Колесов Ю. Б., Сениченков Ю. Б. Моделирование систем. Динамические и гибридные системы. СПб.: БХВ-Петербург. 2006.
[9] Гаврилов М. А., Девятков В. В., Пупырев Е. И. Логическое проектирование дискретных автоматов. М.: Наука, 1977.
[10] Шалыто А. А. Алгоритмизация и программирование для систем логического управления и «реактивных» систем //Автоматика и телемеханика, 2001, № 1, с.3−39. http://is.ifmo.ru/works/arew/1/
[11] Туккель Н. И., Шалыто А. А. SWITCH-технология − автоматный подход к созданию программного обеспечения «реактивных» систем //Программирование. 2001. № 5, c.45-62. http://is.ifmo.ru/works/switch/1/
[12] Harel D. Statecharts: A Visual Formalism for Complex Systems //Science of Computer Programming. 1987. vol.8, pp. 231—274. http://web.archive.org/web/20070221190813/http://www.tik.ee.ethz.ch/tik/education/lectures/hswcd/papers/Statecharts.pdf
[13] Шалыто А. А. Использование граф-схем и графов переходов при программной реализации алгоритмов логического управления. II //Автоматика и телемеханика. 1996. № 7. с.144-169. http://is.ifmo.ru/books/djvu/pdf/A009.pdf
[14] Кретинин А. В., Солдатов Д. В., Шалыто А. А., Шостак А. В. Ракеты. Автоматы. Нейронные сети // Нейрокомпьютеры: разработка и применение. 2005. № 5, с. 50-59. http://is.ifmo.ru/works/_rocketaut.pdf
[15] FSM. http://itc.ua/article.phtml?ID=19921&IDw=19
[16] Кларк Э., Грамберт О., Пелед Д. Верификация моделей программ: Model Checking. М.: МЦНМО. 2002.
[17] Дейкстра Э. Заметки по структурному программированию / Дал У., Дейкстра Э., Хоор К. Структурное программирование. М.: Мир, 1975.
[18] Мейер Б. Объектно-ориентированное конструирование программных систем. М.: Русская редакция. 2005.
[19] Фаулер М. Рефакторинг. Улучшение существующего кода. СПб.: Символ. 2003.
[20] Finite state machine. http://en.wikipedia.org/wiki/Finite_state_machines (англ.)
[21] Конвертор Visio2Switch. http://is.ifmo.ru/progeny/visio2switch/
[22] Инструментальное средство MetaAuto. http://is.ifmo.ru/projects/metaauto/
[23] Инструментальное средство UniMod. http://unimod.sourceforge.net/ (англ.)
[24] Гуров В. С., Мазин М. А., Нарвский А. С., Шалыто А. А. UML. SWITCH-технология. Eclipse //Информационно-управляющие системы. 2004. № 6, c.12-17. http://is.ifmo.ru/works/uml-switch-eclipse/
[25] Gurov V.S., Mazin M.A. , Narvsky A.S., Shalyto A.A. UniMod: Method and Tool for Development of Reactive Object-Oriented Programs with Explicit States Emphasis /Proceedings of St. Petersburg IEEE Chapters. Year 2005. International Conference «110 Anniversary of Radio Invention». SPb ETU «LETI». 2005. V. 2, pp. 106—110. http://is.ifmo.ru/articles_en/_unimod.pdf
[26] Executable UML. http://en.wikipedia.org/wiki/Executable_UML
[27] Model Driven Architecture. http://en.wikipedia.org/wiki/Model_Driven_Architecture
[28] Новиков Ф. А. Визуальное конструирование программ //Информационно-управляющие системы. 2005. № 6. с.9−22. http://is.ifmo.ru/works/visualcons/
[29] Сайт кафедры «Технологии программирования» СПбГУ ИТМО, http://is.ifmo.ru
[30] Туккель Н. И., Шалыто А. А. Система управления дизель-генератором (фрагмент). Программирование с явным выделением состояний. Проектная документация. 2002. 51 с. http://is.ifmo.ru/projects/dg/
[31] Туккель Н. И., Шалыто А. А. Система управления танком для игры «Robocode». Вариант 1. Объектно-ориентированное программирование с явным выделением состояний. 2001. 52 с. http://is.ifmo.ru/projects/tanks/
[32] UniMod−проекты. http://is.ifmo.ru/unimod-projects/
[33] Визуализаторы. http://is.ifmo.ru/vis/
[34] Корнеев Г. А., Шамгунов Н. Н., Шалыто А. А. Обход деревьев на основе автоматного подхода //Компьютерные инструменты в образовании. 2004. № 3, с.32-37. http://is.ifmo.ru/works/traverse/
[35] Yartsev B., Korneev G., Shalyto A., Kotov V. Automata-Based Programming of the Reactive Multi-Agent Control Systems /2005 International Conference on «Integration of Knowledge Intensive Multiagent Systems. KIMAS ’05: Modeling, Exploration, and Engineering». USA, MA: IEEE. 2005. pp.449-453. http://is.ifmo.ru/articles_en/_kimas05-2.pdf
[36] Программирование мобильных устройств. http://is.ifmo.ru/science/MD-Mobile.pdf
[37] Выбраны лучшие инновационные проекты России //Информационная система «Наука и Инновации», http://www.rsci.ru/company/innov/more.html?MessageID=965
[38] Волшебный сундучок Роснауки //Приложение к газете КоммерсантЪ, 16.11.2005. https://archive.is/20120803164933/www.kommersant.ru/application.html?DocID=625381
[39] The Synchronous Languages 12 Years Later. http://www-sop.inria.fr/aoste/benveniste2003synchronous.pdf (англ.)
[40] Риган П., Хемилтон С. NASA: миссия надежна //Открытые системы, 2004. № 3. http://www.osp.ru/text/302/184060.html
[41] Шалыто А. А. Новая инициатива в программировании. Движение за открытую проектную документацию //PC Week/RE. 2003. № 40, с.38,39,42. http://is.ifmo.ru/works/open_doc/