سؤال

لماذا لا يمكن أن يكتب مترجم أن <م> إدارة ما يحتاج إلى <م> تمكن في التعليمات البرمجية C ++ (أي لجعله "CLR متوافقة")؟

وربما مع بعض الحلول الوسط، مثل حظر <م> الفراغ المؤشرات في بعض الحالات الخ ولكن كل هذه الكلمات الرئيسية اضافية الخ. ما هي المشكلة التي يجب حلها عن طريق هذه الإضافات؟

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

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

المحلول

وكنت قد نختلف مع إجابات حتى الآن.

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

وبالتالي، يتم وضع كل ما هو مطلوب لدعم مفهوم وظيفة هناك من قبل المجمع. مثلا vtables ليست سوى صفائف الحجم الصحيح، مع القيم الصحيحة من وجهة نظر وحدات المعالجة المركزية. __func__ ينتهي إلى سلسلة من البايتات في جدول سلسلة، وآخر واحد منها هو 00.

والآن، لا يوجد شيء أن يقول البيئة المستهدفة <م> يجب أن يكون البكم . هل يمكن أن تستهدف بالتأكيد JVM. مرة أخرى، والمترجم له لملء ما لم تقدم أصلا. لا توجد ذاكرة الخام؟ ثم تخصيص بايت مجموعة كبيرة واستخدامها بدلا من ذلك. لا مؤشرات الخام؟ مجرد استخدام مؤشرات صحيح إلى أن مجموعة كبيرة بايت.

والمشكلة الرئيسية هي أن البرنامج C ++ يبدو لا يمكن التعرف عليها تماما عن بيئة الاستضافة. وJVM ليست غبية، فهو يعرف عن وظائف، لكنه يتوقع منهم أن يكونوا أعضاء الفئة. انها لا تتوقع ان يكون لهم < و> باسمهم. يمكنك الالتفاف على هذا، ولكن ما ينتهي بك الأمر مع هو في الأساس اسم تغيير اسم. وعلى عكس اسم تغيير اسم اليوم، وليس المقصود هذا النوع من اسم تغيير اسم لlinkers C ولكن لبيئات الذكية. لذلك، قد تصبح محرك انعكاسه على قناعة بأن هناك c__plus__plus فئة مع دالة عضو __namespace_std__for_each__arguments_int_pointer_int_pointer_function_address، وهذا لا يزال مثالا لطيفة. أنا لا أريد أن أعرف ماذا يحدث إذا كان لديك std::map من السلاسل إلى عكس المكررات.

وعلى العكس من ذلك هو في الواقع أسهل كثيرا، بشكل عام. الى حد كبير عن تجريدات لغات أخرى يمكن أن تقوم بتدليك بعيدا في C ++. جمع القمامة؟ وهذا ما سمح بالفعل في C ++ اليوم، لذلك يمكن أن تدعم هذا حتى بالنسبة void*.

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

نصائح أخرى

والقائمة الرمز الصحيح، أي قانون مكتوب وفقا لمعيار C ++، يجب أن لا تغيير سلوكها عن غير قصد.

وحسنا C ++ / CLI هو المقصود في الغالب أن يكون الغراء بين التعليمات البرمجية المدارة وغير المدارة. على هذا النحو تحتاج إلى أن يكون القدرة على مزج mangaged على مفاهيم غير المدارة. عليك أن تكون قادرا على تخصيص الكائنات المدارة وunmanged في نفس الرمز، لذلك ليس هناك طريقة للتغلب الكلمات الرئيسية منفصلة.

لماذا لا يمكنك تجميع الأصلي C ++ كود يستهدفون من CLR؟

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

1) قوالب: C ++ تدعمهم، وCLR لا (الوراثة مختلفة). لذلك لا يمكن استخدام STL، وتعزيز الخ في التعليمات البرمجية.

.

و2) الميراث متعددة: معتمد في C ++، وليس في CLI. لا يمكن حتى استخدام فئة القياسية iostream ومشتقاتها (مثل stringstream، fstream)، التي ترث كلا من istream وostream.

وتقريبا لا شيء من قانون هناك بتجميع، هل يمكن أن تنفذ حتى المكتبة القياسية.

.

و3) جمع القمامة: معظم تطبيقات C ++ إدارة ذاكرتهم يدويا (باستخدام مؤشرات الذكية وما إلى ذلك)، وCLR لديها إدارة الذاكرة التلقائي. وهكذا فإن ++ C النمط "الجديد" و "حذف" سيكون غير متوافق مع "gcnew"، مما يجعل كود C ++ الحالية غير مجدية لهذا المجمع الجديد.

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

وأولا وقبل كل شيء، والتمييز بين "بسيط C ++" و "تمكنت C ++" كان مقصودا، لأن واحدا من أغراض MC ++ هو توفير جسر بين التعليمات البرمجية الموجودة C ++ وCLR.

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

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

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

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

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

وأول شيء هو أن تنظر كل الشيء الذي يجعل c++ "سريع" سوف تختفي. نظام لجمع القمامة الكامل في ج ++ هو أقرب إلى المستحيل. لأن c++ يمكن أن يكون المؤشر في أي مكان تقريبا في التعليمات البرمجية. يصبح وقت التشغيل نوع المعلومات مكلفة إذا لم تبن مباشرة في نظام الناطقة هو النفس. يمكنك الاستفادة من الأداء الأصلي صحيح. سوف قالب dissappear. والمؤشرات الحقيقية تختفي. رحل الوصول المباشر إلى الذاكرة.

وقائمة من الأشياء التي يجب أن تكون القسري

1. no direct pointers(pointers will get replace with complex refernces)
2. templates (generics pay for preformance)
3. simple c-style arrays (will get wrapped with array structures)
4. programmer no longer has control of whether data is on the stack or
the heap.
5. garbage collection will be enforced(this will cause the most changes to the syntax)
6. runtime type data will get added extensively to the code.
(larger code size)
7.  inlining will become more difficult for the compiler
(no more inline key word)
8. no more inline assembly.
9. the new langauge by now will become incompatible c code.(unless you go through hoops) 

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

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

والغرض الرئيسي من C ++ كان دائما Performence. انها واحدة من أفضل لغة للألعاب الكبيرة. وبدون هذه اللغة performences أن الكثير من المباريات لا وجود له!

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