سؤال

في عدة أسئلة رأيت التوصيات روح محلل-مولد إطار من boost.org, ولكن بعد ذلك في التعليقات هناك تذمر من الناس باستخدام الروح الذين ليسوا سعداء.سوف هؤلاء الناس يرجى الوقوف عليها وشرح بقية لنا ما هي عيوب أو سلبيات لاستخدام الروح ؟

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

المحلول

هذا هو بارد جدا الفكرة و أنا أحب ذلك ؛ وخصوصا كان من المفيد حقا تعلم كيفية استخدام C++ قوالب.

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

  • Scannerless تحليل.في حين انها بسيطة جدا عندما تتراجع مطلوب فإنه قد تبطئ محلل.إنه اختياري حتى lexer قد تكون متكاملة ، راجع ج المعالج المدمج مع الروح.قواعد اللغة من ~300 خطوط (بما في ذلك على حد سواء .ساعة .cpp الملفات) يجمع (غير محسن) إلى ملف من 6M مع دول مجلس التعاون الخليجي.Inlining الأقصى تحسينات يصل الى حوالي 1,7 م.

  • بطيئة تحليل - لا يوجد ثابت التحقق من قواعد اللغة, ولا التلميح عن الإفراط في lookahead المطلوبة ولا للتحقق من الأخطاء الأساسية, مثل على سبيل المثال استخدام اليسار العودية (مما يؤدي إلى لانهائية العودية في العودية-أصل موزعي LL قواعد النحو).ترك الإعادة ليست حقا من الصعب علة لتعقب, رغم أن, ولكن الإفراط في lookahead قد تسبب الأسي تحليل مرات.

  • الثقيلة قالب الاستخدام - في حين أن هذا له مزايا معينة ، هذه الآثار تجميع مرات حجم التعليمات البرمجية.بالإضافة إلى ذلك, قواعد التعريف يجب أن تكون عادة مرئية لجميع المستخدمين الآخرين ، تؤثر أكثر تجميع مرات.لقد كنت قادرة على التحرك إلى قواعد النحو .cpp الملفات عن طريق إضافة صريحة قالب التجسيدات مع المعلمات ، لكن ذلك لم يكن سهلا.

تحديث:ردي يقتصر على تجربتي مع روح الكلاسيكية, لا روح V2.وأود أن لا تزال تتوقع الروح إلى حد كبير على أساس قالب, ولكن الآن أنا مجرد التخمين.

نصائح أخرى

في دفعة 1.41 يتم الافراج عن نسخة جديدة من الروح، وأنه يدق السراويل قبالة الروح :: الكلاسيكي:

<اقتباس فقرة>   

وبعد فترة طويلة في مرحلة تجريبية (أكثر من 2   سنوات مع الروح 2.0)، الروح 2.1   وأخيرا سيصدر مع   دفعة المقبل 1.41 الإصدار. الرمز   غير مستقر للغاية الآن، وهي على استعداد ل   رمز الإنتاج. ونحن نعمل بجد   على الانتهاء من الوثائق في الوقت المناسب   لتفعيل 1.41. يمكنك ملاعبة   الحالة الراهنة للوثائق   هنا. حاليا، يمكنك العثور على رمز   وثائق في تفعيل SVN   جذع. إذا كان لديك مشروع جديد   التي تنطوي على الروح، ونحن نوصي بشدة   بدءا الروح 2.1 الآن. اسمح لي   على حد تعبير آخر OvermindDL من ل   قائمة روح البريدية:

     <اقتباس فقرة>     <اقتباس فقرة>       

وأنا قد تبدأ ليبدو وكأنه بوت مع       كم مرة أقول هذا، ولكن       Spirit.Classic هو القديم، يجب عليك       التبديل إلى Spirit2.1، فإنه يمكن القيام به       كل ما فعلتموه فوق قدرا كبيرا       أسهل، وأقل كثيرا من الرمز، وذلك       ينفذ بشكل أسرع. فمثلا،       Spirit2.1 يمكن بناء AST الخاص بك كامل       مضمنة، لا الغلابة غريب، لا حاجة       لبناء الامور بعد ذلك، الخ ...،       كل لطيفا واحد وخطوة سريعة. أنت       حقا بحاجة إلى تحديث. رؤية الآخر       المشاركات من اليوم السابق للحصول على ارتباطات       مستندات ومثل لSpirit2.1. Spirit2.1       حاليا في جذع Boost، ولكن سوف       سيصدر رسميا مع دفعة 1.41،       ولكن اكتمال خلاف ذلك.

       

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

و boost::spirit::classic::parser_result<boost::spirit::classic::action<boost::spirit::classic::sequence<boost::spirit::classic::action<boost::spirit::classic::action<optional_suffix_parser<char const*>, boost::spirit::classic::ref_actor<std::vector<std::string, std::allocator<std::string> >, boost::spirit::classic::clear_action> >, boost::spirit::classic::ref_actor<std::vector<int, std::allocator<int> >, boost::spirit::classic::clear_action> >, boost::spirit::classic::sequence<boost::spirit::classic::alternative<boost::spirit::classic::alternative<boost::spirit::classic::action<boost::spirit::classic::contiguous<boost::spirit::classic::sequence<boost::spirit::classic::alternative<boost::spirit::classic::chlit<char>, boost::spirit::classic::chlit<char> >, boost::spirit::classic::positive<boost::spirit::classic::alternative<boost::spirit::classic::alternative<boost::spirit::classic::alnum_parser, boost::spirit::classic::chlit<char> >, boost::spirit::classic::chlit<char> > > > >, boost::spirit::classic::ref_value_actor<std::vector<std::string, std::allocator<std::string> >, boost::spirit::classic::push_back_action> >, boost::spirit::classic::action<boost::spirit::classic::rule<boost::spirit::classic::scanner<char const*, boost::spirit::classic::scanner_policies<boost::spirit::classic::skipper_iteration_policy<boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy> >, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::ref_const_ref_actor<std::vector<std::string, std::allocator<std::string> >, std::string, boost::spirit::classic::push_back_action> > >, boost::spirit::classic::contiguous<boost::spirit::classic::sequence<boost::spirit::classic::chlit<char>, boost::spirit::classic::action<boost::spirit::classic::uint_parser<unsigned int, 10, 1u, -1>, boost::spirit::classic::ref_value_actor<std::vector<int, std::allocator<int> >, boost::spirit::classic::push_back_action> > > > >, boost::spirit::classic::kleene_star<boost::spirit::classic::sequence<boost::spirit::classic::chlit<char>, boost::spirit::classic::alternative<boost::spirit::classic::alternative<boost::spirit::classic::action<boost::spirit::classic::contiguous<boost::spirit::classic::sequence<boost::spirit::classic::alternative<boost::spirit::classic::chlit<char>, boost::spirit::classic::chlit<char> >, boost::spirit::classic::positive<boost::spirit::classic::alternative<boost::spirit::classic::alternative<boost::spirit::classic::alnum_parser, boost::spirit::classic::chlit<char> >, boost::spirit::classic::chlit<char> > > > >, boost::spirit::classic::ref_value_actor<std::vector<std::string, std::allocator<std::string> >, boost::spirit::classic::push_back_action> >, boost::spirit::classic::action<boost::spirit::classic::rule<boost::spirit::classic::scanner<char const*, boost::spirit::classic::scanner_policies<boost::spirit::classic::skipper_iteration_policy<boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy> >, boost::spirit::classic::nil_t, boost::spirit::classic::nil_t>, boost::spirit::classic::ref_const_ref_actor<std::vector<std::string, std::allocator<std::string> >, std::string, boost::spirit::classic::push_back_action> > >, boost::spirit::classic::contiguous<boost::spirit::classic::sequence<boost::spirit::classic::chlit<char>, boost::spirit::classic::action<boost::spirit::classic::uint_parser<unsigned int, 10, 1u, -1>, boost::spirit::classic::ref_value_actor<std::vector<int, std::allocator<int> >, boost::spirit::classic::push_back_action> > > > > > > > >, void ()(char const, char const*)>, boost::spirit::classic::scanner<char const*, boost::spirit::classic::scanner_policies<boost::spirit::classic::skipper_iteration_policy<boost::spirit::classic::iteration_policy>, boost::spirit::classic::match_policy, boost::spirit::classic::action_policy> > >::type boost::spirit::classic::action<boost::spirit::classic::sequence<boost::spirit::classic::action<boost::spirit::classic::action<

هنا هو ما لا أحب حول هذا الموضوع:

  • الوثائق محدودة.هناك واحدة كبيرة صفحة ويب حيث "كل شيء" هو أوضح ، ولكن التيار تفسيرات نقص في التفاصيل.

  • الفقراء AST جيل.ASTs سيئة وأوضح وحتى بعد ضرب رأسك بالحائط أن نفهم كيف AST معدلات العمل ، فإنه من الصعب الحصول على السهل التلاعب AST (أيواحد الخرائط جيدا أن المشكلة المجال)

  • لأنه يزيد تجميع مرات بشكل كبير ، حتى ل "المتوسط"الحجم قواعد النحو

  • هو جملة من الوزن الثقيل جدا.بل هو حقيقة من حقائق الحياة التي في C/C++ يجب تكرار رمز (أيبين الإعلان و التعريف).ومع ذلك ، يبدو أن في دفعة::روح عند إعلان قواعد اللغة<> يجب تكرار بعض الأشياء 3 مرات :D (عندما تريد ASTs ، وهو ما أريد :D)

بخلاف هذا, أعتقد أنهم قاموا بعمل جيد جدا مع المحلل ، بالنظر إلى القيود المفروضة على C++.ولكن أعتقد أنهم يجب تحسينه أكثر.تاريخ الصفحة توضح أن هناك "ديناميكية" روح قبل الحالية "ثابت" روح ؛ أنا أتساءل كيف أسرع بكثير و كم من أفضل الجملة كان.

وأود أن أقول أن المشكلة الأكبر هي عدم وجود أي تشخيص أو مساعدة أخرى لمشاكل النحوي. إذا قواعد اللغة الخاصة بك غامض، قد محلل يتم تحليل ما كنت تتوقع أن، وليس هناك طريقة جيدة ليلاحظ ذلك.

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