سؤال

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

مع Proviso أنني فعلت، ما bamboozles لي هو أن العديد من اللغات غير المترجمة تسمح المتغيرات مع أنظمة النوع "الليبرالية". في بيثون على سبيل المثال، يمكنني كتابة هذا:

x = "Hello world!"
x = 2**1000

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

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

المحلول

ربما، يجب أن يكون سؤالك بعنوان "كيف لغات ديناميكية الشغل؟."

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

نصائح أخرى

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

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

VM لا علاقة له باللغة. أي لغة يمكن تشغيلها على رأس VM (يحتوي Java VM على مئات اللغات بالفعل).

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

إنه مستوى منخفض للغاية، وفي العديد من الحالات مكدس بشدة - بدلا من السجلات، يكون الرياضيات على مستوى الماكينة كلها بالنسبة للمواقع المتعلقة بمؤشر المكدس الحالي.

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

يقوم VM بكل هذا بتعليم واحد وقصير واحد، وربما واحدا أو بايت بدلا من 4 أو 8 بايت لكل تعليم في لغة الماكينة (اعتمادا على بنية 32 أو 64 بت) والتي يجب أن تعني (التخمين) حوالي 16 أو 32 بايت من X86 لمدة 1-2 بايت من رمز الجهاز. (قد أكون مخطئا، وكان ترميز X86 الأخير في عصر 80286.)

تستخدم Microsoft (ربما لا تزال تستخدم) VMS في منتجات Office الخاصة بهم لتقليل مقدار التعليمات البرمجية.

الإجراء الخاص بإنشاء رمز VM هو نفسه إنشاء لغة الجهاز، فقط نوع معالج مختلف بشكل أساسي.

يمكن أن تقوم VMS أيضا بتنفيذ أمانها الخاص واسترداد الأخطاء وآليات الذاكرة ذات الصلة بإحكام باللغة.

بعض وصفي هنا ملخص ومن الذاكرة. إذا كنت ترغب في استكشاف تعريف bytecode بنفسك، فهو متعة كيندا:

http://java.sun.com/docs/Books/jvms/second_edition/html/instructions2.doc.html.

مفتاح العديد من "كيفية مقبض VMS للمتغيرات مثل هذا أو أن" حقا يأتي إلى البيانات الوصفية ... يتم تخزين المعلومات Meta ثم تحديث VM مقبض أفضل بكثير حول كيفية تخصيصه ثم افعل الشيء الصحيح المتغيرات.

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

أما بالنسبة لأسئلتك المحددة - تعامل المتغيرات ككائنات الفانيليا / إلخ ... تعود إلى إعادة تعيين / إعادة تقييم معلومات التعريف عن مهام جديدة - لهذا السبب يمكن أن تبدو X بطريقة واحدة ثم التالي.

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

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