لا تقم بإنشاء JL (DSL) الخاص بك لتوسيع وظائف التطبيق

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


CPAP


PL ليست الوظيفة الرئيسية للتطبيق


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


ماذا يمكن أن نفوز؟


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

لكن لنكن نظيفين.


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

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


KSP - Kontakt Script Processor ، أو خط إنتاج الترباس في عالم الصوت الرقمي


كونتاكت


سأقول لك قصة عن مثل هذه اللغة:


كونتاكت هو رومبير (عينة) من الشركة النمساوية Native Instruments . من الصعب حاليًا العثور على مشروع باستخدام أدوات افتراضية لا يُستخدم فيه. على مدار السنوات العشر الماضية ، احتلت Kontakt معظم سوق أدوات العينات. السر بسيط: في وقت واحد ، اقترح كونتاكت ابتكارين قلبا الطريق نحو تطوير أدوات افتراضية عينات.


كان الابتكار الأول مرتبطًا بشكل مباشر بوظيفته الرئيسية: تعامل مع الذاكرة بعناية فائقة (والعينات الموجودة في wav هي نفسها الآكل ، كلا HDD و RAM). صنع NI تنسيق ضغط ضياع مع فك تشفير سريع وكتب نظام التخزين المؤقت الصوت الثوري لوقته.


الابتكار الثاني كان KSP


قبل الاتصال ، كانت هناك طريقتان لتنظيم العينات المسجلة وظيفيًا في أداة MIDI التي يتم التحكم فيها:


  • اكتب محركك الخاص من الصفر في لغة C ++ ، أو بلغة أخرى يمكنها استخدام Steinberg's VST SDK (وهناك تنسيقات أخرى للمكونات ، على سبيل المثال ، AAX)
  • استخدم أداة العينات الجاهزة للموسيقيين الذين ليسوا على دراية بالبرمجة ، ولكن لديهم أصوات تحتاج إلى تنظيم في نظام ما. دعنا نقول جيجا ستوديو . ولكن هذه رومبيرس ، كقاعدة عامة ، إما أن تكون مغلقة ، أو لإنهاء عملها ، فإنها تتطلب ما لا يقل عن الموظفين من تطوير العارية تحت SDK VST.

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


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


ليس كل شيء وردية جدا


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


علاوة على ذلك ، حتى مع ظهور نيلز ليبرغ KScriptEditor ، متشعب بـ Scintilla ، والذي كان منذ فترة طويلة بمثابة IDE الرئيسي لـ KSP. من السخف أن نقول ، لكن عندما أدرك المواطنون الأصليون أن جهة الاتصال لا تستطيع التعامل مع حجم مصدر التغذية ، فإنها أدخلت وظائف في اللغة ، دون أن تكلف نفسها عناء تمرير الحجج فيها. وبعد شهر ، ظهر فريق مهام في taskfunc ، ويمرر الوسائط إلى وظائف لا تأخذ أي وسيطات.


بعد فترة من الوقت ، أدرك نيلز أنه كان يخطو على أشعة السكان الأصليين: لم يكن هناك أي معنى لتطوير IDE الخاصة. استدار المترجم وتطبيق وظائف IDE إلى SublimeText2 ، ولوح. في هذه اللحظة ، يتحمل المطور مقاليد SublimeKSP ، على ما يبدو ، من Fluffy Audio .


المرة الثالثة على نفس أشعل النار


حسنا ، أنت تفهم)


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


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


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


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


القول بأن KSP أصبح ألمًا للمطورين لا يعني شيئًا.


ليس جهة اتصال واحدة.


لا يمكنني إعطاء أمثلة من مناطق أخرى ، ولكن هنا من نطاق DigitalAudio:


  • Lemur هو تطبيق مجرفة مع محرر سطح مكتب يتيح لك إنشاء واجهات جميلة بسرعة للاتصال معاول باستخدام بروتوكول OSC . لديها PL الخاصة بها ، والتي يمكن استخدامها في كائنات البرنامج النصي الخاصة المنتشرة في جميع أنحاء شجرة المشروع. لا توجد طريقة لإنشاء مترجم له مثل ما تم القيام به لـ KSP.
  • Reaper - شعبة النهوض بالمرأة مع نظام بيئي متطور لتطوير التمديد. ونتيجة لذلك ، كلما أمكن ذلك ، قمت بنسخ رمز لغة JSFX الخاص بي (ReaScript) كواجهة برمجة تطبيقات لـ C ++ و lua و Python.
  • HISE هي كاتبة ومنشئ VST \ VSTi شاب ستقتل Kontakt من المطور السويدي Christoph Haart عاجلاً أم آجلاً. داخل المحرر نفسه ، يسمح لك بالكتابة في JavaScript معدلة ، والتي يتم تحليلها وتجميعها في ثنائي بواسطة كائنات C ++. عملت الفكرة باستخدام المحلل اللغوي الخاص بك لإدخال كيانات إضافية (على سبيل المثال ، تسجيل المتغيرات ، إذا قمت بترجمتها بشكل صحيح) حتى قام المستخدمون بنقل الكود الخاص بهم من محرر HISE إلى IDEs المفضلة لديهم مع تسليط الضوء على بناء الجملة ، والتحليل الثابت وأدوات تنسيق JsPrettier . قام Christophe الآن برسم اثنين من ملفات الرأس لتجميع المكتبات الثابتة في C ++ ، والتي يمكن بعد ذلك استخدامها كوحدات نمطية في المحرر. في موازاة ذلك ، يواصل تكملة HISEScript (لأنه لم يعد من الممكن استدعاء JavaScript) بوظائف جديدة ، لكننا نعرف أن ...

الخاتمة


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


في الوقت نفسه ، بالنسبة لمطوري المكونات الإضافية للمبتدئين لبرنامجك ، يمكنك ببساطة إنشاء QuickStartGuide ، وتعريفهم بالمفاهيم الأساسية لـ PL التي اخترتها لتوسيع الوظيفة وتزويد API الخاصة بك ببطء ، وهو جزء من النظام البيئي لهذه اللغة.


ملحوظة: لا ، كتابة المحلل اللغوي الخاص بك في PL الجاهزة هي فكرة سيئة أيضًا.


سأكون سعيدًا بأي نقد لهذه المقالة ، والفطيرة الأولى وكل الأشياء.

Source: https://habr.com/ru/post/ar436682/


All Articles