هل تقوم بإنشاء مولدات الأكواد الخاصة بك؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

المبرمج العملي يدعو إلى استخدام مولدات التعليمات البرمجية.هل تقوم بإنشاء مولدات الأكواد في مشاريعك؟إذا كانت الإجابة بنعم، في ماذا تستخدمهم؟

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

المحلول

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

نصائح أخرى

في "المبرمج العملي"، يميز هانت وتوماس بين مولدات الأكواد السلبية والفعالة.

يتم تشغيل المولدات السلبية مرة واحدة، وبعد ذلك تقوم بتحرير النتيجة.

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

IMO، تعتبر الأخيرة أكثر قيمة لأنها تقترب من مبدأ DRY (لا تكرر نفسك).

إذا كان من الممكن تقسيم معلومات الإدخال إلى برنامجك إلى جزأين، الجزء الذي نادرًا ما يتغير (أ) (مثل البيانات الوصفية أو خط المشترك الرقمي)، والجزء الذي يختلف في كل مرة يتم فيها تشغيل البرنامج (ب) (الإدخال المباشر) ، يمكنك كتابة برنامج مولد يأخذ فقط A كمدخل، ويكتب برنامجًا مخصصًا يأخذ B فقط كمدخل.(اسم آخر لهذا هو التقييم الجزئي.)

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

يكون البرنامج المخصص أسرع لأنه لا يضطر إلى الخوض في المدخلات التي تكون دائمًا هي نفسها تقريبًا (A).إنه أبسط لأنه يجب عليه فقط اتخاذ قرارات بشأن المدخلات B، وليس A وB.

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

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

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

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

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

لقد أمضيت أيضًا وقتًا لا بأس به في الكتابة، بشكل أساسي، مولد أكواد من شأنه أن يأخذ وصف XML لجميع السجلات الموجودة على System-on-Chip، ويصدر HTML (نعم، نعم، أعرف عن XSLT، لقد وجدت للتو ينبعث منها برمجيًا ليكون أكثر فعالية من حيث الوقت)، Verilog، SystemVerilog، C، Assembly وما إلى ذلك."عروض" تلك البيانات لفرق مختلفة (تصميم ASIC للواجهة الأمامية والخلفية، والبرامج الثابتة، والوثائق، وما إلى ذلك) لاستخدامها (والحفاظ عليها متسقة بفضل "قاعدة التعليمات البرمجية" XML الفردية).هل هذا يحتسب؟

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

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

أدوات مثل Visual Studio وCodesmith لها قوالبها الخاصة لمعظم المهام الشائعة وتجعل هذه العملية أسهل.ولكن من السهل طرحها بنفسك.

غالبًا ما يكون من المفيد إنشاء منشئ تعليمات برمجية يقوم بإنشاء تعليمات برمجية من إحدى المواصفات - عادةً ما تحتوي على قواعد جدولية منتظمة.فهو يقلل من فرصة إدخال خطأ عن طريق الخطأ المطبعي أو الإغفال.

نعم ، قمت بتطوير مولد الكود الخاص بي لقطر بروتوكول AAA (RFC 3588).يمكنه إنشاء هياكل وواجهة برمجة التطبيقات (API) لرسائل القطر التي يتم قراءتها من ملف XML الذي يصف القواعد النحوية لتطبيق القطر.

أدى ذلك إلى تقليل الوقت اللازم لتطوير واجهة كاملة القطر (مثل SH/CX/RO وما إلى ذلك).

في رأيي، لغة البرمجة الجيدة لن تحتاج إلى مولدات الأكواد لأن الاستبطان وتوليد الأكواد في وقت التشغيل سيكونان جزءًا من اللغة على سبيل المثال.في فئات التعريف بيثون والوحدة الجديدة وما إلى ذلك.

عادةً ما تولد مولدات الأكواد تعليمات برمجية أكثر صعوبة في الاستخدام على المدى الطويل.

ومع ذلك، إذا كان من الضروري تمامًا استخدام منشئ الأكواد (Eclipse VE للتطوير المتأرجح هو ما أستخدمه في بعض الأحيان) فتأكد من معرفة الكود الذي يتم إنشاؤه.صدقني، لن ترغب في وجود كود في تطبيقك لا تعرفه.

كتابة المولد الخاص للمشروع ليست فعالة.بدلاً من ذلك، استخدم مولدًا مثل T4 وCodeSmith وZontroy.

T4 أكثر تعقيدًا وتحتاج إلى معرفة لغة برمجة .Net.يجب عليك كتابة القالب الخاص بك سطرًا تلو الآخر وعليك إكمال العمليات الارتباطية للبيانات بنفسك.يمكنك استخدامه عبر Visual Studio.

CodeSmith هي أداة وظيفية وهناك الكثير من القوالب الجاهزة للاستخدام.إنه يعتمد على T4 وتستغرق كتابة القالب الخاص بك الكثير من الوقت كما هو الحال في T4.هناك نسخة تجريبية ونسخة تجارية.

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

قد يكون هناك الكثير من مولدات الأكواد البرمجية، ومع ذلك أقوم دائمًا بإنشاء مولداتي الخاصة لجعل الأكواد البرمجية أكثر قابلية للفهم وتناسب الأطر والإرشادات التي نستخدمها

نحن نستخدم منشئًا لجميع التعليمات البرمجية الجديدة للمساعدة في ضمان اتباع معايير الترميز.

لقد استبدلنا مؤخرًا مولد C++ الداخلي الخاص بنا بـ كود سميث.لا يزال يتعين علينا إنشاء قوالب للأداة، ولكن يبدو من المثالي ألا نضطر إلى صيانة الأداة بأنفسنا.

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

لا نقلل من قوة وحدات الماكرو :)


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

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

كم كنت تبحث عنه؟لقد قمت بإنشاء اثنين رئيسيين والعديد من العناصر الثانوية.الأول من البرامج الرئيسية سمح لي بإنشاء برامج مكونة من 1500 خط (زيادة أو أخذ) التي لها تشابه عائلي قوي ولكنها متوافقة مع الجداول المختلفة في قاعدة البيانات - وللقيام بذلك بسرعة وبشكل موثوق.

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

ومع ذلك، بالنسبة للغات أو الأنظمة التي تتطلب الكثير من الترميز شبه المتكرر الذي يجب القيام به، فإن مولد الأكواد الجيد (الكافي) يعد بمثابة نعمة (ونعمة أكثر من "doggle").

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

بشكل عام، إذا كان لديك عدد كبير من الهياكل، أو مجرد بنيات متغيرة بسرعة تحتاج إلى استخدامها، ولكن لا يمكنك التعامل مع أداء بناء الكائنات من خلال البيانات الوصفية، فعليك كتابة منشئ التعليمات البرمجية.

لا أستطيع التفكير في أي مشاريع نحتاج فيها إلى إنشاء مولدات أكواد خاصة بنا من البداية، ولكن هناك العديد منها استخدمنا فيها مولدات موجودة مسبقًا.(لقد استخدمت كلاً من Antlr وEclipse Modeling Framework لبناء محللين ونماذج بلغة جافا لبرامج المؤسسات.) إن جمال استخدام منشئ الأكواد الذي كتبه شخص آخر هو أن المؤلفين يميلون إلى أن يكونوا خبراء في هذا المجال وقد قاموا بحل المشكلات. التي لم أكن أعلم بوجودها بعد.وهذا يوفر لي الوقت والإحباط.

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

إذا كنت لن تكتب الكود، فهل ستشعر بالارتياح تجاه الكود الذي أنشأه شخص آخر؟

هل من الأرخص في كل من الوقت و$$ على المدى الطويل كتابة الكود الخاص بك أو منشئ الأكواد؟

لقد كتبت منشئ الأكواد الذي من شأنه أن يبني مئات الفئات (Java) التي من شأنها إخراج بيانات XML من قاعدة البيانات بطريقة متوافقة مع DTD أو المخطط.كان إنشاء الكود بشكل عام أمرًا لمرة واحدة، ثم يتم تحسين الكود بعد ذلك بقواعد عمل مختلفة وما إلى ذلك.وكان الناتج لبنك متحذلق إلى حد ما.

تعتبر مولدات الأكواد بمثابة حل بديل لقيود لغة البرمجة.أنا شخصياً أفضل الانعكاس بدلاً من مولدات الأكواد ولكني أوافق على أن مولدات الأكواد أكثر مرونة ومن الواضح أن الكود الناتج أسرع أثناء وقت التشغيل.آمل أن تتضمن الإصدارات المستقبلية من C# نوعًا ما من بيئة DSL.

مولدات الأكواد الوحيدة التي أستخدمها هي موزعي خدمة الويب.أنا شخصياً أبتعد عن مولدات الأكواد بسبب مشاكل الصيانة للموظفين الجدد أو لفريق منفصل بعد التسليم.

أنا أكتب مولدات التعليمات البرمجية الخاصة بي، خاصة في T-SQL، والتي يتم استدعاؤها أثناء عملية الإنشاء.

استنادًا إلى بيانات النموذج التعريفي، يقومون بإنشاء المشغلات والتسجيل وإعلانات C# const وبيانات INSERT/UPDATE ومعلومات نموذج البيانات للتحقق مما إذا كان التطبيق يعمل على مخطط قاعدة البيانات المتوقعة.

ما زلت بحاجة إلى كتابة منشئ نماذج لزيادة الإنتاجية ومزيد من المواصفات وترميز أقل ;)

لقد قمت بإنشاء عدد قليل من مولدات التعليمات البرمجية.كان لدي منشئ كود سلبي لإجراءات SQL المخزنة التي تستخدم القوالب.أدى هذا إلى إنشاء 90% من إجراءاتنا المخزنة.

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

أستخدم ميزات إنشاء التعليمات البرمجية التي توفرها EMF - إطار عمل نمذجة الكسوف.

تعد مولدات الأكواد مفيدة حقًا في كثير من الحالات، خاصة عند التعيين من تنسيق إلى آخر.لقد قمت بإنشاء مولدات الأكواد البرمجية لـ IDL إلى C++، وجداول قواعد البيانات لأنواع OO، وتنظيم التعليمات البرمجية على سبيل المثال لا الحصر.

أعتقد أن النقطة التي يحاول المؤلفون توضيحها هي أنه إذا كنت مطورًا، فيجب أن تكون قادرًا على جعل الكمبيوتر يعمل لصالحك.يعد إنشاء التعليمات البرمجية مجرد مهمة واحدة واضحة يجب تشغيلها تلقائيًا.

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

انظر لدينا منشئ الأكواد "العالمية". على أساس التحولات البرنامج.

أنا المهندس المعماري والمنفذ الرئيسي.ومن الجدير بالذكر أن جزءًا كبيرًا من هذا المولد يتم إنشاؤه باستخدام هذا المولد.

في الأنظمة المدمجة، تحتاج أحيانًا إلى كتلة كبيرة من البيانات الثنائية في الفلاش.على سبيل المثال، لدي ملف يأخذ ملفًا نصيًا يحتوي على صور رمزية للخط النقطي ويحوله إلى زوج ملفات .cc/.h يعلن عن ثوابت مثيرة للاهتمام (مثل الحرف الأول والحرف الأخير وعرض الحرف وارتفاعه) ثم البيانات الفعلية كـ كبير static const uint8_t[].

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

IMHO، هذا النوع من الأشياء هو الغرض من مولدات الأكواد. لا تنس أبدًا أن الكمبيوتر يعمل من أجلك، وليس العكس.

راجع للشغل، إذا كنت تستخدم مولدا، دائما دائما دائما قم بتضمين بعض الأسطر مثل هذه في بداية ونهاية كل ملف تم إنشاؤه:

// This code was automatically generated from Font_foo.txt. DO NOT EDIT THIS FILE.
// If there's a bug, fix the font text file or the generator program, not this file.

نحن نستخدم Telosys مولد الكود في مشاريعنا : http://www.telosys.org/

لقد قمنا بإنشائه لتقليل مدة التطوير في المهام المتكررة مثل شاشات CRUD، والوثائق، وما إلى ذلك...

الشيء الأكثر أهمية بالنسبة لنا هو أن نكون قادرين على تخصيص قوالب المولد، من أجل إنشاء أهداف جيل جديد إذا لزم الأمر وتخصيص القوالب الموجودة.ولهذا السبب قمنا أيضًا بإنشاء محرر قوالب (لملفات Velocity .vm).إنه يعمل بشكل جيد مع منشئ أكواد Java/Spring/AngularJS ويمكن تكييفه مع أهداف أخرى (PHP، C#، Python، إلخ)

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