در سالهای اخیر و بهویژه با معرفی پروژههای کلیدی در نسخه 3.11 تا 3.13 و برنامههای تدوینشده برای نسخه 3.14، شایعات و بحثهای فراوانی در جامعه توسعهدهندگان شکل گرفته است: آیا پایتون قرار است کلاً به یک زبان کامپایلری تبدیل شود؟
در این مقاله تخصصی، از منظر معماری سیستم و مهندسی نرمافزار، به بررسی دقیق روند تحول پایتون، تکنولوژیهای JIT Compiler، حذف GIL، پروژه Faster CPython و آینده اجرایی این زبان میپردازیم.
پاسخ کوتاه و صریح: خیر، پایتون به یک زبان کامپایلری محض (Statically Compiled) مانند C++ یا Go تبدیل نخواهد شد.
برای فهم عمیقتر این موضوع باید دو مفهوم را از هم تفکیک کنیم:
۱.۱. زبان در برابر پیادهسازی (Language vs. Implementation)
پایتون یک مفهوم و استاندارد زبانی است؛ مجموعهای از قواعد نحو (Syntax) و معناشناختی (Semantics). آنچه ما اجرا میکنیم، پیادهسازی پایتون است.
وقتی از «تغییرات پایتون» صحبت میکنیم، منظور تغییرات در 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) استفاده میکند تا رفتار کدهای پویا را کالیبره کند.
در کنفرانس PyCon 2021، خیدو فان روسوم (آفریننده پایتون) به همراه تیم پایتون در مایکروسافت، برنامهای چندساله به نام Faster CPython Project (یا پروژه Shannon) را معرفی کردند. هدف پروژه: افزایش سرعت CPython تا ۵ برابر طی چند نسخه.
ارکان اصلی این تغییرات که از پایتون 3.11 کلید خورد و در 3.13 به اوج رسید عبارتاند از:
۳.۱. مفسر تطبیقی تخصصی (Specializing Adaptive Interpreter - Python 3.11)
پیش از 3.11، Virtual Machine پایتون دستورالعملهای بایتیکد (Bytecode) را به صورت کاملاً عمومی اجرا میکرد.
در 3.11، مفهوم Adaptive Bytecode معرفی شد:
این کار بدون نیاز به کامپایل به زبان ماشین، سرعت اجرا را ۱۰ تا ۶۰ درصد افزایش داد.
۳.۲. انقلاب JIT Compiler در پایتون 3.13 (Copy-and-Patch JIT)
بزرگترین خبر تکنیکال نسخه 3.13، اضافه شدن کامپایلر JIT رسمی به CPython است.
معمولاً کامپایلرهای JIT (مانند V8 در مرورگر کروم یا JVM در جاوا) از فریمورکهای سنگینی مثل LLVM استفاده میکنند. این کار باعث:
تیم توسعه 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)]
زمان ساخت پایتون (Build Time): با استفاده از LLVM، قالبهای کوچکی از کد ماشین (Machine Code Snippets) برای هر دستور ساختار یافته تولید میشود.
زمان اجرای کد (Runtime): وقتی JIT تشخیص میدهد کدی «داغ» (Hot Code / حلقه پرتکرار) است، به جای کند و کاو و تحلیلهای سنگین کامپایلری، فقط قالبهای کد ماشین پیشساخته را کپی کرده، متغیرها/آدرسهای حافظه آن را پچ (Patch) میکند و مستقیماً به CPU میسپارد!
نتیجه: سرعت کامپایل JIT تا ۱۰۰ برابر سریعتر از LLVM است و مصرف حافظه آن ناچیز است.
۳.۳. حذف GIL و انقلاب Free-Threading (پایتون 3.13 و 3.14)
یکی دیگر از موانع اصلی عملکرد پایتون، GIL (Global Interpreter Lock) بود. GIL اجازه نمیداد حتی در پردازندههای چند هستهای، بیش از یک ترد (Thread) کد پایتون را همزمان اجرا کند.
در پایتون 3.13:
در پایتون 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) |
اگر پروژه شما حتماً نیاز دارد که کد پایتون را به یک فایل Executable مستقل (بدون نیاز به نصب پایتون) یا کد C کامپایل کند، ابزارهای زیر در اکوسیستم فعلی وجود دارند:
Mypyc:
توسعه دادهشده توسط تیم MyPy.
کدهای پایتون دارای Type Hint را مستقیماً به C Extension میترجمد و کامپایل میکند. سرعت کد حاصل تا ۴ برابر سریعتر از پایتون معمولی است.
Cython:
ابرمجموعهای از زبان پایتون که به C/C++ کامپایل میشود و سالهاست در کتابخانههای سنگینی مثل NumPy و Pandas استفاده میشود.
Numba:
یک JIT compiler مبتنی بر LLVM مخصوص محاسبات عددی و ریاضی.
PyInstaller / Nuitka:
Nuitka: کد پایتون را به C تبدیل کرده و سپس با GCC/MSVC کامپایل میکند (کامپایلر واقعی).
PyInstaller: کد پایتون و مفسر CPython را فقط در یک پکیج زیپشده (EXE) بستهبندی میکند (کامپایل واقعی نیست).
پایتون مسیر زبانهایی مانند JavaScript (V8) و Java (JVM) را پیش گرفته است:
پایتون ماهیت پویا، ساده و تفسیرشونده خود در ظاهر را حفظ میکند، اما زیر سقف خانه (Under the Hood)، مفسر آن در حال تبدیل شدن به یک موتور چندلایه JIT قدرتمند است.
پایتون کامپایلری نمیشود تا سادگیاش را ببازد؛ بلکه هوشمندتر میشود تا سرعتش را به زبانهای کامپایلری نزدیک کند.
0 نظر
هنوز نظری برای این مقاله ثبت نشده است.