در برنامهنویسی، ماشین کد p یا ماشین کد قابل حمل یک ماشین مجازی است که برای اجرای کد p (زبان اسمبلی یک پردازنده فرضی) طراحی شدهاست. این اصطلاح هم بهطور کلی برای همه این ماشینها (مانند ماشین مجازی جاوا و کد از پیش کامپایل شده متلب) و هم برای پیادهسازیهای خاص به کار میرود، معروفترین آنها p-Machine سیستم Pascal-P، به ویژه پیادهسازی UCSD Pascal است. (که در میان توسعه دهندگان آن "p" در "p-code" اغلب به معنی «شبه» به کار میرود تا «قابل حمل»، پس «شبه کد» به معنای دستورالعملهای یک شبه ماشین است).[۱]
اگرچه این مفهوم برای اولین بار در حدود سال ۱۹۶۶ پیادهسازی شد (به عنوان کد O برای بیسیپیال و یک p-کد برای زبان اویلر)، اصطلاح p-code اولین بار در اوایل دهه ۱۹۷۰ ظاهر شد دو کامپایلر اولیه که کد p تولید میکنند، کامپایلر Pascal-P در سال۱۹۷۳ توسط Kesav V. Nori , Urs Ammann , Kathleen Jense, Hans-Heinrich Nägeli و Christian Jacobi، و کامپایلر پاسکال در ۱۹۷۵، توسط نیکلاوس ویرت بودند.[۲]
برنامههایی که به p-کد ترجمه شدهاند میتوانند توسط یک برنامه نرمافزاری تفسیر شده باشند که رفتار CPU فرضی را شبیهسازی کردهاست یا به کد ماشین CPU ای که برنامه قرار است روی آن اجرا شوند و سپس عمل کنند، ترجمه شده باشند. اگر منافع تجاری کافی وجود داشته باشد، ممکن است یک پیادهسازی سختافزاری از مشخصات پردازنده (مثلاً Pascal MicroEngine یا یک نسخه پردازنده جاوا) ساخته شود.[۳]
در مقایسه با ترجمه مستقیم به کد ماشین بومی، یک رویکرد دو مرحله ای شامل ترجمه به p-کد و اجرای آن توسط یک مترجم یا کامپایلر درجا مزایای مختلفی را ارائه میدهد.
یکی از معایب قابل توجه کد p سرعت اجراست که بعضاً با استفاده از کامپایل درجا قابل رفع است. مهندسی معکوس کد p اغلب آسانتر از کد بومی است.
در اوایل دهه ۱۹۸۰، حداقل دو سیستم عامل با استفاده گسترده از p-کد به استقلال دستگاه دست یافتند. سیستم عامل کسب و کار (BOS) یک سیستم عامل چند پلتفرمی بود که برای اجرای برنامههای کد p به صورت انحصاری طراحی شده بود. UCSD p-System، توسعه یافته در دانشگاه کالیفرنیا، سندیگو، یک سیستمعامل خود-میزبان و خود-کامپایل-کننده مبتنی بر کد p بهینه شده برای تولید توسط زبان برنامهنویسی پاسکال بود.
در دهه ۱۹۹۰، ترجمه به p-کد تبدیل به یک استراتژی محبوب برای پیادهسازی زبانهایی مانند پایتون، Microsoft P-Code در ویژوال بیسیک و بایت کد جاوا درجاوا تبدیل شد.[۴]
زبان برنامهنویسی گو از یک نسخه اسمبلی کلی و قابل حمل به عنوان شکلی از کد p استفاده میکند که توسط کن تامسون به عنوان افزونهای از کار برنامه ۹ از آزمایشگاههای بل توسعه داده شد. بر خلاف بایت کد CLR یا بایت کد JVM، اسناد پایداری وجود ندارند و ابزارهای ساخت Go فرمت بایتکد را منتشر نمیکنند تا بعداً استفاده شود. اسمبلر Go از زبان اسمبلی عمومی به عنوان نمایش میانی استفاده میکند و اجراییهای Go باینریهای به صورت ایستا پیوسته مخصوص ماشین هستند.[۳]