مدل اجرا

در محاسبات، یک زبان برنامه‌نویسی شامل سینتکس به علاوه یک **مدل اجرایی** است. مدل اجرایی رفتار عناصر زبان را مشخص می‌کند. با اعمال مدل اجرایی، می‌توان رفتار یک برنامه که بر اساس آن زبان برنامه‌نویسی نوشته شده است را استنباط کرد. به عنوان مثال، وقتی یک برنامه‌نویس کد را "می‌خواند"، در ذهن خود روند اجرای هر خط از کد را مرور می‌کند. در واقع، او رفتار کد را در ذهن خود شبیه‌سازی می‌کند. آنچه که برنامه‌نویس انجام می‌دهد این است که مدل اجرایی را به کد اعمال می‌کند که در نتیجه آن، رفتار کد مشخص می‌شود.

هر زبان برنامه‌نویسی دارای یک مدل اجرایی است که نحوه زمان‌بندی اجرای واحدهای کاری (که توسط نحو برنامه مشخص می‌شود) را برای اجرا مشخص می‌کند. مثال‌های دقیق از مدل‌های اجرایی برخی زبان‌های محبوب شامل مدل اجرایی پایتون  
مدل اجرایی زبان برنامه‌نویسی Unified Parallel C (UPC),  
بحث در مورد انواع مختلف مدل‌های اجرایی مانند مدل‌های اجرایی زبان‌های دستوری در برابر تابعی  
و مقاله‌ای در مورد مدل‌های اجرایی برای زبان‌های بلادرنگ

## جزئیات مدل اجرایی

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

مدل اجرایی مسائلی مانند اینکه واحد کاری غیرقابل تقسیم چیست و محدودیت‌های ترتیب انجام این واحدهای کاری چگونه است را پوشش می‌دهد. به عنوان مثال، عمل جمع یک واحد کاری غیرقابل تقسیم در بسیاری از زبان‌ها است و در زبان‌های دنباله‌ای، این واحدهای کاری محدود به این هستند که به ترتیب یکی پس از دیگری انجام شوند.

برای روشن شدن این مطلب، به زبان برنامه‌نویسی C توجه کنید که در کتاب توسط کرنیگان و ریچی توضیح داده شده است.  
زبان C مفهومی به نام "بیانیه" دارد. مشخصات زبان یک بیانیه را به عنوان یک بخش از نحو تعریف می‌کند که با ";" تمام می‌شود. مشخصات زبان سپس می‌گوید که "اجرای برنامه به ترتیب یکی پس از دیگری انجام می‌شود". این کلمات: "اجرای برنامه به ترتیب یکی پس از دیگری انجام می‌شود" یکی از بخش‌های مدل اجرایی C است. این کلمات به ما می‌گویند که بیانیه‌ها واحدهای کاری غیرقابل تقسیم هستند و به همان ترتیبی که در کد نوشته شده‌اند اجرا می‌شوند (مگر اینکه یک دستور کنترلی مانند IF یا FOR ترتیب اجرا را تغییر دهد). به این ترتیب، مدل برنامه‌نویسی C محدودیت‌هایی در مورد ترتیب انجام واحدهای کاری را تعیین کرده است.

مدل اجرایی زبان C همچنین شامل اولویت انجام عملیات است. اولویت انجام عملیات قوانین مربوط به ترتیب انجام عملیات درون یک بیانیه را مشخص می‌کند. این اولویت‌ها به‌عنوان محدودیت‌هایی در انجام واحدهای کاری در داخل یک بیانیه عمل می‌کنند. بنابراین، علامت ";" و دستورات کنترلی مانند "IF" و "WHILE" محدودیت‌هایی در ترتیب انجام بیانیه‌ها ایجاد می‌کنند، در حالی که اولویت انجام عملیات قوانین محدودکننده‌ای برای انجام واحدهای کاری درون یک بیانیه فراهم می‌آورد. به این ترتیب، این بخش‌ها از مشخصات زبان C همچنین بخشی از مدل اجرایی زبان C هستند.

مدل‌های اجرایی همچنین می‌توانند به‌طور مستقل از زبان‌های برنامه‌نویسی وجود داشته باشند. نمونه‌هایی از این نوع مدل‌های اجرایی شامل کتابخانه POSIX Threads و مدل برنامه‌نویسی Map-Reduce در هداپ است. پیاده‌سازی یک مدل اجرایی می‌تواند از طریق کامپایلر یا مفسر انجام شود و معمولاً شامل یک سیستم زمان اجرا است.

یک پیاده‌سازی از مدل اجرایی ترتیب انجام کارها را در طول اجرای برنامه کنترل می‌کند. این ترتیب ممکن است پیش از زمان اجرا مشخص شود، یا ممکن است به‌طور پویا در حین اجرای برنامه تعیین گردد. بیشتر مدل‌های اجرایی درجات مختلفی از این دو حالت را اجازه می‌دهند. به‌عنوان مثال، زبان C ترتیب کارها را درون یک بیانیه ثابت کرده و ترتیب تمام بیانیه‌ها را نیز ثابت می‌کند، مگر در مواردی که دستورات کنترلی مانند IF یا FOR ترتیب اجرای آن‌ها را تغییر دهند. بنابراین بیشتر ترتیب انجام کارها به‌طور ایستا پیش از شروع اجرا مشخص می‌شود، اما بخش کمی از آن باید به‌طور پویا در حین اجرا تعیین شود.

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

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

## مدل اجرایی زبان اسمبلی در مقابل پیاده‌سازی توسط میکرومعماری‌ها

زبان‌های اسمبلی نیز مانند هر زبان دیگری مدل‌های اجرایی دارند. چنین مدل اجرایی توسط میکرومعماری پردازنده پیاده‌سازی می‌شود. به‌عنوان مثال، هم یک پایپ‌لاین ۵ مرحله‌ای به‌صورت ترتیبی و هم یک پردازنده بزرگ با اجرای غیرترتیبی مدل اجرایی یک زبان اسمبلی مشابه را پیاده‌سازی می‌کنند. مدل اجرایی تعریف‌کننده رفتار است، بنابراین تمام پیاده‌سازی‌ها، چه ترتیبی، چه غیرترتیبی، چه تفسیر شده یا JIT‌شده و غیره، باید همان نتیجه را بدهند، و آن نتیجه توسط مدل اجرایی تعریف شده است.

## مدل‌های اجرایی موازی

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

برای مثال، یک سازه همزمان‌سازی رایج قفل است. در نظر بگیرید یک خط زمانی. این خط زمانی نقطه‌ای دارد که در آن سازه همزمان‌سازی "کسب مالکیت قفل" اجرا می‌شود. در نخ‌های Posix، این می‌تواند pthread_mutex_lock(&myMutex) باشد. در جاوا، این می‌تواند lock.lock() باشد. در هر دو مورد، خط زمانی به‌نام نخ است. مدل اجرایی C و جاوا به‌صورت ترتیبی است و بیان می‌کند که خط زمانی فعالیت‌هایی دارد که قبل از کسب مالکیت قفل اجرا می‌شوند و فعالیت‌هایی که پس از کسب مالکیت قفل اجرا می‌شوند. به‌طور مشابه، یک عملیات "رها کردن مالکیت قفل" نیز وجود دارد. در C این می‌تواند pthread_mutex_unlock(&myMutex) باشد. در جاوا، این می‌تواند lock.unlock() باشد. دوباره، مدل‌های اجرایی C و جاوا بیان می‌کنند که یک گروه از بیانیه‌ها قبل از رها کردن مالکیت قفل اجرا می‌شوند و گروه دیگری پس از رها کردن مالکیت قفل اجرا می‌شود.

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

نخ دوم، فرض کنید نخ B، برخی از بیانیه‌ها را اجرا می‌کند، بیانیه‌هایی که آن‌ها را بیانیه‌های قبل از قفل B می‌نامیم. سپس نخ B "کسب مالکیت قفل" را اجرا می‌کند، سپس نخ B بیانیه‌های پس از قفل B را اجرا می‌کند که پس از کسب مالکیت قفل اجرا می‌شوند.

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

"در صورتی که مالکیت قفل از نخ A به نخ B منتقل شود، بیانیه‌های پس از کسب قفل A قبل از بیانیه‌های پس از کسب قفل B اجرا می‌شوند."

پیچیدگی از اینجا ناشی می‌شود که مدل اجرایی هیچ وسیله‌ای ندارد که اجرای "رها کردن مالکیت قفل" تأثیری بر ترتیب اجرای "کسب مالکیت قفل" در خط زمانی دیگر (نخ دیگر) داشته باشد. اغلب فقط برخی از انتقال‌ها نتایج معتبر می‌دهند. بنابراین، برنامه‌نویس باید تمام ترکیب‌های ممکن از یک نخ که مالکیت قفل را رها می‌کند و نخ دیگری که آن را بعداً کسب می‌کند، در نظر بگیرد و اطمینان حاصل کند که کد فقط ترکیب‌های معتبر را اجازه می‌دهد.

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

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

## جستارهای وابسته
  
* سیستم زمان اجرا  
* اجرا (رایانش)  
* زمان‌بندی (رایانش)

## منابع

  
رده:سکوهای رایانش