تواصل هذه المواد سلسلة من المنشورات على أساس التقارير التي أعددناها في مؤتمر ملتقى الألعاب 2017 في ديسمبر الماضي. في أحد
التقارير ، أثير موضوع اختيار لغة البرمجة النصية المضمنة.

ما هو ولماذا لغات البرمجة النصية مطلوبة
كما ذكرنا سابقًا في المنشور
السابق لمدونتنا ، فقد كتبت شركتنا محركها الخاص. اليوم سنتحدث عن ما تم إرشادنا عند اختيار لغة برمجة لهذا المحرك.
لماذا هناك حاجة إلى لغات البرمجة النصية على الإطلاق؟ كما يقول المثل ،
"في صناعة الألعاب لا توجد مشاكل معقدة ، ليست هناك حاجة للمطالبة بحلول معقدة" . بالإضافة إلى المبرمجين ذوي الخبرة (والمكلفة!) الذين يحلون المشاكل المعقدة ، نحن بحاجة إلى أشخاص (كثير من الناس!) الذين سيشاركون في المهام ، على سبيل المثال. ولكي نكون صادقين ، نود أن يكون هؤلاء المبرمجين غير مكلفين للغاية ، ومن الناحية المثالية ليس المبرمجين على الإطلاق ، ولكن مصممي الألعاب وكتاب السيناريو بشكل مباشر.
وبالتالي ، هناك حاجة لأداة لوصف بسيط ، ولكن لا يزال منطقًا ، دون إشراك المدفعية الثقيلة من قبل المبرمجين. نستنتج - ما هي لغة البرمجة النصية بالنسبة لنا؟ هذه أداة ستجعل تطوير اللعبة أسرع وأرخص.
يطرح السؤال على الفور ، لماذا لا نستخدم شيئًا مثل XML؟ والحقيقة هي أننا لأغراضنا غالبًا ما نحتاج إلى هياكل التحكم - التفرع والحلقات ، في حين أن XML هو وصف تعريفي.
ميزة أخرى للغات البرمجة النصية هي أن البرامج النصية في المشروع يمكن أن تكون إما رمز أو مورد. وبالتالي ، يمكن تحديث جزء البرنامج النصي للعبة ليس فقط بالكود ، أي أثناء التحديثات المنتظمة من خلال آليات متاجر التطبيقات. ولكن أيضًا مع الموارد - أي مع الرسوم البيانية والمواد الأخرى باستخدام CDN.
متطلبات لغة البرمجة النصية المثالية
نقوم بصياغة متطلبات لغة برمجة مثالية.
- ديناميكي. في فهمنا ، يجب أن تكون لغة البرمجة النصية ديناميكية.
- الشعبية. نعني بشعبية اللغة ، وجود مجتمع كبير بما فيه الكفاية مستعد للإجابة على الأسئلة حول الموارد المتخصصة مثل StackOverflow.
- منحنى التعلم اللطيف. نريد أن نأخذ ، عمليا ، أي شخص تقريبا ، وندربه بسرعة إلى مستوى يسمح لهذا الشخص بالعمل بشكل منتج في مهامنا.
- فرص وافرة. يجب أن تكون اللغة قوية وتحتوي على ميزات كافية ، ويجب أن تدعم نماذج برمجة مختلفة. المبرمج المحترف الذي يُعرض عليه الكتابة بهذه اللغة سيكون قادرًا على القيام بذلك براحة ومتعة.
- أداء عالي. الأداء هو أحد الأركان الأساسية في صناعة الألعاب.
- عدد كبير من المكتبات. في كثير من الأحيان ، أثناء حل المهام التي تواجهنا ، لا ننشئ رمزًا جديدًا بشكل أساسي ، ولكن نستخدم ما كتبه شخص آخر بالفعل. كلما كانت المكتبات أكثر ثباتًا ودعمًا جيدًا يمكننا استخدام لغة معينة ، كان ذلك أفضل.
- سهل التضمين. نحن نتحدث عن اللغات المضمنة ، لذلك عند اختيار لغة البرمجة النصية ، تلعب القدرة على تضمينها دورًا مهمًا.
دعونا نحلل بعض لغات البرمجة الشائعة التي يتم استخدامها كبرامج نصية لتلبية هذه المتطلبات.
بيثون
Python هي لغة ديناميكية تحظى بشعبية كبيرة. يتميز بمنحنى تعلم لطيف إلى حد ما ، فمن السهل جدًا التعلم. ومع ذلك ، فإن دراستها بشكل صحيح لا ينبغي أن تكون سهلة. نتيجة لذلك ، مبرمجو بايثون الجيدون نادرون ومكلفون. هذا يتناقض مع رغبتنا في تسريع وتقليل تكلفة تطوير منطق اللعبة.
Python لديها ميزات رائعة وأداء جيد. مشكلتها هي نظام مكتبة غير متناسق. ومن مشاكله الأخرى ، التي تلعب دورًا مهمًا بالنسبة لنا ، أنه في الواقع ليس لغة مضمنة. هذه لغة ملائمة لاستدعاء المكتبات المكتوبة بلغة C أو C ++.
فيما يتعلق بقدرات تضمين Python ، يمكننا القول ، على سبيل المثال ، أن هناك مايا ، حيث يتم استخدام Python. لكن أي شخص رأى مكونات Python الإضافية لمايا من الداخل سيوافقنا على أنها لا تبدو جيدة جدًا.
نتيجة لذلك ، يمكننا القول أن Python ، على الرغم من كل نقاط قوتها ، لا تناسبنا. الآن فكر في JavaScript.
جافا سكريبت
JavaScript هي ، بدون مبالغة ، لغة رائعة استحوذت على العالم حرفيا.
JavaScript هي لغة ديناميكية شائعة ، تتميز بمنحنى تعلم لطيف ، مع ميزات غنية وأداء جيد ومجموعة واسعة من المكتبات.
إذا كنا بحاجة إلى مترجم لغة لبناء محرك ألعاب ، فيمكننا العثور على العديد من المترجمين. في الواقع ، عليك الاختيار من بين مشروعين من هذا القبيل - V8 و WebKit. كل من ذلك وآخر له أحجام كبيرة إلى حد ما. ونتيجة لذلك ، إذا كنا نتحدث عن ألعاب الطاولة ، فيمكننا أن نغتنم الفرصة ونشمل المترجم بأكمله في اللعبة ، ولكن في حالة ألعاب الهاتف المحمول لا يناسبنا هذا الخيار.
SocialQuantum لديه مترجم جافا سكريبت خاص به ، والذي يجتاز 98٪ من الاختبارات ، ونحن نخطط لنقل هذا المشروع إلى فئة المصدر المفتوح.
ونتيجة لذلك ، اتضح أن جافا سكريبت تبدو كمرشح قوي لدور اللغة المضمنة ، لكنها لا تناسبنا أيضًا.
هاكس
وتجدر الإشارة إلى أنه عندما يتعلق الأمر بالحديث عن جافا سكريبت ، فإن الكلمات التالية عادة ما تتذكر Haxe. ولكن ، في الواقع ، ليس هناك جدوى من الحديث عن إمكانية استخدام هذه اللغة كلغة مدمجة ، لأن Haxe ، في الواقع ، ليست لغة بقدر ما هي مترجم إلى لغات أخرى. وهذا ليس ما نحتاجه.
ربما نحن راضون عن ActionScript أو بعض لغة البرمجة النصية الأخرى؟
أكشن
إذا قمنا بتحليل ActionScript رسميًا للامتثال للمتطلبات المذكورة أعلاه ، فقد يبدو أنه تم العثور على لغة البرمجة النصية المثالية. إلى جانبها الطبيعة الديناميكية والشعبية وسهولة الدراسة والميزات الجيدة والأداء وتوافر المكتبات وسهولة التضمين. هذه اللغة محبوبة وتذكرها في صناعة الألعاب ، وهي مكتوبة بعدد كبير من ألعاب الفلاش الرائعة. المشكلة الرئيسية في ActionScript هي أن هذه اللغة ميتة تقريبًا. لذلك ، لا يناسبنا أيضًا.
AngelScript ، السنجاب وغيرها
بالإضافة إلى ActionScript ، هناك العديد من لغات البرمجة مثل AngelScript و Squirrel وغيرها. من بينها ، يمكنك العثور على تلك التي ، بشكل رسمي تقريبًا ، تفي تمامًا بمتطلباتنا ، ولكن عادة ما تكون هذه اللغات مرتبطة بمطورها ، لديهم بعض المشاكل القديمة التي لم يتم إصلاحها لسنوات. على الأرجح ، لا تحظى بشعبية كبيرة ، ولا يتم توثيقها جيدًا ، وهناك القليل من المواد التدريبية عليها ، وليس لديهم مجتمعات كبيرة جدًا. إحدى نتائج هذه الحالة هي صعوبة الدراسة - إذا لم يكن واضحًا تمامًا - ما هي وكيف تعمل.
كما ترون ، لم نجد بعد اللغة المضمنة المثالية. ماذا لو قمت بإنشاء لغتك الخاصة؟
ابتكر لغتك الخاصة
من الممكن أن اللغة التي يتم تطويرها داخل الشركة ستناسب احتياجاتها بشكل مثالي وستكون سهلة التعلم. ولكن ، على الأرجح ، لن تصبح هذه اللغة شائعة. ستحتوي مثل هذه اللغة على عدد قليل من المكتبات ، أو لن تكون موجودة على الإطلاق. بالإضافة إلى ذلك ، من الصعب الاعتقاد أنه في الظروف الحديثة ، من الممكن إنشاء شيء يعمل بشكل أفضل ، والذي سيكون له إنتاجية أكبر وسيكون من الأسهل الاندماج من شيء موجود بالفعل في السوق.
هناك شركات تطور وتستخدم لغاتها الخاصة ، ومن بينها هناك لاعبون ناجحون في سوق الألعاب ، ولكن على الأرجح هذه ليست فكرة جيدة.
بعد فحص لغات البرمجة الحالية التي تدعي أنها مضمنة ومناقشة فكرة تطوير لغتنا الخاصة ، دعنا ننتقل إلى Lua.
لوا هي اللغة المدمجة التي اخترناها
لوا هي لغة ديناميكية. إنها تحظى بشعبية كبيرة ، وقد تطور حولها مجتمع كبير ، خاصة في مجال تطوير اللعبة. لديها منحنى تعلم لطيف للغاية. على سبيل المثال ، في شركتنا ، يتم كتابة البرامج النصية للاختبارات الذاتية باللغة Lua. تستغرق الدورة التمهيدية القياسية للاختبارات الذاتية حوالي ساعتين ، وبعدها يمكن للشخص استخدام هذه اللغة. في الوقت نفسه ، لغة لوا هي لغة متعددة النماذج. يدعم أسلوب وظيفي للبرمجة و OOP. ونتيجة لذلك ، فهي مناسبة ليس فقط لحل بعض المهام البسيطة ، ولكن أيضًا للمسائل الأكثر خطورة التي يقوم بها المبرمجون المحترفون.
تتمتع Lua بأداء جيد ولديها عدد قليل من المكتبات. ليس بقدر جافا سكريبت ، ولكن مع ذلك ، على موقع
LuaForge يمكنك العثور على أي شيء قد تحتاجه. وأخيرًا ، من السهل جدًا دمج لغة لوا ، علاوة على ذلك ، تم إنشاؤها لاستخدامها كلغة مضمنة.
على سبيل المثال ، إليك ما تبدو عليه مساحة عمل
JetBrains IDE
CLion . هنا يمكنك رؤية آلية الإكمال التلقائي التي أنشأناها لـ Lua ، والتي نخطط لجعلها مفتوحة المصدر. سنقوم بعمل مصحح مفتوح المصدر.
بيئة العمللقد اخترنا Lua ، ولكن عندما يتعلق الأمر باستخدامها كلغة برمجة نصية قابلة للتضمين ، فعادة ما تصادف نفس الاعتراضات التي سننظر فيها الآن.
اعتراضات على استخدام لوا
Lua هو لـ C وليس C ++
لا أحد يجادل في أن لوا هي لغة رائعة قابلة للتضمين. الشيء الرئيسي الذي يعتبرونه ناقصًا هو أنه تم إنشاؤه للاستخدام مع لغة C ، وليس C ++. وبسبب هذا ، عند محاولة تطبيق شيء ما في لغة Lua في لغة C ++ وليس في لغة C ، فإننا نواجه مشكلات. ومع ذلك ، يجب على المرء أن يفهم هنا أن هذه المشاكل تم حلها من قبل الكثير من الأشخاص الأذكياء. من بين الأدوات التي تحل مشاكل تضمين Lua في C ++ هي المشاريع ، مثل Luabind ، Luabridge ، toLua ++ ، SQLuaHost. هذه ليست قائمة كاملة. لديهم مزايا وعيوب مختلفة ، ولكن ، على الرغم من ذلك ، على الأرجح ، كل شيء قد تحتاجه قد تم تنفيذه بالفعل في أحد هذه الحلول.
خذ بعين الاعتبار ، على سبيل المثال ، SQLuaHost. هذا ملزم يتم داخل SocialQuantum ، ومن المقرر أن يكون مفتوح المصدر. يمثل هذا القرار رؤيتنا لكيفية ارتباط لوا. لذلك ، من الممكن جدًا أنه إذا لم تجد ما تحتاجه في المجلدات الموجودة ، فستجده في SQLuaHost.
لوا بطيء
غالبًا ما نتوصل إلى الرأي القائل بأن لغة لوا بطيئة جدًا. أولاً ، الأمر ليس كذلك. Lua هي آلة مكدسة ، ولا يوجد شيء يتباطأ هناك. بالإضافة إلى ذلك ، يجب أن نفهم أنه في لغة البرمجة النصية عادةً ما نتخلى عن منطق اللعبة ومنطق الأعمال ، وليس بعض الأشياء الثقيلة حقًا. ونتيجة لذلك ، إذا تسببت النصوص البرمجية لوا في إبطاء اللعبة ، فقد تكمن المشكلة في الربط دون المستوى الأمثل أو الاستخدام غير المناسب لبعض ميزات اللغة. على سبيل المثال ، أجرينا اختبارات اصطناعية حيث يكون LuaJIT أسرع من Mono. في الوقت نفسه ، لا يزعج أحد الكتابة عن مثل هذا الرمز غير الأمثل:
function myGame:onUpdate() local tex = Texture::new(name) self.background:setTexture(tex) end
هنا ، في كل علامة لعبة ، يتم إنشاء نسيج جديد وتعيينه كخلفية. بالطبع ، لن يعمل هذا التصميم بسرعة خاصة ، ولكن لا أحد يزعج كتابة مثل هذه الأشياء.
لوا مناسبة فقط للمشاريع الصغيرة.
الاعتراض التالي هو أن لوا جعلته يكتب بعض الأشياء الصغيرة ولا يمكن كتابة شيء كبير بهذه اللغة. من ناحية ، هذا صحيح. لكن هذه اللغة معيارية للغاية. ومن العديد من الكتل الصغيرة ، يمكنك إنشاء أنظمة كبيرة ومعقدة. وإذا كنت تتذكر ما قيل بالفعل عن تعدد الأطوار و OOP ، فقد اتضح أن OOP يشجع المطور على إنشاء وحدات صغيرة يمكن استخدامها لإنشاء هياكل كبيرة ومعقدة.
علاوة على ذلك ، غالبًا ما يتم كتابة بعض الوحدات الصغيرة على Lua بسرعة ، وفي صناعة الألعاب تعني "أسرع" "أرخص".
الحجج الأخرى ضد لوا
نقدي لوا ، يقولون أن اللغة قديمة ، كما يقولون ، "خارج الصندوق" لا تدعم OOP ، وأن ترقيم العناصر في جداولها لا يبدأ بـ 0 ، كما يتوقع المرء من أي لغة لائقة ، ولكن مع 1.
يقولون أن ناقصها هو أنه ليس لديه عامل ثلاثي. في الواقع ، هناك عدد غير قليل من الحجج ضد لوا ، لكننا لن نناقشها ، لأننا نعتقد أنها تتعلق في معظمها بعادات المطورين وتفضيلاتهم الشخصية.
الملخص
لتلخيص. إذا كانت مهمتك هي الحصول على لغة مضمنة بأقل جهد ، خذ Lua. في الوقت نفسه ، إذا كان لديك الوقت والموارد لتطوير لغتك أو روابطك الخاصة - مرة أخرى - انتبه إلى Lua. لماذا نوصي بـ Lua في الحالتين الأولى والثانية؟
في الحالة الأولى ، باختيار Lua ، ستختار لغة يسهل دمجها واستخدامها. هناك
درس تعليمي واحد عن هذه اللغة كتبه مؤلفها. لا توجد كتب أخرى ببساطة لأن الكتاب الأول يخبر بكل شيء كل ما تحتاج إلى معرفته عن لوا ، وليس هناك المزيد لتخبره عنه. لغة Lua ليست لغة مثالية أو الأكثر انتشارًا في العالم ، ولكن ، وفقًا لمعايير المعايير ، فهي بالتأكيد واحدة من أفضل اللغات للتضمين. إنه أفضل ما لدينا الآن. بالإضافة إلى ذلك ، هناك العديد من الأدوات القياسية لـ Lua التي تبسط بشكل كبير حياة أولئك الذين يستخدمونها.
في الحالة الثانية ، إذا كان لديك الموارد اللازمة لتطوير الأدوات ، فإن اختيار Lua يمكن أن ينفق هذه الموارد حقًا ، نظرًا لأن Lua ، على الرغم من شعبيتها في بيئة تطوير اللعبة ، يتم التقليل من اللغة للغاية. ونتيجة لذلك ، ستتاح لك الفرصة ، مع أخذ Lua كأساس ، لمراعاة احتياجاتك والحصول على ما تحتاج إليه بالضبط.