Возможно многие слышали о детерминированных конечных автоматах. Это интересная тема, и я хотел бы изложить ее в виде небольшого и очень простого скрипта на perl, демонстрирующего принцип конечного автомата.
Итак, два основных понятия, которые важны при рассмотрении конечного автомата:
1. Состояние
2. Входные символы
Напомню что:
Детерминированным конечным автоматом (ДКА) называется такой автомат, в котором для каждой последовательности входных символов существует лишь одно состояние, в которое автомат может перейти из текущего.
И в качестве примера рассмотрим модель: вопрос - ответ. То есть наш автомат может находиться только в одном из этих стостояний: поиск ответа или получение вопроса.
При получении вопроса - автомат переходит в состоянии поиска ответа, выдает ответ на терминал и снова переходит в состояние ожидания вопроса. Входными символами в нашем примере будет какое-либо слово или фраза, по которой автомат будет искать ответ.
1 #!/usr/bin/perl -w
2 #
3 use strict;
4
5 # бесконечный цикл
6 while(1) {
7 state_answer(state_quest());
8 }
9 # состояние ожидания вопроса
10 sub state_quest {
11 print "\n> ";
12 my $line=<STDIN>;
13 chomp($line);
14 exit 0 if $line=~/^exit/i;
15 return $line;
16 }
17 # состояние поиска ответа
18 sub state_answer {
19 my $quest=shift;
20 # ответы ищем в текстовом файле
21 open(FILE,"<","base.txt") || die "$!\n";
22 while(<FILE>) {
23 chomp;
24 print and return if /$quest/ig;
25 }
26 }
При получении в качестве вопроса команды exit - завершаем программу.
Теперь собственно зачем я это пишу - модель ДКА может очень пригодится в разработке. Особенно полезна она для обработки большого потока входных данных, и зачастую гораздо выигрышней модели с использованием threads (потоков), но из-за некоторой теоретической сложности зачастую отпугивает начинающих программистов.
Приведенный пример можно легко переложить на сервер обслуживающий подключения клиентов, у него два состояния: получение запроса - отдача контента.
Кстати, известный nginx работает как раз по этому принципу ;-)



Комментировать