سؤال

نظرًا لمطور ماهر يتمتع بخبرة تتراوح من 10 إلى 20 عامًا ولم يقم مطلقًا ببناء مترجم أو محاكي، فما الذي سيكون أكثر تحديًا؟

هل يمكنك مقارنة المشكلات التي قد تشكل حواجز طريق لأي منهما.

شكرًا.

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

المحلول

ومضاهاة وتجميع مختلفة تماما، ولكن تميل إلى الحصول على جمعها معا لأن كلا يجري النظر "على مستوى منخفض".

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

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

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

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

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

نصائح أخرى

وكنت قد كتبت على حد سواء وأن أقول أن الأمور الأخرى متساوية (تعقيد اللغة أو مجموعة التعليمات)، فمن <م> الطريق أسهل في الكتابة مقلدا، وخاصة إذا كنت تحاول كتابة <م > اهتمام محاكي أو مترجم.

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

وبطبيعة الحال، لعصابات من المرح، يمكنك كتابة مقلدا الذي يعمل عن طريق <م> دينامية ترجمة ثنائية ، وهو تجميع رمز الجهاز لبنية يحتذى في رمز الجهاز لبنية الأم. وبهذه الطريقة يمكنك الحصول على أن يكون كل المتعة من كلا --- ويو إنتاج محاكاة سريع حقا مثل كيمو أو رثى وقت متأخر FX الرقمية! 32.

ولقد كتب على حد سواء وأن أقول إن مقلدا هو أسهل عموما. وبطبيعة الحال، وهذا يعتمد إلى حد كبير على ما تحاول محاكاة (محاكاة أجهزة الكمبيوتر المركزية IBM على اي فون قد يكون نوعا من التحدي) وما تحاول تجميع (أ C مترجم صغيرة من السهل جدا، مترجم الكامل C ++ تقريبا من الصعب مستحيل.

يعتمد الأمر إلى حد كبير على ما تحاكيه وما تقوم بتجميعه.

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

في رأيي مترجم معقدة أكثر صعوبة في الكتابة من منافس معقد لسبب بسيط هو أن المترجم ينطوي على أكثر من ذلك بكثير النظرية.

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

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

وتحرير: وأعتقد أن كلا المهارات هي مفيدة جدا ويمكن للمرء أن الجمع بين الواقع لهم - أنهم ليسوا XOR.

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

وأنا أتفق أيضا أنه إذا كان النظام الأساسي هو غير معروف أي أنك الهندسة العكسية شيء بعد ذلك هو أكثر صعوبة للقيام منافس، ولكن OTOH ليس هذا ما كان السؤال OP حول، كان ذلك؟

ومضاهاة البرنامج هي جميلة على التوالي إلى الأمام وهكذا سهلة نسبيا، ولكن يمكن أن تكون مملة.

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

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

وعلى كل، أنا قاض مضاهاة ليكون أكثر صعوبة.

إن كتابة محاكي لمنصة معروفة تمت محاكاتها ليس بالأمر الصعب (يمكنك أيضًا استخدام محاكي وحدة المعالجة المركزية المُعد مسبقًا والحصول على بعض الوقت للتطوير).

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

على سبيل المثال، مجرد التفكير في مقدار الوقت CPS2 المحاكاة مطلوبة (تم تشفير ذاكرة القراءة فقط CPS2).

خارج السياق، يمكن أن يكون هناك إجابات محددة: كل شيء يتوقف على ما تريد تحقيقه، وما كنت المتنافسة ضد

إذا كان مجرد "دليل على مفهوم"، ثم في كلتا الحالتين، انها بسيطة إلى حد ما.

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

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

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

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

ومقلدا للتو من أداء منطق كل التعليمات لتغذية ذلك (وأنا أعلم أنني تبسيط هذا، لكنني أفترض أن لديك المواصفات لمجموعة التعليمات)، الآن، كتابة محاكي FAST هو أصعب بكثير.

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