سؤال

هل هو قانوني لاستدعاء مترجم ج مكتوب في ج أو مترجم فب مكتوب في metacircular php؟ هل هذا التعريف صالح لغات نوع معين، مثل LISP؟ باختصار، ما هي الشروط التي يجب أن ترضي إليه المترجم الخاص بها لتدوين metacircular؟

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

المحلول

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

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

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

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

نصائح أخرى

هنا تعريف من صفحة ويكيبيديا ل metacircular.:

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

وبالتالي فإن الجواب ليس في كلتا الحالتين:

  • مترجم AC ليس مترجما (مقيم). يترجم برنامجا من نموذج إلى آخر دون تنفيذه.
  • A (افتراضي) مترجم فب مكتوب في PHP سيكون مترجميا ذاتيا، ولكن ليس بالضرورة metacircular.

لاستكمال الإجابات أعلاه: http://www.c2.com/cgi/wiki؟metacircularevaluator.

كما أفهمها، مترجم metacircular هو مترجم يمكن أن يفسر نفسه.

مترجم يترجم رمز فقط، ولا ينفذه.

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

"""
Metacircular Python interpreter with macro feature.
By Cees Timmerman, 14aug13.
"""

import re

def meta_python_exec(code):
    # Optional meta feature.
    re_macros = re.compile("^#define (\S+) ([^\r\n]+)", re.MULTILINE)
    macros = re_macros.findall(code)
    code = re_macros.sub("", code)
    for m in macros:
        code = code.replace(m[0], m[1])

    # Run the code.
    exec(code)

if __name__ == "__main__":
    #code = open("metacircular_overflow.py", "r").read()  # Causes a stack overflow in Python 3.2.3, but simply raises "RuntimeError: maximum recursion depth exceeded while calling a Python object" in Python 2.7.3.
    code = "#define 1 2\r\nprint(1 + 1)"
    meta_python_exec(code)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top