تخطَّ إلى المحتوى
cd /languages
  • نواة الأنظمة
  • البرمجة
  • دعم AST والرموز

لغة C في Maguyva: رسوم بيانية للاستدعاءات في شيفرة الأنظمة والأنظمة المدمجة

يدعم Maguyva لغة C بشجرة AST والرموز والرسم البياني، ليتمكن وكلاء الذكاء الاصطناعي من تتبّع الدوال والـ structs وعبارات include والمستدعين في شيفرة الأنظمة والبرامج الثابتة والمكتبات.

لماذا تحتاج C إلى رسم بياني للاستدعاءات لا إلى grep

لا تملك C فئات أو وحدات تنظّم الشيفرة. تعيش البنية في استدعاءات الدوال والترويسات والـ structs، وقد يظهر الاسم نفسه في التعليقات ووحدات الماكرو والسلاسل الحرفية. وتلتفّ وحدات ماكرو التصدير والتعليقات التوضيحية حول التصريحات، ما يُربك الأدوات التي لا تحلّل إلا C الصافية. بالنسبة إلى الوكيل، الخطوة الأولى الآمنة هي الرسم البياني للاستدعاءات.

يبني Maguyva هذا الرسم البياني، فيرى الوكيل إلى أين تصل الدالة وما الذي يصل إليها قبل أن يقترح تغييرًا.

ما الذي يستخرجه Maguyva من C

يغطي Maguyva الملفات .c و.h. تُستخرج تعريفات الدوال رموزًا، ويمكن اختيار الـ structs والـ unions تعريفاتِ أنواع في البحث البنيوي. وتصبح توجيهات #include علاقات استيراد.

تُحجب قبل التحليل وحدات ماكرو التصدير والرؤية (أنماط مثل FOO_API أو DLLEXPORT أو LIBEXPORT) ووحدات ماكرو التعليقات الخاصة بأمان الخيوط (مثل GUARDED_BY وREQUIRES)، فتُحلَّل التصريحات التي تلتفّ حولها تصريحاتٍ عادية. وتُحلَّل أجسام وحدات الماكرو الشبيهة بالدوال، ولا تُحلَّل أجسام وحدات الماكرو الشبيهة بالكائنات.

يسجّل الرسم البياني الاستدعاءات وعبارات include وإنشاء المثيلات عبر القيم الحرفية المركّبة ومراجع الأنواع والقراءات والكتابات وتدفق التحكم. ويُستبعد من العلاقات نحو 124 استدعاءً من المكتبة القياسية لـ C (printf وmalloc وfree وmemcpy وstrlen وما شابهها)، لتبرز شيفرة المشروع.

أمثلة على مطالبات الوكلاء

  • “من يستدعي uart_write، مباشرة أو عبر دوال أخرى؟” (dependency_search في الاتجاه الوارد)
  • “ما الملفات التي تضمّن config.h، وأيّ structs منه تستخدم؟” (dependency_search ثم find_symbol)
  • “اشرح كيف تنتقل حزمة من مقاطعة الاستقبال إلى محلّل البروتوكول.” (get_task_context)

القيود المعروفة

  • لا تملك C فئات ولا استثناءات، لذا تُعلَّم علاقات الوراثة وتنفيذ الواجهات والتجاوز والرمي والالتقاط بأنها غير منطبقة.
  • يظهر .h في قوائم امتدادات C وC++ وObjective-C، لذا تتوزّع الترويسات في الأشجار متعددة اللغات بين هذه الملفات التعريفية.
  • الاستدعاءات إلى دوال المكتبة القياسية المستبعدة ليست حوافَّ في الرسم البياني. استخدم text_pattern_search حين تحتاج إلى كل malloc أو memcpy.

الخطوات التالية

اربط مستودعًا عبر دليل البدء السريع، ثم راجع مصفوفة الدعم في صفحة التوافق. ولشيفرة C++ في الشجرة نفسها، اقرأ دليل لغة C++.

الأنسب لـ

  • > فرق البرامج الثابتة والأنظمة المدمجة وأنظمة التشغيل، حيث قد يصل تغيير صغير في دالة مشتركة إلى مسارات العتاد.
  • > مكتبات C طويلة العمر ذات ترويسات عامة ووحدات ماكرو للتصدير ووحدات ترجمة داخلية كثيرة.
  • > المراجعات بمساعدة الوكلاء، حيث يكون السؤال: «من يستدعي هذا، وعبر أي ترويسات؟»

سير عمل الوكلاء

  • > العثور على كل من يستدعي دالة قبل تغيير توقيعها أو طريقة معالجتها للأخطاء.
  • > رسم خريطة الملفات التي تضمّن ترويسة والـ structs التي تستخدمها.
  • > تتبّع طلب من معالج مقاطعة أو نقطة دخول عبر الدوال التي يصل إليها.

تفاصيل المحرك

  • > يغطي دعم C الملفات `.c` و`.h`. تعريفات الدوال رموز، والـ structs والـ unions تعريفات أنواع، ويصبح `#include` علاقة استيراد.
  • > تُحجب وحدات ماكرو التصدير والرؤية وتعليقات أمان الخيوط قبل التحليل، فتُحلَّل التصريحات الملتفّ حولها. تُحلَّل أجسام وحدات الماكرو الشبيهة بالدوال، ولا تُحلَّل الشبيهة بالكائنات.
  • > يُستبعد نحو 124 استدعاءً من المكتبة القياسية مثل `printf` و`malloc` و`memcpy`. وتُعلَّم علاقات الوراثة والتجاوز والاستثناءات بأنها غير منطبقة.

نقاط دخول مفيدة عبر MCP

  • find_symbol

    استخدمه مع اسم دالة أو struct حين تحتاج إلى التعريف وكل مرجع.

  • dependency_search

    استخدم التتبّع في الاتجاه الوارد على دالة مشتركة قبل تغيير توقيعها أو طريقة معالجتها للأخطاء.

  • get_task_context

    استخدمه لمطالبات مثل «اشرح كيف تنتقل حزمة من مقاطعة الاستقبال إلى محلّل البروتوكول».