سؤال

وكنت أقرأ هذا السؤال لمعرفة الاختلافات بين آلة جافا الافتراضية وCLR NET و الجواب بينجي وحصلت لي أن أتساءل لماذا ضرورية في المقام الأول الأجهزة الظاهرية.

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

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

إذا كود C يمكن تشغيلها على أي وحدة المعالجة المركزية ثم ما هو الغرض من الجهاز الظاهري؟ هل بحيث يمكن تشغيل نفس رمز على أي نظام تشغيل؟ وأنا أعلم جافا الإصدارات VM الى حد كبير على أي نظام تشغيل ولكن هناك CLR عن الأخرى OS إلى جانب ويندوز؟

وأم أن هناك شيء آخر أنا في عداد المفقودين؟ هل OS القيام ببعض تفسير آخر من رمز التجميع تشغيله لتكييفه مع وحدة المعالجة المركزية أو شيء معين؟

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

ملحوظة: والسبب لم أكن مجرد توجيه استفساراتي عن التعليقات في JVM مقابل السؤال CLR هو لأنني لم يكن لديك ما يكفي من النقاط للنشر تعليقات حتى الآن = ب

وتحرير: شكرا لجميع الأجوبة كبيرة! هكذا يبدو ما كان في عداد المفقودين وكنت أنه على الرغم من كل المعالجات لديها خلافات هناك توحيد المشترك، وفي مقدمتها العمارة X86، والتي توفر مجموعة واسعة بما فيه الكفاية من السمات المشتركة بحيث رمز C جمعت على معالج X86 واحدة ستعمل بالنسبة للجزء الأكبر على معالج X86 آخر. هذا يعزز مبررات الأجهزة الظاهرية، ناهيك لقد نسيت حول أهمية جمع القمامة.

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

المحلول

والمعالجات AMD وإنتل استخدام نفس مجموعة التعليمات والهندسة المعمارية آلة (من وجهة نظر تنفيذ شفرة الآلة).

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

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

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

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

وأبعد من ذلك، إذا كنت ترغب في تشغيلها على معالجات ARM، أو MIPS، أو باور، ثم لديك لتشغيل تعليمات الجهاز كامل مجموعة المحاكي أن يفسر رمز الجهاز ثنائي من X86 في كل ما آلة كنت تشغيله على.

وعلى النقيض من ذلك مع .NET.

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

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

ولكن دعونا نذهب أبعد قليلا - وبمجرد الانتهاء من هذه اللغة المشتركة، لماذا لا تجعل المجمعين التي تحول أي لغة أخرى مكتوبة فيه

وحتى الآن هل يمكن أن يكون C، C #، C ++، جافا، جافا سكريبت، الأساسية، الثعبان، لوا، أو أي مترجم لغة أخرى أن يحول قانون مكتوب لذلك سوف تعمل على هذا الجهاز الظاهري.

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

إذا كنت لا تزال تتساءل لماذا هذا أمر جيد، والنظر آلات DOS في وقت مبكر، وما مايكروسوفت <م> حقيقية الإسهام في العالم كانت في:

كان

وأوتوكاد لكتابة برامج التشغيل لكل طابعة يتمكنوا من طباعة ل. وكذلك فعل لوتس 1-2-3. في الواقع، إذا أردت البرنامج إلى الطباعة، كان عليك أن كتابة برامج التشغيل الخاصة بك. إذا كان هناك 10 الطابعات، و 10 برامج، ثم 100 قطعة مختلفة من الأساس زيارتها نفس رمز لتكون مكتوبة بشكل منفصل ومستقل.

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

والآن مع 10 برامج و 10 الطابعات، والمراد كتابتها فقط 20 قطعة من رمز، ومنذ الجانب مايكروسوفت من قانون هو نفسه للجميع، ثم أمثلة من MS يعني أن لديك القليل جدا من العمل للقيام به.

والآن لم يقتصر برنامج لمجرد 10 الطابعات اختاروا لدعم، ولكن جميع الطابعات التي تقدم برامج تشغيل في ويندوز المصنعين.

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

كان من المفترض

وجافا لإصلاح هذا، ولكن كان الكثير من القيود، وبعضها لا الجرميةحل LLY.

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

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

و-Adam

نصائح أخرى

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

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

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

وخدمة أبرز عرضت هي جمع القمامة، وعرضت من قبل CLR وJVM. كل من هذه الأجهزة الظاهرية نقدم لكم هذه الخدمة مجانا. تمكنوا من ذاكرة لك.

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

وكما يقدم CLR شكل من أشكال رمز الحماية بالنسبة لك.

وتقدم أيا من هذه كجزء من بيئة وقت التشغيل الأساسية لعدد من اللغات الأخرى التي لا تعمل مع جهاز ظاهري.

هل يمكن الحصول على بعضها باستخدام المكتبات، ولكن بعد ذلك أن قوات لكم في نمط استخدام مع المكتبة، في حين أن الخدمات .NET و Java التي يتم تقديمها لك من خلال CLR وJVM تتفق في إمكانية وصولهم.

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

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

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

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

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

ومعظم المجمعين، حتى الأم المجمعين رمز، وتستخدم نوعا من لغة وسيطة.

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

ومع ذلك، من خلال تحديد لغة وسيطة وكسر مترجم تصل إلى أجزاء 2، والأمامية والخلفية، مع الواجهة الأمامية ترجمة التعليمات البرمجية المصدر إلى IL والنهاية الخلفية تجميع IL إلى رمز الجهاز، يمكن أن تحصل بعيدا مع كتابة فقط المجمعين N + M. هذا ينتهي به الأمر إلى تحقيق وفورات كبيرة في التكاليف.

والفارق الكبير بين المجمعين CLR / JVM والمجمعين التعليمات البرمجية الأصلية هو الطريقة التي يتم بها ربط الواجهة الأمامية والمجمعين النهاية الخلفية لبعضها البعض. في مترجم التعليمات البرمجية الأصلية عادة ما يتم الجمع بين العنصرين في نفس الملف القابل للتنفيذ، وتشغيل كل من عند مبرمج يضرب "بناء" في IDE.

ومع المجمعين CLR / JVM، الواجهة الأمامية والخلفية وتشغيلها في أوقات مختلفة. تشغيل الواجهة الأمامية في وقت الترجمة، وإنتاج IL التي يتم شحنها في الواقع للعملاء. ثم يتجسد النهاية الخلفية في بند منفصل أن يتم استدعاء في وقت التشغيل.

وهكذا، وهذا إحضار السؤال بديل، "ما هي فوائد تأخير الظهر تجميع نهاية حتى وقت التشغيل"؟

والجواب هو: "الامر يعتمد"

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

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

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

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

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

وAMD و Intel المعالجات لديهما بنية x86 و إذا كنت ترغب في تشغيل ج / ج برنامج ++ على بنية مختلفة لديك لاستخدام مترجم لأن العمارة، لن يتم تشغيل نفسه للتنفيذ ثنائي عبر بنيات المعالج مختلفة.

<اقتباس فقرة>   

وأنا أعلم جافا الإصدارات VM الى حد كبير على أي نظام تشغيل ولكن هناك CLR عن الأخرى OS إلى جانب ويندوز؟

مونو

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

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

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

والجمعية الناطقة في الوقت الحاضر هي في الأساس واجهة أخرى أن مبرمجا يمكن البرنامج ل. إلى x86 (32-بت) يسمح لك بالوصول إلى EAX، EBX، ECX، EDX لسجلات صحيح للأغراض العامة، وF00-F07 لنقطة عائمة. وراء الكواليس، وحدة المعالجة المركزية لديها بالفعل مئات من سجلات أكثر، وتختلط الاشياء التي حولها للضغط على الأداء بها.

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

وأعتقد أن مقدمة سؤالك صحيح - أنت بالتأكيد لم يكن أول من طرح هذا السؤال. وذلك راجع http://llvm.org لنرى نهجا بديلا (والذي هو الآن مشروع تدار؟ أو يرعاه من قبل شركة آبل)

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