هو روبي حقا لغة تفسير إذا تم تجميع جميع تطبيقاتها في bytecode؟

StackOverflow https://stackoverflow.com/questions/717490

سؤال

في الإجابة المختارة ل هذا السؤال حول Ruby الأزرق, ، تشاك يقول:

جميع تطبيقات روبي الحالية تجميعها إلى bytecode. على عكس مطالبات SAP، اعتبارا من روبي 1.9، يتضمن MRI نفسه مترجما bytecode، على الرغم من أن القدرة على حفظ ByTecode المترجمة على القرص قد اختفت في مكان ما في عملية دمج الجهاز الظاهري Yarv. يتم تجميع JRURY في ملفات Java .class. ليس لدي الكثير من التفاصيل على Maglev، لكن يبدو من الآمن أن نقول أنه سيستغرق هذا الطريق كذلك.

أنا مرتبك بشأن مشكلة الترجمة / الترجمة هذه فيما يتعلق براغي.

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

ولكن إذا تم تجميع جميع تطبيقات روبي الآن، فهل لا يزال من العدل أن نقول أن روبي هي لغة تفسير؟ أو هل أنا أسيء فهم شيء ما؟

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

المحلول

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

نصائح أخرى

تقريبا كل لغة "مجمعة" في الوقت الحاضر، إذا عدت ByTecode كما تم تجميعها. حتى emacs lisp تجميعها. كان روبي حالة خاصة لأنه مؤخرا، لم يكن جمعت في bytecode.

أعتقد أنك محق في السؤال عن فائدة توصيف اللغات بأنها "مترجمة" مقابل "تفسيرها". تمييز مفيد، على الرغم من أن اللغة تنشئ رمز الجهاز (مثل مجمع X86) مباشرة من كود المستخدم. C، C ++، العديد من Lisps، وجافا مع JIT تمكين القيام به، ولكن Ruby، Python، و Perl لا.

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

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

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

بعض اللغات هي أكثر ديناميكية من غيرها، ومعنى شيء - نوع، طريقة، متغير - يعتمد على بيئة وقت التشغيل. هذا يعني أنه تم تجميعها أم لا يوجد آلية كبيرة وقت التشغيل المرتبطة بتنفيذ برنامج. ورطوبة، Smalltalk، الأخبار، LISP، كانت جميعها أمثلة على ذلك. في البداية، تطلب هذه اللغات الكثير من الآلية لتنفيذ (مقابل C أو FORTRAN) أنها كانت طبيعية للتفسير.

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

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

تتزوج اللغات الحديثة كل هذه الابتكارات. يتمتع البعض بطبيعة الوقت الديناميكي المفتوح، الذي لا تعرفه، ما الذي لا يهتم به - حتى وقت التشغيل للتقليدية "اللغات المترتبة (روبي، LISP، Smalltalk، Python، Perl (!))، يحاول البعض لديك صرامة المواصفات مما يسمح بالكشف عن الأخطاء الثابتة الثابتة القائمة على النوع العميق للغات المترجمة التقليدية (Java، Scala). جميع تجميعها للتمثيلات الفعلية المستقلة للآلات (JVM) للحصول على كتابة في أي مكان في أي مكان.

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

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

يمكنك تشغيل برامج Ruby باستخدام تفاعلية irb., ، قذيفة روبي التفاعلية. في حين أنه قد تولد bytecode الوسيط، فإنه بالتأكيد ليس "مترجم" بالمعنى التقليدي.

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

رمز البايت نفسه هو مجرد خطوة وسيطة بين التعليمات البرمجية الحرفية التي كتبها المستخدم والآلة الظاهرية، لا تزال بحاجة إلى تفسيرها بواسطة الجهاز الظاهري على الرغم من (كما تم ذلك مع Java في JVM و PHP مع ذاكرة التخزين المؤقت OPCODE).

هذا ربما يكون بعيدا عن الموضوع ولكن ...

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

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

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