تكرار السؤال: …
الإجابة المختصرة
يقرأ CPython ملف المصدر ويحوّله إلى bytecode (ويخزنه غالبًا في __pycache__ كملفات .pyc)، ثم ينفذ الـ interpreter هذا الـ bytecode تعليمةً تعليمة داخل الآلة الافتراضية.
الشرح
يمر الكود بمراحل: tokenizing ثم parsing إلى AST ثم compile إلى code objects تحتوي bytecode. يخزن CPython نتيجة الترجمة للموديولات المستوردة في __pycache__ لتسريع التشغيل التالي، بينما يُترجم السكربت الرئيسي في كل مرة. وجود bytecode لا يجعل Python لغة compiled إلى كود آلة؛ فهو تمثيل وسيط ينفذه الـ runtime. تختلف التفاصيل بين التنفيذات (CPython و PyPy بـ JIT)، كما أضاف CPython 3.13 مترجم JIT تجريبيًا معطلًا افتراضيًا.
مثال بالكود
import dis
def add(a, b):
return a + b
dis.dis(add)
# LOAD_FAST a
# LOAD_FAST b
# BINARY_OP +
# RETURN_VALUEأخطاء شائعة
- الاعتقاد بأن Python تفسر السطور نصيًا في كل مرة بدون أي مرحلة ترجمة.
- رفع ملفات __pycache__ إلى Git أو الاعتماد على ملفات .pyc كوسيلة لإخفاء الكود المصدري.