مراجعة Haxe: ميزات وقوة Haxe 4

نشرت: 2022-03-11

انتهت مراجعة Haxe السابقة بإلقاء نظرة على Haxe 4. مع الإصدار الرسمي لـ Haxe 4 (وبعد ذلك بوقت قصير ، إصداران من تصحيح الأخطاء - الإصداران 4.0.1 و 4.0.2) ، حان الوقت لمراجعة Haxe جديدة . ما هي أحدث الإضافات إلى لغة البرمجة المزدهرة هذه؟ إلى أين يتجه مجتمع لغة البرمجة Haxe؟ هل محركات لعبة Haxe لا تزال الدعامة الأساسية لها؟

مراجعة Haxe: ميزات Haxe 4 الجديدة

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

الهدف التجريبي لتجميع JVM Bytecode في Haxe 4

يجعل هدف JVM bytecode الجديد لـ Haxe 4 تطوير Java عبر Haxe أكثر فاعلية إلى حد ما عن طريق الاستغناء عن خطوة تجميع رئيسية: لا توجد خطوة ثانية لوجود مترجم Java الخاص ( javac ) يقوم بتجميع إخراج كود مصدر Java لمحول Haxe.

مقارنة بين هدف JVM المباشر الجديد وسير العمل الأصلي عند تطوير هدف Java. يأخذ الأصل بعض مصادر .hx ، وينتج مصدر .java ، والذي بدوره يحتاج إلى أن يتم تجميعه باستخدام مترجم Java (الذي يعتمد على JDK) قبل أن يتم إنتاج ملف .jar قابل للتشغيل أخيرًا. الهدف الجديد يسمح للمطورين بالانتقال مباشرة من مصدر .hx إلى ملف .jar قابل للتشغيل.

هذه الطريقة في التجميع باستخدام Haxe 4 تزيل تمامًا الاعتماد على مجموعة مطور Java (JDK) ، وتفتح الباب لتصحيح الأخطاء التفاعلي ليتم تنفيذه في المستقبل.

إلى أن يصبح الإصدار السائد من hxjava مع Haxe 4 ، فإن الإعداد الأساسي يتضمن تثبيت Haxe و Haxelib ، ثم تشغيل haxelib install hxjava 4.0.0-alpha . بعد القيام بذلك ، يكون تدفق التطوير بسيطًا:

 # transpile directly to JVM bytecode with Haxe (-D jvm would also work): haxe --main HelloWorld --java jar_output --define jvm # run JVM bytecode with Java: java -jar jar_output/HelloWorld.jar

بالنظر إلى أن تجميع JVM المباشر لا يزال يتمتع بحالة تجريبية في Haxe 4 ، فإنه يأتي مع اثنين من المحاذير:

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

ومع ذلك ، فهي خطوة ملحوظة في الاتجاه الصحيح لأي شخص يستفيد من التقنيات القائمة على Java.

دعم العلامات المضمنة التجريبية في Haxe 4

JSX ، أي شخص؟ يمكّن Haxe 4 الترميز المضمن ، مما يسمح للمطورين بكتابة ، على سبيل المثال ، HTML مباشرةً داخل كود مصدر Haxe:

 var dom = jsx( <div> <h1>Hello!</h1> <p>This is a paragraph.</p> </div> );

نظرًا لأن jsx() هنا يمكن أن تكون دالة ماكرو ثابتة ، فإن هذا يسمح للمشروع بإجراء فحوصات وقت الترجمة لمعرفة ما إذا كانت العلامة تتوافق مع أي مواصفات XML-ish التي يهتم المطور بتنفيذها. نظرًا لأن دعم XML نفسه مدمج في Haxe API ، يمكن للفحص الاستفادة من Xml.parse() ، ولكن لإمكانية التوزيع الأساسية لـ "XML-ish" ، ولا يلزم ذلك حتى:

 static macro function jsx(expr) { return switch expr.expr { case EMeta({name: ":markup"}, {expr: EConst(CString(s))}): macro $v{"XML MARKUP: " + s}; case _: throw new haxe.macro.Expr.Error("not an xml literal", expr.pos); } }

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

السلامة التجريبية الفارغة في Haxe 4

منذ اختراع المرجع الفارغ في عام 1965 ، كانت قضية الأمان الفارغ غالبًا ما تكون لعنة المطورين في البيئات المكتوبة الصفرية مثل تلك الخاصة بلغة برمجة Haxe. يقدر Aleksandr Kuzmenko أن GitHub تلتزم بإصلاح أخطاء مرجع المؤشر الفارغ التي تزيد عن 10 ملايين.

يحتوي Haxe 4 على وحدات ماكرو أمان فارغة مدمجة في وقت التجميع ، والتي يمكن تمكينها من خلال تضمين سطر @:nullSafety قبل تعريف معين مباشرةً. يأتي في وضعي @:nullSafety(Loose) (الافتراضي) و @:nullSafety(Strict) ، ويمكن تعطيله حسب الحاجة باستخدام @:nullSafety(Off) . سيبحث الوضع Strict في استدعاءات الوظائف لطفرات الحقل التي قد تخصص قيمة خالية ، حتى في سياق تعطيل الأمان الفارغ.

قد يتساءل مطورو Ruby عما إذا كان مشغل الملاحة الآمن ( ?. في Ruby) على الرادار. ليس بعد ، ولكن كما هو الحال مع العديد من جوانب البرمجة في Haxe ، هناك ماكرو لذلك (لاحظ أنه يستخدم !. بدلاً من ذلك.)

تجربة المطور (DX) مع Haxe 4: الإضافات النحوية والسكر النحوي والمزيد

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

والنتيجة هي أن لغة برمجة Haxe وواجهة برمجة التطبيقات القياسية تتطور دون المساس باستقرارها وحساسيتها وتماسكها. لن يبدو كل شيء في مراجعة Haxe جديرًا بالضجيج ، وهذه هي النقطة بالضبط: DX يتحسن ، وهذا لصالح مجرد مطاردة "ميزات du jour " المبهرجة.

هناك توازن يجب تحقيقه ، على الرغم من ذلك: يتم إجراء تغييرات Haxe مع إدراك الأنماط التي تتبعها اللغات الأخرى ، ومن المؤكد أن Haxe 4 يبذل جهدًا لجذب القادمين الجدد من اللغات الأكثر شيوعًا.

صيغة جديدة لـ "نوع الوظيفة"

في هذه الملاحظة ، يدعم Haxe الآن طريقتين رئيسيتين لتمثيل أنواع الوظائف. يقترح بناء الجملة القديم "أن التطبيق التلقائي والجزئي مدعومان ، لكنهما ليسا كذلك" ، وفقًا لاقتراح الميزة الأصلي:

 Int -> String -> Void

تسمح الصيغة الجديدة للوسيطات المسماة ، والتي تعمل على تحسين DX:

 (id:Int, name:String) -> Void

لكن بصرف النظر عن DX ، فإن استخدام بناء الجملة الجديد Haxe 4 لأنواع الوظائف هو عادة جيدة للدخول فيها ، حيث يمكن إزالة البنية القديمة الأدنى في إصدار رئيسي مستقبلي.

السكر النحوي ... نوع من

ربما لا يكون هذا أمرًا رائدًا ، ولكن التحسينات النحوية لـ Haxe 4 ستكون أخبارًا مرحب بها لكل من مطوري Haxe الحاليين الذين لديهم خلفيات تطوير معينة (ES6 ، على سبيل المثال) وأولئك الذين قد يأتون منهم إلى Haxe لأول مرة.

يتم دعم بناء جملة دالة السهم ("lambda" القصيرة) ، وهي في حالة Haxe مجرد اختصار function الكتابة return . يتم دعم صيغ التكرار الرئيسية للقيمة والفهرس (للخرائط والمصفوفات ، على التوالي) الآن أيضًا. يمكن أن تستخدم إعلانات الكتابة التي تستخدم الامتدادات الثابتة عبارة واحدة using بشكل عام بدلاً من الحاجة إليها في كل مكان تُستخدم فيه طرق الامتداد الثابتة المقابلة.

يحتوي Enums و enum abstract على بعض التحسينات الأخرى ، أحدها أن الأخير قد انتقل من مجال اختصاص وحدات الماكرو إلى دعم مترجم مباشر. تتضمن الميزات الأخرى التي تم نقلها بالمثل الفئات النهائية والواجهات النهائية والحقول الخارجية.

ظلت بعض الميزات التي تعتمد على وحدات الماكرو معتمدة على وحدات الماكرو ، ولكنها تحسنت مع ذلك. تمت تسوية الحمل الزائد على المشغل ليشمل واضعي الحقول ، ويمكن الآن وضع البيانات الوصفية ضمن نطاق أسماء . الفواصل مثل @:prefix.subprefix.name .

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

المزيد من Haxe 4 DX Boosts

بينما كان التصحيح التفاعلي ممكنًا بالفعل في Haxe للعديد من الأهداف المجمعة ، فإن هدف eval الجديد يجعل التصحيح التفاعلي ممكنًا للتعليمات البرمجية المفسرة. للحصول على مثال بسيط ، يمكنك أن تأخذ أي دليل مشروع تعليمي لـ Haxe “Hello، World” ، أضف ملفًا يسمى whatever-you-want.hxml يبدو كالتالي:

 --main HelloWorld --interp

... والحصول على تصحيح تفاعلي في VSCode IDE ببساطة عن طريق:

  1. فتح دليل المشروع في VSCode ؛
  2. إضافة نقطة توقف في مكان ما ؛ و
  3. الضغط على F5 واختيار "مترجم Haxe" من القائمة المنسدلة.

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

خدمات IDE

عند الحديث عن IDEs ، يقدم Haxe 4 بروتوكول خدمات IDE جديد ، والذي تم الاستفادة منه بالفعل في أحدث امتداد VSCode Haxe ، vshaxe. إلى جانب التعزيز الكبير في الأداء ، يتيح ذلك لـ vshaxe تقديم بعض تحسينات DX المفيدة للغاية ، بما في ذلك:

  • (طال انتظاره) الواردات التلقائية
  • تعرض تلميحات التمرير للإكمال التلقائي مزيدًا من التفاصيل ، مثل الإجابة على السؤال "من أين هذا الحقل؟"
  • الإكمال التلقائي الشامل للغاية بعدة طرق جديدة رائعة ، مثل الإكمال المتوقع للنوع وإكمال ما بعد الإصلاح وإكمال التجاوز
  • تحسينات "Down to-the-keystroke" أثناء كتابة التعليمات البرمجية

من الأسهل بكثير رؤية قيمة هذه عبر العروض التوضيحية المرئية الممتازة من سجل التغيير vshaxe ذي الصلة. vshaxe مع VSCode ليس هو Haxe IDE الوحيد الموجود - HaxeDevelop و Kode Studio خاصان بـ Haxe ، وهناك مكونات إضافية Haxe IDE لـ IntelliJ IDEA ، Sublime Text ، Atom ، وما إلى ذلك - ولكن يبدو أنه يتقدم على الحزمة من حيث من الاستفادة من بروتوكول خدمات IDE الجديد الخاص بـ Haxe 4 ، تليها IntelliJ-Haxe عن كثب.

يونيكود حرفي

سيجد المطورون الذين يرغبون في استخدام حرفية لسلسلة Unicode الحقيقية دعمًا لذلك في Haxe 4 ، ولكن هناك بعض الفروق الدقيقة التي يجب أن تكون على دراية بها.

صفائف للقراءة فقط

تحتوي واجهة Haxe API القياسية الآن على مصفوفات للقراءة فقط. هذه سهلة الاستخدام مثل إعلان أن المتغير من النوع ، على سبيل المثال ، haxe.ds.ReadOnlyArray<Int> ، وبعد ذلك تؤدي محاولة تعيين أو دفع أو فرقعة القيم إلى حدوث أخطاء مختلفة في المترجم. أضف الكلمة الأساسية final إلى الإعلان ، ولن يُسمح أيضًا بإعادة تعيين المصفوفة نفسها.

موقع الاتصال الداخلي

يعد تضمين موقع الاستدعاء ميزة جديدة للغة Haxe تتيح للمطورين التحكم الدقيق في الأماكن المضمنة للوظائف ، وهو مفيد عند تحسين الوظائف التي يُطلق عليها كثيرًا حيث قد تكون مقايضة الحجم الكلي للأداء قرارًا خاسرًا.


هذه إضافات جديرة بالاهتمام إلى لغة برمجة Haxe الممتازة بالفعل. ما هم المطورون في مبنى مجتمع Haxe الآن بعد خروج Haxe 4؟

ما وراء محركات ألعاب Haxe: تطوير الويب باستخدام Haxe 4

تاريخياً ، سيطر مبرمجو الألعاب على قاعدة مستخدمي Haxe. ولكن هناك الكثير من الأمثلة على استخدام Haxe - على نطاق واسع - في قطاعات أخرى ، مثل مجموعات الأعمال ، وتطبيقات الأجهزة المحمولة ، والويب ، لتطوير الواجهة الأمامية والخلفية على حدٍ سواء.

تحقيقًا لهذه الغاية ، يوفر Haxe 4 برامج خارجية لـ HTML مُعاد إنشاؤها ، مما يعني أن واجهة برمجة تطبيقات js.html القياسية js.html قد تم تحديثها مع واجهة برمجة تطبيقات الويب الأوسع كما تحددها MDN ، بالإضافة إلى إصلاح الأخطاء وإضافة واجهات برمجة التطبيقات المفقودة. (على سبيل المثال ، يتضمن Haxe 4 الآن واجهة برمجة تطبيقات Push.)

في حديث Juraj Kirchheim ، Weaving a Better Web with Haxe ، يشير إلى أمثلة على حلول الويب المستندة إلى Haxe كونها أكثر كفاءة - لكنها أيضًا أكثر قوة - في بيئة المؤسسة.

كما أنه يجادل ضد نهج Rails المعماري (من حيث التسلسل الهرمي للمجلدات) ، ولكن لا يزال بإمكان المطورين الذين يفضلون إطار عمل ويب كاملًا مثل la Rails العثور عليه. في أوقات أخرى ، قد يكون من المفيد للمطورين مراجعة مصدر مشروع ويب كامل ، وفي هذه الحالة يجدر إلقاء نظرة على الريبو العام لـ Giffon ، وهي منصة إهداء جماعي تدعم Haxe 4. وبالمثل ، تتمحور حول الويب ، ومفتوحة- مكتبات Haxe المصدر مثل Haxe Modular لتقسيم JavaScript ، و thx.core العام والمكتبات الشقيقة ، ومجموعة أدوات الويب Haxe الموقرة ، كلها تدعم Haxe 4. وكذلك حل HaxeUI عبر الأنظمة الأساسية ، والذي يدعم سياق الويب ولكن يستهدف نطاقًا أوسع بكثير بما في ذلك تطوير تطبيقات الأعمال وسطح المكتب ؛ لقد استمرت بشكل مطرد في النضج على وجه الخصوص حتى إصدار لغة Haxe الجديدة.

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

Haxe كأفضل لغة برمجة للألعاب

هل توجد لغة واحدة "أفضل" لتطوير اللعبة؟ إنه سؤال شخصي ، ويسهل العثور على نقاشات محتدمة حوله. أكبر مما قد يتوقعه المرء من حجم مجتمعها وحده ، فإن نجاح Haxe في مجال تطوير اللعبة ليس مصادفة بالتأكيد. يقدم جو ويليامسون نظرة ثاقبة عن سبب حدوث ذلك في مقابلة حول الفوز بلعبة Ludum Dare 45 في عام 2019 ، ويبدو أن هذا سيستمر مع Haxe 4.

يستخدم مبتكر Haxe الأصلي ، Nicolas Cannasse ، بالفعل Haxe 4 في الإنتاج مع Northgard التابعة لشركة Shiro Games. يستخدم Motion Twin أيضًا Haxe 4 في إنتاج الخلايا الميتة. تتمتع كلتا اللعبتين بعشرات الآلاف من التقييمات الإيجابية على Steam ، وهما متاحتان لكل من أجهزة الكمبيوتر (Win و Mac و Linux) ووحدات التحكم - وهي نتيجة رائعة حقًا بالنظر إلى أن كلا اللعبتين بهما فرق تطوير أصغر ولكن قواعد المستخدمين بالملايين. لدى Dead Cells أيضًا إصدار iOS ، مع إصدار Android على الرادار أيضًا.

من ناحية المكتبة ، فإن العديد من محركات ألعاب Haxe الرئيسية تتماشى بالتأكيد مع تغييرات Haxe 4. تشتمل المحركات المتوافقة مع Haxe 4 على Kha (وجزء من العديد من المحركات المبنية فوقه - على سبيل المثال ، Armory) ، و HaxeFlixel والاعتماد الرئيسي لها OpenFL و NME و Heaps - بشكل طبيعي ، نظرًا لأن هذا هو ما تستخدمه Northgard و Dead Cells. تعمل HaxePunk أيضًا على التوافق مع Haxe 4 ؛ في إحدى الحالات ، تم تشعب مكتبة ، Nape ، للعمل مع Haxe 4.

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

Haxe 4: استمرار التقدم السلس لسلسلة أدوات ممتازة

مع وجود هذه الأداة الواسعة ، ستختلف أهم ميزات Haxe 4 حسب المطور ، لذا فإن مراجعة Haxe هذه ليست شاملة بأي حال من الأحوال. بعض تغييرات Haxe 4 مفقودة أعلاه ، بما في ذلك:

  • إضافة إخراج ES6 لهدف JavaScript
  • إزالة الميزات (بعضها لا يزال متاحًا عبر مكتبة hx3compat ) والأهداف (PHP5 وقريبًا AS3)
  • يتم جعل علامات CLI أكثر اتساقًا مع الأدوات الشائعة (ستحتاج ملفات -lib -using .hxml إلى التغيير إلى -L أو --library ، على سبيل المثال).
  • إلى جانب كون الكلمة final الآن كلمة رئيسية (وبالتالي لا يمكن استخدامها كاسم متغير) ، فإن operator overload هما أيضًا كلمات رئيسية محجوزة حديثًا.

كانت هناك أيضًا بعض التغييرات العاجلة ، لكنها قليلة جدًا لدرجة أن العديد من المكتبات التي يتم الحفاظ عليها بنشاط لا تكلف نفسها عناء الإعلان صراحة عن توافق Haxe 4 - بشكل عام ، يُقال أن الترحيل من Haxe 3 بسيط إلى حد ما. بعد كل شيء ، أحد أهداف Haxe هو الاستقرار في خضم دعم شعوذة لعدد كبير من المنصات المستهدفة ، ولا يخيب Haxe 4 الآمال هنا.

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

مزيد من القراءة: قد يكون المطورون الجدد على Haxe مهتمين ببرنامج تعليمي Haxe جديد إلى حد ما بواسطة John Gabriele ، وكذلك ملاحظات إصدار Haxe 4.1.0 و Haxe 4.1.1.