سؤال

أنا أكتب مترجميا تجريبي لغة برمجة لعبة في C.

ما هي المشاكل التي يمكن أن تنشأ إذا فعلنا معالجة ماكرو في مرحلة منفصلة بين قراءة البرنامج والتحليل المعجمي؟

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

المحلول

"Preprocessor" المتعمم يعني أداة تحول الرموز قبل أن يحصل المحول البرمجي الرئيسي على تعليق منه.

هذا هو المعالج ليكس (وربما يوزع) المصدر من قبل إنه القواعد، تؤدي بعض التحول والنواتج نتيجة لذلك. الترجمة الرئيسية LEXES ويوزع نتيجة عمل Preprocessor وفقا ل إنه القواعد (التي قد تكون مختلفة عن تلك المستخدمة من قبل Preprocessor).

لذلك إذا كان Preprocessor يعمل تغييرات غير تافهة في نص البرنامج، فقد يكون من الصعب التنبؤ بالنتيجة النهائية في لمحة. هذا صحيح C مع C-Preprocessor، ولكن (أو ربما هكذا) تعقد الاتفاقية أنه يجب عليك استخدام المسامير فقط بطريقات قليلة لها نتائج يمكن التنبؤ بها إلى حد ما. فيأعتقد أن Preprocessor C تورينج كاملة، لذلك لا يوجد حد لما يمكن تحقيقه إذا كنت لا تذهب مجنونا يحاول تصحيح ذلك. في التفكير في تعليق بافل، أتعرف على حلقات، لا توجد مكدسات، لا أكوام. يبدو أن هذا يقتل ذلك. شكرا. لا يزال بإمكانك الذهاب Bonkers في محاولة تصحيح كومة تقدما بما فيه الكفاية من وحدات الماكرو.)

نصائح أخرى

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

مثال بسيط

(defmacro ntimes (data n)
  `(loop for i from 1 to ,n collecting ,data))

(print (ntimes 'a 10))

Result : (A A A A A A A A A A)

سيتم إجراء هذا التحول في وقت الترجمة (أحد الأشياء الجميلة للمصدر بأنه AST الخاص به). هذا شيء لا يمكن القيام به من قبل Preprocessor منفصل (ما لم يكن Preprocessor احتوى على نسخة من المحول البرمجي!)

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