28 Şubat 2011 Pazartesi

.Net Mimarisi ve Çalışma Yapısı

.Net, yazılım geliştirmek amacı ile Microsoft tarafından sağlanan bir platformdur. Bünyesinde Visual Studio, .net framework, expression ailesi gibi birçok ürünü barındıran .Net'i, tüm bu ürünlerin tek bir çatı altında toplandığı platform olarak da tanımlayabiliriz.

.Net ile temel olarak Console, Windows, Asp.Net, WPF ve Silverlight uygulamaları geliştirilebildiği gibi Mobile uygulamaları da geliştirilebilir (Windows Mobile işletim sisteminin yüklü olması gerekir). Ancak .Net platformunun temel amacının veritabanı programcılığı olduğunu söylersek yanılmış olmayız.

Mimariye geçmeden önce birkaç temel kavramı tanımlamakta fayda var.

Source Code : Bildiğimiz gibi bilgisayar 0’lar ve 1’lerden anlayan bir makinedir. Bilgisayara bir şeyler yaptırmak istersek onun anlayacağı dil ile, yani 0 ve 1 rakamları ile konuşmalıyız. Günümüz teknolojisinde, programlama dillerinin görevi bu işi kolaylaştırmaktır. Belirli syntax kurallarına uyarak insanlara bir şeyler ifade eden kodlamalar yapmak mümkün. Bir şeyler ifade etmesinden kasıt, baktığımızda ne işe yarayabileceği hakkında fikir sahibi olabilmemizdir. İşte bize anlam ifade eden ve bir arayüz kullanarak yazdığımız bu kodlara kaynak(soruce) kod adını veririz.

Native Code : Kaynak kodların derlenerek makinenin anlayacağı şekle dönüşmüş haline native code adını veririz.

Compile : Kaynak kodların, makinenin anlayacağı dile veya bir ara dile dönüştürülmesi işleme compile(derleme), bu işlemi gerçekleştiren araca da compiler(derleyici) adını veririz.

Örnek olarak C programlama dili ile yazılmış bir kodun derlenmesi olayını inceleyelim :

resim1

Şekilden de anlaşıldığı gibi, yazılan kaynak kodlar bir derleyici aracılığı ile direkt olarak native code’a, yani makinenin anlayacağı dile dönüştürülmektedir. Bu işlem sırasında bir problem ile karşı karşıyayız. Kaynak kodlar ara işlemden geçmeden direkt olarak native code’a dönüştürüldüğü için oluşan native kod yalnızca o işletim sistemine özeldir. Mesela programımızı 32 bit Windows 7 işletim sisteminde derlediğimizi varsayalım. Oluşan program, çift tıklandığında çalışan bir exe olsun. Derlediğimiz makine üzerinde programa çift tıkladığımızda program çalışacaktır. Ancak bu exe dosyasını alıp 64 bit Windows 7 işletim sistemi üzerinde çalıştırmayı denediğimiz zaman program çalışmayacaktır. Bunun nedeni oluşan native code’un yalnızca 32 bit Windows 7 işletim sistemine özgü olmasıdır. Yazılan kaynak kod farklı işletim sistemlerinde derlendiğinde ortaya çıkan native code’lar birbirinden farklıdır.

Şimdi .Net platformunda yazılıp derlenen bir programın çalışmasını inceleyelim:

resim2

.Net bünyesinde mevcut olan programlama dillerini kullanarak oluşturduğumuz kaynak kodu derlediğimiz zaman, kaynak kod hangi dil ile yazılmışsa o dile ait derleyici tarafından (visual studio ilk kurulduğunda hangi programlama dilini kullanacağımızı belirtmemizi ister) derlenir ve assembly oluşur. Assemly, uzantısı .exe veya .dll olan fiziksel bir dosyadır. Assembly içerisinde bulunan IL kodlar makine üzerinde çalıştırılabilir bir kod bloğu değildir.

Assembly içinde;

1)Manifest Dosyanın adı, açıklaması, versiyon numarası ve en önemlisi referans edilen dll dosyalarının listesinin bulunduğu bölümdür. Kısaca, programın kendisi ile ilgili kimlik bilgisidir diyebiliriz.
2)Metadata : Program içerisinde kullanılan tiplerin, sınıfların, üyelerin bulunduğu bölümdür.
3)CIL : Kaynak kodun derlenmesiyle oluşan ve tüm diller için ortak olan IL kodlarının bulunduğu bölümdür. Sözde kod olarak da adlandırılırlar.
4)Resources : Programın kullandığı ses, video, resim vs dosyalarının bulunduğu bölümdür. Her assembly içinde bulunması zorunlu değildir.

Kaynak kodların, kendi derleyicileri ile ortak bir dile çevrilmeleri, dil bağımsızlığını sağlayan en önemli etmendir. Yani programı ister c#.net ile, ister vb.net ile, ister c++.net ile yazalım, oluşan IL kodlar aynı olacaktır. Daha sonra oluşan bu kodlar CLR tarafından yorumlanarak native code’a dönüştürülür. CLR’nin olduğu her ortamda, önceden oluşturulmuş bu IL kodların, o sisteme uygun bir şekilde yorumlanması ile aynı sonucu elde etmek mümkündür. Burada CLR’ın platform bağımsızlığını sağladığını söylersek doğru bir tespitte bulunmuş oluruz.

Ekrana “Hello World” yazdıran basit bir program yazdığımızı düşünelim. .Net bünyesinde bulunan herhangi bir programlama dilini kullanarak kaynak kodları oluşturup derlediğimizi varsayalım. Programı derlediğimiz zaman ortaya çıkan fiziksel dosyanın assembly olduğundan yukarıda bahsetmiştik. Bu oluşuma kadar olan kısım “derleme zamanı (compile-time)” olarak adlandırılır. Yani kaynak kodumuzu yazdık, derledik ve ortaya bir assembly çıktı. Ortaya çıkan assembly çift tıklandığında ise “çalışma zamanı (run-time)” süreci başlar. İşte bu noktada CLR devreye girer ve assembly içerisinde bulunan IL kodları yorumlayarak native code üretir. Oluşan native code, bilgisayar tarafından çalıştırılır ve console ekranında “Hello World” yazısını görürüz.

Debugging

Yazılan programların(büyük projeleri varsayıyorum) sıfır hata ile yazılması imkansızdır. Boyutu değişken olmakla birlikte mutlaka hatalarla karşılaşılır. Zaten bu sebepten dolayı projelerin en önemli aşamalarından biri de bakım aşamasıdır. İşte yazılımlar içerisinde ortaya çıkan bu hatalara bug adını veririz .Debug kelimesini de hata ayıklamak olarak düşünebiliriz. Çalışan bir programın çalışmasını adım adım izleyebilmemizi ve bu esnada istediğimiz sonuçları elde edip edemediğimizi görmemizi sağlayayan bir özelliktir. Debugging işlemi ancak managed platformlar üzerinde gerçekleştirilebilir. Managed plaformu şu şekilde tanımlayabiliriz; yazılan kaynak kodların direkt olarak native koda değil de ortak bir ara dile çevrildiği, ve o ara dilin, başka bir araç tarafından yorumlanarak native koda çevrildiği platformlardır. .Net içerisinde debug kelimesini duyduğumuzda aklımıza ilk gelmesi gereken kavram, oluşan IL kodları işletim sistemi için yorumlayan CLR olmalıdır. Çünkü programa debug yeteneğini kazandıran araç CLR’dır.

CLR’ın 4 temel işlevi vardır:
1) CIL kodları Native Code’a çevirmek.
2) Bellek yönetimini sağlamak.
3) Thread yönetimini sağlamak.
4) Debugging



0 yorum:

Yorum Gönder