رضوى العربي

التصريف في الوقت المناسب (JIT compilation)

يَعتمِد إطار عمل ‎.NET framework على التَصرِّيف في الوقت المناسب (Just-In-Time compilation)، والذي يَختلف عن كلًا من التَصرِّيف المُسبَق (Ahead-of-time compilation) والتفسير (Interpretation).

باختصار، لا تُصرَّف الشيفرة المصدرية (source code) المكتوبة بأيّ من اللغات المُدعَّمة مثل C#‎ أو F#‎ أو Visual Basic إلى لغة الآلة (machine code) مُباشرة كما في التَصرِّيف المُسبَق (AOT compilation)، وإنما تُصرَّف أولًا إلى اللغة الوسيطة المشتركة (Common Intermediate Language (CIL، وهي لغة مُنخَفِضة المستوى وقريبة من لغة الآلة ولكنها غير مُرتبطة بمنصة (platform) معينة.

تُنفَّذ شيفرة اللغة الوسيطة داخل بيئة تَّنفيذ افتراضية تُسمى بيئة التَّنفيذ المُشتركة Common Language Runtime (CLR) بإطار عمل ‎.NET framework. تَتضمَّن هذه البيئة مُصرِّف آني وقت التَّنفيذ JIT compiler، والذي يُصرِّف تلك اللغة الوسيطة أثناء زمن التَّنفيذ (runtime) إلى لغة الآلة الخاصة بالمنصة التي تُنفَّذ عليها الشيفرة.

بيئة التنفيذ المشتركة (CLR)

تُعدّ بيئة التَّنفيذ المشتركة Common Language Runtime (CLR)‎ جزءً أساسيًا من إطار عمل ‎.NET framework. وهي بالأساس بيئة تَّنفيذ افتراضية، وتَتضمَّن التالي:

  • لغة بايتكود مَحمولة تُعرَف باسم اللغة المشتركة الوسيطة Common Intermediate Language (CIL or IL)‎.
  • مُصرِّف آني وقت التَّنفيذ JIT compiler، يُحوِّل شيفرة البايت (bytecode) إلى لغة الآلة الفعلّية (machine code) عند الحاجة.
  • كَانِس مُهملات (garbage collector) والذي يُوفِّر إدارة أوتوماتيكية للذاكرة.
  • تَستخدِم عمليات فرعية (sub-processes) مُنفصلة تُعرَف باسم AppDomains لضمان عزل البرامج.
  • تَستخدِم العديد من أساليب تَوفِّير الآمان مثل التَحقُّق من الشيفرة (verifiable code) ومستويات الثقة (trust levels).

عادةً ما يُشار إلى الشيفرة التي تُنفَّذ داخل بيئة التَّنفيذ المشتركة (CLR) باسم الشيفرة المُدارة (managed code) بخلاف الشيفرة التي تُنفَّذ خارجها، ويُشار إليها بطبيعة الحال باسم الشيفرة غير المُدارة (unmanaged code). تَتوفَّر العديد من الطرائق لتسهيل التعامل بين الشيفرات من كلا النوعين.

مثال "أهلًا بالعالم"

على الرغم من شيوع استخدام كلًا من اللغات C#‎، و Visual Basic و F#‎ بإطار عمل ‎.NET، يُمكن أيضًا لأي لغة برمجية -متوافقة مع معايير البنية التحتية للغة الوسيطة (Common Language Infrastructure CLI)- أن تُصرَّف إلى اللغة الوسيطة المشتركة (CIL)، وتُنفَّذ ببيئة التَّنفيذ المُشتركة (CLR).

لغة C#‎

using System;
class Program
{
    // هذه الدالة هي أول ما يُنفذ بالبرنامج
    static void Main()
    {
        // أرسل السلسلة النصية "أهلًا بالعالم" إلى الخرج القياسي
        Console.WriteLine("Hello World");
    }
}

يوجد العديد من التحميلات الزائدة للتابع Console.WriteLine. في المثال باﻷعلى، السِلسِلة النصية Hello World هي مُعامِل للتابع. عند تنفيذ البرنامج، يُرسل التابع السِلسِلة النصية المُمررة إليه Hello World إلى مجرى الخْرج القياسي.

تَستدعي بعض التحميلات الزائدة (overloads) الآخرى التابع ToString من خلال الوسيط، قبل أن تُرسل النتيجة إلى مجرى الخْرج القياسي. اطلع على توثيق إطار عمل .NET لمزيد من المعلومات.

رابط مثال حي

الشيفرة المكافئة باللغة الوسيطة IL (والتي ستُصرَّف باستخدام مُصرِّف آني وقت التَّنفيذ JIT):

// Microsoft (R) .NET Framework IL Disassembler. Version 4.6.1055.0
// Copyright (c) Microsoft Corporation. All rights reserved.
// Metadata version: v4.0.30319
.assembly extern mscorlib
{
.publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4..
.ver 4:0:0:0
}
.assembly HelloWorld
{
.custom instance void
[mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 )
.custom instance void
[mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00
54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx
63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows.
// --- The following custom attribute is added automatically, do not uncomment -------
// .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype
[mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00
0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 ) // ...HelloWorld..
.custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = (
01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) =
( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01
00 00 00 00 )
.custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01
00 0A 48 65 6C 6C 6F 57 6F 72 6C 64 00 00 ) // ...HelloWorld..
.custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01
00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // ...Copyright ..
20 32 30 31 37 00 00 ) // 2017..
.custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01
00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) =
( 01 00 00 00 00 )
.custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01
00 24 33 30 38 62 33 64 38 36 2D 34 31 37 32 // ..$308b3d86-4172
2D 34 30 32 32 2D 61 66 63 63 2D 33 66 38 65 33 // -4022-afcc-3f8e3
32 33 33 63 35 62 30 00 00 ) // 233c5b0..
.custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = (
01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0..
.custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string)
= ( 01 00 1C 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ....NETFramework
2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 2E 32 01 // ,Version=v4.5.2.
00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 // .T..FrameworkDis
70 6C 61 79 4E 61 6D 65 14 2E 4E 45 54 20 46 72 // playName..NET Fr
61 6D 65 77 6F 72 6B 20 34 2E 35 2E 32 ) // amework 4.5.2
.hash algorithm 0x00008004
.ver 1:0:0:0
}
.module HelloWorld.exe
// MVID: {2A7E1D59-1272-4B47-85F6-D7E1ED057831}
.imagebase 0x00400000
.file alignment 0x00000200
.stackreserve 0x00100000
.subsystem 0x0003 // WINDOWS_CUI
.corflags 0x00020003 // ILONLY 32BITPREFERRED
// Image base: 0x0000021C70230000
// =============== CLASS MEMBERS DECLARATION ===================
.class private auto ansi beforefieldinit HelloWorld.Program
extends [mscorlib]System.Object
{
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
// Code size 13 (0xd)
.maxstack 8
IL_0000: nop
IL_0001: ldstr "Hello World"
IL_0006: call void [mscorlib]System.Console::WriteLine(string)
IL_000b: nop
IL_000c: ret
} // end of method Program::Main
.method public hidebysig specialname rtspecialname
instance void .ctor() cil managed
{
// Code size 8 (0x8)
.maxstack 8
IL_0000: ldarg.0
IL_0001: call instance void [mscorlib]System.Object::.ctor()
IL_0006: nop
IL_0007: ret
} // end of method Program::.ctor
} // end of class HelloWorld.Program
Generated with MS ILDASM tool (IL disassembler)

لغة F#‎

open System
[<EntryPoint>]
let main argv =
        printfn "Hello World"
        0        

رابط مثال حي

لغة Visual Basic

Imports System
Module Program
    Public Sub Main()
        Console.WriteLine("Hello World")
    End Sub
End Module

رابط مثال حي

لغة C++/CLI

using namespace System;
int main(array<String^>^ args)
{
    Console::WriteLine("Hello World");
}

اللغة الوسيطة IL

.class public auto ansi beforefieldinit Program
extends [mscorlib]System.Object
{
    .method public hidebysig static void Main() cil managed
    {
        .maxstack 8
        IL_0000: nop
        IL_0001: ldstr "Hello World"
        IL_0006: call void [mscorlib]System.Console::WriteLine(string)
        IL_000b: nop
        IL_000c: ret
    }

    .method public hidebysig specialname rtspecialname
    instance void .ctor() cil managed
    {
        .maxstack 8
        IL_0000: ldarg.0
        IL_0001: call instance void [mscorlib]System.Object::.ctor()
        IL_0006: ret
    }
}

لغة PowerShell

Write-Host "Hello World"

لغة Nemerle

System.Console.WriteLine("Hello World");

لغة Python

print "Hello World"
import clr
from System import Console
Console.WriteLine("Hello World")

لغة Oxygene

namespace HelloWorld;

interface

type
    App = class
    public
            class method Main(args: array of String);
    end;


implementation


class method App.Main(args: array of String);
begin
        Console.WriteLine('Hello World');
end;




end.

لغة Boo

print "Hello World"

1.4: إصدارات إطار عمل ‎.NET

إطار عمل ‎.NET

الإصدار تاريخ الإصدار
1.0 13 فبراير 2002
1.1 24 أبريل 2003
2.0 07 نوفمبر 2005
3.0 06 نوفمبر 2006
3.5 19 نوفمبر 2007
3.5 SP1 11 أغسطس 2008
4.0 12 أبريل 2010
4.5 15 أغسطس 2012
4.5.1 17 أكتوبر 2013
4.5.2 05 مايو 2014
4.6 20 يوليو 2015
4.6.1 17 نوفمبر 2015
4.6.2 02 أغسطس 2016
4.7 05 أبريل 2017
4.7.1 17 أكتوبر 2017

إطار عمل ‎.NET Compact

الإصدار تاريخ الإصدار
1.0 01 يناير 2000
2.0 01 أكتوبر 2005
3.5 19 نوفمبر 2007
3.7 01 يناير 2009
3.9 01 يونيو 2013

إطار عمل ‎.NET Micro

الإصدار تاريخ الإصدار
4.2 04 أكتوبر 2011
4.3 04 ديسمبر 2012
4.4 20 أكتوبر 2015

ترجمة -وبتصرف- للفصل Getting started with .NET Framework من كتاب ‎.NET Framework Notes for Professionals





تفاعل الأعضاء


لا توجد أيّة تعليقات بعد



يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن