مفهوم ماشین حالت : دیدگاهی متفاوت در کدنویسی

مفهوم ماشین حالت : دیدگاهی متفاوت در کدنویسی

مفهوم ماشین حالت : دیدگاهی متفاوت در کدنویسی
مفهوم ماشین حالت : دیدگاهی متفاوت در کدنویسی

هر برنامه‌نویس پیش از اینکه نوشتن برنامه را آغاز کند اگر بتواند دیاگرام مسئله شامل ورودی‌ها و حالت‌های موردانتظار را مشخص کند در برنامه‌نویسی موفق‌تر خواهد بود.

حتی اگر بتوان این نوع تفکر را در ساختار کدنویسی خود وارد کنیم می‌توانیم بسیاری از اشکالات برنامه‌نویسی خود را برطرف کنیم و برنامه‌ای با سطح خوانایی بالا داشته باشیم.

در این پست قصد داریم به مفهوم ماشین حالت و کاربرد آن در برنامه‌نویسی بپردازیم.

یکی از مشکلات برنامه‌نویسان ایجاد حلقه‌های بی‌نهایت در برنامه است. برای نمونه وجود تعداد زیادی وقفه و دستورات شرطی در برنامه ممکن است احتمال چنین خطایی را افزایش دهد.

گفتنی است حلقه بی‌نهایت دنباله‌ای از دستورالعمل‌ها در یک برنامه است که به شکل نامحدودی تکرار می‌شود یا به این دلیل که شرطی برای پایان یافتن حلقه تعیین نشده، یا اگر تعیین شده، طوری است که آن شرایط هیچگاه اتفاق نمی‌افتد.

حلقه‌های بی‌نهایت باعث می‌شوند تا برنامه کل زمان در دسترس پردازنده را مصرف کند، اما معمولاً کاربر می‌تواند آنها را از بین ببرد. یکی از دلایلی که می‌تواند باعث هنگ کردن سیستم شود همین حلقه‌های بی‌نهایت هستند.

یکی از روش‌های معمول برای رهایی از این خطا به کارگیری تایمرها و یا watchdog برای ریست سیستم است اما این روش به از دست رفتن داده یا رفتارهای ناخواسته‌ی برنامه منجر می‌شود.

از کاربردهای ماشین حالت می‌توان جلوگیری از اشکالات برنامه‌نویسی، آسان‌تر کردن اشکال‌زدایی برنامه و متوقف کردن حلقه‌های بی‌نهایت را نام برد.

از سوی دیگر معمولا برنامه‌های پیچیده و عملی در طول اجرا از تعدادی حالت مختلف عبور می‌کنند. توصیف رفتار برنامه به عنوان ماشین حالت بسیار مفید است و برنامه را ساده‌تر می‌کند.

با مفهوم ماشین حالت شما می‌توانید برنامه‌های پیچیده‌ را به صورت منطقی و با خوانایی بالا بنویسید. ممکن است در ابتدا ماشین حالت را پیچیده بدانیم یا کاربرد آن را به موارد خاص محدود کنیم اما قصد داریم برتری نوشتن برنامه بر اساس مفهوم ماشین حالت را بیان کنیم.

در این مقاله روش‌های مختلف پیاده‌سازی ماشین حالت در برنامه را دنبال خواهیم کرد.

ماشین حالت – Finite state machines

ماشین حالت، یک ابزار ریاضی برای توصیف پردازش توسط یک ماشین است و نحوه‌ی واکنش ماشین به رویدادهای مختلف را بیان می‌کند. ماشین حالت را می‌توان مدلی تشکیل شده از حالت‌ها (State)، رویدادها ، انتقال‌ها، اعمال و شرط‌ها دانست.

یک رویداد (Event)، اتفاقی است که به ماشین حالت اعمال می‌شود و به آن ورودی‌ ماشین (Input) نیز گفته می‌شود.

نحوه‌ی‌ رفتار ماشین حالت به رویدادی خاص را انتقال (Transition) می‌نامند. در یک انتقال، مشخص می‌شود که ماشین حالت بر اساس حالت جاری خود، با دریافت یک رویداد، چه عکس العملی را باید بروز دهد.

در طی یک انتقال، ماشین از یک حالت به حالتی دیگر منتقل خواهد شد.

گاهی نیاز است پیش از انجام عکس‌العمل، شرطی بررسی شده و سپس انتقال رخ دهد، به این شرط، guard یا منطق شرطی (Conditional Logic) گفته می‌شود. در صورت درست بودن شرط، انتقال انجام می‌گیرد.

یک عمل(action) بیانگر نحوه پاسخگویی ماشین حالت در طول دوره انتقال است.

Finite state machines

نمودار حالت

نمودار حالت نوعی دیاگرام برای تشریح و توضیح رفتار سیستم است.

این نمودار مجموعه‌ای از رویدادها را که در حالات مختلف و ممکن یک سیستم رخ می‌دهد تجزیه و تحلیل می‌کند. در نمودار حالت، کلیه حالات یک ماشین در نظر گرفته می‌شود.

نمودار حالت در واقع شکل بصری جدول حالت یک ماشین یا مدار منطقی است و به وسیله آن دید بهتری را می‌توان نسبت به سیستم به دست آورد.

برنامه‌ی ساده زمان‌سنج دیجیتالی را در نظر بگیرید که دارای دو حالت آغاز زمان و پایان زمان است. در تصویر زیر نمودار ماشین حالت این برنامه را مشاهده می‌کنید.

آشنایی با مفهوم ماشین حالت

1) توصیف رفتار ماشین حالت با دستورات شرطی

رایج‌ترین روش پیاده‌سازی ماشین حالت در برنامه‌نویسی C، نوشتن منطق برنامه با دستورات شرطی switch-case و if-else است. در برنامه‌ای که در ادامه آورده شده با دستورات شرطی switch-case، حالات و رویدادهای برنامه‌ی زمان‌سنج در نظر گرفته شده است. در ابتدا حالت‌ها و رویدادها را تعریف می‌کنیم. اگر رویدادی رخ دهد حالت کنونی بررسی می‌شود و با توجه به رویداد، حالت تغییر می‌کند و یک عمل اجرا می‌شود.

مزایای دستورات شرطی : برنامه ساده و قابل فهم است.

معایب دستورات شرطی: برنامه با دستورات شرطی مقیاس‌پذیر نیست یعنی برای تعداد حالت‌های بیشتر عملی و کارآمد نخواهد بود. اگر در برنامه‌های دارای تعداد زیاد حالت از این روش استفاده کنیم کد برنامه طولانی خواهد شد و در صورت تغییر در بخشی از برنامه، تغییر کد بسیار مشکل است. در این نحوه‌ی نوشتن کد، میان اجزای ماشین حالت مانند حالت‌ها و رویدادها و عمل‌ها تفکیک واضحی وجود ندارد و در نتیجه دارای خوانایی کمی خواهد بود.

2) توصیف رفتار برنامه با جدول انتقال حالت

آشنایی با مفهوم ماشین حالت : دیدگاهی نو برای کدنویسی

جدول انتقال حالت زمان سنج

مزایای جدول انتقال حالت: استفاده از جدول انتقال حالت به جای دستورات شرطی، باعث مقیاس پذیری برنامه می‌شود یعنی گسترش برنامه به تعداد حالت‌های بیشتر امکان‌پذیر است و کد برنامه خوانایی بالاتری دارد چراکه از یک جدول انتقال برای تعریف ماشین حالت استفاده می‌شود. بر خلاف دستورات شرطی از ساختارهای تکراری استفاده نمی‌شود. هنگام تغییر برنامه یا اضافه‌کردن حالت بیشتر به برنامه تنها جدول انتقال تغییر می‌کند.

3) تفکیک حالت‌ها در توابع

در کدی که ارائه می‌شود هر عمل (action) در یک تابع تعریف شده و برنامه به صورت تفکیک شده است.

حمایت از Khatereh Akbari

خوشحال میشیم برای تداوم و کیفیت ما رو حمایت کنید.

0 نفر

پــــســنــدیـده انـد

توجه

دیدگاه ها

5 دیدگاه

  • پارسا
    ۲۳ شهریور ۱۴۰۰

    بی زحمت ی مثال کامل از روش دوم با avr قرار بدید که بتونیم بفهمیم چیه دقیقا

  • حسین
    ۲۳ آبان ۱۳۹۹

    سلام.
    مطلب خوبی بود .
    ولی معایب جدول انتقال حالت رو نفرمودید .
    علی القاعده باید از منابع سیستم بیشتر استفاده کنه …

  • مهدی
    ۱۰ مهر ۱۳۹۹

    سلام تشکر بابت مطالب خوبتون عالیه
    لطفا ادامه بدید
    درضمن لطفا روحساب اینکه همه بلدند توضیح ندید
    یکم بیشتر جامع تر و بامثال بیشتر ..
    من حالت اول رو بلد بودم اما حالت دوم جالب بود اما بد نبود مثال دقیق تر و کاربردی تر(یعنی در مین اصلی استفاده شده )ی ارائه میدادید
    جاداره ادامش بدید

  • مهدی
    ۱۳ اسفند ۱۳۹۸

    سلام وقت به خیر ممنون از مطلب جالب
    من کمی با مثالی که برای حالت جدولی آوردید مشکل دارم. تابع main برنامه کجاست و توابع action و start و stop کجا فراخوانی می شوند؟ اگر در یک وضعیتی بخواهیم یک وظیفه را به صورت ادامه دار انجام دهیم – مانند چک کردن وضعیت یک کلید ورودی – اون قسمت از کد باید کجا بیاد؟
    ممنون

    • Zeus ‌
      زئوس Zeus
      ۲۴ اسفند ۱۳۹۸

      خوب این یه شبح برنامه است و برنامه کامل نیست که این جزییات رو داشته باشه :/

پر بحث ترین ها

مسابقه دوم : چالش برنامه نویسی به زبان C

مسابقه اول سیسوگ (مسابقه اول: درک سخت افزار) انتقادهای زیادی رو در پی داشت تا جایی که حتی خودمم به نتیجه مسابقه...

Zeus ‌ Zeus ‌
  • 2 سال پیش

راه اندازی LCD گرافیکی Nokia 1661 و دانلود کتابخانه آن

LCD گرافیکی یکی از مهم ترین پارامترهای موجود در طراحی انواع مدارات الکترونیکی پیچیده و حتی ساده است ، نمایش وضعیت و...

Zeus ‌ Zeus ‌
  • 4 سال پیش

ریموت کدلرن و چکونگی دکد کردن آن به همراه سورس برنامه

ریموت کنترل امروزه کاربرد زیادی پیدا کرده است؛ از ریموت‌های درب بازکن تا ریموت‌های دزدگیر و کنترل روشنایی همه از یک اصول اولیه پیروی می‌کنند و آن‌هم ارسال اطلاعات به‌صورت بی‌سیم است....

Zeus ‌ Zeus ‌
  • 5 سال پیش

همه چیز درباره ریموت کنترل‌های هاپینگ

امنیت همیشه و در همه‌ی اعصار، مقوله‌ی مهم و قابل‌توجه‌ ای بوده و همیشه نوع بشر به دنبال امنیت بیشتر، دست به ابداعات و اختراعات گوناگونی زده است. ریموت کنترل یکی از این اختراعات است. در این مقاله، به بررسی امنیت انواع ریموت‌های کنترل خواهیم پرداخت....

Zeus ‌ Zeus ‌
  • 5 سال پیش

مسابقه سوم: استخراج داده از رشته ها در زبان C

نزدیک به 5 ماه از مسابقه دوم سیسوگ می‌گذره و فکر کردم که بد نیست یک چالش جدید داشته باشیم! البته چالش‌ها...

Zeus ‌ Zeus ‌
  • 2 سال پیش

مسابقه ششم: بزن میکروکنترلر را بسوزون!

بزنم میکروکنترلر را بسوزونم اونم تو  این شرایط!، طراحی مسابقه از اون چیزی که به نظر می‌رسه سخت‌تر است، باید حواست باشه...

Zeus ‌ Zeus ‌
  • 11 ماه پیش

آموزش قدم به قدم راه اندازی +NRF24L01

آموزش قدم به قدم راه اندازی +NRF24L01  با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها قبل از اینکه قسمت بشه با ماژول...

رسول خواجوی بجستانی رسول خواجوی بجستانی
  • 3 سال پیش

ساخت ماینر با FPGA و ARM

چند ماهی هست که تب بیت کوین و ارزهای دیجیتال خیلی بالا رفته! چه شد که این پست را نوشتم همانطور که...

Zeus ‌ Zeus ‌
  • 3 سال پیش

کار با ماژول تمام عیار mc60 – قسمت دوم – راه اندازی OpenCPU

در قسمت اول به یکسری اطلاعات کلی ماژول mc60 پرداختیم، با نرم افزار QNavigator کار کردیم و یک هدربرد هم برای کار...

Mahdi.h   Mahdi.h  
  • 3 سال پیش

مسابقه چهارم: کدام حلقه سریع‌تر است؟

حدود ۷ ماه پیش، مسابقه سوم سیسوگ رو برگزار کردیم و کلی نکته در مورد خواندن رشته‌های ورودی را بررسی کردیم. فکر...

Zeus ‌ Zeus ‌
  • 1 سال پیش
سیـــســـوگ

مرجع متن باز آموزش الکترونیک