ماشین p-کد

در برنامه‌نویسی، ماشین کد p یا ماشین کد قابل حمل یک ماشین مجازی است که برای اجرای کد p (زبان اسمبلی یک پردازنده فرضی) طراحی شده‌است. این اصطلاح هم به‌طور کلی برای همه این ماشین‌ها (مانند ماشین مجازی جاوا و کد از پیش کامپایل شده MATLAB) و هم برای پیاده‌سازی‌های خاص به کار می‌رود، معروف‌ترین آن‌ها p-Machine سیستم Pascal-P، به ویژه پیاده‌سازیUCSD Pascal است. (که در میان توسعه دهندگان آن "p" در "p-code" اغلب به معنی «شبه» به کار می‌رود تا «قابل حمل»، پس «شبه کد» به معنای دستورالعمل‌های یک شبه ماشین است).

اگرچه این مفهوم برای اولین بار در حدود سال ۱۹۶۶ پیاده‌سازی شد (به عنوان کد O برای BCPL و یک p-کد برای زبان اویلر)، اصطلاح p-code اولین بار در اوایل دهه ۱۹۷۰ ظاهر شد دو کامپایلر اولیه که کد p تولید می‌کنند، کامپایلر Pascal-P در سال۱۹۷۳ توسط Kesav V. Nori , Urs Ammann , Kathleen Jense, Hans-Heinrich Nägeli و Christian Jacobi، و کامپایلر Pascal-S در ۱۹۷۵، توسط نیکلاوس ویرت بودند.

برنامه‌هایی که به p-کد ترجمه شده‌اند می‌توانند توسط یک برنامه نرم‌افزاری تفسیر شده باشند که رفتار CPU فرضی را شبیه‌سازی کرده‌است یا به کد ماشین CPU ای که برنامه قرار است روی آن اجرا شوند و سپس عمل کنند، ترجمه شده باشند. اگر منافع تجاری کافی وجود داشته باشد، ممکن است یک پیاده‌سازی سخت‌افزاری از مشخصات پردازنده (مثلاً Pascal MicroEngine یا یک نسخه پردازنده جاوا) ساخته شود.

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

یکی از معایب قابل توجه کد p سرعت اجراست که بعضاً با استفاده از کامپایلر JIT قابل رفع است. مهندسی معکوس کد p اغلب آسان‌تر از کد بومی است.

در اوایل دهه ۱۹۸۰، حداقل دو سیستم عامل با استفاده گسترده از p-کد به استقلال دستگاه دست یافتند. سیستم عامل کسب و کار (BOS) یک سیستم عامل چند پلتفرمی بود که برای اجرای برنامه‌های کد p به صورت انحصاری طراحی شده بود. UCSD p-System، توسعه یافته در دانشگاه کالیفرنیا، سن‌دیگو، یک سیستم‌عامل خود-میزبان و خود-کامپایل-کننده مبتنی بر کد p بهینه شده برای تولید توسط زبان برنامه‌نویسی پاسکال بود.

در دهه ۱۹۹۰، ترجمه به p-کد تبدیل به یک استراتژی محبوب برای پیاده‌سازی زبانهایی مانند پایتون، Microsoft P-Code در ویژوال بیسیک و بایت کد جاوا درجاوا تبدیل شد.

زبان برنامه‌نویسی گو از یک نسخه اسمبلی کلی و قابل حمل به عنوان شکلی از کد p استفاده می‌کند که توسط Ken Thompson به عنوان افزونه‌ای از کار برنامه ۹ از آزمایشگاه‌های بل توسعه داده شد. بر خلاف بایت کد CLR یا بایت کد JVM، اسناد پایداری وجود ندارند و ابزارهای ساخت Go فرمت بایت‌کد را منتشر نمی‌کنند تا بعداً استفاده شود. اسمبلر Go از زبان اسمبلی عمومی به عنوان نمایش میانی استفاده می‌کند و اجرایی‌های Go باینری‌های به صورت ایستا پیوسته مخصوص ماشین هستند.

منابع 

پاسکال (زبان برنامه‌نویسی)
پیاده‌سازی زبان برنامه‌نویسی
کامپایلرها