Before DotNet

  • قبل 2002 مايكروسوفت عملت Delphi, VB, Visual Cpp، بس فكرت تعمل DotNet بسبب مشكلتين:
    1. مقدرش أعمل برنامج يشتغل على كل البلاتفورم المختلفة Can’t create cross platform app
    2. مقدرش أشتغل في نفس البروجكت بأكتر من لغة No cross language
  • عشان نوضح دا لازم نقول الـ Life cycle قبل الـ DotNet كان عامل ازاي
    • عايز أعمل برنامج فبكتب الكود بتاعي
    • الكومبايلر بياخد الكود ويحوله ل Native code اللي هو 0,1 ودا بنسميه platform dependent
      • بيعتمد على ال platform اللي بيتترجم عليه البرنامج ودا لأن ال structure بتاع كل بلاتفورم مختلفة عن التانية

With DotNet 2002

  • DotNet Framework: is a Big Container for software technologies like Web (ASP), Mobile (Xamarin), Desktop (WPF). إطار عمل
  • مع مراعاة أن Xamarin كان في الأصل إطار عمل مستقل ثم أصبح جزء من الـ .NET Ecosystem ككل مع .NET 5 وما بعدها).

بيتكون من حاجتين:

  1. الـ BCL (Base Class Library):
    هذه المكتبات القياسية تضم (Classes) و (Methods) ووظائف جاهزة للاستخدام تغطي نطاقاً واسعاً من الاحتياجات البرمجية. على سبيل المثال:
    • كلاس String التي تتعامل مع النصوص موجودة داخل مكتبة System، وهذه المكتبة ضمن حزمة ضخمة من المكتبات القياسية التي توفرها الـ BCL.
    • مكتبات للتعامل مع الملفات، الشبكات، قواعد البيانات، وغيرها الكثير.
    • الـ BCL يعتبر حجر الأساس الذي تعتمد عليه Technologies ضمن الـ .NET.
  2. الـ CLR (Common language runtime) ويعتبر قلب الـ .NET Framework، فهو المسؤول عن تشغيل التطبيقات المدعومة من .NET. وبيتكون من 3 حاجات:
    1. لغات الـDotNet واشهرهم C#, VB,.NET, F وهذه اللغات بتولد كود وسيط اسمه IL
    2. الكومبيلر بتاع كل لغة يعني مثلًا بتاع C# اسمه Roslyn ودا اللي بيحولها لـ IL
    3. الـ Runtime Components: وهي المسؤولة عن إدارة الذاكرة (Garbage Collection)، معالجة الاستثناءات، تأمين البيئة الافتراضية لتشغيل الكود، وغير ذلك من المهام اللازمة لتشغيل التطبيق.

.NET Code Compilation steps

  1. انت بتكتب الكود بلغة C#، وبعد كده Roslyn (الكومبايلر بتاع C#) بيعمل Compile للكود بتاعك.
  2. بعد الـ Compile الكود بيتحول لـ IL (أو CIL أو MSIL، Common Intermediate Language) وبيتحط جوه فايل اسمه Assembly (سواء كان امتداده DLL أو EXE). الفايل ده هو عبارة عن IL + Metadata، وملوش علاقة بــ “الاسمبلي” العادي (اللغة منخفضة المستوى)، تشابه أسامي بس. يعني الـ “Assembly” بتاع الـ .NET هو حزمة IL و Metadata، مش كود اسمبلي بتاع المعالج.
  3. الفايل بيكون Platform independent الـ IL اللي جوه الـ Assembly ملف مستقل عن أي بلاتفورم (Windows, Linux, Mac). نفس الفايل الـ IL يشتغل على أي منصة فيها CLR مناسب من غير ما تعيد Compile. الفايل دا مش هيأكل عيش عشان الكمبيوتر مبيفهمش غير machine code
  4. بيدخل عملية الـ runtime الـ CLR بتستخدم الـ JIT Compiler (Just In Time Compiler) عشان تاخد الـ IL وتحوله لكود Native (اللي بيفهمه المعالج مباشرة).

Danger

لسا المشكلة بتاع cross platform متحلتش في الـ .NET Framework لأن كل platform (Linux, Mac, win) المفروض يبقا ليهم الـCLR الخاص بيهم وليهم الـ JET compiler الخاص بيهم عشان يعمل المرحلة الأخيرة دي على جهازة والبرامج تشتغل فمايكروسوفت المفروض تعمل لكل platform SDK خاص بيها فيه الـ Compiler بس دا محصلش

Runtime vs Compilation

  • الـ compilation: هي عملية تحويل الـ code لـ IL وبنسخدم فيها compiler زي Roslyn ودا اللي بيظهر فيه الـ Compilation errors
  • الـ Runtime: عملية تحويل الـ IL إلى Native (exe) ودي بنستخدم فيها ال JIT وبيظهر فيه الـ Runtime error

  • الفرق في ال Life cycle قبل وبعد هو الـ JIT ودا هيعملي overhead in runtime وهيبطأ الـ Runtime شوية

عشان يحلوا المشاكل دي:

  1. ال JIT خلاه 64bit ودا أسرع
  2. ال Jitting بيحصل مرة واحدة لما بعمل call function وطالما أنا مقفلتش البرنامج هيفضل زي ما هو ومش هيحتاج يعمل تاني

Note

عندنا وقتين في الـ Life cycle

  • وهي عملية الكومبيلر لـ IL
  • والـ JET compiler ودا الـ .net Framework القديم

دا مش حل كامل للأسف فحلينا المشكلة التانية وهي اني أكتب بأكتر من لغة برمجة بس المشكلة الأولى لسا متحلتش

.NET Core

  • اتعمل في 2014 واتغلب على المشاكل السابقة وظهر للناس في 2016
  • قبلها كان فيه تيم من الديفولبرز شغالين على حاجة اسمها Mono Project/framework وهو عبارة عن حل لمشكلة الـ Cross platform اني أكتب الكود على أكتر من حاجة ويشتغل عليهم كانت حاجة مش رسمية فمكنش فيه سابورت وكان بيبقا دايمًا متأخر version عن DotNet Framework
  • عشان كدا عملوا ال .NET Core

  • الـComponent Based: عندنا حاجة اسمها package manager أقدر انزل منها package/library اللي انا محتاجها في البروجكت بتاعي عن طريق الـ NPM (Nuget.org Package Manager)