سؤال

تقول لغة Google الجديدة "Go". على موقعها على الانترنت:

تم تصميم اللغة لتكون سهلة التحليل ويمكن تحليلها بدون جدول رموز

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

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

المحلول

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

على ما يبدو، يتطلب C ++ جدول رمز للقيام بتحليله.

هذه الصفحة تناقش بعض الأسباب لماذا C ++ يتطلب جدول رمز للتحليل.

بالطبع، تحليل ليست سوى جزء من التجميع، وستحتاج إلى جدول الرمز للقيام بتجميع كامل.

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

نصائح أخرى

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

في C و C ++، حتى تفسير اللغة تتطلب جدول رمز.

@ justice هو الصحيح. للتوسع على ذلك قليلا، في C الجزء الصعب الفعلي الوحيد هو تخبر الأنواع بصرف النظر عن المتغيرات. على وجه التحديد عندما ترى هذا:

T t;

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

في أشياء C ++ هي كثيرا، كثير أكثر تعقيدا. هناك أرقام هائلة من بنيات غامضة أو غامضة. الأكثر وضوحا هو هذا واحد:

B::C (c);

بصرف النظر عن حقيقة أنه ليس واضحا إذا B هو class, ، أ typedef, أو أ namespace, ، ليس من الواضح أيضا C هو نوع و c كائن من هذا النوع، أو إذا C هي وظيفة (أو منشئ) أخذ c كحجة (أو حتى إذا كانت C كائن مع operator() مثقلة). تحتاج إلى جدول الرموز لعمل التحليل، على الرغم من أنه لا يزال من الممكن الاستمرار بسرعة كافية، حيث أن نوع الرمز موجود في جدول الرمز.

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

كل هذا لديه العديد من الآثار العملية. الأكثر أهمية أود أن أقول:

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

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

على سبيل المثال:

int x = foo (شريط)؛

يمكن أن يكون FOO نوعا أو وظيفة ويمثلون أنواع AST مختلفة. في الأساس، لا يتعين على المحلل أن يبحث أبدا عن الرموز لمعرفة كيفية إنشاء AST. القواعد النحوية و AST أبسط فقط من معظم اللغات. رائع جدا حقا.

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

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

في C وC++، حتى تحليل اللغة يتطلب جدول رموز، لأنك تحتاج إلى تخزين أنواع وإعلانات العموميات والوظائف.

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

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

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