.NET Framework dünyası hakkında bahsetmeden önce, Microsoft'un .NET framework'ü çıkarmasına, bir nevi zorlayan nedenlere bakmamiz gerekiyor. Bu makalede .Net'ten önce kullanılan yazılım dilleri ve mimarileri hakkında kısaca bahsetmek gerektiğini düşünüyorum. Bu kısa açıklamadan hemen sonra tekrar .Net platformuna odaklanıp daha detaylı bir açıklama yapabiliriz.
C/Win32 API'de yazılım
Geleneksel olarak Windows tabanlı işletim sistemlerinde yazılım yapabilmek icin C yazılım dili ile birlikte Windows API'lerini (Application Programming Interface) iyi derecede bilmek gerekiyor. Bu zaman alıcı, uğraşlı yöntem kullanılarak çok başarılı programların üretildiği gerçek olsa da, bu yaklaşımın zaman alıcı ver karmaşık olduğunu düşünmeyen çok az sayıda yazılımcı vardır herhalde.
Açık olan ilk problem C yazılım dilinin çok kısa ve öz bir dil olmasıdır. Yazılımcılar, hafıza yönetimini manüel olarak yaptırmak zorunda kalmakla beraber, pointer aritmetiği ve syntax hataları ile mücadele etmekle mahsur kalmaktaydı. Buna ek olarak, C yapısal bir yazılım dilidir, dolayısı ile nesne yönelimli yazılım yaklaşımının sunduğu avantajlardan yararlanmak mümkün değildir. Yüzlerce global metot yazdıgınızda, ve bununla beraber API'lerde belirlenen değişkenler oluşturduğunuzda programınızın karmaşık bir hal alması kaçınılmaz olabilir. Günümüze kadar gelebilmiş bazı eski yazılımların neden bu kadar çok sayıda hata taşıdığını anlamak zor olmasa gerek.
C++/MFC 'de yazılım
C/API üzerinde gerçekleştirilen en büyük yenilik C++ yazılım dilidir. C++ temelde C'nin üzerinde getirilen bir nesne yönelimli katman olarak düşünülebilir. Fakat, C++ yazılımcıları nesne yönelimli programlamanın sunduğu avantajlardan faydalanıyor olsada, C'deki acı dolu yöntemleri kullanmak zorundadırlar.
Karmaşık ve kullanımı zor bir dil olmasına rağmen, birçok C++ framework'ü hala bugün kullanılmaktadır. Örnek verecek olursak, Microsoft Foundation Classes (MFC) yazılımcıların WIN32 programları geliştirmek için kullanabileceği C++ sınıflarından oluşmaktadır. MFC, arka planda bulunan WIN32 API 'sine daha anlaşılır bir yüz ile beraber, sihirbazlar ve makrolar sunmaktadır, fakat kökleri C yazılım diline dayanmasından dolayı hala hata meyilli bir yazılım dili olarak bilinmektedir.
Visual Basic 6.0 'de Yazılım
Genel olarak, kullanımı daha kolay olan şeylerin daha çekici olabimesinden dolayı birçok yazılımcı Visual Basic dünyasına geçiş yaptı. Visual Basic yazılım dilinin bu kadar popüler bir dil olmasının nedenleri arasında, kolayca gelişmiş arayüzler, kod kütüphaneleri ve veri erişiminin, mümkün olduğu kadar az cabayla elde edilebilmesi yatmaktadır. C++'ta olduğu gibi Visual Basic dilinin temelinde de WIN32 API'leri olmasına rağmen, birçok sihirbaz ve kendine özgü veri türleri, sınıflar ve fonksiyonlar kullanarak bu karmaşıklığı oratadan kaldırmayı başardı.
Visual Basic 6.0 yazılım dilinin en büyük eksikliği ise, tam olarak bir nesne yönelimli dil olmamasıdır. Örneğin sınıflar arasında "bu-türdendir" ilişkisini kurmak mümkün değildir, başka bir dille klasik olan kalıtım alınmasına izin vermez. Buna ek olarak Multi-threaded yazılıma, derine dalıp WIN32 API'lerini kullanmak istemediğiniz sürece de izin vermez. (NOT: bu eksiklikler Visual Basic.NET te giderildi).
Java/J2EE de yazılım
Java yazılım dili, tamamen nesne yönelimli olmakla beraber syntax kökleri C++ yazılım diline dayanmaktadır. Birçok yazılımcının farkında olduğu gibi Java'nin sunduğu avantajlar sadece platform bağımsız bir dil olması ile kalmamaktadır. Java, C++'daki birçok syntax'a yönelik kaba pütürleri temizlemeyip bunları Java yazılım diline adapte etmeyi başardı. Java platformu, önceden belirlenmiş paketleri kullanıma açarak, bu paketler içerisinde veritabanı bağlantısı, ve gelişmiş arayüzler geliştirmeyi sunuyor.
Çok zarif bir dil olmasına rağmen, Java ile birlikte gelen olası bir problem, Java'da basladığınız bir yazılımı Java ile bitirmenize sizi zorlmasıdır. Başka dillerle entagrasyona izin vermemesi, aslında Java'nın temelinde yatan platform bağımsızlığı ideolojisine de ters düşmektedir. Bununla beraber çok yoğun ve yüksek miktarda grafik veya sayısal hesaplamalar gerektiren herhangi bir yazılım için ideal bir dil olmaması da bir baska desavantaj olarak düşünülebilir. Bu tür yazılımlar için daha hızlı ve daha derin (örneğin C++ gibi) yazılım dillerinin tercih edilmesi Java için bu aşamada aydınlık bir gelecek belirlememektedir.
COM'da yazılım
Component Object Model (COM) Microsoft'un .NET'ten önce kullandığı Framework'tu. COM'un temelde sunduğu ise, "Sayet benim istediğim şekilde sınıflar oluşturup bunları kurarsan, karşılığında kullanabilecegin bir binary dosyası elde edeceksin." dir.
COM'un güzelliği herhangi bir yazılım dilinden rahatca ona erişip, kullanabilinmesidir. Örnegin C++ kullanılarak geliştirilen bir COM nesnesine VB6 yazılım dilinden erişip kullanabilirsiniz, veya aynı şekilde Delphi'de yazılım yapacak olan bir kimse C kullanılarak oluşturulan bir COM objesine erişebilir, vs. Fakat dikkat etmemiz gereken bir nokta ise, COM objelerinin kalıtıma izin vermemeleridir.
COM çok başarılı bir model olmasına rağmen temelinde çok karmaşıktır. COM binary dosyaları oluşturmayı kolaylaştırmak için çok sayıda framework oluşmaya başladı. Örneğin, Active Template Library (ATL) C++ yazılım dile ile kullanılabilecek birçok sınıf, template, ve makro'yu COM objeleri oluşturmayı kolaylaştırmak için geliştirildi.
Windows DNA'da yazılım
Son birkaç yıldır Microsoft işletim sistemlerine ve çıkardığı ürünlere, internet ile iletişim kurabilecek birçok yenilikler eklemeye başladı. Üzücüdür ki, internet uygulamalarını COM tabanlı Windows Distributed interNet Applications (DNA) mimarisi kullanarak oluşturmak da çok karmaşıktır.
Bu karmaşıklığın en baştaki nedenlerinden biri, Windows DNA'nın çalışabilmesi için ASP, HTML, XML, Javascript, VBScript ve COM(+) gibi teknolojilere ihtiyacı olmasıdır. Problemlerden bir başkası ise bu teknolojilerin, en azından syntax olarak birbirlerinden tamamen bağımsız olmalarıdır. Örneğin Javascript C'ye benzerken VBScript VB6'nin türevidir. Bu tamamen karmaşık bir ortam oluşturmaktadır.
.NET dünyasının sunduğu çözüm
.NET framework'ün sunduğu çözüm ise, herşeyi kökten değiştirmekti. .NET Framework Windows işletim sistemi ailesi üzerinde program oluşturmak için geliştirilen, tamamen yeni bir teknolojidir. Bununla kalmayıp .NET Framework kullanılarak Mac OS X ve birçok Unix/Linux tabanlı işletim sistemleri için de yazılım geliştirmeye olanak sunmaktadır.
.NET Framework'ün kalbinde yatan üç anahtar varlıktan bahsedelim: CLR, CTS ve CLS.
Common Language Runtime (CLR) nin en başlıca görevi, .NET türlerinin bulunması, yüklenmesi ve yönetilmesidir. Bununla beraber CLR hafıza yönetimi ve güvenlik'ten sorumludur. Common Type System (CTS) .NET Framework içerisinde bulunan tüm türlerden sorumludur. Bu türlerin açıklaması (nasıl olmaları gerektiğine dair bilgiler) ve onlar hakkındaki ****data CTS tarafından yönetilmektedir. Common Language Specification (CLS) ise diller arasındaki ortak bir kontrattır.
Bunlara ek olarak .NET içerisinde bulunan temel sınıf kütüphaneleri (Base Class Libraries) tüm diller tarafından kullanılabilen, yazılımı kolaylaştıracak birçok kod parçacıklarıdır. Base Class Library bize input/output, güvenlik ve XML gibi birçok özelliği kullanıma açmaktadır. Bunlardan daha detaylı olarak ileride bahsetmeye devam edeceğiz.
Bu açıklamadan sonra detaylı bir şekilde, .NET Framework içerisinde neler var ve görevlerini daha detaylı açıklamaya geçebiliriz. Fakat bu açıklamaları parçalara bölmemiz gerektiğinden herbiri için özel bir başlık altında detaylı açıklamalar yapmak gerektiğini düşünüyorum.
C/Win32 API'de yazılım
Geleneksel olarak Windows tabanlı işletim sistemlerinde yazılım yapabilmek icin C yazılım dili ile birlikte Windows API'lerini (Application Programming Interface) iyi derecede bilmek gerekiyor. Bu zaman alıcı, uğraşlı yöntem kullanılarak çok başarılı programların üretildiği gerçek olsa da, bu yaklaşımın zaman alıcı ver karmaşık olduğunu düşünmeyen çok az sayıda yazılımcı vardır herhalde.
Açık olan ilk problem C yazılım dilinin çok kısa ve öz bir dil olmasıdır. Yazılımcılar, hafıza yönetimini manüel olarak yaptırmak zorunda kalmakla beraber, pointer aritmetiği ve syntax hataları ile mücadele etmekle mahsur kalmaktaydı. Buna ek olarak, C yapısal bir yazılım dilidir, dolayısı ile nesne yönelimli yazılım yaklaşımının sunduğu avantajlardan yararlanmak mümkün değildir. Yüzlerce global metot yazdıgınızda, ve bununla beraber API'lerde belirlenen değişkenler oluşturduğunuzda programınızın karmaşık bir hal alması kaçınılmaz olabilir. Günümüze kadar gelebilmiş bazı eski yazılımların neden bu kadar çok sayıda hata taşıdığını anlamak zor olmasa gerek.
C++/MFC 'de yazılım
C/API üzerinde gerçekleştirilen en büyük yenilik C++ yazılım dilidir. C++ temelde C'nin üzerinde getirilen bir nesne yönelimli katman olarak düşünülebilir. Fakat, C++ yazılımcıları nesne yönelimli programlamanın sunduğu avantajlardan faydalanıyor olsada, C'deki acı dolu yöntemleri kullanmak zorundadırlar.
Karmaşık ve kullanımı zor bir dil olmasına rağmen, birçok C++ framework'ü hala bugün kullanılmaktadır. Örnek verecek olursak, Microsoft Foundation Classes (MFC) yazılımcıların WIN32 programları geliştirmek için kullanabileceği C++ sınıflarından oluşmaktadır. MFC, arka planda bulunan WIN32 API 'sine daha anlaşılır bir yüz ile beraber, sihirbazlar ve makrolar sunmaktadır, fakat kökleri C yazılım diline dayanmasından dolayı hala hata meyilli bir yazılım dili olarak bilinmektedir.
Visual Basic 6.0 'de Yazılım
Genel olarak, kullanımı daha kolay olan şeylerin daha çekici olabimesinden dolayı birçok yazılımcı Visual Basic dünyasına geçiş yaptı. Visual Basic yazılım dilinin bu kadar popüler bir dil olmasının nedenleri arasında, kolayca gelişmiş arayüzler, kod kütüphaneleri ve veri erişiminin, mümkün olduğu kadar az cabayla elde edilebilmesi yatmaktadır. C++'ta olduğu gibi Visual Basic dilinin temelinde de WIN32 API'leri olmasına rağmen, birçok sihirbaz ve kendine özgü veri türleri, sınıflar ve fonksiyonlar kullanarak bu karmaşıklığı oratadan kaldırmayı başardı.
Visual Basic 6.0 yazılım dilinin en büyük eksikliği ise, tam olarak bir nesne yönelimli dil olmamasıdır. Örneğin sınıflar arasında "bu-türdendir" ilişkisini kurmak mümkün değildir, başka bir dille klasik olan kalıtım alınmasına izin vermez. Buna ek olarak Multi-threaded yazılıma, derine dalıp WIN32 API'lerini kullanmak istemediğiniz sürece de izin vermez. (NOT: bu eksiklikler Visual Basic.NET te giderildi).
Java/J2EE de yazılım
Java yazılım dili, tamamen nesne yönelimli olmakla beraber syntax kökleri C++ yazılım diline dayanmaktadır. Birçok yazılımcının farkında olduğu gibi Java'nin sunduğu avantajlar sadece platform bağımsız bir dil olması ile kalmamaktadır. Java, C++'daki birçok syntax'a yönelik kaba pütürleri temizlemeyip bunları Java yazılım diline adapte etmeyi başardı. Java platformu, önceden belirlenmiş paketleri kullanıma açarak, bu paketler içerisinde veritabanı bağlantısı, ve gelişmiş arayüzler geliştirmeyi sunuyor.
Çok zarif bir dil olmasına rağmen, Java ile birlikte gelen olası bir problem, Java'da basladığınız bir yazılımı Java ile bitirmenize sizi zorlmasıdır. Başka dillerle entagrasyona izin vermemesi, aslında Java'nın temelinde yatan platform bağımsızlığı ideolojisine de ters düşmektedir. Bununla beraber çok yoğun ve yüksek miktarda grafik veya sayısal hesaplamalar gerektiren herhangi bir yazılım için ideal bir dil olmaması da bir baska desavantaj olarak düşünülebilir. Bu tür yazılımlar için daha hızlı ve daha derin (örneğin C++ gibi) yazılım dillerinin tercih edilmesi Java için bu aşamada aydınlık bir gelecek belirlememektedir.
COM'da yazılım
Component Object Model (COM) Microsoft'un .NET'ten önce kullandığı Framework'tu. COM'un temelde sunduğu ise, "Sayet benim istediğim şekilde sınıflar oluşturup bunları kurarsan, karşılığında kullanabilecegin bir binary dosyası elde edeceksin." dir.
COM'un güzelliği herhangi bir yazılım dilinden rahatca ona erişip, kullanabilinmesidir. Örnegin C++ kullanılarak geliştirilen bir COM nesnesine VB6 yazılım dilinden erişip kullanabilirsiniz, veya aynı şekilde Delphi'de yazılım yapacak olan bir kimse C kullanılarak oluşturulan bir COM objesine erişebilir, vs. Fakat dikkat etmemiz gereken bir nokta ise, COM objelerinin kalıtıma izin vermemeleridir.
COM çok başarılı bir model olmasına rağmen temelinde çok karmaşıktır. COM binary dosyaları oluşturmayı kolaylaştırmak için çok sayıda framework oluşmaya başladı. Örneğin, Active Template Library (ATL) C++ yazılım dile ile kullanılabilecek birçok sınıf, template, ve makro'yu COM objeleri oluşturmayı kolaylaştırmak için geliştirildi.
Windows DNA'da yazılım
Son birkaç yıldır Microsoft işletim sistemlerine ve çıkardığı ürünlere, internet ile iletişim kurabilecek birçok yenilikler eklemeye başladı. Üzücüdür ki, internet uygulamalarını COM tabanlı Windows Distributed interNet Applications (DNA) mimarisi kullanarak oluşturmak da çok karmaşıktır.
Bu karmaşıklığın en baştaki nedenlerinden biri, Windows DNA'nın çalışabilmesi için ASP, HTML, XML, Javascript, VBScript ve COM(+) gibi teknolojilere ihtiyacı olmasıdır. Problemlerden bir başkası ise bu teknolojilerin, en azından syntax olarak birbirlerinden tamamen bağımsız olmalarıdır. Örneğin Javascript C'ye benzerken VBScript VB6'nin türevidir. Bu tamamen karmaşık bir ortam oluşturmaktadır.
.NET dünyasının sunduğu çözüm
.NET framework'ün sunduğu çözüm ise, herşeyi kökten değiştirmekti. .NET Framework Windows işletim sistemi ailesi üzerinde program oluşturmak için geliştirilen, tamamen yeni bir teknolojidir. Bununla kalmayıp .NET Framework kullanılarak Mac OS X ve birçok Unix/Linux tabanlı işletim sistemleri için de yazılım geliştirmeye olanak sunmaktadır.
.NET Framework'ün kalbinde yatan üç anahtar varlıktan bahsedelim: CLR, CTS ve CLS.
Common Language Runtime (CLR) nin en başlıca görevi, .NET türlerinin bulunması, yüklenmesi ve yönetilmesidir. Bununla beraber CLR hafıza yönetimi ve güvenlik'ten sorumludur. Common Type System (CTS) .NET Framework içerisinde bulunan tüm türlerden sorumludur. Bu türlerin açıklaması (nasıl olmaları gerektiğine dair bilgiler) ve onlar hakkındaki ****data CTS tarafından yönetilmektedir. Common Language Specification (CLS) ise diller arasındaki ortak bir kontrattır.
Bunlara ek olarak .NET içerisinde bulunan temel sınıf kütüphaneleri (Base Class Libraries) tüm diller tarafından kullanılabilen, yazılımı kolaylaştıracak birçok kod parçacıklarıdır. Base Class Library bize input/output, güvenlik ve XML gibi birçok özelliği kullanıma açmaktadır. Bunlardan daha detaylı olarak ileride bahsetmeye devam edeceğiz.
Bu açıklamadan sonra detaylı bir şekilde, .NET Framework içerisinde neler var ve görevlerini daha detaylı açıklamaya geçebiliriz. Fakat bu açıklamaları parçalara bölmemiz gerektiğinden herbiri için özel bir başlık altında detaylı açıklamalar yapmak gerektiğini düşünüyorum.
