موضوع مقاله: مدل اجرا | مخاطب: عمومی | لحن: دانشنامه‌ای | ساختار: عنوان، مقدمه، 3 بخش، جمع‌بندی | مقاله: | # مدل اجرا | مقدمه: با اعمال مدل اجرایی، می‌توان رفتار یک برنامه که بر اساس آن زبان برنامه‌نویسی نوشته شده است را استنباط کرد. | ## بخش 1: مدل اجرا | به عنوان مثال، وقتی یک برنامه‌نویس کد را "می‌خواند"، در ذهن خود روند اجرای هر خط از کد را مرور می‌کند. آنچه که برنامه‌نویس انجام می‌دهد این است که مدل اجرایی را به کد اعمال می‌کند که در نتیجه آن، رفتار کد مشخص می‌شود. هر زبان برنامه‌نویسی دارای یک مدل اجرایی است که نحوه زمان‌بندی اجرای واحدهای کاری (که توسط نحو برنامه مشخص می‌شود) را برای اجرا مشخص می‌کند. مثال‌های دقیق از مدل‌های اجرایی برخی زبان‌های محبوب شامل مدل اجرایی پایتون مدل اجرایی زبان برنامه‌نویسی Unified Parallel C (UPC), بحث در مورد انواع مختلف مدل‌های اجرایی مانند مدل‌های اجرایی زبان‌های دستوری در برابر تابعی و مقاله‌ای در مورد مدل‌های اجرایی برای زبان‌های بلادرنگ جزئیات مدل اجرایی سیمانتیک عملیاتی یکی از روش‌های مشخص کردن مدل اجرایی یک زبان است. رفتار مشاهده‌شده یک برنامه در حال اجرا باید با رفتار استخراج‌شده از سیمانتیک عملیاتی مطابقت داشته باشد (که مدل اجرایی زبان را تعریف می‌کند). مدل اجرایی مسائلی مانند اینکه واحد کاری غیرقابل تقسیم چیست و محدودیت‌های ترتیب انجام این واحدهای کاری چگونه است را پوشش می‌دهد. به عنوان مثال، عمل جمع یک واحد کاری غیرقابل تقسیم در بسیاری از زبان‌ها است و در زبان‌های دنباله‌ای، این واحدهای کاری محدود به این هستند که به ترتیب یکی پس از دیگری انجام شوند. برای روشن شدن این مطلب، به زبان برنامه‌نویسی C توجه کنید که در کتاب توسط کرنیگان و ریچی توضیح داده شده است. مشخصات زبان یک بیانیه را به عنوان یک بخش از نحو تعریف می‌کند که با ";" تمام می‌شود. مشخصات زبان سپس می‌گوید که "اجرای برنامه به ترتیب یکی پس از دیگری انجام می‌شود". این کلمات: "اجرای برنامه به ترتیب یکی پس از دیگری انجام می‌شود" یکی از بخش‌های مدل اجرایی C است. این کلمات به ما می‌گویند که بیانیه‌ها واحدهای کاری غیرقابل تقسیم هستند و به همان ترتیبی که در کد نوشته شده‌اند اجرا می‌شوند (مگر اینکه یک دستور کنترلی مانند IF یا FOR ترتیب اجرا را تغییر دهد). به این ترتیب، مدل برنامه‌نویسی C محدودیت‌هایی در مورد ترتیب انجام واحدهای کاری را تعیین کرده است. اولویت انجام عملیات قوانین مربوط به ترتیب انجام عملیات درون یک بیانیه را مشخص می‌کند. این اولویت‌ها به‌عنوان محدودیت‌هایی در انجام واحدهای کاری در داخل یک بیانیه عمل می‌کنند. بنابراین، علامت ";" و دستورات کنترلی مانند "IF" و "WHILE" محدودیت‌هایی در ترتیب انجام بیانیه‌ها ایجاد می‌کنند، در حالی که اولویت انجام عملیات قوانین محدودکننده‌ای برای انجام واحدهای کاری درون یک بیانیه فراهم می‌آورد. | ## بخش 2: مدل اجرا | به این ترتیب، این بخش‌ها از مشخصات زبان C همچنین بخشی از مدل اجرایی زبان C هستند. مدل‌های اجرایی همچنین می‌توانند به‌طور مستقل از زبان‌های برنامه‌نویسی وجود داشته باشند. پیاده‌سازی یک مدل اجرایی می‌تواند از طریق کامپایلر یا مفسر انجام شود و معمولاً شامل یک سیستم زمان اجرا است. یک پیاده‌سازی از مدل اجرایی ترتیب انجام کارها را در طول اجرای برنامه کنترل می‌کند. این ترتیب ممکن است پیش از زمان اجرا مشخص شود، یا ممکن است به‌طور پویا در حین اجرای برنامه تعیین گردد. به‌عنوان مثال، زبان C ترتیب کارها را درون یک بیانیه ثابت کرده و ترتیب تمام بیانیه‌ها را نیز ثابت می‌کند، مگر در مواردی که دستورات کنترلی مانند IF یا FOR ترتیب اجرای آن‌ها را تغییر دهند. بنابراین بیشتر ترتیب انجام کارها به‌طور ایستا پیش از شروع اجرا مشخص می‌شود، اما بخش کمی از آن باید به‌طور پویا در حین اجرا تعیین شود. انتخاب‌های ایستا معمولاً در داخل یک کامپایلر پیاده‌سازی می‌شوند، جایی که ترتیب کارها به ترتیب قرار دادن دستورالعمل‌ها در فایل باینری اجرایی مشخص می‌شود. سیستم زمان اجرا ممکن است یک کتابخانه باشد که توسط دستورالعمل‌های درج شده توسط کامپایلر فراخوانی می‌شود، یا ممکن است به‌طور مستقیم در داخل اجرای برنامه گنجانده شود، مانند وقتی که دستورالعمل‌های انشعاب برای انتخاب دینامیکی که کدام کار بعدی باید انجام شود درج می‌شود. با این حال، یک مفسر نیز می‌تواند برای هر زبان ساخته شود، در این صورت تمام تصمیمات مربوط به ترتیب اجرا به‌طور پویا انجام می‌شوند. یک مفسر را می‌توان به‌عنوان بخشی از مترجم و بخشی از پیاده‌سازی مدل اجرایی در نظر گرفت. مدل اجرایی زبان اسمبلی در مقابل پیاده‌سازی توسط میکرومعماری‌ها زبان‌های اسمبلی نیز مانند هر زبان دیگری مدل‌های اجرایی دارند. به‌عنوان مثال، هم یک پایپ‌لاین ۵ مرحله‌ای به‌صورت ترتیبی و هم یک پردازنده بزرگ با اجرای غیرترتیبی مدل اجرایی یک زبان اسمبلی مشابه را پیاده‌سازی می‌کنند. مدل اجرایی تعریف‌کننده رفتار است، بنابراین تمام پیاده‌سازی‌ها، چه ترتیبی، چه غیرترتیبی، چه تفسیر شده یا JIT‌شده و غیره، باید همان نتیجه را بدهند، و آن نتیجه توسط مدل اجرایی تعریف شده است. مدل‌های اجرایی موازی در دنیای مدرن، برنامه‌نویسی موازی موضوعی است که اهمیت فزاینده‌ای پیدا کرده است. یک سازه همزمان‌سازی تأثیر بر جای می‌گذارد که ترتیب فعالیت‌ها در یک خط زمانی نسبت به فعالیت‌ها در خط زمانی دیگری مشخص شود. | ## بخش 3: مدل اجرا | این خط زمانی نقطه‌ای دارد که در آن سازه همزمان‌سازی "کسب مالکیت قفل" اجرا می‌شود. مدل اجرایی C و جاوا به‌صورت ترتیبی است و بیان می‌کند که خط زمانی فعالیت‌هایی دارد که قبل از کسب مالکیت قفل اجرا می‌شوند و فعالیت‌هایی که پس از کسب مالکیت قفل اجرا می‌شوند. دوباره، مدل‌های اجرایی C و جاوا بیان می‌کنند که یک گروه از بیانیه‌ها قبل از رها کردن مالکیت قفل اجرا می‌شوند و گروه دیگری پس از رها کردن مالکیت قفل اجرا می‌شود. نخ اول، فرض کنید نخ A، برخی از بیانیه‌ها را اجرا می‌کند، بیانیه‌هایی که آن‌ها را بیانیه‌های قبل از کسب قفل A می‌نامیم. سپس نخ A "کسب مالکیت قفل" را اجرا می‌کند، سپس نخ A بیانیه‌های پس از کسب قفل A را اجرا می‌کند که پس از کسب مالکیت قفل اجرا می‌شوند. نخ دوم، فرض کنید نخ B، برخی از بیانیه‌ها را اجرا می‌کند، بیانیه‌هایی که آن‌ها را بیانیه‌های قبل از قفل B می‌نامیم. سپس نخ B "کسب مالکیت قفل" را اجرا می‌کند، سپس نخ B بیانیه‌های پس از قفل B را اجرا می‌کند که پس از کسب مالکیت قفل اجرا می‌شوند. حالا، می‌توانیم مدل اجرایی موازی "کسب مالکیت قفل" و "رها کردن مالکیت قفل" را اینگونه بیان کنیم. مدل اجرایی این است: "در صورتی که مالکیت قفل از نخ A به نخ B منتقل شود، بیانیه‌های پس از کسب قفل A قبل از بیانیه‌های پس از کسب قفل B اجرا می‌شوند." پیچیدگی از اینجا ناشی می‌شود که مدل اجرایی هیچ وسیله‌ای ندارد که اجرای "رها کردن مالکیت قفل" تأثیری بر ترتیب اجرای "کسب مالکیت قفل" در خط زمانی دیگر (نخ دیگر) داشته باشد. بنابراین، برنامه‌نویس باید تمام ترکیب‌های ممکن از یک نخ که مالکیت قفل را رها می‌کند و نخ دیگری که آن را بعداً کسب می‌کند، در نظر بگیرد و اطمینان حاصل کند که کد فقط ترکیب‌های معتبر را اجازه می‌دهد. تنها اثر این است که بیانیه‌های پس از کسب قفل A قبل از بیانیه‌های پس از کسب قفل B اجرا می‌شوند. به‌طور خاص، بیانیه‌های پس از رها کردن قفل A و بیانیه‌های پس از کسب قفل B هیچ ترتیبی نسبت به هم ندارند، که این برای بسیاری از افراد غافلگیرکننده است. اما ممکن است نخ A پس از رها کردن مالکیت قفل تعویض شود، بنابراین بیانیه‌های پس از رها کردن قفل A ممکن است مدت‌ها پس از اینکه بسیاری از بیانیه‌های پس از کسب قفل B تمام شده‌اند، اجرا شوند. این یکی از احتمال‌هایی است که هنگام طراحی قفل‌ها باید در نظر گرفته شود و نشان می‌دهد که چرا برنامه‌نویسی چندنخی دشوار است. | ## جمع‌بندی | مدل نخ یکی از مدل‌های اجرایی اولیه موازی بود که ممکن است دلیل باقی ماندن آن باوجود پیچیدگی در استفاده از آن باشد.