سؤال

إنني أتطلع إلى إنشاء جهاز افتراضي في لعبة وكنت أتساءل عما إذا كان أي شخص يعرف أي أجهزة افتراضية بسيطة حقًا (كنت أعتقد أن RISC/PIC كان قريبًا مما أردت) والتي تُستخدم عادةً للمشاريع المضمنة مثل التحكم في الروبوتات والمحركات، أجهزة الاستشعار، الخ.شاغلي الرئيسي هو الاضطرار إلى كتابة مترجم/مجمّع إذا قمت بإنشاء برنامج خاص بي.سيكون من الجيد استخدام الأدوات الموجودة بالفعل أو في أبسط أشكالها مجرد مترجم C يمكنه الترجمة من أجله :-p.

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

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

فيما يتعلق بالذاكرة، أود أن يكونوا قادرين على تخزين ما يكفي من البيانات ليتم تركهم بمفردهم لبضعة أيام دون التدخل في بناء الخرائط وجمع الإحصائيات.لا أحب أن 8 بت سيقطعها للمعالجة أو الذاكرة ولكن 16 بت سيكون بالتأكيد منافسًا.سوف يقوم الإصداران 32 و64 بت بدفعها فقط، ومن غير الممكن أن يكون لكل منهما أكثر من 1 ميجابايت من الذاكرة - ربما أقرب إلى 256-512 كيلو بايت.(قال الفاتورة الأولى إن 640 ألفًا ستكون كافية، فلماذا لا أستطيع ذلك!!)

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

المحلول

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

وهناك احتمال آخر هو كيمو، الذي يحاكي بالفعل عدة أصناف ARM.

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

نصائح أخرى

رين لأحد الأصدقاء الذي يريد VM لغة تشغيل على وحدة تحكم جزءا لا يتجزأ مع حوالي 16K من الرامات "الذاكرة العشوائية في الهواتف والحواسيب. (ولكن يسمح ما يصل الى 64K لكل عملية في رمز كما هو مكتوب.) وهو يشتمل على مترجم للغة البرمجة غبية قليلا. الأمر كله، اه، جميلة الأساسية ولم ير فائدة كبيرة، وإنما هو فقط ما هو موضح في الفقرة الأولى.

وإيابا "الجهاز الظاهري" حوالي بسيطة كما أنها تأتي. مساحة العنوان 16 بت (عادة)، والكلمات بيانات 16 بت، واثنين من المداخن، الذاكرة. Loeliger في "مترابطة تفسيري اللغات" يقول لك الكثير عن كيفية بناء مترجم FORTH على Z80.

إذا كنت تريد بسيط، والنظر في مانشستر الأقسام I. انظر الصفحة 15 من هذا PDF . الجهاز لديه 7 التعليمات. يستغرق حوالي ساعة واحدة لكتابة مترجم لذلك. وللأسف، فإن تعليمات ودانغ جدا محدود (وهذا هو السبب الى حد كبير المواصفات الكاملة للآلة يمكن أن يصلح في صفحة واحدة).

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

وأيضا - أنها لا يجب أن تكون RISC؟ هل يمكن أن تختار، ويقول، 68K التي هناك مفتوحة محاكاة مصدر ، وكان 68K هدفا مفهومة جيدا لدول مجلس التعاون الخليجي.

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

بقدر ما أستطيع أن أقول، الأكثر شعبية اللغات المضمنة بالترتيب الأول الأكثر شيوعًا تقريبًا (على الرغم من أن عبارة "أكثر شيوعًا" لا تعني بالضرورة "الأفضل") يبدو أنها:

  • لغة خاصة بالمجال مصممة خصيصًا لهذا التطبيق المحدد ولا تستخدم في أي مكان آخر
  • لوا أ
  • تي سي ال
  • بايثون أ ب, ، غالبًا ما تكون مجموعة فرعية مبسطة مثل PyMite ج
  • رابعا
  • جافا سكريبت أ
  • اللثغة
  • AngelScript أ
  • XPL0 أ ب
  • سنجاب أ
  • هاسكل أ ب
  • NPCI (تفسير Nano Pseudo C) أ
  • روبوتالك
  • ترجمة بعض لغات الأجهزة (لماذا يعد هذا الخيار الأقل شيوعًا؟لأسباب وجيهة، الموضحة أدناه).

قد ترغب في الاطلاع على Gamedev StackExchange، في أسئلة معينة مثل "كيف يمكنك إضافة لغة البرمجة النصية إلى اللعبة؟".

قد ترغب في الاطلاع على بعض الأسئلة هنا على StackOverflow الموسومة "اللغة المدمجة";مثل""اختيار لغة مضمنة"", "ما هي اللغة الجيدة القابلة للتضمين التي يمكنني استخدامها في البرمجة النصية داخل برنامجي؟" "بدائل لوا كلغة مضمنة؟" "ما هي لغة البرمجة النصية للعبة الأفضل استخدامها:لوا أو بايثون؟"، إلخ.

تستخدم العديد من تطبيقات هذه اللغات نوعًا ماbytecode داخليا.غالبًا ما يستخدم تطبيقان مختلفان لنفس لغة البرمجة عالية المستوى مثل JavaScript لغتين مختلفتين تمامًا للرمز الثانوي داخليًا ( أ ).غالبًا ما يتم تجميع العديد من لغات البرمجة عالية المستوى إلى نفس لغة البايت كود الأساسية - على سبيل المثال، تطبيق Jython لـ Python، وتطبيق Rhino لـ JavaScript، وتطبيق Jacl لـ Tcl، وJScheme والعديد من تطبيقات Scheme الأخرى، والعديد من تطبيقات Pascal؛يتم تجميعها جميعًا إلى نفس رمز بايت JVM.

تفاصيل

لماذا نستخدم لغة البرمجة النصية بدلاً من ترجمة بعض لغات الآلة للأجهزة؟

لماذا "الطبقات الصلبة والناعمة البديلة"؟للحصول على البساطة، والتطور الأسرع.

تطوير أسرع

يعمل الأشخاص عمومًا بشكل أسرع مع لغات البرمجة النصية بدلاً من اللغات المترجمة.

يعد الحصول على النموذج الأولي للعمل أسرع بشكل عام - حيث يتعامل المترجم مع مجموعة من الأشياء خلف الكواليس التي تجبرك لغة الآلة على كتابتها بشكل صريح:تعيين القيم الأولية للمتغيرات على الصفر، ورمز الروتين الفرعي والروتين الفرعي، وmaloc وrealloc وأشياء إدارة الذاكرة المجانية وذات الصلة، وزيادة حجم الحاويات عندما تمتلئ، وما إلى ذلك.

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

بساطة

نريد أن تكون لغة اللغة المضمنة "بسيطة" بطريقتين:

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

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

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

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

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

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

لهذه الأسباب وغيرها، يستخدم العديد من مبرمجي الألعاب لغة "البرمجة النصية" باعتبارها "اللغة المضمنة" الخاصة بهم.

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

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