Comments 27
Вы не исключили оператор цикла, а заменили его условным переходом. Собственно, все операторы цикла на уровне ассемблера и реализованы через условные переходы.
Здесь цикл именно исключен из тела программы. Это становится совсем очевидно, если для эксперимента сделать цикл бесконечным: все остальные блоки, кроме текущего не будут активными и вообще программа зависнет, т.е. в буквально "упадет" и выход из нее будет только одним - завершить исполнение среды.
В моем варианте в теле программы цикла нет от слова совсем, а вот необходимая цикличность исполнения реализуется внешней по отношению к блокам средой, т.е. средой SimInTech..
Для тех кто по-прежнему видит циклы в теле блока и особенно тому, кто ставит "минусы". Ну, ребята, нет на вас Задорнова...
Ну а если серьезно, то просмотрите хотя бы книгу Кип Р. Ирвина "Язык ассемблера для процессоров Intel". Особенно главу "Условные вычисления". Матчасть надо знать. Ну, или спросите у разработчиков среды SimInTech - есть ли внутри тела рассмотренного автоматного блока цикл? Возможно они вам и ответят... ;)
я настолько старый, что помню примеры из книжки про бейсик, условно:
10 X = 0
20 X = X + 1
30 PRINT X
40 IF X < 10 GOTO 20
Это "цикл" или "условный переход"?
Пожилых надо уважать, а потому отнеситесь с пониманием к моим последующим словам и не подумайте чего плохого...
Вы в принципе задали хороший вопрос, но из него следует также, что Вы ни чего не поняли или совсем не читали статью. Но есть такой принцип: если не получается постичь умом - попробуйте ручками...
Бейсик - это, конечно, круто :) Поэтому, чтобы не задирать планку, я все же не зря взял для демонстрации SimInTech. Его можно скачать и ручками, ручками, если не доходит по-иному, воссоздать НОД или же создать аналог Вашего или любого другого примера.
Но возьмем за основу Ваш пример. В SimInTech в аналоге вашего примера сделайте условие безусловным. В оригинале это было бы просто GOTO 20. В SimInTech это будет, конечно, несколько иначе, но ... все же освойте тамошнее программирование без GOTO (теория - у Вирта). Посмотрите, что получится. Это первое.
Второе. Подобно мне, повторив мои шаги, создайте автоматный аналог Вашего примера. Посмотрите что получится в этот раз. Сравните. О результатах было бы любопытно узнать.
Конечно. Для убеленного "годами" ветерана это может показаться достаточно сложным, но ... все же попробуйте. Уверен, что Вам покорятся вершины SimInTech, а затем, как следствие, и вершины автоматного программирования...
Собственно все сказанное выше относится и ко всем кто тут увлеченно "минусует". Настоятельно советую - ручками, ручками, ручками, если без этого не заходит.
Только без обид, плиз. Вот, как-то так и не иначе.
Конечный автомат — это цикл, на каждой итерации которого автомат меняет состояние исходя из текущего состояния и входного символа. И этот цикл выполняется, пока автомат не перейдёт в конечное состояние. На вашем Рис.5 явно видны два цикла из S1 в S1.
Конечный автомат — это цикл...
Смотрите определение КА. Там ни слова про циклы. Но есть переходы между состояниями (функция переходов автомата). Те "циклы", о которых Вы ведете речь - это обычные переходы, у которых только следующее состояние совпадает с текущим. Вот их все отличие от других переходов (которые, видимо, не циклы)...
В определении может и нет, но в реализации есть. Вот ваш автомат с Рис.9 выполнил строку 11. Каким образом он работает дальше?
А переходы S1 -> S1 — это именно циклы графа. Вы не сможете реализовать их используя только линейный код.
Он завершает текущий такт и ждет следующего дискретного такта. Как? - просто. Извне. Это реализует "автоматная машина" или, если хотите, "автоматный процессор", машина Тьюринга и т.д. и т.п. В данном случае их роль взяло на себя ядро среды SimInTech. Где здесь цикл? Но есть некая "машина" реализующая автоматные функции - переходо/выходов. Еще раз - есть некий "реализатор", т.е. внешняя среда, которая в данном случае "черный ящик".. В идеале это может быть и "автоматный процессор", аналогичный обычному процессору.
Чтобы ощутить разницу сравните две блок-схемы НОД. Одна содержит циклы, вторая - нет.
Первая не вернет управление (выполнит exit) пока не завершит циклы, вторая - по-любому "просквозит" со входа на выход. Первая при попадании в бесконечный цикл обрушит проект, вторая - ни когда. Вот эти процессы и отражает SimInTech.
Да, и еще существенный момент. Слева - это алгоритм функции, а справа это все же алгоритм процесса. Вот такие нюансы тоже нужно учитывать. Кроме того, функция рассматривается, как условно мгновенна, даже если содержит длительный по времени цикл. А вот процесс - это всегда во времени. Даже если его жизнь условно мизерна во времени (определяется числом дискретных шагов, например, одним ;).
Теперь вычислите НОД одним вызовом второй блок-схемы. Не получается? Нужно вызывать повторно? Так повторный вызов до достижения результата и есть цикл.
Повторный вызов не цикл. А автомат, вычисляющий за один вызов, может быть таким. Правда при проверке входных параметров это будет два:
Вычисление за один вызов
Но все это скажется на результате:
Тестирование двухтактного алгоритма НОД
Слева - автоматы. Справа - один блок "двухтактный". Попробуйте объяснить вид графика и результаты правой схемы.
Так как же вы собираетесь многократно вызывать свой автомат без цикла? В индусском стиле, записав 100500 вызовов один за другим?
А по вашей картинке могу только сказать, что у вас где-то ошибка в коде.
НОД(10, 2) = 2, а не 10.
Да уж, неудобно, но должен признать, что дал "в штангу". Можно даже сказал "промазал" :)... Конечно, все совсем не так... Даже код совсем не тот привел :(
Должно быть так:
Вычисление за один такт
Заменен один блок. Остальные два - автоматы. Видно, что он, как и должно, считает "мгновенно". Считает правильно, но динамика искажена. Я новому блоку даже увеличил число циклов расчета, но "мгновенный" он есть мгновенный.
Здесь я заменил и остальные два мгновенными. Расчет тоже мгновенный :)
Все однотактные автоматы
Но для разнообразия на примере трех блоков я показал "дрейф" от обычного кода к автоматному.
Варианты алгоритмов НОД
А вот тест для 11, 3. И здесь за один такт:
Тест 11, 3
Надеюсь, в этот раз не лажанул :) Все спешка-спешка.... Куда спешим? ;)
Да, если смотреть на код от 1 к 3, то мне будет понятна критика. Любая :) Но, во-первых, это Pascal, а не С++. Здесь да еще с ООП, все гораздо логичнее, проще и нагляднее. А, во-вторых, глядя на подобное "безобразие" я все же скажу, что я по-другому уже и не могу. А потому кто бы что ни говорил , я все равно буду примерно так как в 3 :) Но, конечно, на С++ А потом, чем сложнее алгоритм, тем получается больше выгоды.
отличная статья, тоже хотел разобраться с конечными автоматами
как же автор удивиться функциональным языкам без управляющих конструкций из мира процедурного программирования
С таких алгоритмов, да и с подобных книг, начинается или должно начинаться знакомство с программированием
Если бы моё знакомство с программированием началось с таких задач, я бы никогда не стал программистом. Потому что увлекательный процесс подчинения компьютера заменён на максимально скучную математику.
Почему-то в результате прочтения статьи я лишь вспомнил анекдот про суровых сибирских мужиков, засунувших лом в японскую пилораму...
Об ошибке Н. Вирта и вреде операторов цикла