Menu
Coddy logo textTech
flag Ar iconالعربيةdown icon

ما هو المفسر (Interpreter)؟

المفسر (interpreter) برنامج ينفّذ الكود المصدري مباشرة، فيطبّق تعليماته واحدة تلو الأخرى أثناء القراءة، بدلًا من أن يترجم البرنامج كله أولًا إلى ملف منفصل بلغة الآلة. والتطبيقان القياسيان للغتي Python وRuby مفسران.

بقلم Kevin Spektor, شريك مؤسس ورئيس قسم التكنولوجيا (CTO)

آخر تحديث 24 سبتمبر 2026

الكود المصدري
  1. 1print("Hello")
  2. 2total = 2 + 3
  3. 3print(total)
  4. 4print("Done")
الناتج
الأسطر المترجمة0
مرات التشغيل0

كل تشغيل يترجم الأسطر من جديد. فعّل الخطأ الإملائي وسيطبع المفسر "Hello" رغم ذلك قبل أن يصل إلى السطر 3 ويتوقف.

اكتب python3 hello.py فيظهر الناتج، لكن انظر في المجلد بعد ذلك: لم يُنشأ أي ملف برنامج جديد. البرنامج الذي عمل فعلًا هو python3 نفسه، أي مفسر Python. قرأ hello.py، وفهم معنى كل تعليمة، ونفّذها. شغّل السكربت مجددًا غدًا وسيقرأ المفسر الكود المصدري من البداية مرة أخرى.

كيف يعمل المفسر

يكرّر المفسر دورة واحدة حتى ينتهي البرنامج: خذ التعليمة التالية، افهم معناها، نفّذها، ثم انتقل إلى ما بعدها. ويحتفظ بمتغيرات البرنامج في ذاكرته الخاصة أثناء العمل، ولهذا يستطيع total = price * 3 استخدام price الذي أُسند قبل بضعة أسطر.

أوضح طريقة لرؤية ذلك هي الوضع التفاعلي، المسمّى REPL (اقرأ، قيّم، اطبع، كرّر). اكتب python3 بدون اسم ملف، وسيُنفَّذ كل سطر لحظة ضغطك على Enter:

>>> price = 4
>>> price * 3
12

المفسرات الحقيقية تضيف خطوة تحضيرية. CPython، مفسر Python القياسي، يترجم ملفك كله أولًا إلى بايت كود (bytecode)، وهو قائمة مختصرة من التعليمات البسيطة، ثم يشغّل حلقة تنفّذ هذا البايت كود تعليمة تلو الأخرى. يمكنك طباعة البايت كود لسطر واحد:

يطبع Python 3.12 ما يلي (تختلف الإصدارات الأخرى في التفاصيل):

  0           0 RESUME                   0

  1           2 LOAD_NAME                0 (price)
              4 LOAD_CONST               0 (3)
              6 BINARY_OP                5 (*)
             10 STORE_NAME               1 (total)
             12 RETURN_CONST             1 (None)

كل سطر من هذه الأسطر خطوة واحدة في حلقة المفسر: اجلب قيمة price، اجلب الثابت 3، اضربهما، خزّن النتيجة في total. لا شيء من ذلك لغة آلة؛ فالمفسر، وهو نفسه برنامج C مترجَم، هو من ينفّذ كل خطوة.

الأخطاء تظهر عند تنفيذ السطر

لأن المفسر ينفّذ أثناء القراءة، يستطيع البرنامج أن يؤدي عملًا حقيقيًا قبل أن يصطدم بخطأ. شغّل هذا الكود وسيُطبع السطران الأولان قبل الانهيار:

Step 1: starting
Step 2: still fine
Traceback (most recent call last):
  ...
ZeroDivisionError: division by zero

أما خطأ الصياغة فيتصرف بشكل مختلف، لأن CPython يترجم الملف كله إلى بايت كود قبل تشغيل أي جزء منه. غيّر السطر 3 إلى print("Step 3:" 10) (الفاصلة ناقصة) ولن يُطبع شيء على الإطلاق، ولا حتى Step 1:

SyntaxError: invalid syntax. Perhaps you forgot a comma?

إذن عبارة "المفسر يشغّل الكود سطرًا بسطر" صحيحة بنسبة النصف فقط. تُفحص القواعد النحوية للملف كله أولًا؛ وكل ما عدا ذلك، مثل القسمة على صفر أو استخدام اسم غير موجود، لا يُكتشف إلا عند تنفيذ ذلك السطر. راجع الخطأ في الصياغة للنوع الأول.

المترجم مقابل المفسر

المترجم يحوّل البرنامج كله إلى ملف منفصل قبل تشغيله. أما المفسر فيشغّل البرنامج نفسه في كل مرة. والفروق العملية تنتج من ذلك:

المترجمالمفسر
متى يحدث العملمرة واحدة، قبل تشغيل البرنامجفي كل مرة يُشغَّل فيها البرنامج
الناتجملف منفصل (ملف تنفيذي أو بايت كود)لا يوجد ملف برنامج منفصل
ما تعطيه للمستخدمينالبرنامج المترجَمالكود المصدري، مع المفسر مثبتًا على أجهزتهم
فحص الأخطاءأخطاء الصياغة، وأخطاء الأنواع في اللغات ذات الأنواع، للبرنامج كله قبل تشغيلهتُفحص الصياغة أولًا عادةً؛ والأخطاء الأخرى تظهر عند تنفيذ السطر المعيب
التعديل والتشغيلإعادة الترجمة بعد كل تغييراحفظ وشغّل مجددًا
السرعةأسرع، فالمعالج ينفّذ لغة الآلة مباشرةأبطأ، فكل تعليمة تُفك أثناء تشغيل البرنامج
قابلية النقلإعادة الترجمة لكل معالج ونظام تشغيلالكود المصدري نفسه يعمل في أي مكان يوجد فيه المفسر
لغات نموذجيةC وC++ وRust وGoPython وRuby وPHP وBash

فارق السرعة حقيقي في الحلقات الحسابية المكثفة: قد تعمل الحلقة نفسها أسرع بمرات كثيرة كبرنامج C مترجَم منها في CPython. أما البرامج التي تقضي معظم وقتها في انتظار الشبكة أو القرص أو المستخدم، فالفارق غالبًا أصغر من أن يُلاحظ.

كون اللغة مترجمة أو مفسرة ليس صفة في اللغة

اللغة مجموعة من القواعد؛ والمترجم أو المفسر برنامج يطبّق هذه القواعد. يمكن تشغيل اللغة نفسها بالطريقتين، ومعظم اللغات الشائعة تمزج بينهما:

  • Python. يترجم CPython إلى بايت كود ثم يفسّره. ويضيف PyPy، وهو تطبيق آخر للغة، مترجم تنفيذ فوري (JIT) يحوّل الكود الأكثر تنفيذًا إلى لغة الآلة أثناء تشغيل البرنامج.
  • Java. يترجم javac الكود المصدري إلى بايت كود مسبقًا. ثم تفسّر آلة Java الافتراضية هذا البايت كود، وتترجم الدوال الأكثر استخدامًا إلى لغة الآلة بتقنية JIT. ومنذ Java 11، يشغّل الأمر java Main.java ملفًا مصدريًا واحدًا مباشرة بعد ترجمته في الذاكرة أولًا.
  • JavaScript. تستخدم المتصفحات وNode.js محركات مثل V8، تبدأ بتفسير الكود ثم تترجم الأجزاء الأكثر تنفيذًا إلى لغة الآلة أثناء عمل البرنامج.
  • C وC++. تُترجَمان دائمًا تقريبًا قبل التشغيل باستخدام GCC أو Clang أو MSVC.
python3 app.py            # Python: interpreter, bytecode behind the scenes
node app.js               # JavaScript: V8 interprets, then JIT-compiles
javac Main.java           # Java step 1: compile to Main.class
java Main                 # Java step 2: the JVM runs the bytecode

وأيًّا كانت الطريقة، فالمفسر أو الآلة الافتراضية جزء من بيئة التشغيل الخاصة بالبرنامج: يجب أن يكون مثبتًا حيثما يعمل البرنامج.

مفاهيم خاطئة شائعة

  • "المفسر يترجم كل سطر إلى لغة الآلة." المفسر التقليدي لا يُنتج لغة آلة لبرنامجك أبدًا. إنه يقرأ التعليمة وينفّذها باستخدام كود مترجَم مسبقًا داخل المفسر نفسه. أما إنتاج لغة الآلة وقت التشغيل فهو عمل مترجم JIT.
  • "اللغات المفسرة ليس فيها خطوة ترجمة." CPython وYARV الخاص بلغة Ruby وPHP كلها تترجم إلى بايت كود أولًا. الخطوة تلقائية وغير مرئية، لذا يسهل ألا تلاحظها.
  • "مفسرة تعني بطيئة." ترجمة JIT قلّصت جزءًا كبيرًا من الفارق. يشغّل V8 لغة JavaScript بسرعة تكفي لتطبيقات كبيرة مثل VS Code المبني على Electron.
  • "Python هي المفسر." Python هي اللغة. أما CPython وPyPy وMicroPython فمفسرات مختلفة لها، وقد تختلف في السرعة وفي المكتبات التي تدعمها.

إلى أين بعد ذلك

للنصف الآخر من المقارنة، اقرأ ما هو المترجم وكيف يحوّل الكود المصدري إلى لغة الآلة. وتشرح صفحة بيئة التشغيل ما يجلبه المفسر معه أيضًا. ولتجرّب مفسرًا بنفسك، شغّل سكربت Python أو افتح Python Playground.

الأسئلة الشائعة

هل Python مترجم أم مفسر؟
Python لغة، والبرنامج الذي يشغّلها عادةً هو CPython، وهو مفسر. يترجم CPython كودك أولًا إلى بايت كود تلقائيًا، ثم يفسّر هذا البايت كود. وتوجد تطبيقات أخرى للغة، مثل PyPy الذي يضيف مترجم JIT.
هل C++ مفسر أم مترجم؟
C++ لغة، وتُترجَم دائمًا تقريبًا قبل التشغيل بمترجم مثل GCC أو Clang أو MSVC. والنتيجة ملف تنفيذي أصلي لمعالج واحد ونظام تشغيل واحد. توجد أدوات تفاعلية لـ C++، لكنها تترجم كل جزء من الكود في الخلفية.
أيهما أسرع، المفسر أم المترجم؟
البرنامج المترجَم يعمل عادةً أسرع، لأن المعالج ينفّذ لغة الآلة مباشرة بدلًا من أن يفك المفسر كل خطوة. أما المفسر فيبدأ أسرع، إذ لا توجد عملية بناء منفصلة. ومترجمات JIT، التي تستخدمها JVM وV8، تقلّص الفارق بترجمة الكود الأكثر تنفيذًا أثناء عمل البرنامج.
ما هو REPL؟
REPL (اقرأ، قيّم، اطبع، كرّر) موجّه تفاعلي يشغّل فيه المفسر كل سطر فور كتابته ويعرض النتيجة. كتابة python3 أو node بدون اسم ملف تفتح واحدًا. وهو مفيد لاختبار فكرة صغيرة دون إنشاء ملف.
هل يمكن أن تكون اللغة مترجمة ومفسرة في آن واحد؟
نعم. كون اللغة مترجمة أو مفسرة صفة للتطبيق (implementation) لا للغة نفسها. تُترجَم Java إلى بايت كود بواسطة javac، ثم تفسّره JVM وتترجمه بتقنية JIT، وتوجد مفسرات ومترجمات معًا للغات مثل Python وJavaScript.
Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن