1. Введение

Термин «автоматное программирование» (АП) был введен в широкую практику в 90-х годах прошлого века [1, 2], хотя о применении автоматов в программировании шла речь задолго до этого. R первым упоминаниям уже начала 70-х годов можно отнести метод введения переменной состояния или, по-другому, метод преобразования неструктурированных программ Ашкрофта и Манны [3]. За прошедшее время сформировалось достаточное число его поклонников и не меньшее число критиков. Если говорить об их разногласиях, то в их основе отсутствие формального определения АП и поверхностное восприятие его возможностей. Из-за этого автоматное программирование формируется интуитивно, что и приводит к противоречивым его формам, порой, мало похожим на первоисточник – модель конечного автомата.

Но, несмотря на пробелы в теории, создано множество вариантов технологий автоматного программирования. Это, например, SWITCH-технология, которая известна, в том числе, и по активному продвижению АП, пакет Stateflow [4] системы MATLAB [5], язык UML [6], различные реализации автоматов в рамках программных библиотек типа Qt [7] и т.д. и т.п. Эту же технологию реализует и среда автоматного Визуального Компонентного Программирования – ВКПа[8].

По большому счету автоматному программированию необходим и свой «автоматный язык». Пока же его роль выполняют существующие языки. Реализация АП в них строится на базе достаточно простых, если не сказать – примитивных, программистских приемах и SWITCH-технология тому показательный пример. Но такой, слишком простой, подход влечет утрату важных качеств модели. Подобное программирование, порой, лишь имитирует в той или иной мере возможности АП. Тем не менее, данный вариант наиболее типичен, т.к. позволяет обойтись без специализированного языка.

В наши цели входит определение автоматного программирования, описание его вычислительной модели и принципов ее реализации. Рассматриваемые далее примеры, которые в той или иной мере это демонстрируют, созданы в рамках программных сред MATLAB и ВКПа. Первая – наглядно демонстрирует возможности визуального программирования на базе автоматной модели, вторая - пример наиболее полного воплощения идей автоматного программирования и реализации автоматного языка на базе С++ без утраты каких-либо качеств базовой модели.

2. Формальная модель автоматного программирования

Ответ на наиболее часто задаваемый вопрос, что собой представляет автоматная программа, казалось бы, достаточно прост. Как минимум, в большинстве языков программирования на структурном уровне выделяют: 1) данные, 2) операции и 3) управление. В соответствии с этим схематология [9] представляет модель программы в форме схемы программы тройкой S = (M, A, C), где M – конечное множество элементов памяти, называемых переменными, A – конечное множество операторов, C – управление [10]. Под элементами памяти будем понимать также более сложные объекты – массивы, очереди, множества, стеки и т.п., а к операторам будем относить, кроме простейших операций, программные функции.

Определение 1. Автоматной программой (АП) будем называть программу с моделью управления в форме модели конечного автомата.

Данное определение отличает АП от других определений программ моделью управления. В нашем случае она может быть представлена аналитической, графической, матричной или любой другой формой задания автоматов (подробнее о способах задания см. [11]). Но существенным при этом является реализация всех свойств автоматной модели управления, выраженном в ее законе функционирования, а не только лишь демонстрация «картинок», как это декларирует SWITCH-технология.

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

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

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

3. Конечный автомат с абстрактным состоянием. Автоматы Мили и Мура

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

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

Определение 1. Назовем автоматом с абстрактным состоянием конечный автомат, у которого каналы представлены множеством входных – x1, x2, …, xn и выходных – y1, y2, …, ym булевых переменных, а внутреннее состояние – одной многозначной переменной q (см. также [12]). Его функция переходов определяет следующее состояние q(t+1) в зависимости от текущего значения состояния q и значения двоичной входной переменной, представленной булевой функцией –  f(x1, x2, …, xm) от входных переменных в дизъюнктивной нормальной форме (ДНФ). Функция выходов автомата определяет зависимость  последующего значения выходной переменной y(t+1), представленной элементарной конъюнкцией – (y1, y2, …, yn) выходных булевых переменных без знаков отрицания, в зависимости от текущего состояния q и текущего состояния входных каналов x(t). Закон функционирования автомата определяется уравнениями:

       q(t+1) = j(q(t), x(t)),                                                                                         (1)

       y(t+1) = y(q(t), x(t)),     

Подобные автоматы будем называть просто конечными автоматами (КА) или, автоматами Мили. Необходимо также отметить, что именно о таком же поведении (законе функционирования) автоматов говорит и М.Минский [14]. 

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

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

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

В классической теории автоматов входные и выходные сигналы связаны с текущим моментом времени t и из-за этого между ними возникает «мгновенная» связь. Это противоречит признаваемому даже в теории факту, что в реальной ситуации выходной сигнал y(t) автомата всегда появляется после входного сигнала x(t) (см., например,  [11]). Инерционный закон устраняет необходимость также различать, как это принято в теории, обычные и сдвинутые функции выходов.

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

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

Определение 3. Назовем автоматом Мура автомат, у которого функции переходов и выходов следующие:

            q(t+1) = j(q(t), x(t)),                                                                                    (2)

y(t+1) = y(q(t)).

У автоматов Мура значение выходной переменной зависит только от переменной внутреннего состояния. Подобные автоматы называются правильными (подробнее см. [11]). Напомним, что в классической теории автоматами Мура называют правильные автоматы второго рода, выходной сигнал которых определяется ровно в момент t от состояния q(t), которое, что примечательно, в этот же момент еще только вычисляется (подробнее см. [11]).

Определение 4. Назовем совмещенным автоматом Мили-Мура автомат, функции переходов и выходов которого определяются следующим образом:

            q(t+1) = j( q(t), x(t)),                                                                                   (3)

y1(t+1) = y1(q(t), x(t)),         

y2(t+1) = y2(q(t)).

Данная модель совмещает в себе, как функции автоматов Мили, которым соответствует функция выходов y1(t+1), так и автоматов Мура – y2(t+1)

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

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

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

Тем не менее, проблемы не исчезают и в рамках классической теории на примере схемы на рис. 1 (цепь из трех автоматов-инверторов) часто демонстрируют [теоретическую] проблему неоднозначности сигналов [13]. В рамках инерционного закона ее не существует в принципе. Для этого только необходимо, чтобы при реализации параллельной автоматной модели 1) все автоматы схемы, работая в едином дискретном времени, 2) выполняли бы сначала анализ текущих входных сигналов, текущего состояния и только затем их изменяли в соответствии с функциями переходов/выходов.

Рис.1 Пример циклической цепи
Рис.1 Пример циклической цепи

Рассмотрим, как инерционный закон функционирования автоматов позволяет рассматривать схемы с контурами обратной связи. Наличие подобных связей создает множество проблем, в том числе и в [параллельном] программировании, но они почему-то «исключаются из рассмотрения» теорией автоматов (см. правильные логические сети (ППЛС) в [15]).

Заметим, что требование единого времени относится только к автоматным объектам, составляющим единую модель. Она известна под именем синхронных сетей автоматов (ССА) [16]. Единое время также необходимо для создания и применимости операций композиции и декомпозиции автоматов, без которых сложно представить анализ и синтез автоматов. У независимых же моделей дискретное время  может вполне различаться и каждая из них в общем случае может иметь свое дискретное время (см. понятие автоматных пространств в ВКПа). Но тогда перестают работать упомянутые алгебраические операции.

Заметим, что управление дискретным временем весьма удобно с практической точки зрения. Малое дискретное время можно назначать быстротекущим процессам, а большое – сервисным, диалогам и/или не столь критичным ко времени получения результата процессам. Такой подход может значительно уменьшить системные потери, связанные с переключением процессов. Особенно это критично в ситуации ограниченных вычислительных ресурсов.

4. Дизъюнктивная форма структурных конечных автоматов

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

Более того, существует даже мнение об ограниченности или даже невозможности использования автоматов для описания и моделирования систем параллельного типа, что прямо или косвенно становится аргументом в пользу других моделей. Примером может служить обоснования преимущества сетей Петри перед автоматами, приведенные в книге Дж. Питерсона (см. п.3.1.1 в [17]).  Поэтому расширение возможностей автоматов имеет не только теоретическое, но большое практическое значение.

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

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

Рассматривая подобные структурные автоматы,  будем допускать наличие у них «пустых» наборов для входных и выходных логических переменных. Они будут в этом случае представлены символом «прочерк».  Переход, помеченный «пустым» входным набором – это безусловный переход в следующее состояние. Такой переход у состояния может быть один и только один. Использование прочерка на месте выходного набора будет соответствовать отсутствию выходных сигналов. Для программ это означает отсутствие каких-либо действий с памятью.

Введем по аналогии с нормальными формами булевых функций нормальную форму описания вполне определенных структурных автоматов. Это даст более компактное их представление, т.к. позволит в явной форме выделить подавтомат, несущий существенную информацию о функционировании автомата. Под существенной информацией  понимается смена текущего состояния и/или выдача выходных сигналов даже без перехода в новое состояние. Напомним, что для дизъюнктивных форм булевых функций (БФ) аналогичный подход отделяет  единичные значения булевой функции от ее нулевых значений, и нулевые значения функции от единичных для конъюнктивных форм БФ.

Определение 5. Назовем дизъюнктивной нормальной формой структурных конечных автоматов (ДНФ СКА) вполне определенные структурные автоматы, переходы которых помечены элементарными конъюнкциями логических переменных.

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

Определение 6. Автоматы ДНФ СКА, переходы которых помечены конституентами единиц (элементарные конъюнкции ранга m для автомата, имеющего m входных каналов), назовем канонической или совершенной формой представления дизъюнктивных нормальных форм структурных автоматов  – ДКФ СКА (СДНФ СКА).

Любой вполне определенный дизъюнктивный структурный автомат M можно представить объединением двух подавтоматов - подавтомата S, который является ДНФ СКА, и подавтомата ^S, состоящего из подмножества состояний  автомата M с переходами в форме петель, где

 M=S∪S ̅. .                                                                           (4)

Когда все переходы у автомата результативные, имеем M = S.

Покажем на примерах способы задания структурных автоматов в форме ДНФ СКА.

Далее будем использовать упрощенную форму текстового задания, заменяя символ «отрицания» символом ^ или ¬ (далее будем использовать ^). Так, например, элементарная конъюнкция  будет записана как ^x1^x2. В этом случае отображение (5) примет следующий вид:

            F:                                                                                                                  (6)

                        s0 = {s1(^x1^x2/y1), s1(^x1x2/y1), s1(x1^x2/y1), s0(x1x2/y2)},              

                        s1 = {s1(^x1^x2/y1), s1(^x1x2/y1), s1(x1^x2/y1), s0(x1x2/y2)},

Когда выходным сигналам автомата удается поставить в соответствие внутренние состояния (по аналогии с автоматами Мура), то описание может быть дополнительно упрощено. В этом случае идет речь о смешанной модели автоматов Мили-Мура. Для приведенного выше примера состоянию s1 можно поставить в соответствие сигнал y1, а состоянию s0 - y2 и тогда отображение F будет следующим:

            F:                                                                                                                  (7)

                        s0 = {s1(^x1^x2/-), s1(^x1x2/-), s1(x1^x2/-), s0(x1x2/-)},                         

                        s1 = {s1(^x1^x2/-), s1(^x1x2/-), s1(x1^x2/-), s0(x1x2/-)},

В приведенных примерах F является вполне определенным структурным автоматом. Но, начиная с формулы (7), уже можно выделить подавтоматы. Обозначим их F и ^F. В результате получим подавтоматы следующего вида:

F:                                                                                                                  (8)

s0 = {s1(^x1^x2/-), s1(^x1x2/-), s1(x1^x2/-)},                                                       

s1 = {s0(x1x2/-)},

^F:                                                                                                                (9)

                        s0 = {s0(x1x2/-)},                                                                                        

                        s1 = {s1(^x1^x2/-), s1(^x1x2/-), s1(x1^x2/-)}.

В дальнейшем отображение M будем ассоциировать только с отображением F. Это вполне допустимо, т.к. по нему можно однозначно сначала восстановить отображение ^F и далее, объединив отображения, найти исходный вполне определенный автомат M.

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

Для рассматриваемого примера необходимо минимизировать следующую БФ (см. состояние s0):

y = ^x1^x2  ^x1x2  x1^x2 = ^x1  ^x2.                                                (10)

После минимизации отображения F и ^F, представленные формулами (8) и (9),  примут вид:

F:                                                                                                                  (11)

s0 = {s1(^x1/-), s1(^x2/-)},                                                  

                        s1 = {s0(x1x2/-)}.

^F:                                                                                                                (12)

                        s0 = {s0(x1x2/-)},                                                                                        

                        s1 = {s1(^x1/-), s1(^x2/-)}.

По ДНФ СКА, выполняя действия обратные рассмотренной процедуре минимизации автомата, однозначно находится его каноническое представление -  ДКФ СКА. Далее можно найти дополнение до вполне определенного автомата и, следовательно, восстановить исходное представление любого вполне определенного автомата.

5. Сети структурных автоматов

Синхронные сети из структурных автоматов (ССА) представляют адекватную параллельным процессам формальную модель[16]. При этом в качестве модели компонентного автомата сети может быть выбрана модель ДНФ СКА. Однако, если говорить об алгоритмической модели параллельных процессов, то ССА является лишь частью более общей модели параллельных процессов – параллельной алгоритмической машины. Последняя, кроме автоматного управления в форме ДНФ СКА или ССА на базе ДНФ СКА, включает дополнительно модели памяти и операторов (см. определение автоматной программы). 

 

 Рис.2. Схема RS-триггера на элементах И-НЕ
Рис.2. Схема RS-триггера на элементах И-НЕ

Учитывая, что ДНФ СКА, представленный формулой (11), представляет модель элемента И-НЕ, то модель асинхронного RS-триггера (рис.2), состоящая из двух подобных автоматов, будет следующей:

S:                                                                                                                  (13)

s0 = {s1(^a/-), s1(^d/-)},                                                      

                        s1 = {s0(ad/-)}.

R:                                                                                                                             

w0 = {w1(^c/-), w1(^b/-)},                                                  

                        w1 = {w0(cb/-)}.

 Здесь логическим переменным a, b, c, d (см. рис.2) соответствуют входные сигналы, принадлежащие соответствующим компонентным автоматам сети. В этом случае они являются локальными переменными  соответствующих структурных автоматов.

Введем логические переменные x1 и x2, соответствующие установочным входам RS-триггера, и свяжем внутренние состояния автоматных моделей элементов И-НЕ с состоянием его выходов. В результате модель RS-триггера (13) можно представить в следующем эквивалентном виде:

S:                                                                                                                  (14)

                        s1 = {s0(x1w1/-)},

s0 = {s1(^x1/-), s1(w0/-)}.                                                   

R:                                                                                                                             

                        w1 = {w0(s1x2/-)},

w0 = {w1(s0/-), w1(^x2/-)}.

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

Рис.3. Граф сетевой модели RS-триггера на элементах И-НЕ
Рис.3. Граф сетевой модели RS-триггера на элементах И-НЕ

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

6. Операция умножения структурных автоматов

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

Для автоматов в форме ДНФ СКА операция умножения, обозначаемая далее , определяется следующим образом (формулировку аналогичной операции для абстрактных автоматов см. в [11]). Пусть M – бесконечное множество структурных автоматов и  – произ­вольные непустые автоматы в форме ДНФ СКА. Обозначим их через  и , где  – соответственно входные и выходные структурные алфавиты,  – алфавиты состояний, а  – отображения соответственно Q и W в себя. ДНФ СКА , обозначаемый , называется произведением автоматов , если

где , причем . Начальным состоянием автомата  будет состояние . Поскольку  вполне определенные автоматы, то и автомат K также является вполне определенным автоматом.

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

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

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

      

где дополнения ДНФ СКА R и S до вполне определенных автоматов будут следующими (см. также рис.3):

^R:                                                                                                                (21)

                        w0 = {w0(s1x2/-)},                                                                                     

                        w1 = {w1(s0/-), w1(^x2/-)}.

^S:                                                                                                                (22)

                        s0 = {s0(x1w1/-)},                                                                                       

                        s1 = {s1(w0/-), s1(^x2/-)}.

Рассмотрим подробнее вычисление множества переходов для компонентных состояний {w0s0, w1s0, w0s1, w1s1} эквивалентного автомата подавтомата R : (см. также (14))

           

Для (26) входное x1w1s1x2 упрощено до x1x2, поскольку текущее компонентное состояние совпадает с именами логических переменных, включенных в условие перехода.

Рис.4. Граф результирующего автомата сетевой модели RS-триггера
Рис.4. Граф результирующего автомата сетевой модели RS-триггера

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

7. Теневая модель памяти автоматных программ

Для корректной реализации параллелизма программам  необходима модель памяти типа CREW (concurrent read exclusive – write) [18], в которой чтение разрешено любым параллельным операторам, а изменение общих данных – только одному из них. Автоматная модель управления ограничивает исполнение операторов программы границами текущего дискретного такта. В такой ситуации изменение памяти со стороны действий  могут фиксироваться в «теневой памяти», чтобы после их завершения стать ее новыми значениями.

Подобное взаимодействие операторов с памятью будем называть теневой моделью памяти. Она является важной частью модели памяти АП, обеспечивая корректность параллельных вычислений. Введение модели памяти упрощает программирование, т.к. становятся во многом не нужными, прямо скажем, не очень надежные механизмы синхронизации процессов (подробнее см. [19]).

Но автоматное программирование в силу эквивалентности автоматов и граф-схем алгоритмов (ГСА) (см. [20]) не запрещает использовать и любые другие механизмы управления параллельными вычислениями. Но ответственность за результат в этом случае будет нести уже программист [19].

8. Вложенная и инерционная модели автоматов

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

Итак, пусть стоит задача создания модели элемента задержки, реализующего без преобразования передачу двоичного сигнала. Пусть при этом времена задержек t01и t10, определяющие задержки переключения элемента в единичное и нулевое состояния, в общем случае не совпадают.

Модель простейшей единичной задержки автомата Мили показана на рис. 5 (ср. с моделью задержки в [21]). Более сложную модель транспортной задержки (о типах задержек подробнее см. [22]) в форме автомата Мили и совмещенной модели Мили-Мура демонстрируют рис. 6а и рис. 6б.

Рис. 5. Модель единичной задержки в форме автомата Мили
Рис. 5. Модель единичной задержки в форме автомата Мили
Рис. 6. Модель транспортной задержки Мили(а) и Мили-Мура (б)
Рис. 6. Модель транспортной задержки Мили(а) и Мили-Мура (б)

У моделей сигнал x3 примет истинное значение при равенстве значения счетчика тактов переменной t (не путать с дискретным временем модели) со значением t01или t10. Переменной t значение присваивается сигналами y4 или y3. Сигналы y1, y2 присваивают значение выходу модели, а сигнал y5 увеличивает счетчик тактов, который сбрасывается сигналом y6.

Модели на рис. 6 демонстрируют отличие автоматов Мили от автоматов Мура. Модель Мили считается удобнее, но модель Мура в определенном смысле надежнее. В нашем случае она точнее инициирует счетчик тактов, установку выходного значения и подсчет тактов, т.к. исключает повтор сигналов на переходах в состояния «0» и «1».

Механизм вложения автоматов формирует технологию модульного проектирования программ. При этом реализовать программное вложение автоматов много проще, чем аппаратное (см. [23]). Для этого на переходе в рамках функции-действия формируется вызов, создающий вложенный автомат, выход/возврат из которого реализует ядро интерпретации автоматов.

Определение 7. Вложенными автоматами будем называть вызываемые автоматы, имеющие заключительное состояние, переход в которое запускает процедуру возврата на предыдущий уровень вложенности. 

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

Если дополнить процедуру вложения автоматов [стековыми] приемами работы с данными, то это создает модель автоматных рекурсивных алгоритмов.

Рис. 7. Модель задержки в форме вложенных автоматов
Рис. 7. Модель задержки в форме вложенных автоматов

На рис.7 представлена модель задержки, где рис.7а представляет модель верхнего уровня, а рис.7б и рис. 7в – вложенные автоматы для двух типов задержек. Тип вложенного автомата – обычный или инерционный определяется заключительным состоянием. Переход в состояние «00» определяет обычный возврат, а в состояние с именем «ХХ» - возврат инерционного типа. Последний не изменяет состояние автомата верхнего уровня (см. исторические состояния в UML).

Определение 8. Автоматы, включающие вызов вложенных автоматов, у которых есть  инерционное заключительное состояние (в нашем случае состояние с именем «XX»), будем называть инерционными автоматами.

У модели на рис.7а действие z1 (так будем обозначать действия, создающие вложенные автоматы) создает один из вложенных автоматов – рис. 7а или рис. 7б, если задано значение задержки и определен ее тип. Видно, что на верхнем уровне иерархии автомат на рис.7а по структуре совпадает с моделью на рис. 5.

Любой вложенный автомат может рассматриваться в качестве «библиотечного автомата», который может быть вызван из любой другой автоматной модели.

9. Объектное автоматное программирование

Парадигма объектного программирования (ООП) доминирует в современном программировании. Автоматы расширяют ООП, формализуя понятие активных объектов, когда программу, как и схему S, можно рассматривать, как  класс в смысле ООП. В этом случае памяти M будут соответствовать свойства класса, множеству операций A – методы, а автоматное управление автоматной программы С будет представлять поведения класса.

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

Множество объектов формализует понятие объектной автоматной параллельной программы. В этом случае ее модель представляется схемой программы, в которой управление C будет представлено сетью автоматов, где компонентные автоматы описывают поведение активных объектов, память M – объединением свойств объектов, а множество операторов A – объединением методов объектов программы.

Уже существующие возможности объектно-ориентированных языков позволяют реализовать концепцию параллельного автоматного программирования. Это упрощает задачу создания языка АП, т.к. можно использовать существующий язык и его среду программирования (С++ и IDE типа Microsoft Visual Studio или Qt Creator). Подобный подход реализован в рамках среды ВКПа.  В ее «автоматном С++» объекты наделены поведением и имеют средства реализации параллелизма, как на уровне отдельных объектов, так и на уровне множества объектов. Для реализации автоматного поведения объектов создано ядро (на том же С++), интерпретирующее текстовое описание автоматного управления в форме таблиц переходов (ТП).

В основе активных автоматных классов лежит базовый класс, которому передается ссылка на описание ТП автомата. Он также содержит методы, наследуемые и/или перегружаемые в производных классах. В их число входят методы, реализующие  подключение к ядру. Есть также методы, возвращающие текущее состояние автомата, методы, представляющие операторы автоматной модели, и т.д. и т.п.

Существующие объектные реализации автоматного программирования достаточно сложны  (см. [1] и/или реализацию автоматов в Qt [7]). Одна из причин подобной сложности – отсутствие  понятной алгоритмической модели. Усугубляется это также тем, что основное внимание уделяется реализации описания автомата, а не динамическим свойствам автоматов, зависящих от их закона функционирования.

В ВКПа автоматное программирование базируется на интерпретации автоматов и выделенном управлении программ. В отличие от прямой реализации автоматов, используемой в той же SWITH-технологии, это позволяет исключить этап преобразования автоматов в блок-схемы и в полном объеме реализовать [инерционный] закон функционирования автоматов. Используемый в ВКПа алгоритм интерпретации аналогичен алгоритму, описанному Э.Хамби [24].

Далее, если не оговорено противное, мы будем ассоциировать автоматную программу с понятием автоматного объекта (АО) с учетом введенного выше понятия объектной автоматной параллельной программы. В силу этого операторы и память АП будем определять через методы и свойства объектов. От обычных объектов АО отличаются поведением, определяемым  моделью конечного автомата.

На листинге 1 приведен пример автоматного класса на языке С++ (только текст реализации), преобразующего произвольный входной сигнал в импульсную форму. В качестве базового примера взята модель, созданная в рамках пакета Stateflow среды MATLAB (см. реализацию примера в MATLAB [25]). 

На описательном уровне соответствие между  элементами автоматных программ в MATLAB и ВКПа достаточно очевидно. Это относится к множеству состояний, модели автоматного управления (в Stateflow она представлена графической формой, в ВКПа – таблицей переходов), набору входных и выходных действий.  Но есть и существенная разница – в поведении автоматных программ.  А поскольку поведение программ, определяемое законами поведения их моделей управления, разное, но, несмотря на внешнюю схожесть, данные программы все же следует считать разными.

На базе языка С++ реализация автоматных процессов в ВКПа предоставляет  значительно больше возможностей, чем аналогичное проектирование, например, в том же Stateflow. Если же модель проста, то и в ВКПа ее можно реализовать, используя весьма наглядный и удобный визуальный язык проектирования среды (здесь мы его не рассматриваем).

10. Заключение

Уже легко можно представить времена, когда программирование станет более легким, простым и наглядным, используя визуальную концепцию. Предпосылки к этому достаточно очевидны. Программирование в MATLAB и ВКПА вносит в этот процесс свой вклад. При этом, если сравнивать эффективность этих вариантов, то в ВКПа дискретный такт даже в режиме интерпретации измеряется долями милисекунд. Поддержка на уровне «железа» способна на порядки ускорить исполнение параллельных процессов (см. также [26]).

Застойные процессы в SWITCH-технологии (даже с учетом объявленной альтернативы ООП [27]) или «революционные» идеи UML вносят определенный хаос в АП, не ускоряя, а в какой-то мере даже притормаживая его развитие. Предложенная в статье модель автоматного программирования демонстрирует путь развития в рамках классической теории. Среди перспективных направлений приложения автоматных моделей следует упомянуть дискретные модели,  подобные модели кибер-физических систем [28].

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

Литература

Список литературы

1.      Шалыто А.А. Парадигма автоматного программирования. Научно-технический вестник Санкт-Петербургского государственного университета информационных технологий, механики и оптики. Вып. 53. Автоматное программирование. 2008, с. 3–23.

2.      Шалыто А.А. SWITCH-технология. Алгоритмизация и программирование задач логического управления. СПб.: Наука, 1998. 628 с.

3.      Йодан Э. Структурное проектирование и конструирование программ. М.: Мир,1979 - 415с.

4.      Stateflow [Электронный ресурс], Режим  доступа: https://matlab.ru/products/stateflow/stateflow_rus_web.pdf , свободный. Яз. англ. (дата обращения 19.03.2018).

5.      Дьяконов В.П. MATLAB. Полное руководство. – ДМК Пресс, 2010. – 768 с.

6.      Буч Г., Рамбо Дж., Якобсон И. Язык UML. Руководство пользователя. Второе издание. Академия АЙТИ: Москва, 2007. – 493 с.

7.      Боровский А.Н. Qt4.7. Практическое программирование на С++. – СПб.: БХВ-Петербург, 2012. – 496 с.

8.      Любченко В.С. Автоматная парадигма параллельного программирования //Научный сервис в сети Интернет: поиск новых решений: Труды Международной суперкомпьютерной конференции (17-22 сентября 2012 г., г. Новороссийск). - М.: Изд-во МГУ, 2012. - 752 с. ISBN 978-5-211-06394-5.

9.      Котов В.Е . Введение в теорию схем программ. Новосибирск.: Наука, 1978. -258с.

10.  Алгоритмы, математическое обеспечение и архитектура многопроцессорных вычислительных систем. М.: Наука, 1982, – 336с.

11.  Мелихов А.Н. Ориентированные графы и конечные автоматы. – М.: Наука, 1971. – 416 с.

12.  ЗАКРЕВСКИЙ А.Д. Логический синтез каскадных схем. – М.: Наука. Гл. ред. Физ.-мат. лит., 1981. – 416 с.

13.  Глушков В.М. Синтез цифровых автоматов. М.: Физматгиз, 1962.

14.  Минский М. Вычисления и автоматы. М.: Мир, 1971. – 364 с.

15.  Кузнецов О.П. Графы логических автоматов и их преобразования // Автоматика и Телемеханика. – 1975. – №9.– С. 149-158.

16.  Кузнецов О.П., Андельсон-Вельский Г.М. Дискретная математика для инженера. – 2-е изд., перераб. и доп. – М.: Энергоатом издат, 1988. – 480 с.

17.  Питерсон Дж. Теория сетей Петри и моделирование систем: Пер с англ. – М.: Мир, 1984. – 264с.

18.  Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. – М.: МЦНМО, 2001. – 960 с.

19.  Edward A. Lee. The Problem with Threads, in IEEE Computer, 39(5):33-42, May 2006 as well as an EECS Technical Report, UCB/EECS-2006-1 , January 2006 [Электронный ресурс], Режим  доступа: http://ptolemy.eecs.berkeley.edu/publications/papers/06/problemwithThreads/, свободный. Яз. англ. (дата обращения 12.05.2017).

20.  Баранов С.И. Синтез микропрограммных автоматов. – Л.: Энергия, 1979. – 232с.

21.  Кудрявцев В.Б., Алешин С.В., Подколзин А.С. Введение в теорию автоматов. – М.: Наука. Гл. ред. физ.-мат. лит., 1985. – 320 с.

22.  Армстронг Дж.Р. Моделирование цифровых систем на языке VHDL: Пер с англ./М.: Мир, 1992. – 175 с.

23.  Амбарцумян А.А., Запольских Е.Н. Об одном подходе к временной декомпозиции автоматов. I, Автомат. и телемех., 1981, выпуск 2, 135-144 [Электронный ресурс], Режим  доступа: http://www.mathnet.ru/links/7bc5ad9ab122ebea3ae07c6e4a8367b4/at5725.pdf, свободный. (дата обращения 28.06.2018).

24.  Хамби Э. Программирование таблиц решений. М.: Мир, 1976. – 86 с.

25.  State Machine Example Using Simulink [Электронный ресурс], Режим  доступа: https://www.youtube.com/watch?v=0Ix1Jf0hVfM , свободный. Яз. англ. (дата обращения 14.03.2018).

26.  Шалыто А.А, Боб Е.Б., Латников А.В., Мальцев А.М., Потехин А.Е. Программисты, компиляторы, процессоры – поиск единого вектора // Научно-технический вестник информационных технологий, механики и оптики. 2008. Т. 8. № 3. С. 199–205. doi:10.17586/2226-1494-2015-15-6-976-983

27.  Шалыто А.А, Боб Е.Б., Латников А.В., Мальцев А.М., Потехин А.Е. Эволюция методов и технологий программирования // Научно-технический вестник информационных технологий, механики и оптики. 2008. Т. 8. № 3. С. 191–199. doi:10.17586/2226-1494-2015-15-6-976-983

28.  E. A. Lee and S. A. Seshia, Introduction to Embedded Systems - A Cyber-Physical Systems Approach, Second Edition, MIT Press, 2017 [Электронный ресурс], Режим  доступа: http://leeseshia.org/releases/LeeSeshia_DigitalV2_2.pdf , свободный. (дата обращения 26.04.2018).

29.  Новый язык обычного и параллельного программирования Planning C 2.0. [Электронный ресурс], Режим  доступа: https://habr.com/ru/post/645533/, свободный. (дата обращения 26.04.2018).

 

Комментарии (38)


  1. Indemsys
    14.08.2022 23:10

    Stateflow - это хорошо. Но не стоит забывать Simulink в среде которого диаграммы Stateflow работают. А Simulink создан в парадигме потоковой обработки данных. Stateflow там лишь компонент.


    1. Sergeant101
      15.08.2022 14:50

      Знакомые буковки, Simulink, и где за пределами машинного обучения в программировании такой инструмент используется?


      1. Indemsys
        15.08.2022 16:46
        +1

        Цифровая обработка сигналов, фильтры, оцениватели состояний, квантизаторы, статистики, спектральные трансформеры, фаззи-регуляторы, HDL-кодеры, индустриальные коммуникаторы, распознаватели , навигаторы, физические симуляторы, контроллеры моторов и мехатроники, финансовые решатели и симуляторы, фазовые решетки, контроллеры роботов, радиопротоколы и симуляторы радиосетей и т.д. и т.п


  1. dvoeglazyi
    15.08.2022 01:08
    +4

    Попытался прочитать — судя по всему, статью вы писали на некоем своём «автоматном языке» — читается очень тяжело. Ну, допустим, на заре развития вычислительной техники люди действительно всерьёз обсуждали машины Тьюринга, автоматы Мили и Мура. Но я так и не смог понять ваш посыл — в чём смысл этих идей сейчас, применительно к программированию — перейти от слов к кубикам и блок-схемам? Вы не знакомы с такой передовой научно-технической вехой развития программирования как "Scratch"?

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


    1. lws0954 Автор
      15.08.2022 11:53

      Быть модным, креативным, понятным «пиплам» – это по-современному, это то, к чему надо стремиться. Кто ж с этим спорит? Собрать по максиму лайков и\или лойсов(?),так сказать, «похайпить» – ну, что еще может быть лучше?!J Правда, в процессе есть опасность, прошу прощения за выражение, «облажаться», но это так – мелочи, на которые не стоит и обращать внимание.

      Язык начинается с алфавита, теория программирования – с абстрактных машин. Не зная алфавита, не зная правил, можно выглядеть очень даже креативненько (вполне себе такой Даня Милохин), но и … безграмотным.  Если плавает, как утка, крякает, как утка, то это, наверное, и есть утка или то, что станет ею. Даже если это пусть не очень красивый птенец или весьма привлекательный селезень.

      За внешностью Stateflow и за «креативными» котиками «Scratch»-а скрывается нечто, что можно распознать, лишь зная алфавит или – тьфу! – абстрактные машины. Но увидеть это, порой, не очень просто! Здесь нужен или некий очевидный тест, который бы просветил или убедил в чем-то, или самому «ручечками» (что не очень креативно) очистить все от шелухи и докопаться до «алфавита».

      В нашем случае алфавит – это те самые абстрактные машины. Но если до них – не царское это дело, то есть простой и, думаю, креативненький такой тест. Это RS-триггер. Он рассмотрен в статье (можно ее не читать). Но он оформлен, нарисован, как «шапка» статьи. Уж его-то можно вполне собрать из «квадратиков» и в среде Stateflow, и в среде “Scratch” да и в любой другой. И если при этом получится верный результат, то все написанное в статье - полный, можно сказать, «скратч», но если не получится, то … уж будьте добры  поставить «лайк» и, отбросив все свои «креативные амбиции», и т.п. … серьезненько так заняться основами, начиная с тех самых абстрактных машин.

      Иначе… Ну, иначе прямой путь к …  лайкам (лойсам?)  Дане Милохину. Уж в лойсах, лайках и дизлайках, «котиках» и т.п. он наверняка знает толк J  


      1. Indemsys
        15.08.2022 17:03

        Теория формальных грамматик и автоматов конечно мощная. Хорошо описана в учебнике "Фундаментальные основы дискретной математики" В.А.Горбатов.
        Но даже там сразу упоминается существование алгоритмически неразрешимых задач, обнаруженных Черчем ещё в 1936 году.
        И вот программисты постоянно имеют дело с алгоритмически неразрешимыми задачами.

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



        1. lws0954 Автор
          16.08.2022 09:32

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


          1. Indemsys
            16.08.2022 10:17

            Нет, Stateflow это исключительно визуальное программирование. "Автоматчики" узурпировать Stateflow не имеют никаких оснований. Да там можно делать и в cтиле Милли и в стиле Мура, и таблицы переходов, Ну так "автоматчики" умудряются в самом потоковом Simulink сделать автоматы накидав дискретных логических компонентов. Они даже на Бейсик-е могут сделать "автомат".
            Да, в Stateflow основное элемент - это состояние, но только это и роднит его с автоматами. Поскольку переходы между состояниями могут быть по событиям, по темпоральным функциям, по сообщениям с очередями, по тригерам и по куче всего.
            Я постоянно пишу программы в Stateflow и могу создавать там программы вообще без состояний.


            1. lws0954 Автор
              16.08.2022 11:16

              Я тоже считаю программирование в Stateflow автоматным с большой натяжкой. С очень большой ;) Например, у автоматной программы хотя бы одно состояние быть должно. Но чтобы совсем без состояний? Для истинного автоматчика это уж слишком :)

              Да, это программирование похоже на автоматное. Очень похоже ;) И модели Мили и Мура похожие. Но и только. О деталях - отдельный разговор.

              Я не программирую в Stateflow, а лишь в порядке освоения его возможностей набрасывал в нем небольшие примерчики. И кое-что до конца так и не выяснил. Ну, например, есть ли доступ извне к состоянию модели? Как-то у меня не получилось. А для "автоматного программирования" это важно. Может, подскажите?


              1. Indemsys
                16.08.2022 11:28

                Я для вывода текущего состояния использую вот такую опцию у диаграммы:

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

                Либо иногда я явно при входе в каждое состояние в директиве en: присваиваю некой переменной определенной значение и эта переменная служит индикатором состояния.


                1. lws0954 Автор
                  16.08.2022 11:45

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


      1. dvoeglazyi
        15.08.2022 19:50

        Язык начинается с алфавита, теория программирования – с абстрактных машин.

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

        Уж его-то можно вполне собрать из «квадратиков» и в среде Stateflow, и в среде “Scratch” да и в любой другой.

        Мне кажется, снова немного путаетесь. Есть вещи, которые работают параллельно, а есть вещи, которые работают последовательно. Ну, допустим, можно собрать RS-триггер в среде "Майнкрафт", но вы при этом не даёте ответа на главный вопрос — зачем? Спойлер: иногда этот ответ вовсе не требуется — если бы ваша статья была разбавлена всякими "котиками" и "Данями Милохиными" — есть вероятность, что подобный вопрос у меня бы и не возник.


        1. lws0954 Автор
          16.08.2022 09:47
          +1

          Все же, скорее всего, заблуждаюсь не я. Любое мало-мальски серьезное введение в программирование начинается с определения вычислительного процесса, основанного на понятии алгоритма. В основе понятие алгоритма - определение через абстрактные машины. А уж потом идут всякие операторы, структуры данных, переход к изучению разных алгоритмов, к их реализации, как правило, на некоем условном языке программирования . Как-то так - если кратко "на пальцах". Здесь любой язык программирования - лишь некая форма описания алгоритмов. Просто пока эта форма и понятней и привычней. Но она могла бы быть и другой.

          Зачем собирать RS-триггер? Чтобы понять каким должно быть нормальное параллельное программирование. Он простая задача для параллельного программирования, но неподъемная для последовательного. Казалось бы простая мысль, но в силу определенных причин трудно воспринимаемая обычными программистами. Может, в силу их последовательного мышления, впитанного, так сказать, "с молоком".


          1. dvoeglazyi
            17.08.2022 05:30

            В основе понятие алгоритма - определение через абстрактные машины.

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

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

            Зачем собирать RS-триггер? Чтобы понять каким должно быть нормальное параллельное программирование.

            Сомневаюсь. Его уже собрали до нас, а вы в данном случае его описываете. Сомневаюсь, потому что язык C++ и программы на нём — они по своей природе последовательные, как и изначально сопутствующие им процессоры.


            1. lws0954 Автор
              17.08.2022 11:01

              Визуальное программирование, действительно, распространено не так чтобы очень. Но кроме "детских проектов" есть "взрослый" МАТЛАБ, был [заброшенный нами] Дракон. Можно и еще что-то припомнить. Я уж молчу про свою ВКПа, которой я активно пользовался, но сейчас для текущй моей работы - это ПЛК ее "слишком много" и потому она несколько в стороне... Так что тренд есть и он достаточно стабилен...

              Про триггер. Собрать-то его собрали, но как он работает, как это ни удивительно, толком нет описания. Его поведение описано в основном "на пальцах". И это при нынешнем-то развитии науки. Смех и только! А все потому, что фактически нет теории параллелизма. Без нее все выливается в некое подобие многопоточности, многоядерности, корутины тут всплыли (видимо, от недостатка идей?) и т.д. и т.п.

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

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

              Кстати, меня не напрягает даже отсутствие "настоящего" параллельного языка. Текущий вариант с С++ и ядром меня вполне устраивает.


          1. dvoeglazyi
            17.08.2022 06:21

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

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

            Например, отделять: "вот тут у меня интересная информация для всякого обывателя", "а тут интересная для тех, кто «в теме»", "а вот тут, под спойлером, не особо интересная, ну, зато какая-то важная по моему мнению". И не гнаться за количеством абзацев, слов, букав и т.п. — не оценят такое. Говорить о вашей мотивации, если не открыто, то хотя бы намекать — типа, "я придумал что-то немножко полезное", "тут описывается некое революционное изобретение", "я занялся такой вот ерундой просто от безделья / по приколу" — тоже нормальная тема, некое искреннее отношение автора к собственному произведению — то, что, к сожалению, в массе литературы трудно распознать. Потому что читаешь:

            За прошедшее время сформировалось достаточное число его поклонников и не меньшее число критиков.

            И по итогу непонятно, кем являетесь вы сами — ваш текст слишком не похож на рекламу / критику этого явления (а, наверное, хотя бы немного должен, если оно вас интересует). Ну и так далее.


            1. lws0954 Автор
              17.08.2022 11:35

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

              Занимаюсь ли я критикой? Занимаюсь, но тоже как могу. Может не так, может не столь сильно. Про корутины я сказал, про SWITCH-технологию высказался, многопоточность обхаял (но ей и без меня ей достается). Что-то это меняет? Да почти ничего. Добавить креативности, перейти на уровень "пиплов"? На это нужны свои способности, наклонности, которых у меня похоже нет. Но, может, это даже к лучшему :)


  1. sturex
    15.08.2022 09:01

    @lws0954Существуют ли поточные алгоритмы синтеза структурных автоматов с памятью?


    1. lws0954 Автор
      15.08.2022 11:58

      Можно, конечно, представить и такое. Но есть ли в этом смысл? Другое дело - реализовать поточные алгоритмы, используя сетевую автоматную модель. Что-то подобное я даже было дело пробовал :)


      1. sturex
        15.08.2022 12:06

        Да-да, вот про "сетевую автоматную модель" и её поточный синтез расскажите, пожалуйста, подробнее)


        1. lws0954 Автор
          15.08.2022 13:25

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


          1. sturex
            15.08.2022 14:48

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


            1. lws0954 Автор
              15.08.2022 16:11

              Насколько я понимаю речь об обратных связях. Здесь - это абсолютно не помеха. Но опять же все зависит от алгоритма. Смотрим на тот же триггер. Он содержит обратные связи. Причем связи перекрестные. Но в одной ситуации он "устаканивается", т.е. переходит в устойчивое состояние. В другой - входит в режим генерации. Но и то и другое - правильно. И тот и другой - ожидаемые результаты. Более того, - просчитанные (см. статью, операция умножения автоматов и построение результирующего автомата).


        1. lws0954 Автор
          15.08.2022 13:30

          Да, собственно и приведенный здесь RS-триггер - это тоже пример поточных вычислений. Каждый его элемент - это тот же поток. Они работают независимо, воспринимаю входные данные и выда.т результат. В результате имеем поведение RS-триггера. Поточного ;)


        1. lws0954 Автор
          15.08.2022 13:36

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


          1. sturex
            16.08.2022 12:20

            Вы уже, разумеется, поняли) я далёк от автоматного программирования, да и дискретную математику порядком подзабыл, поэтому просто постараюсь нарисовать:

            Автомат

            Как собрать такой автомат на "сетях структурных автоматов"? Входящие узлы принимают булевские значения. Автомат должен быть с памятью, т.е. не просто комбинационная схема.


            1. lws0954 Автор
              16.08.2022 16:41

              Собственно это не автомат. Таблица, которую Вы нарисовали не несет информации о поведении. Опишите функции переходов и выходов. Переходов - это когда есть текущее состояние и входной сигнал и нужно указать следующее состояние. Функция выходов - это когда есть это же состояние, этот же вход и нужно выдать сигнал. Если это будет несколько автоматов, например автоматы А и В, то нужно определить, если оно есть, взаимодействие между ними.


              1. sturex
                16.08.2022 17:02

                В таблице, как мне представляется, описано поведение некоего "черного ящика" в серии из 4 наблюдений за ним. И нам надо собрать устройство, реализующее идентичную логику. Что-то мне подсказывает) но эта задача очень распространённая. Скорее, даже типовая, не ошибиться бы.. в ТАУ?

                Как на "сетях структурных автоматов" построить модель черного ящика по серии наблюдений за ним?


                1. lws0954 Автор
                  17.08.2022 10:03

                  Это отдельная тема. Подобным построением автоматов я не увлекаюсь. Это уже что-то ближе к нейронным сетям. Но припомнил только одну книжку, которая, может, и сможет помочь разобраться в этом. Это Богомолов А.М., Твердохлебов В.А. Диагностика сложных систем.


                  1. sturex
                    17.08.2022 10:32

                    Хорошо, спасибо за книжку.


                  1. sturex
                    17.08.2022 11:46

                    Большой обзор Анализ и синтез автоматов по их поведению. Возможно, кому-то будет полезно


  1. Sergeant101
    15.08.2022 14:52
    +1

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


    1. lws0954 Автор
      15.08.2022 16:13

      И то и другое - одна хрень. Ей название - алгоритмы. Программирование - про алгоритмы. Может, Вас не тому и не так учили? ;)


      1. Sergeant101
        15.08.2022 16:16

        Может учили, а может и не учили, но вот троллить меня по этой теме не нужно, хотя бы поверхностно ТАУ и ЦСУ я знаю: нет там никаких алгоритмов, чистое моделирование.

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


        1. lws0954 Автор
          16.08.2022 09:52

          А моделирование - это не про алгоритмы? До текущего момента я все же представлял, что поведение любой модели определяется простым ли, сложным ли, но все же алгоритмом. Вы переворачиваете мои представления о моделировании...


  1. sokol_9
    16.08.2022 15:47
    +1

    В каких конкретно проектах применяется описанная математика?


    1. lws0954 Автор
      17.08.2022 10:04

      У меня - во всех.


      1. sokol_9
        17.08.2022 16:04

        Понятно. Если применяется только в ваших игрушках, то к чему этот высокий штиль и академический формализм?! Ощущение от вашей статьи такое, как будто читаешь нормативно-правовой акт: хочется по-быстрее закрыть, чтобы не сойти с ума. Если хотите разжечь интерес к теории автоматов и практике, нужно проще излагать для широкой публики.