سؤال

يتم تجميع Python في رمز bytecode الوسيط (PYC) ثم ينفذ. لذلك ، هناك مجموعة تليها التفسير. ومع ذلك ، يقول مستخدمو Python منذ فترة طويلة أن Python هي لغة "ملزمة" وأنه لا ينبغي أن يشار إليها كلغة تفسير.

  1. كيف يمكن أن تختلف بيثون عن لغة أخرى معروفة؟

  2. هل يمكن أن تخبرني ماذا تعني "الربط المتأخر" ، في سياق بيثون؟

Java هي لغة أخرى تحتوي أولاً على رمز المصدر تم تجميعه في رمز Bytecode ثم يتم تفسيره في Bytecode.

  1. هل Java لغة متوسطة/تجميع؟

  2. كيف يختلف عن بيثون من حيث التجميع/التنفيذ؟

  3. يقال إن جافا ليس لديه "ربط متأخر". هل هذا له علاقة ببرامج Java كونها أسرع من Python؟

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

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

المحلول

الربط المتأخر هو مفهوم مختلف تمامًا للتفسير.

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

على النقيض من ذلك ، يتم تفسير Java Bytecode وتجميعها في هذه الأيام. يتم تجميعه في الكود الأصلي بواسطة jit-compiler ثم تشغيله مباشرة على الجهاز.

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

نصائح أخرى

كيف يمكن أن تختلف بيثون عن لغة أخرى معروفة؟

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

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

هل يمكن أن تخبرني ماذا تعني "الربط المتأخر" ، في سياق بيثون؟

لا يتم إعلان المتغيرات أن يكون لها نوع. يرتبط المتغير بنوع في وقت متأخر قدر الإمكان - مع تعيين كائن فعلي.

هل Java لغة متوسطة/تجميع؟

نعم. تم تجميعها إلى رموز البايت. يتم تفسير رموز البايت. أنا أفضل أن أسميها تفسير.

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

بعض jvm do jit. البعض لا. بعضها مزيج. أن نقول أن JVM فقط لا تعتبر ترجمة الرمز البايت JIT غير صحيحة. بعض JVM تفعل. البعض لا.

كيف يختلف عن بيثون من حيث التجميع/التنفيذ؟

لا على الاطلاق. يمكن لـ Java VM تنفيذ Python. [بالنسبة للمرضى بسهولة ، لا يمكن أن تعني كلمة "Python" في هذا السياق "مصدر Python". يجب أن يعني بيثون bytecode.

يقال إن جافا ليس لديه "ربط متأخر". هل هذا له علاقة ببرامج Java كونها أسرع من Python؟

ربما. غالبًا ما تكون برامج Java أسرع بسبب مجمعي JIT الذين يترجمون رمز بايت Java إلى رمز الجهاز في وقت التشغيل.

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

هناك بالفعل القليل من العقوبة لربط "متأخر". يتم حل سمات Python والأساليب باستخدام عمليات البحث القاموس البسيطة. القاموس هو تجزئة. الأداء جيد جدا. يمكن وضع التجزئة للأسماء في مجموعة حرفية "متدربة" تبرز تكلفة حساب التجزئة.

من أجل المتعة الحقيقية ، انظر Pypy و Rpython. هذا هو مترجم بيثون يمكنه القيام بتجميع JIT. تنتهي مع مترجم ثنائي المستويين. يتم تفسير الكود الخاص بك بواسطة Pypy. يتم تفسير Pypy بواسطة Rpython. http://alexgaynor.net/2010/may/15/pypy-future-python/

هناك اتصال بين ما نسميه وقت الربط ومفهوم التفسير/التجميع.

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

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

التمييز بين كليهما ليس صارمًا. لا يمكننا فقط التفكير في أن كل شيء يتم تفسيره في نهاية المطاف (انظر S.Lott Answer) ، ولكن يمكن تجميع جزء من الكود أو فك تشفيره أو إعادة ترجمة ديناميكيًا (مثل JIT) مما يجعل التمييز غامضًا للغاية.

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

لا أعرف الكثير عن Python ، لكن ممارسي Python يفضلون ربما مصطلح "Late Bound" لتجنب هذا الالتباس.

أعتقد أن الاعتقاد الخاطئ الشائع بأن Python يتم تفسيره بينما يتم تجميع Java لأن Java لديها خطوة تجميع صريحة - يجب عليك تشغيل Javac لتحويل ملف مصدر .java إلى ملف .class bytecode يمكن تشغيله.

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

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

وقت الربط هو عندما يتم حل الأسماء إلى الأشياء. المزيد من اللغات الديناميكية تميل نحو الربط المتأخر. يمكن أن يكون ذلك منفصلاً عن التفسير/التجميع-على سبيل المثال ، يتم حل طرق الهدف-C متأخراً ومقارنة ديناميكيًا بـ C ++. تقوم Java بالكثير من الربط في وقت تحميل الفصل: في وقت لاحق من C ولكن قبل Python.

اقتباسي المفضل من تناقض الكمبيوتر في ستان كيلي بوتل:

وقت الربط ن. اللحظة التي يصبح فيها جدول التجزئة تالفًا.

==> يمكن تعيين التقدم في الحوسبة مقابل "تأخر الربط" ، الأمر الذي جعلني أفكر في ما يسمى بخصوصية CS ما يسمى المهنة: الماضي الذهبي والحاضر الرمادي والمستقبل الوردي. هذا هو نسختي من تفاؤل سينج: العشب أكثر خضرة في t = 0. على Edsac I ، تم تثقيب وظائفي (روتين فرعي للشريط الورقي 5Ch) ، وتراجعها ، وربطها قبل حوالي أسبوعين من الإدخال. يُعرف هذا بربط Aspremature ويدعو إلى ماهر مع نطاقات مرنة. جاء Fortran بعد ذلك بنوع جديد من الربط: طوابق بطاقات فطرية رفضت خلطها. ثم مع Algol و C ، استمتعت بالربط الثابت (وقت الترجمة) ، حتى جلب C ++ أفراح الربط الديناميكي (وقت التشغيل). يهدف بحثي الحالي إلى تأخير الربط حتى جيد بعد التنفيذ. أسمي هذا الارتباط في الوقت النهائي ، كما تنبأ في إنجيل القديس ماثيو: "... وأيًا كان الربط على الأرض يجب أن يكون ملزماً في السماء ..." (متى 16:19 KJV).

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