كيف يمكن للغة التي تدعم وحدات الماكرو تتبع التعليمات البرمجية المصدر لتصحيح الأخطاء؟

StackOverflow https://stackoverflow.com/questions/3214603

سؤال

هذا سؤال نظري أكثر حول وحدات الماكرو (على ما أظن).أعلم أن وحدات الماكرو تأخذ كود المصدر وتنتج كود الكائن دون تقييمه، مما يمكّن المبرمجين من إنشاء هياكل نحوية أكثر تنوعًا.إذا اضطررت إلى تصنيف هذين النظامين الماكرو، فسأقول أن هناك ماكرو "نمط C" وماكرو "نمط ليسب".

يبدو أن تصحيح أخطاء وحدات الماكرو قد يكون أمرًا صعبًا بعض الشيء لأنه في وقت التشغيل، يختلف الكود الذي يتم تشغيله فعليًا عن المصدر.

كيف يتتبع مصحح الأخطاء تنفيذ البرنامج فيما يتعلق بكود المصدر المعالج مسبقًا؟هل هناك "وضع تصحيح" خاص يجب ضبطه لالتقاط بيانات إضافية حول الماكرو؟

في لغة C، أستطيع أن أفهم أنك قمت بتعيين مفتاح وقت الترجمة لتصحيح الأخطاء، ولكن كيف يمكن للغة المفسرة، مثل بعض أشكال Lisp، أن تفعل ذلك؟

أعتذر عن عدم تجربة ذلك، لكن سلسلة أدوات LISP تتطلب وقتًا أطول مما يجب أن أقضيه في اكتشاف ذلك.

هل كانت مفيدة؟

المحلول

لا أعتقد أن هناك فرقًا جوهريًا بين وحدات الماكرو "نمط C" و"نمط Lisp" في كيفية تجميعها.كلاهما يحول المصدر قبل أن يراه المترجم.يتمثل الاختلاف الكبير في أن وحدات ماكرو لغة C تستخدم معالج لغة C الأولي (لغة ثانوية أضعف تستخدم في الغالب لاستبدال سلسلة بسيطة)، بينما تتم كتابة وحدات ماكرو Lisp بلغة Lisp نفسها (وبالتالي يمكنها فعل أي شيء على الإطلاق).

(جانبا:لم أر Lisp غير مجمعة منذ فترة ...بالتأكيد ليس منذ مطلع القرن.ولكن إذا كان هناك أي شيء، فإن التفسير يبدو أنه يجعل مشكلة تصحيح أخطاء الماكرو أسهل، وليس أصعب، نظرًا لأن لديك المزيد من المعلومات حولها.)

أنا أتفق مع مايكل:لم أر مصحح أخطاء لـ C الذي يتعامل مع وحدات الماكرو على الإطلاق.يتم تحويل التعليمات البرمجية التي تستخدم وحدات الماكرو قبل حدوث أي شيء.ال وضع "التصحيح" لتجميع كود C عموما يعني فقط أنه يخزن الوظائف والأنواع والمتغيرات وأسماء الملفات وما إلى ذلك - لا أعتقد أن أيًا منهم يخزن معلومات حول وحدات الماكرو.

  • لبرامج التصحيح ذلك استخدم وحدات الماكرو, ، Lisp إلى حد كبير مثل C هنا:يرى مصحح الأخطاء الخاص بك الرمز المترجم ، وليس تطبيق الماكرو.عادةً ما يتم الاحتفاظ وحدات الماكرو بسيطة ، ويتم تصحيحها بشكل مستقل قبل الاستخدام ، لتجنب الحاجة إلى ذلك ، تمامًا مثل C.

  • لتصحيح وحدات الماكروأنفسهم, ، قبل الذهاب واستخدامه في مكان ما ، يحتوي Lisp على ميزات تجعل هذا الأمر أسهل من C ، على سبيل المثال ، REPL وmacroexpand-1 (على الرغم من أنه في C ، من الواضح أن هناك وسيلة لمجموعة Macroexpand ملف كامل ، بالكامل ، في وقت واحد).يمكنك رؤية ما قبل وبعد Macroexpansion ، مباشرة في المحرر الخاص بك ، عندما تكتبه.

لا أستطيع أن أتذكر أي وقت واجهت فيه موقفًا حيث يتم تصحيح الأخطاء داخل كان من الممكن أن يكون التعريف الكلي بحد ذاته مفيدًا.إما أنه خطأ في تعريف الماكرو، في هذه الحالة macroexpand-1 يعزل المشكلة على الفور، أو يكون هناك خطأ أقل من ذلك، وفي هذه الحالة تعمل مرافق تصحيح الأخطاء العادية بشكل جيد ولا أهتم بحدوث توسع كبير بين إطارين من مكدس الاستدعاءات الخاص بي.

نصائح أخرى

في lispworks يمكن للمطورين استخدام أداة السائر .

يوفر

lispworks سائر، حيث يمكن للمرء أن يتخطى كامل عملية التوسع الماكرو .

يجب عليك أن تنظر حقا إلى نوع الدعم الذي مضرب يحتوي على رمز تصحيح الأخطاء مع وحدات الماكرو. هذا الدعم له جانبان، كما يذكر كين. من ناحية هناك مسألة تصحيح وحدات الماكرو: في LISP المشترك أفضل طريقة للقيام بذلك هي فقط توسيع النماذج الماكرو يدويا. مع CPP، فإن الوضع مشابه ولكن أكثر بدائية - كنت تقوم بتشغيل التعليمات البرمجية من خلال توسيع CPP فقط وتفقد النتيجة. ومع ذلك، كلاهما غير كاف لمحاجر أكثر مشاركة، وكان هذا هو الدافع للحصول على ماكرو مصحح الأخطاء في مضرب - إنه يوضح لك خطوات توسيع بناء الجملة واحدا تلو الآخر، مع وجود مؤشرات إضافية قائمة على واجهة المستخدم الرسومية لأشياء مثل الموازين المتصلين وغيرها.

على جانب باستخدام وحدات الماكرو، كان مضرب دائما أكثر تقدما من تطبيقات المخطط وغيرها من تطبيقات LISP. الفكرة هي أن كل تعبير (ككائن سنوي) هو الرمز بالإضافة إلى بيانات إضافية تحتوي على موقع مصدرها. بهذه الطريقة عندما يكون النموذج ماكرو، سيكون الرمز الموسع الذي يحتوي على أجزاء قادمة من الماكرو موقع المصدر الصحيح - من تعريف الماكرو بدلا من استخدامه (حيث تكون النماذج موجودة حقا). ستنفذ بعض تطبيقات المخطط و LISP محدودة من هذا باستخدام هوية النموذج الفرعي، كما ذكر Dmitry-VK.

لا أعرف عن وحدات الماكرو Lisp (التي أظن أنها تختلف تماما عن وحدات الماكرو C) أو تصحيح الأخطاء، ولكن العديد من الصحافة - من المحتمل أن يتعاملوا في تصحيح الأخطاء على مستوى المصدر من وحدات ماكرو Preprocessor C بشكل جيد.

عموما، D / C ++ Debuggers لا "الخطوة" في تعريف الماكرو.إذا كان الماكرو يتوسع إلى عبارات متعددة، فسيظل المصحح عادة فقط على نفس خط المصدر (حيث يتم استدعاء الماكرو) لعملية خطوة مصحح الأخطاء.

هذا يمكن أن يجعل تصحيح وحدات الماكرو أكثر إيلاما بقليل مما قد يكون غير ذلك - سبب آخر لتجنبها في C / C ++.إذا كان ماكرو يسيئ التصرف بطريقة غامضة حقا، فسوف أسقط في وضع التجميع لتصحيحه أو توسيع الماكرو (إما يدويا أو باستخدام مفتاح التحويل البرمجي).من النادر جدا أن عليك أن تذهب إلى هذا المدقع؛إذا كنت تكتب وحدات ماكرو هي تلك المعقدة، فمن المحتمل أن تأخذ النهج الخاطئ.

عادة في C، يحتوي على تصحيح الأخطاء على مستوى المصدر الحبيبية ("التالي" الأمر) أو الحبيبية على مستوى التعليمات ("خطوة إلى"). تعالج المعالجات الماكرو توجيهات خاصة في المصدر المعالج الذي يسمح بمجموعة التحويل البرمجي إلى تعيين تسلسلات مجمعة لتعليمات وحدة المعالجة المركزية إلى خطوط التعليمات البرمجية المصدر.

في LISP موجودة لا توجد اتفاقية بين وحدات الماكرو ومجموعة التحويل البرمجي لتتبع التعليمات البرمجية المصدرية لرسم خرائط الترميز المترجمة، لذلك ليس من الممكن دائما القيام بمثابة خطوة واحدة في التعليمات البرمجية المصدرية.

الخيار واضح هو القيام بخطوة واحدة في رمز الكائنات الكثيرة. مترجم يرى بالفعل النهائي، وسعت نسخة من التعليمات البرمجية ويمكن تتبع التعليمات البرمجية المصدر إلى تعيين رمز الجهاز.

خيار آخر هو استخدام حقيقة أن تعبيرات LISP أثناء التلاعب لديها هوية. إذا كان الماكرو بسيطا، فما عليك سوى تدمير ورمز مدمر ولصق في قالب، فسيكون بعض التعبيرات من التعليمات البرمجية الموسعة مطابقا (فيما يتعلق بمقارنة مكافحة EQ) مع التعبيرات التي تم قراءتها من التعليمات البرمجية المصدرية. في هذه الحالة، يمكن لمجموعة التحويل البرمجي تعيين بعض التعبيرات من التعليمات البرمجية الموسعة إلى التعليمات البرمجية المصدرية.

الإجابة البسيطة هي أنه معقد ؛-) هناك العديد من الأشياء المختلفة التي تسهم في أن تكون قادرا على تصحيح برنامج، وحتى أكثر لتتبع وحدات الماكرو.

في C و C ++، يتم استخدام Preprocessor لتوسيع وحدات الماكرو ويشملها في التعليمات البرمجية المصدر الفعلية. يتم تتبع أسماء الملفات الأصلية وأرقام الأسطر في هذا الملف المصدر الموسع باستخدام توجيهات #line.

http://msdn.microsoft.com/ en-us / library / b5w2czay (vs.80) .aspx

عندما يتم تجميع برنامج C أو C ++ مع تمكين تصحيح الأخطاء، يقوم المجمع بإنشاء معلومات إضافية في ملف الكائنات التي تتبع خطوط المصدر، أسماء الرموز، اكتب واصفات، إلخ.

p> http://sources.redhate.com/gdb/onlinedocs/stabs.html

يحتوي نظام التشغيل على ميزات تجعل من الممكن مصححا للتعرف على عملية والتحكم في تنفيذ العملية؛ التوقف، خطوة واحدة، إلخ.

عندما يتم إرفاق مصحح الأخطاء بالبرنامج، فإنه يترجم كومة العملية وعداد البرنامج مرة أخرى إلى شكل رمزي من خلال البحث عن معنى عناوين البرنامج في معلومات التصحيح.

اللغات الديناميكية تنفذ عادة في جهاز ظاهري، سواء كان مترجميا أو VM ByTecode VM. إنه VM الذي يوفر السنانير للسماح لأصحاب المصحح بالتحكم في تدفق البرنامج وتفقد حالة البرنامج.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top