سیستم زمان اجرا
در برنامه‌نویسی رایانه، یک سیستم زمان اجرا، همچنین یا نام محیط زمان اجرا از آن یاد می‌شود، در درجه اول بخش‌هایی از یک مدل اجرا را پیاده‌سازی می‌کند. این نباید با مرحله چرخه زمان اجرای یک برنامه اشتباه گرفته شود، که در حین آن سیستم زمان اجرا در حال کار است. بیشتر زبانها نوعی سیستم زمان اجرا دارند که محیطی را فراهم می‌کند که برنامه‌ها در آن اجرا شوند. این محیط ممکن است تعدادی از موضوعات از جمله چیدمان حافظه برنامه، چگونگی دستیابی برنامه به متغیرها، مکانیسم‌های عبور پارامترها بین رویه‌ها، رابط با سیستم عامل و موارد دیگر را مورد بررسی قرار دهد. کامپایلر برای تولید کد صحیح، بسته به سیستم زمان خاص، فرضیاتی را ایجاد می‌کند. به‌طور معمول سیستم زمان اجرا مسئولیت تنظیم و مدیریت پشته و پشته را بر عهده خواهد داشت و ممکن است شامل ویژگی‌هایی مانند زباله روب، نخ‌ها یا سایر ویژگی‌های دینامیکی داخلی باشد.
هر زبان برنامه‌نویسی یک مدل اجرایی را مشخص می‌کند، و بسیاری از آنها حداقل بخشی از آن مدل را در یک سیستم زمان اجرا اجرا می‌کنند. یک تعریف احتمالی از عملکرد سیستم زمان اجرا، از جمله دیگر، هرگونه رفتاری که مستقیماً به خود برنامه منتسب نشود، نیست. این تعریف، به عنوان بخشی از سیستم زمان اجرا، مواردی از قبیل قرار دادن پارامترها بر روی پشته قبل از فراخوانی عملکرد، رفتار دیسک I / O و اجرای موازی رفتارهای مرتبط را شامل می‌شود.
با این تعریف، اساساً هر زبانی یک سیستم زمان اجرا دارد، از جمله زبان‌های کامپایل شده، زبان‌های تفسیر شده و زبان‌های خاص دامنه تعبیه شده. حتی API مدل‌های اجرای مستقل مانند مدل Pthreads از سیستم اجرا استفاده می‌کند که اجرای رفتار مدل اعدام است.
بیشتر مقالات علمی در مورد سیستم‌های زمان اجرا بر جزئیات اجرای سیستم‌های زمان اجرای موازی تمرکز دارند. یک نمونه قابل توجه از یک سیستم زمان اجرای موازی، نمونه ای از Cilk، یک مدل برنامه‌نویسی موازی محبوب است. علاوه بر این، ابزار ساده برنامه زمان اجرا برای ساده‌سازی ایجاد سیستم‌های زمان اجرا موازی ایجاد شده‌است.
علاوه بر رفتار مدل اعدام، یک سیستم زمان اجرا ممکن است خدمات پشتیبانی مانند بررسی نوع، اشکال زدایی یا تولید کد و بهینه‌سازی را نیز انجام دهد.
سیستم زمان اجرا همچنین دروازه ای است که با استفاده از آن یک برنامه در حال اجرا با محیط زمان اجرا تعامل دارد، که شامل نه تنها مقادیر حالت است که در هنگام اجرای برنامه قابل دسترسی است، بلکه موجودات فعال دیگری نیز هستند که می‌توانند در حین اجرای برنامه مانند درایو دیسک و افراد از طریق کیبورد تعامل داشته باشند. . به عنوان مثال، متغیرهای محیطی ویژگیهای بسیاری از سیستم عاملها و بخشی از محیط زمان اجرا هستند. یک برنامه در حال اجرا می‌تواند از طریق سیستم زمان اجرا به آنها دسترسی پیدا کند. به همین ترتیب، دستگاه‌های سخت‌افزاری مانند درایو دی وی دی موجودی فعال هستند که یک برنامه می‌تواند از طریق یک سیستم زمان اجرا با آنها ارتباط برقرار کند.
یک برنامه منحصر به فرد از محیط زمان اجرا (RTE) در یک سیستم عامل (OS) است که "فقط" RTE را اجرا می‌کند، به معنی از بوت شدن سیستم تا زمان پایین آمدن کامل سیستم عامل فقط به برنامه (های) اجرا شده در آن RTE اختصاص دارد. هر کد دیگری که سعی در اجرای آن دارد یا هرگونه خرابی در برنامه (های) RTE را شکست می‌دهد که سیستم عامل را خراب می‌کند که تمام پردازش را متوقف می‌کند و به بوت مجدد نیاز دارد. اگر بوت از حافظه فقط خواندنی باشد، یک سیستم بسیار مأمور، ساده و مأموریتی ایجاد می‌شود.
به عنوان نمونه ای ساده از سیستم اصلی زمان اجرا، سیستم زمان اجرای زبان C مجموعه خاصی از دستورالعمل‌هایی است که توسط کامپایلر وارد تصویر اجرایی می‌شود. در میان چیزهای دیگر، این دستورالعمل‌ها پشته پردازنده را مدیریت می‌کنند، فضایی را برای متغیرهای محلی ایجاد می‌کنند و پارامترهای عملکرد-تماس را در بالای پشته کپی می‌کنند. اغلب معیارهای مشخصی برای تصمیم‌گیری در مورد رفتار زبان در سیستم زمان اجرا وجود ندارد، در حالی که رفتار بخشی از برنامه منبع است. برای C، تنظیم پشته بخشی از سیستم زمان اجرا است، برخلاف بخشی از معناشناسی یک برنامه فردی، زیرا ثابت نگه داشتن جهانی را دارد که بیش از همه اعدام‌ها را در خود جای داده‌است. این رفتار سیستماتیک، الگوی اجرای زبان را بر خلاف اجرای معانی متن برنامه خاص که مستقیماً به کدی ترجمه شده‌است که نتایج را محاسبه می‌کند، پیاده‌سازی می‌کند.
یک راه برای مشاهده این تفکیک بین معنایی یک برنامه خاص و محیط زمان اجرا این است که برنامه را در یک فایل شیء شامل تمام توابع در مقابل تهیه یک کل برنامه به یک باینری اجرا کنید. پرونده شی فقط حاوی کد مونتاژ مربوط به آن توابع است، در حالی که باینری اجرایی شامل کد اضافی است که برای اجرای محیط زمان اجرا استفاده می‌شود. پرونده شیء از یک سو ممکن است اطلاعاتی را از محیط زمان اجراکه با پیوند حل می‌شود، از دست ندهد. از طرف دیگر، کد موجود در پرونده شیء به فرضیات سیستم زمان اجرا بستگی دارد. به عنوان مثال، بسته به کنوانسیون فراخوانی مورد استفاده در محیط زمان اجرا، یک عملکرد ممکن است پارامترهای مربوط به یک رجیستر یا محل پشته را بخواند.
مثال دیگر مورد استفاده از رابط برنامه‌نویسی برنامه (API) برای تعامل با سیستم زمان اجرا است. تماسهای مربوط به آن API همانند تماس با یک کتابخانه نرم‌افزاری معمولی به نظر می‌رسند، اما در برخی از زمان مکالمه، مدل اجرا تغییر می‌کند. سیستم اجرا یک الگوی اجرا را متفاوت از زبانی که کتابخانه از نظر آن نوشته‌است، پیاده‌سازی می‌کند. شخصی که کد یک کتابخانه عادی را می‌خواند، می‌تواند با دانستن زبانی که در آن کتابخانه نوشته شده‌است، بتواند رفتار این کتابخانه را درک کند. با این حال، شخصی که کد API را فرا می‌خواند و از سیستم زمان اجرا استفاده می‌کند، نمی‌تواند با دانستن زبانی که در آن نوشته شده‌است، رفتار تماس API را درک کند. در بعضی مقاطع، از طریق برخی سازوکارها، مدل اجرای از زبان زنگ نوشته شده متوقف می‌شود و به مدل اجرای اجرای سیستم اجرا می‌شود. به عنوان مثال، دستورالعمل تله یکی از روش‌های تغییر مدل‌های اجرای است. این تفاوت چیزی است که یک مدل اجرای API فراخوانی شده مانند موضوعات POSIX را از یک کتابخانه نرم‌افزاری معمول متمایز می‌کند. هر دو تماس موضوع POSIX و تماس‌های کتابخانه ای نرم‌افزار از طریق یک API فراخوانی می‌شوند، اما رفتار موضوعات POSIX از نظر زبان تماس قابل درک نیست. در عوض، فراخوانی موضوعات POSIX یک الگوی اجرای خارجی را اجرا می‌کند، که توسط سیستم زمان اجرا POSIX اجرا می‌شود (این سیستم زمان اجرا اغلب هسته سیستم عامل است).
به عنوان یک مثال شدید، CPU فیزیکی به خودی خود می‌تواند به عنوان اجرای سیستم زمان اجرای یک زبان خاص مونتاژ شود. از این نظر، مدل اجرای توسط پردازنده فیزیکی و سیستم‌های حافظه پیاده‌سازی می‌شود. به عنوان یک قیاس، سیستم‌های زمان اجرا برای زبان‌های سطح بالاتر خودشان با استفاده از برخی زبان‌های دیگر اجرا می‌شوند. این یک سلسله مراتب از سیستم‌های زمان اجرا را ایجاد می‌کند، با خود پردازنده (CPU) یا در واقع منطق آن در لایه میکرو کد یا پایین‌تر از آن - به عنوان پایین‌ترین سطح اجرای زمان اجرا.
برخی از زبان‌های کامپایل شده یا تفسیری رابطی را ارائه می‌دهند که به کد برنامه اجازه می‌دهد تا مستقیماً با سیستم اجرا ارتباط برقرار کند. نمونه ای از کلاس codice_1 در زبان جاوا است. کلاس اجازه می‌دهد تا کد (که توسط یک موضوع متحرک است) کارهایی مانند شروع و متوقف کردن موضوعات دیگر را انجام دهد. به‌طور معمول، جنبه‌های اصلی رفتار یک زبان مانند برنامه‌ریزی کار و مدیریت منابع در این روش قابل دسترسی نیست.
رفتارهای سطح بالاتر که توسط یک سیستم زمان اجرا اجرا می‌شود ممکن است شامل کارهایی از قبیل ترسیم متن روی صفحه یا برقراری ارتباط اینترنتی باشد. اغلب این مورد وجود دارد که سیستم عامل‌ها این نوع رفتارها را نیز ارائه می‌دهند و در صورت وجود، سیستم زمان اجرا به عنوان یک لایه انتزاع اجرا می‌شود که تداخل سیستم زمان اجرا را به یک فراخوان از سیستم عامل تبدیل می‌کند. این پیچیدگی یا تغییرات در خدمات ارائه شده توسط سیستم عامل‌های مختلف را پنهان می‌کند. این همچنین نشان می‌دهد که هسته سیستم عامل به خودی خود می‌تواند به عنوان یک سیستم زمان اجرا مشاهده شود، و مجموعه تماس‌های سیستم عامل که باعث بروز رفتارهای سیستم عامل می‌شوند ممکن است به عنوان تعامل با یک سیستم زمان اجرا تلقی شوند.
در حد مجاز، سیستم زمان اجرا ممکن است خدماتی مانند دستگاه P-code یا ماشین مجازی را ارائه دهد که حتی مجموعه دستورالعمل پردازنده را نیز پنهان می‌کند. این رویکردی است که بسیاری از زبانهای تفسیر شده مانند AWK و بعضی از زبانها مانند جاوا دنبال می‌کنند، منظور این است که در برخی از کدهای نمایندگی واسطه مستقل ماشین (مانند بایت کد) وارد می‌شوند. این ترتیب کار اجرای زبان و سازگاری آن با دستگاه‌های مختلف را ساده‌تر کرده و کارایی ویژگی‌های زبان پیشرفته مانند بازتاب را بهبود می‌بخشد. همچنین این امکان را می‌دهد که برنامه مشابهی را در هر دستگاه و بدون قدم برداشتن صریح اجرا کند، ویژگی ای که از زمان تکثیر شبکه جهانی وب بسیار مهم شده‌است. برای سرعت بخشیدن به اجرای، برخی از سیستم‌های زمان اجرا کامپایل همزمان را در کد دستگاه دارند.
یک جنبه مدرن از سیستم‌های زمان اجرا رفتارهای اجرای موازی است، مانند رفتارهایی که توسط سازه‌های mutex در Pthreads و سازه‌های موازی در OpenMP به نمایش گذاشته شده‌است. یک سیستم زمان اجرا با چنین رفتارهای اجرای موازی ممکن است مطابق رویکرد زمان اجرای اولیه مدولار شود.
نمونه‌های اولیه سیستم‌های زمان اجرا، مفسرهایی مانند BASIC و Lisp هستند. این محیط‌ها همچنین حاوی جمع‌آوری زباله بودند. چهارم مثال اولیه زبانی است که برای تهیه کد نمایندگی میانی طراحی شده‌است. سیستم زمان اجرای آن یک ماشین مجازی بود که آن کد را تفسیر می‌کرد. مثال محبوب دیگر، اگر نظری، رایانه MIX دونالد ناتوس است.
در زبانهای C و بعد از آن که از تخصیص حافظه پویا پشتیبانی می‌کردند، سیستم زمان اجرا شامل کتابخانه ای نیز بود که حافظه برنامه را مدیریت می‌کرد.
در زبانهای برنامه‌نویسی شی گرا، سیستم زمان اجرا نیز اغلب مسئول بررسی نوع پویا و حل مراجعات روش بود.