پادشاهِ کُدنویسا شو!
کینگتو - آموزش برنامه نویسی تخصصصی - دات نت - سی شارپ - بانک اطلاعاتی و امنیت

آقا قرار است که پایتون از یک زبان مفسیری به یک زبان کامپایلری تبدیل شود؟ آخرین تغییرات پایتون

17 بازدید 0 نظر ۱۴۰۵/۰۶/۲۵
پایتون از زمان پیدایش خود به‌عنوان یک زبان تفسیرشده (Interpreted) و پویا (Dynamic) شناخته شده است؛ زبانی که سرعت توسعه بالا و خوانایی فوق‌العاده‌اش را مدیون همین ساختار پویای runtime است، اما همواره از نظر سرعت اجرا در برابر زبان‌های کامپایلری مانند C++، Rust و Go لنگ زده است.

در سال‌های اخیر و به‌ویژه با معرفی پروژه‌های کلیدی در نسخه 3.11 تا 3.13 و برنامه‌های تدوین‌شده برای نسخه 3.14، شایعات و بحث‌های فراوانی در جامعه توسعه‌دهندگان شکل گرفته است: آیا پایتون قرار است کلاً به یک زبان کامپایلری تبدیل شود؟

در این مقاله تخصصی، از منظر معماری سیستم و مهندسی نرم‌افزار، به بررسی دقیق روند تحول پایتون، تکنولوژی‌های JIT Compiler، حذف GIL، پروژه Faster CPython و آینده اجرایی این زبان می‌پردازیم.

 

آیا پایتون واقعاً قرار است کامپایلری (Compiled) شود؟

پاسخ کوتاه و صریح: خیر، پایتون به یک زبان کامپایلری محض (Statically Compiled) مانند C++ یا Go تبدیل نخواهد شد.

برای فهم عمیق‌تر این موضوع باید دو مفهوم را از هم تفکیک کنیم:

 

۱.۱. زبان در برابر پیاده‌سازی (Language vs. Implementation)

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

  • CPython: پیاده‌سازی مرجع و استاندارد به زبان C که بایتی‌کد (Bytecode) تولید کرده و آن را در یک Virtual Machine اجرا می‌کند.
  • PyPy: پیاده‌سازی پایتون با کامپایلر JIT.
  • Mypyc / Cython: ابزارهایی برای کامپایل کد پایتون به C/C++.

وقتی از «تغییرات پایتون» صحبت می‌کنیم، منظور تغییرات در CPython است. CPython در حال حرکت به سمت استراتژی‌های جدید کامپایل هنگام اجرا (Just-In-Time Compilation) است، نه کامپایل پیش از اجرا (Ahead-Of-Time Compilation).

 

۱.۲. چرا کامپایل AOT کاملاً برای پایتون ناممکن (یا شدیداً سخت) است؟

در زبان‌های کامپایلری مانند C++، تایپ‌ها static هستند. وقتی می‌نویسید a + b، کامپایلر دقیقاً می‌داند که a و b دو عدد 64 بیتی هستند و آن را مستقیم به یک دستورالعمل سخت‌افزاری (ADD) تبدیل می‌کند.

در پایتون، همه‌چیز Object است و dynamic binding وجود دارد:

def add(a, b):
    return a + b

در زمان کامپایل (AOT)، پایتون نمی‌داند a و b عدد هستند، رشته هستند، یا لیستی از اشیا. عملگر + ممکن است به __add__ یا __radd__ اشاره کند که حتی در زمان اجرا قابل تغییر (Monkey Patching) است!

بنابراین، پایتون پویایی خود را حفظ خواهد کرد، اما CPython از مکانیزم‌های هوشمند کامپایل در زمان اجرا (JIT) استفاده می‌کند تا رفتار کدهای پویا را کالیبره کند.

 

ریشه تغییرات جدید: پروژه Faster CPython

در کنفرانس PyCon 2021، خیدو فان روسوم (آفریننده پایتون) به همراه تیم پایتون در مایکروسافت، برنامه‌ای چندساله به نام Faster CPython Project (یا پروژه Shannon) را معرفی کردند. هدف پروژه: افزایش سرعت CPython تا ۵ برابر طی چند نسخه.

ارکان اصلی این تغییرات که از پایتون 3.11 کلید خورد و در 3.13 به اوج رسید عبارت‌اند از:

  1. Specializing Adaptive Interpreter (پایتون 3.11)
  2. JIT Compiler جدید مبتنی بر Copy-and-Patch (پایتون 3.13)
  3. حذف قفل بزرگ مفسر (Free-Threaded CPython / Free GIL)

 

تغییرات تکنیکال پایتون: از 3.11 تا 3.14

۳.۱. مفسر تطبیقی تخصصی (Specializing Adaptive Interpreter - Python 3.11)

پیش از 3.11، Virtual Machine پایتون دستورالعمل‌های بایتی‌کد (Bytecode) را به صورت کاملاً عمومی اجرا می‌کرد.

در 3.11، مفهوم Adaptive Bytecode معرفی شد:

  • وقتی مفسر متوجه می‌شود یک بخش از کد (مثلاً یک حلقه) مرتباً با داده‌هایی از یک نوع خاص (مثلاً integer) اجرا می‌شود، بایتی‌کد عمومی (مانند BINARY_OP) را به یک بایتی‌کد تخصصی (مانند BINARY_OP_ADD_INT) تبدیل می‌کند (In-line Caching).
  • اگر نوع داده تغییر کند (De-optimization)، کد به حالت عمومی بازمی‌گردد.

این کار بدون نیاز به کامپایل به زبان ماشین، سرعت اجرا را ۱۰ تا ۶۰ درصد افزایش داد.

 

۳.۲. انقلاب JIT Compiler در پایتون 3.13 (Copy-and-Patch JIT)

بزرگ‌ترین خبر تکنیکال نسخه 3.13، اضافه شدن کامپایلر JIT رسمی به CPython است.

 

معماری JIT پایتون چگونه کار می‌کند؟

معمولاً کامپایلرهای JIT (مانند V8 در مرورگر کروم یا JVM در جاوا) از فریم‌ورک‌های سنگینی مثل LLVM استفاده می‌کنند. این کار باعث:

  1. افزایش شدید زمان بالا آمدن (Startup Time).
  2. مصرف بسیار بالای حافظه RAM می‌شود.

تیم توسعه CPython از تکنیک نوآورانه‌ای به نام Copy-and-Patch JIT استفاده کرد که بر اساس مقاله دانشگاه استنفورد (سال 2021) طراحی شده است:

[Python Source Code] 
        │
        ▼
[AST Parsing] 
        │
        ▼
[Tier 1: Standard Bytecode Interpreter]
        │  (Monitoring hot loops & execution count)
        ▼
[Tier 2: High-Level IR (Micro-Ops / uops)]
        │  (Optimization & Type Specialization)
        ▼
[Copy-and-Patch JIT Engine]
        │  (Stitches pre-compiled C machine-code templates)
        ▼
[Native Machine Code (x86_64 / ARM64)]

نحوه عملکرد Copy-and-Patch:

  1. زمان ساخت پایتون (Build Time): با استفاده از LLVM، قالب‌های کوچکی از کد ماشین (Machine Code Snippets) برای هر دستور ساختار یافته تولید می‌شود.

  2. زمان اجرای کد (Runtime): وقتی JIT تشخیص می‌دهد کدی «داغ» (Hot Code / حلقه پرتکرار) است، به جای کند و کاو و تحلیل‌های سنگین کامپایلری، فقط قالب‌های کد ماشین پیش‌ساخته را کپی کرده، متغیرها/آدرس‌های حافظه آن را پچ (Patch) می‌کند و مستقیماً به CPU می‌سپارد!

نتیجه: سرعت کامپایل JIT تا ۱۰۰ برابر سریع‌تر از LLVM است و مصرف حافظه آن ناچیز است.

 

۳.۳. حذف GIL و انقلاب Free-Threading (پایتون 3.13 و 3.14)

یکی دیگر از موانع اصلی عملکرد پایتون، GIL (Global Interpreter Lock) بود. GIL اجازه نمی‌داد حتی در پردازنده‌های چند هسته‌ای، بیش از یک ترد (Thread) کد پایتون را هم‌زمان اجرا کند.

در پایتون 3.13:

  • نسخه Free-Threaded CPython به صورت آزمایشی (Experimental build با فلگ --disable-gil) معرفی شد.
  • در این حالت، GIL کاملاً غیرفعال می‌شود و پایتون می‌تواند از True Multithreading روی تمام هسته‌های CPU بهره ببرد.

در پایتون 3.14 (که در دست توسعه است):

  • بهینه‌سازی‌های عمیق‌تری روی ساختار Data Structures (مانند Mimalloc و Garbage Collection بدون lock) صورت گرفته تا حذف GIL باعث افت سرعت کدهای تک-تردی (Single-threaded performance) نشود.

 

مقایسه پایتون قدیم، پایتون جدید و زبان‌های کامپایلری

ویژگی CPython 3.9 (قدیم) CPython 3.13/3.14 (جدید) C++ / Go / Rust
نوع مفسر/کامپایلر Pure Bytecode Interpreter Tiered Interpreter + JIT (Copy-and-Patch) AOT Compiler (Ahead-Of-Time)
تایپینگ (Typing) Dynamic Dynamic (با بهینه‌سازی JIT) Static
اجرای چندنخی محدود به ۱ هسته (بسبب GIL) True Multithreading (در حالت free-threaded) True Multithreading
Startup Time فوق‌العاده سریع بسیار سریع آنی (Native Binary)
سرعت محاسباتی CPU کند متوسط تا سریع (رشد ۲ تا ۳ برابری) فوق‌العاده سریع
خروجی نهایی فایل .pyc (Bytecode) ترکیب Bytecode و Machine Code در RAM فایل باینری مستقل (ELF/EXE)

 

ابزارهای واقعی برای کامپایل پایتون به فایل باینری (AOT)

اگر پروژه شما حتماً نیاز دارد که کد پایتون را به یک فایل Executable مستقل (بدون نیاز به نصب پایتون) یا کد C کامپایل کند، ابزارهای زیر در اکوسیستم فعلی وجود دارند:

  1. Mypyc:

    • توسعه داده‌شده توسط تیم MyPy.

    • کدهای پایتون دارای Type Hint را مستقیماً به C Extension می‌ترجمد و کامپایل می‌کند. سرعت کد حاصل تا ۴ برابر سریع‌تر از پایتون معمولی است.

  2. Cython:

    • ابرمجموعه‌ای از زبان پایتون که به C/C++ کامپایل می‌شود و سال‌هاست در کتابخانه‌های سنگینی مثل NumPy و Pandas استفاده می‌شود.

  3. Numba:

    • یک JIT compiler مبتنی بر LLVM مخصوص محاسبات عددی و ریاضی.

  4. PyInstaller / Nuitka:

    • Nuitka: کد پایتون را به C تبدیل کرده و سپس با GCC/MSVC کامپایل می‌کند (کامپایلر واقعی).

    • PyInstaller: کد پایتون و مفسر CPython را فقط در یک پکیج زیپ‌شده (EXE) بسته‌بندی می‌کند (کامپایل واقعی نیست).

 

آینده پایتون به کدام سمت می‌رود؟

پایتون مسیر زبان‌هایی مانند JavaScript (V8) و Java (JVM) را پیش گرفته است:

پایتون ماهیت پویا، ساده و تفسیرشونده خود در ظاهر را حفظ می‌کند، اما زیر سقف خانه (Under the Hood)، مفسر آن در حال تبدیل شدن به یک موتور چندلایه JIT قدرتمند است.

  • نیاز به تغییر کد نیست: کدهای قبلی شما بدون هیچ تغییری در نسخه‌های جدید سریع‌تر اجرا خواهند شد.
  • تایپ هینت‌ها (Type Hints) مهم‌تر می‌شوند: هرچند تایپ‌ها هنوز در زمان اجرا چک نمی‌شوند، اما موتورهای JIT آینده می‌توانند از این static hintها برای بهینه‌سازی‌های شدیدتر استفاده کنند.
  • پایتون در عرصه پردازش موازی جان تازه‌ای می‌گیرد: با حذف کامل GIL در نسخه‌های آینده، پایتون سهم بیشتری از بازار پروژه‌های Multi-threaded و سیستم‌های با لاجیک سنگین را تصاحب خواهد کرد.

 

پایتون کامپایلری نمی‌شود تا سادگی‌اش را ببازد؛ بلکه هوشمندتر می‌شود تا سرعتش را به زبان‌های کامپایلری نزدیک کند.

 
لینک استاندارد شده: DBd

0 نظر

    هنوز نظری برای این مقاله ثبت نشده است.
جستجوی مقاله و آموزش
دوره‌ها با تخفیفات ویژه
آخرین مقالات تخصصی