هانی تربتی
بازگشت
Python Runtime Ecosystem

بررسی تخصصی‌تر زبان پایتون و انواع Virtual Machine در آن

در این مقاله زبان پایتون را کمی تخصصی‌تر بررسی می‌کنیم؛ از دلیل وجود پیاده‌سازی‌های مختلف گرفته تا Bytecode، ماشین مجازی و تفاوت‌هایی مثل CPython، PyPy، Jython، IronPython، MicroPython و GraalPy.

نویسنده: هانی تربتی موضوع: Python / Runtime / VM زمان مطالعه: حدود ۸ دقیقه

درود به همه دوستان خوبم.

در این مقاله قصد دارم زبان پایتون را، که امروزه یکی از محبوب‌ترین زبان‌های برنامه‌نویسی دنیاست، کمی تخصصی‌تر با هم بررسی کنیم.

برای درک بهتر مطالب، بهتر است قبل از مطالعه این مقاله، آشنایی اولیه و شناخت کافی از این زبان داشته باشید.

چرا با وجود رسیدن همه زبان‌ها به باینری، این‌همه تنوع وجود دارد؟

تا به حال به این فکر کرده‌اید که وقتی تمام زبان‌های برنامه‌نویسی در نهایت به باینری (Binary) ختم می‌شوند، چرا این‌قدر تنوع بین آن‌ها وجود دارد؟

پاسخ این سؤال به تفاوت نیازها در دنیای برنامه‌نویسی و مفهومی به نام Trade-off یا همان دادوستد برمی‌گردد.

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

تفاوت بین مفسر (Interpreter) و کامپایلر (Compiler) هم تا حد زیادی از همین نیازها نشأت می‌گیرد.

آیا پایتون فقط یک زبان مفسری است؟

همه ما می‌دانیم که پایتون یک زبان مفسری (Interpreted) است، اما این فقط بخشی از ماجراست.

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

برای حل این مسئله، کدهای پایتون به‌صورت مستقیم توسط سخت‌افزار اجرا نمی‌شوند، بلکه ابتدا وارد فرایندی می‌شوند که در آن یک ماشین مجازی (Virtual Machine) نقش اصلی را ایفا می‌کند.

این ماشین‌های مجازی با کمک زبان‌های سطح پایین‌تر، مسئول پردازش و اجرای کدهای پایتون هستند. نسخه‌های مختلفی از این VMها وجود دارد که شناخته‌شده‌ترین آن‌ها CPython است؛ همان چیزی که اکثر ما در استفاده روزمره از پایتون با آن سر و کار داریم.

فرایند اجرای یک اسکریپت پایتون

برای درک بهتر VMها، بیایید ابتدا فرایند اجرای یک اسکریپت پایتون را بررسی کنیم:

script.py compile to bytecode __pycache__ VM output

ماشین مجازی قادر به درک مستقیم کدهای سطح بالای پایتون نیست. به همین دلیل، ابتدا کدهای پایتون به Bytecode کامپایل می‌شوند و سپس VM این بایت‌کد را تفسیر و اجرا می‌کند.

تبدیل شدن کد به Bytecode چند مزیت مهم دارد که یکی از مهم‌ترین آن‌ها، اجرای سریع‌تر در دفعات بعدی است.

انواع Virtual Machine در پایتون

حالا که با این فرایند آشنا شدیم، بیایید سراغ موضوع اصلی مقاله برویم؛ یعنی بررسی تفاوت‌ها و انواع Virtual Machine در پایتون.

01

CPython

CPython پراستفاده‌ترین، محبوب‌ترین و سازگارترین پیاده‌سازی پایتون است. این ماشین مجازی با زبان C نوشته شده و Bytecodeها توسط آن اجرا می‌شوند.

مزیت اصلی

تقریباً همه کتابخانه‌ها و پکیج‌ها ابتدا برای این نسخه پشتیبانی می‌شوند؛ به‌خصوص کتابخانه‌هایی که بر پایه زبان C هستند، مثل NumPy.

معایب

این VM یک محدودیت مهم به نام Global Interpreter Lock یا GIL دارد. GIL اجازه نمی‌دهد پردازش‌های CPU-bound به‌صورت واقعی و مؤثر با Multi-threading روی چند هسته اجرا شوند.

همچنین CPython همیشه سریع‌ترین گزینه نیست.

  • توسعه عمومی
  • توسعه وب با FastAPI / Django / Flask
  • اسکریپت‌نویسی
  • اغلب="vm-section" id="pypyul>
02

PyPy

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

مزیت

این VM از مفهومی به نام Just-In-Time Compiler یا JIT استفاده می‌کند.

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

همچنین PyPy گاهی در Garbage Collection نسبت به CPython عملکرد بهتری دارد.

معایب

برخلاف CPython که سازگاری بسیار بالایی دارد، PyPy با بسیاری از کتابخانه‌ها، مخصوصاً کتابخانه‌های مبتنی بر C، سازگاری کامل ندارد.

به همین دلیل بیشتر برای اجرای کدهای خالص پایتون مناسب است.

مفهوم Warm-up

در ابتدای اجرای برنامه با PyPy، ممکن است تفاوت محسوسی از نظر سرعت نسبت به CPython احساس نکنید. اما به مرور زمان، PyPy بخش‌های تکراری و قابل بهینه‌سازی را شناسایی می‌کند و عملکرد برنامه بهتر می‌شود.

از این موضوع می‌توان نتیجه گرفت که PyPy برای Background Taskها و سرویس‌هایی که به‌صورت مداوم در حال اجرا هستند، انتخاب مناسبی است.

03

Jython

Jython پیاده‌سازی پایتون روی JVM (Java Virtual Machine) است. یعنی کد پایتون را در محیط Java Virtual Machine اجرا می‌کند.

مزیت اصلی

مهم‌ترین مزیت Jython این است که می‌تواند با کتابخانه‌ها و کلاس‌های Java تعامل داشته باشد.

کاربرد

برای سازمان‌ها یا پروژه‌هایی که زیرساخت اصلی آن‌ها بر پایه Java است، Jython می‌تواند انتخاب مفیدی باشد.

04

IronPython

IronPython پیاده‌سازی پایتون برای محیط .NET است. یعنی کد پایتون در دنیای CLR اجرا می‌شود و می‌تواند با کتابخانه‌های .NET تعامل داشته باشد.

کاربرد

این گزینه برای پروژه‌هایی مناسب است که می‌خواهند از پایتون در کنار C# یا اکوسیستم دات‌نت استفاده کنند.

05

MicroPython

MicroPython نسخه‌ای سبک از پایتون برای میکروکنترلرها و سیستم‌های Embedded است. برای مثال، روی بردهایی مثل ESP32 یا برخی دستگاه‌های IoT استفاده می‌شود.

نکته مهم

طبیعتاً MicroPython همه امکانات CPython را ندارد، چون باید روی سخت‌افزارهایی با حافظه و پردازنده محدود اجرا شود.

06

GraalPy

GraalPy پیاده‌سازی پایتون روی GraalVM است. هدف آن اجرا در یک محیط چندزبانه است؛ جایی که زبان‌هایی مثل JavaScript، Java، Ruby و Python بتوانند در کنار هم کار کنند.

کاربرد

این گزینه بیشتر در سناریوهایی جذاب است که نیاز به تعامل نزدیک چند زبان در یک بستر واحد وجود دارد.

جمع‌بندی

اگر بخواهیم خیلی ساده جمع‌بندی کنیم:

CPython انتخاب پیش‌فرض، پایدار و سازگار برای اکثر پروژه‌ها
PyPy مناسب برای کدهای خالص پایتون و برنامه‌های بلندمدت با نیاز به سرعت بیشتر
Jython مناسب برای تعامل با اکوسیستم Java
IronPython مناسب برای پروژه‌های مبتنی بر .NET
MicroPython مناسب برای سخت‌افزارهای محدود و پروژه‌های Embedded
GraalPy مناسب برای محیط‌های چندزبانه و ترکیب چند اکوسیستم

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