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

Продолжим тему нахождения наибольшего общего делителя (НОД) двух чисел для МТ. Только теперь это будет обычное программирование. По счастью ли по совпадению нужный нам алгоритм приведен в книге Н.Вирта [2]. Его блок‑схема (БС) приведена на рис. 1. Обычная и ни чем не примечательная БС и совсем простой алгоритм. Особенно в сравнении с рассмотренными для МТ. Привел он его, преследуя другие цели, но сейчас не это главное.

Рис.1.  Блок-схема алгоритма нахождения НОД двух чисел
Рис.1. Блок‑схема алгоритма нахождения НОД двух чисел

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

Рис. 2. Эквивалентная рис. 1 блок-схема
Рис. 2. Эквивалентная рис. 1 блок‑схема

А теперь большего внимания. Превратим граф на рис.2 в граф переходов для машины Тьюринга или граф конечного автомата (КА). Он на рис. 3. Сравните его с графами на рис.1 и рис.2. Заметим, что метки w0, w1, w2 на рис. 2 это имена будущих состояний автомата и/или МТ. Их места и сам переход к автомату определены процедурой нахождения эквивалентного любой блок‑схеме автомата, описанной Барановым С.И. [3].

Итак, мы перешли от блок‑схемы к графу переходов машины Тьюринга или к конечному автомату. В данном случае термины МТ и КА по сути синонимы. В подобной машине/автомате мы не оперируем единичками и ноликами, и нет ленты. Эти мелочи воображение должно игнорировать.

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

Рис.3. Граф переходов в форме КА для машины Тьюринга
Рис.3. Граф переходов в форме КА для машины Тьюринга

Осталось запрограммировать «автоматную машину» на языке С++. Ее код приведен в листинге 1.

Листинг 1
class FGrCmDivWirth: public FTuringMashine
{
public:
    void virtual FResetActions();
    FGrCmDivWirth(string strNam);
    int x{4};    int y{6};    int NOD{0};
protected:
    int x1(); int x2();
    void y1(); void y2(); void y3();
    void y4(); void y5(); void y6();
    int a{0};    int b{0};    char buf[20];
};
// Вирт Н. Систематическое программирование. Введение. Пер с англ. – М.:Мир, 1977. – 184 с.
// Алгоритм нахождение НОД
// стр. 40 (5.18)
// 20/08/2026

LArc TBL_GrCmDivWirth[] = {
    LArc("w0","w1","--","y1y5"),
    LArc("w1","w1","x1x2","y3y5"),
    LArc("w1","w1","x1^x2","y2y5"),
    LArc("w1","w2","^x1","y4y5"),
    LArc("w2","w2","^--","y6"),
    LArc()
};

FGrCmDivWirth::FGrCmDivWirth(string strNam):
    FTuringMashine(strNam, TBL_GrCmDivWirth)
{
    sprintf(buf, "%d,%d", x, y); strSrc = buf;
    strSrc = buf;
    strSaveTape = strTape = strSrc;
}
void FGrCmDivWirth::FResetActions() {
    strTape = strSaveTape;
    FTuringMashine::FResetActions();
};
// ПРЕДИКАТЫ
int FGrCmDivWirth::x1() { return a != b; }
int FGrCmDivWirth::x2() { return a > b; }
// ДЕЙСТВИЯ
void FGrCmDivWirth::y1() {
    vector<string> strList = splitString(strTape, ",");
    x = stod(strList[0]); y = stod(strList[1]);
    a = x; b = y;
}
void FGrCmDivWirth::y2() { b = b - a; }
void FGrCmDivWirth::y3() { a = a - b; }
void FGrCmDivWirth::y4() { NOD = a; }
void FGrCmDivWirth::y5() { sprintf(buf, "%d,%d", a, b); strTape = buf; }
void FGrCmDivWirth::y6() { sprintf(buf, "НОД=%d", NOD); strTape = buf; Stop(); }

Можно было бы в качестве родительского объекта взять автоматный класс LFsaAppl библиотеки VCPa, которому в свойства добавить «ленту». Но мы взяли класс FTuringMashine, описанный в предыдущей статье [1], чтобы воспользоваться диалогом для отображения процесса нахождения НОД. Результат демонстрирует gif1 (см. диалог GrCmDivWirth).

Gif 1. Реализация алгоритма НОД по книге Н.Вирта
Gif 1. Реализация алгоритма НОД по книге Н.Вирта

Когда еще не было современного ИИ, программисты, желая создавать надежные и понятные программы, стремились к использованию автоматной модели. Им, как минимум, ее убедительно рекомендовали. Называлось это, порой, по‑другому, например, метод преобразования неструктурированных программ Ашкрофта‑Манны, таблицы решений и т.д и тому подобное[4]. Они больше внимания уделяли созданию качественных и надежных программ, не надеясь на методы типа model checking, которые сложны и на практике, порой, неприменимы (см. свежую статью на эту тему на Хабре — сложно, путано и без ответов на простые вопросы [5]).

Давайте сравним новый алгоритм НОД для расширенной МТ с его аналогом на чистой МТ (на gif 3 они представлены оба). Например, прогнав алгоритмы в пошаговом режиме. Так, при числе состояний у МТ (берем программу из книги Трахтенброта Б.А. в листинге 1 [1]) — пять (q1, q2, q3, q4, q5), а у Н.Вирта — 3 мы получаем достижения результата в тактах: для МТ — без малого 100, для КА — 5 (следите за мышкой на gif 1).

Сложность алгоритмов в рамках МТ/КА можно оценить по числу состояний и переходов, а скорость по числу затраченных тактов на достижение результата. Просто, наглядно, точно! Чтобы получить подобные оценки на «обычной машине» надо очень постараться. А у нас — из коробки.

Разница между блок‑схемным программированием и тьюринговым образно сравнима с различием между обычным передвижением и с ходьбой на костылях. Удивляет, что многие этого не понимают и упорно цепляются за «костыли». Особенно в многопоточном программировании. Видимо, перестали читать книги и статьи, где дана объективная оценка многопоточности и приведено множество аргументов в пользу использования тех же автоматов.

Сравним подходы, например, только на уровне управления процессами. На видео, используя диалог CoreSetting, можно:

  1. перезапускать процессы — кнопка Restart VCPa,

  2. останавливать/запускать процессы — StopAll Tasks,

  3. переводить систему в пошаговый режим — флаг step‑by‑step

  4. выполнять один шаг — кнопка step‑by‑step,

  5. управлять скоростью работы процессов и если необходимо его подправлять — два поля Delta Time.

Все эти возможности создает автоматная, а по ее истокам — модель вычислений на базе МТ. При этом на уровне ядра VCPa это уже не одна машина Тьюринга, а их параллельное множество (см. на работу процессов на gif 3).

И вы все еще будете настаивать, что машина Тьюринга «интересна сама по себе» (см. обсуждение [1])?! «Тогда мы спешим к вам!»

Литература

  1. По заветам Макконнела

  2. Вирт Н. Систематическое программирование. Введение. Пер с англ. — М.:Мир, 1977. — 184 с.

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

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

  5. 5ⁿ → 4n+1: сколько на самом деле дают редукции в explicit‑state model checking. https://habr.com/ru/articles/1072376/

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


  1. dyadyaSerezha
    23.08.2026 03:25

    Накину на вентилятор немного неожиданных вопросов.

    Мозг - это массово параллельный вычислитель. Вопрос: есть ли в нем та самая главная машина Тюринга или некое ядро CPU, которое прямо или косвенно управляет всеми остальными вычислителями?

    Например, ваше сознание возвращается после сна и вы осознаете, что вы проснулись. Конечно, есть отдел мозга, отвечающий за это (сейчас вообще не важно, как он называется), но есть ли в нем та главная клетка, сигнал или уровень сигнала в которой приводит к той первой мысли - о, я проснулся, я что-то ощущаю. А если нет одной клетки, то сколько клеток надо минимум? 10? 1000? Обязательно связанных или достаточно просто массы? Если обязательно связанных, то насколько тесно? Или возможны варианты и того, и того, и ещё чего-то? Интересно…


    1. Radisto
      23.08.2026 03:25

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


      1. dyadyaSerezha
        23.08.2026 03:25

        Самосознание выносим вообще за скобки, не про него вопрос. Ну или считаем, что оно есть и для него требуется 10 миллиардов нейронов, это неважно. Важно в моем вопросе только одно - есть ли та самая главная машина Тюринга или некий её аналог в мозгу, который управляет всеми остальными? One ring to rule them all.

        Или мозг - принципиально сетевая структура, с возможной иерархией, но всё равно в рамках сети?


        1. lws0954 Автор
          23.08.2026 03:25

          Можно лишь сказать, что есть такая главная машина. Это сам наш мозг. Проблема одна - понять алгоритм ее работы. Так что по большому счету Вы на верном пути. :)


          1. dyadyaSerezha
            23.08.2026 03:25

            Если лежание на диване принять за путь, то я несомненно на очень верном пути)

            Не стой под стрелой!
            Не лежи на путях!


            1. lws0954 Автор
              23.08.2026 03:25

              Вы не просто лежите - Вы размышляете. Если я мыслю, значит, я живу. Лежит тело, а мысль движется. И, кстати, движение Вашей мысли имитирует некая МТ. Я надеюсь, что именно так ;)


    1. lws0954 Автор
      23.08.2026 03:25

      Что такое мозг мы, к сожалению, еще не разобрались. Какую-то его деятельность мы можем сымитировать (тот же ИИ), но и не более того. Машина Тьюринга объясняет наше текущее понимание алгоритма. Но это совсем не про сам алгоритм работы нашего мозга. Ищем, ищем... Но найдем ли и когда? ;) Как-то так.


      1. dyadyaSerezha
        23.08.2026 03:25

        ИИ не имитирует работу мозга, он имитирует результаты работы мозга - связный логический текст. Но это и всё.


        1. lws0954 Автор
          23.08.2026 03:25

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


          1. dyadyaSerezha
            23.08.2026 03:25

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


            1. lws0954 Автор
              23.08.2026 03:25

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

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

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


              1. lws0954 Автор
                23.08.2026 03:25

                Ты, мой придирчивый читатель, объясни, пожалуйста, за что ты мне поставил "минус"? Мне это очень важно знать.


          1. lws0954 Автор
            23.08.2026 03:25

            Может, тебе непонятно и ты потому поставил мне минус? Извини, что на ты, но попробую пояснить. Если поймешь, конечно.

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

            Если есть, то - поздравляю! - ты наконец-то опроверг самого Тьюринга. А если еще предъявишь свои аргументы и доказательства, то этот день будет записан в скрижали теории алгоритмов и программирования. И тогда я к тебе буду обращаться только на Вы.


    1. THEOILMAN
      23.08.2026 03:25

      В сон лучше вообще не лезть. Это ещё более глубокая абстракция, не показатель. Нам бы на поверхности разобраться. Как у Кастанеды было - просто заставь себя перед сном посмотреть на собственные руки во сне и всё сломается)))0)0)


      1. dyadyaSerezha
        23.08.2026 03:25

        Кастанеда для меня не показатель)