Ortak Ara Dil - Common Intermediate Language

Ortak Ara Dil (CIL), önceden Microsoft Ara Dil (MSIL) veya Orta Düzey Dil (IL),[1] ... ara dil içinde tanımlanan ikili komut seti Ortak Dil Altyapısı (CLI) spesifikasyonu.[2] CIL talimatları, CLI uyumlu bir çalışma ortamı tarafından yürütülür. Ortak dil çalışması. CLI'yi hedefleyen diller CIL'e derlenir. CIL nesne odaklı, yığın tabanlı bayt kodu. Tipik çalışma zamanları tam zamanında CIL talimatlarını derlemek yerel kod.

CIL, .NET dillerinin beta sürümleri sırasında orijinal olarak Microsoft Orta Dili (MSIL) olarak biliniyordu. Standardizasyonundan dolayı C # ve CLI, bayt kodu artık resmi olarak CIL olarak biliniyor.[3] Windows Defender virüs tanımları, kendisiyle birlikte MSIL olarak derlenen ikili dosyalara başvurmaya devam eder.[4]

Genel bilgi

Derleme sırasında CLI programlama dilleri, kaynak kodu platforma veya işlemciye özgü yerine CIL koduna çevrilir nesne kodu. CIL bir İşlemci - ve Ortak Dil Altyapısını destekleyen herhangi bir ortamda yürütülebilen platformdan bağımsız talimat seti, örneğin .NET çalışma zamanı açık pencereler, ya da çapraz platform Mono Çalışma süresi. Teorik olarak, bu, farklı platformlar ve CPU türleri için farklı yürütülebilir dosyalar dağıtma ihtiyacını ortadan kaldırır. CIL kodu, çalışma sırasında güvenlik açısından doğrulanır ve yerel olarak derlenen yürütülebilir dosyalardan daha iyi güvenlik ve güvenilirlik sağlar.[5][6]

Yürütme süreci şuna benzer:

  1. Kaynak kodu CIL'e dönüştürülür bayt kodu ve bir CLI montajı yaratıldı.
  2. Bir CIL derlemesinin yürütülmesi üzerine, kodu çalışma zamanının JIT derleyicisi yerel kod oluşturmak için. Zamanın ilerisinde derleme de kullanılabilir, bu da bu adımı ortadan kaldırır, ancak yürütülebilir dosya taşınabilirliği pahasına.
  3. Bilgisayarın işlemcisi yerel kodu yürütür.

Talimatlar

CIL bayt kodu Talimatlar aşağıdaki görev grupları için:

Hesaplamalı model

Ortak Ara Dil, nesne yönelimli ve yığın tabanlı Bu, komut parametrelerinin ve sonuçlarının, çoğu kayıtta olduğu gibi, birkaç yazmaç veya diğer bellek yerleri yerine tek bir yığın üzerinde tutulduğu anlamına gelir. Programlama dilleri.

İçine iki sayı ekleyen kod x86 derleme dili eax ve edx iki farklı genel amaçlı kayıtlar:

Ekle eax, edx

İçinde olabilir ara dil (IL) şöyle görünür, burada 0 eax ve 1 edx'tir:

ldloc.0    // yerel değişken 0'ı yığına itldloc.1    // yerel değişken 1'i yığına itEkle        // pop ve en üstteki iki yığın öğesini ekleyin ve ardından sonucu yığına itinstloc.0    // en üst yığın öğesini 0 yerel değişkenine pop ve sakla

İkinci örnekte, eax ve edx olmak üzere iki kaydın değerleri ilk önce yığın üzerine itilir. Ekleme talimatı çağrıldığında, işlenenler "açılır" veya geri alınır ve sonuç yığın üzerinde "itilir" veya depolanır. Ortaya çıkan değer daha sonra yığından çıkarılır ve eax'ta saklanır.

Nesneye yönelik kavramlar

CIL, nesne yönelimli olacak şekilde tasarlanmıştır. Nesneler oluşturabilir, yöntemleri çağırabilir ve alanlar gibi diğer üye türlerini kullanabilirsiniz.

Her yöntem bir sınıfta ikamet etme ihtiyacı (bazı istisnalar dışında). Bu statik yöntem de öyle:

.sınıf halka açık Foo {    .yöntem halka açık statik int32 Ekle(int32, int32) cil yönetilen {        .maxstack 2        ldarg.0 // ilk bağımsız değişkeni yükle;        ldarg.1 // ikinci bağımsız değişkeni yükle;        Ekle     // onları ekle;        ret     // sonucu döndür;    }}

Foo yöntemi, statik olarak bildirildiği için herhangi bir Foo örneğinin bildirilmesini gerektirmez ve daha sonra C # 'da şu şekilde kullanılabilir:

int r = Foo.Ekle(2, 3);    // 5

CIL'de şöyle görünecektir:

ldc.i4.2ldc.i4.3telefon etmek int32 Foo::Ekle(int32, int32)stloc.0

Örnek sınıfları

Bir örnek sınıfı en az bir tane içerir kurucu ve bazı örnek üyeler. Aşağıdaki sınıf, bir Car nesnesinin eylemlerini temsil eden bir dizi yönteme sahiptir.

.sınıf halka açık Araba {    .yöntem halka açık özel isim rtspecialname örnek geçersiz .ctor(int32, int32) cil yönetilen {        / * Yapıcı * /    }    .yöntem halka açık geçersiz Hareket(int32) cil yönetilen { / * Uygulama atlanıyor * / }    .yöntem halka açık geçersiz Sağa dönün() cil yönetilen { / * Uygulama atlanıyor * / }    .yöntem halka açık geçersiz Sola çevirin() cil yönetilen { / * Uygulama atlanıyor * / }    .yöntem halka açık geçersiz Fren() cil yönetilen { / * Uygulama atlanıyor * / }}

Nesne oluşturma

C # sınıfında örnekler şu şekilde oluşturulur:

Araba arabam = yeni Araba(1, 4); Araba senin araban = yeni Araba(1, 3);

Ve bu ifadeler kabaca CIL'deki şu talimatlarla aynıdır:

ldc.i4.1ldc.i4.4Newobj örnek geçersiz Araba::.ctor(int, int)stloc.0    // myCar = new Car (1, 4);ldc.i4.1ldc.i4.3Newobj örnek geçersiz Araba::.ctor(int, int)stloc.1    // arabanız = new Car (1, 3);

Örnek yöntemlerini çağırma

Örnek yöntemleri aşağıdaki gibi C # 'da çağrılır:

arabam.Hareket(3);

CIL'de çağrıldığı gibi:

ldloc.0    // Yığın üzerine "myCar" nesnesini yükleyinldc.i4.3telefon etmek örnek geçersiz Araba::Hareket(int32)

Meta veriler

Ortak Dil Altyapısı (CLI) derlenen sınıflar hakkındaki bilgileri şu şekilde kaydeder: meta veriler. Tür kitaplığı gibi Bileşen Nesne Modeli Bu, uygulamaların montajdaki arabirimleri, sınıfları, türleri, yöntemleri ve alanları desteklemesini ve keşfetmesini sağlar. Bu tür meta verileri okuma sürecine "yansıma ".

Meta veriler, "öznitelikler" biçimindeki veriler olabilir. Özellikler genişletilerek özelleştirilebilir. Öznitelik sınıf. Bu güçlü bir özelliktir. Sınıfın yaratıcısına, sınıfın tüketicilerinin uygulama alanına bağlı olarak çeşitli anlamlı şekillerde kullanabilecekleri ekstra bilgilerle süsleme yeteneği sağlar.

Misal

Aşağıda temel bir Selam Dünya CIL ile yazılmış program. "Merhaba dünya!" Dizesini gösterecektir.

.montaj Merhaba {}.montaj dış mscorlib {}.yöntem statik geçersiz Ana(){    .giriş noktası    .maxstack 1    ldstr "Selam Dünya!"    telefon etmek geçersiz [mscorlib]Sistemi.Konsol::Yazı çizgisi(dizi)    ret}

Aşağıdaki kod, işlem kodlarının sayısında daha karmaşıktır.

Bu kod, hakkındaki makaledeki karşılık gelen kodla da karşılaştırılabilir. Java bayt kodu.

statik geçersiz Ana(dizi[] argümanlar){    için (int ben = 2; ben < 1000; ben++)    {        için (int j = 2; j < ben; j++)        {             Eğer (ben % j == 0)                 git dış;        }        Konsol.Yazı çizgisi(ben);        dış:;    }}

CIL sözdiziminde şuna benzer:

.yöntem özel Hidebysig statik geçersiz Ana(dizi[] argümanlar) cil yönetilen{    .giriş noktası    .maxstack  2    .yerliler içinde (int32 V_0,                  int32 V_1)              ldc.i4.2              stloc.0              br.s       IL_001f    IL_0004:  ldc.i4.2              stloc.1              br.s       IL_0011    IL_0008:  ldloc.0              ldloc.1              rem              kaba.s  IL_001b              ldloc.1              ldc.i4.1              Ekle              stloc.1    IL_0011:  ldloc.1              ldloc.0              blt.s      IL_0008              ldloc.0              telefon etmek       geçersiz [mscorlib]Sistemi.Konsol::Yazı çizgisi(int32)    IL_001b:  ldloc.0              ldc.i4.1              Ekle              stloc.0    IL_001f:  ldloc.0              ldc.i4     0x3e8              blt.s      IL_0004              ret}

Bu sadece CIL'in nasıl göründüğünün bir temsilidir. sanal makine (VM) seviyesi. Derlendiğinde, yöntemler tablolarda saklanır ve talimatlar derlemenin içinde bayt olarak depolanır; Taşınabilir Yürütülebilir (PE).

Nesil

Bir CIL derlemesi ve yönergeleri, bir derleyici veya adı verilen bir yardımcı program tarafından oluşturulur. IL Assembler (ILAsm ) yürütme ortamıyla birlikte gönderilen.

Montajlı CIL ayrıca, kullanılarak tekrar koda ayrılabilir. IL Dağıtıcı (ILDASM). Gibi başka araçlar da var .NET Reflektörü CIL'i yüksek seviyeli bir dile (ör. C # veya Visual Basic ). Bu, CIL'i tersine mühendislik için çok kolay bir hedef haline getirir. Bu özellik paylaşılıyor Java bayt kodu. Ancak, bunu yapabilen araçlar vardır. şaşırtmak kodun kolayca okunabilmesi, ancak yine de çalıştırılabilir olması için yapın.

Yürütme

Tam zamanında derleme

Tam zamanında derleme (JIT), bayt kodunu CPU tarafından hemen çalıştırılabilir koda dönüştürmeyi içerir. Dönüştürme, programın yürütülmesi sırasında kademeli olarak gerçekleştirilir. JIT derlemesi ortama özel optimizasyon, çalışma zamanı sağlar tip güvenliği ve montaj doğrulaması. Bunu başarmak için, JIT derleyicisi herhangi bir yasa dışı erişim için derleme meta verilerini inceler ve ihlalleri uygun şekilde ele alır.

Zamanın ilerisinde derleme

CLI -uyumlu yürütme ortamları ayrıca Zamanın ilerisinde derleme (AOT) bir derlemenin, JIT işlemini çalışma zamanında kaldırarak daha hızlı çalışmasını sağlamak için.

İçinde .NET Framework adında özel bir araç var Yerel Görüntü Oluşturucu (NGEN) AOT'yi gerçekleştirir. AOT için farklı bir yaklaşım CoreRT Net Core kodunun çalışma zamanına bağımlı olmaksızın tek bir yürütülebilir dosyada derlenmesine izin verir. İçinde Mono AOT yapma seçeneği de vardır.

İşaretçi talimatları - C ++ / CLI

Java'nın bayt kodundan önemli bir fark, CIL'in, C / C ++ kodunu CIL'de derlemek için gereken veri / işlev işaretçileri manipülasyonu için yeterli olan ldind, stind, ldloca ve birçok çağrı talimatıyla birlikte gelmesidir.

sınıf Bir {   halka açık: gerçek geçersiz __stdcall meth() {}};geçersiz test_pointer_operations(int param) {	int k = 0;	int * ptr = &k;	*ptr = 1;	ptr = &param;	*ptr = 2;	Bir a;	Bir * ptra = &a;	ptra->meth();}

CIL'deki ilgili kod şu şekilde oluşturulabilir:

.yöntem montaj statik geçersiz modopt([mscorlib]Sistemi.Çalışma süresi.CompilerServices.CallConvCdecl)         test_pointer_operations(int32 param) cil yönetilen{  .vtentry 1 : 1  // Kod boyutu 44 (0x2c)  .maxstack  2  .yerliler ([0] int32* ptr,           [1] değer türü Bir* V_1,           [2] değer türü Bir* a,           [3] int32 k)// k = 0;  IL_0000:  ldc.i4.0   IL_0001:  stloc.3// ptr = & k;  IL_0002:  Idloca.s   k // yerel adres talimatını yükle  IL_0004:  stloc.0// * ptr = 1;  IL_0005:  ldloc.0  IL_0006:  ldc.i4.1  IL_0007:  zor.i4 // yönlendirme talimatı// ptr = & param  IL_0008:  Ldarga.s   param // parametrenin adres talimatını yükle  IL_000a:  stloc.0// * ptr = 2  IL_000b:  ldloc.0  IL_000c:  ldc.i4.2  IL_000d:  zor.i4// a = yeni A;  IL_000e:  Idloca.s   a  IL_0010:  telefon etmek       değer türü Bir* modopt([mscorlib]Sistemi.Çalışma süresi.CompilerServices.CallConvThiscall) 'Bir.{ctor}'(değer türü Bir* modopt([mscorlib]Sistemi.Çalışma süresi.CompilerServices.IsConst) modopt([mscorlib]Sistemi.Çalışma süresi.CompilerServices.IsConst))  IL_0015:  pop// ptra = & a;  IL_0016:  Idloca.s   a  IL_0018:  stloc.1// ptra-> meth ();  IL_0019:  ldloc.1  IL_001a:  çift  IL_001b:  ldind.i4 // sanal çağrı için VMT'yi okuma  IL_001c:  ldind.i4  IL_001d:  Calli      yönetilmeyen stdcall geçersiz modopt([mscorlib]Sistemi.Çalışma süresi.CompilerServices.CallConvStdcall)(yerli int)  IL_0022:  ret} // 'Global Fonksiyonlar' metodunun sonu :: test_pointer_operations

Ayrıca bakınız

Referanslar

  1. ^ "Orta Düzey Dil ve uygulama".
  2. ^ "ECMA-335 Ortak Dil Altyapısı (CLI)" (PDF). s. 32.
  3. ^ ".NET'te Ara Dil (IL) / MSIL / CIL nedir". Alındı 2011-02-17. CIL: ... [a] 'yı derlediğimizde. NET projesi, doğrudan ikili koda değil, ara dile dönüştürülür. Bir proje çalıştırıldığında, her .NET programlama dili ikili koda CIL'e dönüştürülür. CIL'in yalnızca çalışma zamanında gerekli olan bir kısmı ikili koda dönüştürülür. .NET'in DLL ve EXE dosyası da CIL biçimindedir.
  4. ^ "HackTool: MSIL / SkypeCracker". Microsoft. Alındı 26 Kasım 2019.
  5. ^ Troelsen, Andrew (2009-05-02). CIL'in Faydaları. ISBN  9781590598849. Alındı 2011-02-17.
  6. ^ "C ++, Yönetilen ve .Net Framework için Yönetilmeyen, Yönetilen Uzantılar". www.visualcplusdotnet.com. Alındı 2020-07-07.

Dış bağlantılar