سؤال

لقد كنت أكتب كود C / C ++ منذ ما يقرب من عشرين عامًا، وأعرف لغة Perl وPython وPHP وبعض Java أيضًا، وأقوم بتعليم JavaScript بنفسي.لكنني لم أقم مطلقًا بأي شيء يتعلق بـ .NET أو VB أو C#.ماذا يفعل بالضبط تمكنت رمز يعني؟

ويكيبيديا يصف ذلك ببساطة كما

التعليمات البرمجية التي يتم تنفيذها تحت إدارة جهاز افتراضي

وينص على وجه التحديد على أن Java هي (عادةً) تعليمات برمجية مُدارة، لذلك

  • لماذا يبدو أن المصطلح ينطبق فقط على C# / .NET؟
  • هل يمكنك ترجمة C# إلى ملف .exe يحتوي على VM أيضًا، أم هل يتعين عليك تجميعه وإعطائه إلى ملف .exe آخر (على غرار Java)؟

وفي سياق مماثل،

  • هو .NET أ لغة أو أ نطاق, وماذا يعني "الإطار" هنا بالضبط؟

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

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

المحلول

عندما تقوم بتجميع تعليمات برمجية C# إلى ملف .exe، يتم تجميعها إلى رمز ثانوي للغة المتوسطة المشتركة (CIL).عندما تقوم بتشغيل ملف CIL قابل للتنفيذ، يتم تنفيذه على الجهاز الظاهري لـ Common Language Runtime(CLR) الخاص بشركة Microsoft.لذا لا، ليس من الممكن تضمين الجهاز الافتراضي في ملف .NET القابل للتنفيذ.يجب أن يكون لديك وقت تشغيل .NET مثبتًا على أي جهاز عميل سيتم تشغيل برنامجك عليه.

للإجابة على سؤالك الثاني، يعد .NET إطار عمل، حيث إنه عبارة عن مجموعة من المكتبات والمترجمين وأجهزة VM غير المخصصة للغة معينة.لذا يمكنك البرمجة على إطار عمل .NET بلغات C# وVB وC++ وأي لغات أخرى تحتوي على مترجم .NET.

https://bitbucket.org/brianritchie/wiki/wiki/.NET%20Languages

تحتوي الصفحة أعلاه على قائمة باللغات التي تحتوي على إصدارات .NET، بالإضافة إلى روابط لصفحاتها.

نصائح أخرى

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

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

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

لمعرفة ما هو .Net "حقًا" انتقل ببساطة إلى c:\Windows\Microsoft.Net\Framework

سترى هناك مجلدات خاصة بالإصدار (الإصدارات) التي قمت بتثبيتها.انتقل إلى المجلد v2.0.xxxxx إذا كان مثبتًا لديك على سبيل المثال.

في هذا المجلد هو الإطار.سترى بشكل أساسي مجموعة من ملفات .exe وملفات .dll.جميع ملفات DLL التي تبدأ بـ System.*.dll هي في الأساس إطار عمل .Net.

ملفات .exe التي ستراها في هذا المجلد هي أدوات مساعدة للمطورين وكذلك للمترجمين.لقد ذكرت C #.ابحث عن ملف csc.exe.هذا هو مترجم C# الخاص بك.

بناء البرنامج بسيط حقا.قم برمي الكود التالي في ملف hello.cs.

using System;
class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("hello world");
        }
    }

ثم في سطر الأوامر، اكتب> csc hello.cs

سيؤدي ذلك إلى إنشاء ملف exe.قم بتشغيله وسوف يبصق "مرحبا بالعالم" بشكل واضح.

السطر الذي يشير إلى أن Console.WriteLine() يتصل بإطار العمل.وحدة التحكم هي كائن يعيش داخل مساحة اسم النظام وWriteLine() هي طريقة ثابتة.

هذا هو الكود المفكك لأسلوب Console.WriteLine():

[HostProtection(SecurityAction.LinkDemand, UI=true)]
public static void WriteLine(string value)
{
    Out.WriteLine(value);
}

عندما يقول الناس أشياء مثل، "هل يجب أن أستخدم PHP أو .Net؟"، أو "هل يجب أن أستخدم Python أو .Net"، فإنك تبدأ في رؤية أن هذا هو الشيء الخطأ الذي يجب مناقشته.من الواضح أنهم يقارنون اللغة بالإطار.C# هي لغة وهي مجرد واحدة من اللغات العديدة التي يمكن استخدامها لكتابة التعليمات البرمجية أعلى النظام الأساسي .Net.يمكن استدعاء نفس طريقة Console.WriteLine() من C# وVB.Net وPascal وC++ وRuby وPython وF# وأي لغة أخرى تم تصميمها للعمل أعلى منصة .Net.

أتمنى أن يساعد ذلك.

-كيث

يتم استخدامه بشكل أساسي لوصف .NET لأن هذا هو المصطلح الذي اختارته Microsoft للتمييز بين .NET وC/C++ واللغات الأقدم الأخرى.اختارته Microsoft لأنه لم يكن مصطلحًا مرتبطًا عادةً بـ Java لأنهم لا يريدون التأكيد على أوجه التشابه بين C#/.NET وJava (بدلاً من تسميته بشيء مثل "رمز الجهاز الافتراضي" الذي من شأنه أن يجعله يبدو أكثر مثل Java).في الأساس، فإن استخدام "الكود المُدار" يعتمد على التسويق، وليس المصطلحات الفنية.

ضمن .NET وVisual C++ على وجه التحديد، يمكن أن يكون لديك تعليمات برمجية غير مُدارة ومُدارة.تشير المصطلحات إلى الطريقة التي يتم بها تخصيص الذاكرة و"إدارتها".

ستكون التعليمات البرمجية غير المُدارة هي عناصر C++ التي اعتدت عليها.تخصيص الذاكرة الديناميكية والتحرير الصريح للذاكرة.لا يقوم وقت تشغيل .NET بإدارة الذاكرة نيابةً عنك، ومن ثم فهو "غير مُدار".

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

كما ذكرت أعلاه، من الممكن كتابة تعليمات برمجية مُدارة وغير مُدارة.

غير مُدار:

class Bar : public Foo {
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int * getFubar() { return * fubar; }
}

مُدار:

public ref class Bar :  public Foo
    private:
            int fubar;
    public:
            Bar(int i) : fubar(i) {}
            int ^ getFubar() { return ^ fubar; }
}

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

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

رسميًا، قد يعود الأمر المُدار/غير المُدار إلى طريقة تنفيذ التعليمات البرمجية على مكدس .NET.ومع ذلك، إذا كنت قادمًا من خلفية C++، آمل أن يكون هذا أكثر ملاءمة لك قليلاً.

مُدارة تعني أن التعليمات البرمجية لا يتم تجميعها إلى تعليمات برمجية أصلية، وبالتالي يتم تشغيلها تحت رعاية جهاز افتراضي.تقوم Java بالتجميع إلى تنسيق وسيط يسمى bytecode، والذي يعرف Java VM كيفية تفسيره وتنفيذه.جميع لغات .NET تفعل شيئًا مشابهًا، حيث يتم التحويل إلى IL (اللغة المتوسطة) التي يفسرها وقت تشغيل .NET.إنه أمر مربك بعض الشيء لأن .NET IL له نهايات ملفات .dll و.exe.

على المدى تمكنت يتم تطبيقه عمومًا على .NET فقط لأن Microsoft تستخدم هذا المصطلح.لا تستخدم Microsoft بشكل عام مصطلح "الجهاز الظاهري" للإشارة إلى بيئة التنفيذ المُدارة بواسطة .NET.

يختلف "رمز بايت" (IL) الخاص بـ .NET إلى حد ما عن رمز Java bytecode من حيث أنه تم تصميمه بشكل صريح ليتم تجميعه في تعليمات برمجية أصلية قبل التنفيذ في البيئة المُدارة، في حين تم تصميم Java ليتم تفسيرها، ولكن مفهوم التعليمات البرمجية المستقلة عن النظام الأساسي إنه متشابه.

".NET Framework" هو في الأساس مجموعة ضخمة من المكتبات التي توفرها شركة Microsoft، والتي تحتوي على آلاف الفئات التي يمكن استخدامها لتطوير التطبيقات.

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

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

أو بعبارة أخرى، أيهما تفضل استخدامه:

أ) تعليمات برمجية غير مُدارة قد تؤدي إلى أشياء لا يمكن التحكم فيها بالنظام.

ب) تعليمات برمجية أصلية مجمعة وسريعة ومتينة وقريبة من نظام التشغيل.

بالطبع، هم في الواقع نفس الشيء.

وعلى نفس المنوال، هل .NET لغة أم إطار عمل، وماذا يعني بالضبط "إطار العمل" هنا؟<<

.NET هو النظام الأساسي الحالي لبرامج المؤسسات من Microsoft.إنها تتكون من:

• واجهة عالمية واحدة للوصول إلى وظائف Windows:

o The .NET Framework Class Library (FCL).
o The FCL provides a rich set of high-level functionality for developers.

• لغة عالمية واحدة ووقت تشغيل واحد لتنفيذ تطبيقات .NET:

o Common Language Runtime (CLR) executes Common Intermediate Language (CIL).
o The CLR is God: it runs, controls, and polices everything.

• اختيار لغات متعددة لتطوير تطبيقات .NET:

o Every development language is compiled to CIL, which is run by the CLR.
o C# and VB are the two main development languages.

.NET هو إطار عمل.ينفذ وقت تشغيل اللغة العامة (CLR) كود Microsoft Intermediate Language (MSIL) الذي يتم إنشاؤه عند تجميع الحل (أي لا يتم تجميعه إلى رمز الجهاز).لا يمكنك احتواء واجهة برمجة التطبيقات (API) داخل ملف exe، ولن ترغب في ذلك لأنها كبيرة جدًا.الفائدة الرئيسية هنا هي إدارة الذاكرة (من بين بعض المزايا الأمنية الأخرى وربما مزايا أخرى لا أعرف عنها).

يمكنني الإجابة على السؤال الإطاري..NET عبارة عن إطار عمل، وC#، وVB.NET، وما إلى ذلك هي لغات.يوفر .NET بشكل أساسي نظامًا أساسيًا مشتركًا للمكتبات للاتصال (كل النظام....dlls) التي يمكن لأي لغة تستخدم .NET الاتصال بها.يتم تجميع جميع لغات .NET في MSIL (لغة Microsoft المتوسطة، المعروفة باسم IL فقط) والتي يمكن بعد ذلك تشغيلها على أي جهاز كمبيوتر مثبت عليه إطار عمل .NET المناسب.

.NET هو إطار عمل.يمكن استخدامه من العديد من اللغات (VB.NET، C#، IronPython، boo، إلخ)

يتم تنفيذ .NET دائمًا كما تم تفسيره، ولا يمكنك تضمين "VM" داخل ملف exe.يجب على أي مستخدم يرغب في تشغيل تطبيق .NET الخاص بك أن يكون لديه إطار العمل مثبتًا.

يمكن أن يشير إلى أي تعليمات برمجية يتم تنفيذها بواسطة جهاز افتراضي وليس مباشرة بواسطة وحدة المعالجة المركزية.

أعتقد أن هذا يمكّن أشياء مثل جمع البيانات المهملة والتحقق من حدود المصفوفة.

أنا شخصياً أعتقد أن كلمة "إطار" هي تسمية خاطئة إلى حد ما.

.NET عبارة عن "منصة" تتكون من بيئة تنفيذ (جهاز CLR الظاهري) ومجموعة من المكتبات.إنه مشابه تمامًا لـ Java أو Perl أو Python (لم تتم الإشارة إلى أي منها على الإطلاق باسم "أطر العمل").

في معظم الحالات، يتم استخدام كلمة "إطار العمل" للإشارة إلى مشاريع مثل Spring أو Struts أو QT، والتي تقع فوق منصة (أي لا توفر بيئة تنفيذ خاصة بها) مثل المكتبة.

ولكن على عكس "المكتبة"، يسعى الإطار إلى إعادة تعريف العمليات الأساسية للمنصة الأساسية.(يتحدى حقن تبعية Spring منطق استدعاء المُنشئ لكود Java العادي.إن تنفيذ الإشارات والفتحات الخاصة بـ QT يتحدى كود C++ العادي.)

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

التعليمات البرمجية المُدارة - MSIL وIL والتعليمات البرمجية المُدارة هي نفسها. عندما نبني تطبيقنا، يتم إنشاء ملفات .dll أو .exe في مجلد Bin. تُسمى هذه الملفات باسم التعليمات البرمجية المُدارة. وفي وقت لاحق، يتم إعطاء هذه الملفات إلى CLR لإنشاء Native الكود الذي يمكن أن يفهمه نظام التشغيل.

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