بسهولة نقل رمز لوا إلى C#
-
25-09-2019 - |
سؤال
هل هناك أي طريقة سهلة لبرنامج Port Lua Code إلى C#؟
من المحتمل أن تكون المشكلة الأكبر هي المنافذ بدقة في بعض القواميس.
ومنع أي سوء فهم: لا ، لا يمكنني استخدام LUA المضمنة في برنامجي.
المحلول
الرمز المصمم بلغة ديناميكية للغاية مثل لوا ستحتاج إلى إعادة تنسيق جوهرية بحيث تكون منطقية بلغة ثابتة مثل C#- يخدم الاثنان أغراضًا مختلفة بشكل أساسي. يجب عليك إعادة كتابة هذا الرمز مرة أخرى من نقطة الصفر ، بشكل واقعي ، ما لم تستخدم فقط الميزات الأساسية لأي لغة ، مثل OPS العددية/السلسلة الأساسية.
نصائح أخرى
لا توجد طريقة سهلة للقيام بذلك.
ماذا تريد ان تحقق؟ قم بتحويل ملفات LUA إلى رمز C# ، حيث تريد العمل معها على نطاق واسع ، أو تريد فقط بعض التعليمات البرمجية التي تقوم بأشياء مماثلة من الكود الأصلي.
بالنسبة للنوع الأول من التحويل ، فإن الإجابة هي أنه من الصعب للغاية ، ولكن ليس مستحيلًا. يجب عليك تحليل الكود وإعادة إنشاء الوظيفة (الديناميكية) نفسها في C#. يمكن أن تساعد الأطر ، مثل linfu.reflection هنا ، لأنها ستضيف بعض الوظائف الديناميكية إلى CLR.
بالنسبة للنوع الثاني ، فإن فكرتي هي تحويل Lua Bytecode إلى C# بدلاً من الكود الأصلي. لا ينبغي أن يكون هذا صعبًا للغاية ، وذلك أساسًا لأن Lua ليس لديه الكثير من الرموز المفصلية (حوالي 30 إذا كنت أتذكرها بشكل صحيح). من بين هذه الرموز الإلكترونية ، يكون من الصعب تحويله من المنطق والقفز (لأنه ليس لديك GOTO في C#) ، ولكن إذا حافظت على مشغلي التدفق سليمة (وتحويلهم إلى C# - هذا أمر يمكن إنجازه إلى حد ما) ، وفقط قم بتجميع الرمز بين ، وتحويل النتيجة bytecode إلى C# يجب القيام بالمهمة. بالطبع بهذه الطريقة ، ستفقد الكثير من مسألة الكود الأصلي ، وسيكون الحفاظ عليها أكثر صعوبة.
قد تحاول أيضًا العثور على حل بين هاتين الحافة التي كتبتها هنا. يمكن نقل بعض الإنشاءات بسهولة (خاصة الحلقات ، ومشغلي الحساب البسيطة) ، ولكن العودة إلى تمثيل الرمز البسيط لمعالجة الجدول.
ترانسبيلر العالمي يمكن ترجمة مجموعة فرعية صغيرة من LUA إلى عدة لغات أخرى ، بما في ذلك C#. هذا مثال ، مكتوب لـ SWI-Prolog:
:- use_module(library(transpiler)).
:- set_prolog_flag(double_quotes,chars).
:- initialization(main).
main :-
translate("function add(a,b) return a + b end function squared(a) return a*a end function add_exclamation_point(parameter) return parameter .. \"!\" end",'lua','c#',X),
atom_chars(Y,X),
writeln(Y).
هذا هو رمز المصدر C# الذي ينشئه:
public static int add(int a,int b){
return a+b;
}
public static int squared(int a){
return a*a;
}
public static string add_exclamation_point(string parameter){
return parameter+"!";
}