C# Programlama Dili Yazılım mühendisleri geliştirilecek proje için bir programlama dilini seçmek zorunda kaldığında genelikle şu soruyu sorarlar : Hangi programlama dili ile projeyi en etkin ve en hızlı şekilde kullanıma hazır hale getirebilirim? Bu sorunun çözümüne ulaşmak o kadar da kolay olmuyor maalesef. Çözüme zor ulaşmada programlama dillerinin fazla olmasının etkisi omakla beraber her bir programlama dilinin sunduğu standart kütüphanenin farklı olmasının da etkisi oldukça fazladır. Özellikle günümüz iş uygulamaları birden fazla platformu destelemek zorunda kalmıştır. Buda seçilecek uygulama geliştirme ortamının önemini açıkca göstermektedir. Uygulamaların internet ortamına taşınması ile birlikte bir programlama dilinden beklenen özelliklerde doğal olarak değişmiştir. 1970’ li yıllarda bir mikroişlemciyi programlamak ne denli önemli olduysa 2000’li yıllarda interneti programlamak o kadar önemli olmuştur. İnternet’in iş dünyasına girişi ile birlikte geliştirilen uygulamalardan beklenenler de değişmiştir. Bu durum doğal olarak uygulama geliştiricileri doğrudan etkilemiştir. İnternet ortamında çalışan ve dağıtık yapıda çalışabilen çok yönlü bir uygulama geliştirmek eski yöntemlerle imkansız değildir ancak inanılmaz derecede zaman ve insan gücü gerektirmektedir. Bu zorulukları aşmak için gelişen teknolojiye ve isteklere paralel olarak programlama dilleri de doğal gelişim içine girmiştir. Bu özette son yıllarda iş ve kişisel uygulama geliştiricilerin adını sıkça duyduğu C# programlama dili ve diğer dillerle olan ilişkisi kısaca anlatılacaktır. C# programlama dilinin sunduğu imkanları anlatmaya başlamadan önce programlama dillerinin tarihsel gelişimine göz atmak gerekir. Zira C# dili yıllardır yoğun bir şekilde kullanılan C,C++ ve JAVA dillerinin temelleri üzerine kurulmuştur. C dili ve Yapısal Programlama Düşündüklerimizi makinelere yaptırma isteğimizin bir sonucu olarak programlama dilleri doğmuştur. Makineleri anlamak insanoğlu için o kadar da kolay olmamıştır. Zira makinelerin(bilgisayarların) anladığı dilden konuşmak insanlar için gerçekten zor bir iştir. Gün geçtikçe makineleri anlamak ve onları programlamak için yeni arayışlar içine girildi. Somutlaştırılmış makine komutları sayesinde bilgisayarları daha etkili bir şekilde yönetmek mümkün hale gelmiştir. Zaman ilerledikçe bilgisayarlar sadece belirli bilimsel hesaplamaları yapmak için kullanılan araç olmaktan çıkıp insanların yaşamlarında rutin işleri yapabilecek araç haline geldi. Bilgisayarların insanların ihtiyaçlarına hızlı bir şekilde cevap verebilmesi için onları hızlı bir şekilde programlamak gerekiyordu. Klasik yöntemlerle(makine komutlarıyla) hızlı çözümler üretilemez hale gelince daha yüksek seviyeli programlama dillerine ihtiyaç duyuldu. 1980’li yıllarda en çok kullanılan programlama dili olan “C” bu anlamda atılmış büyük bir adımdır. Yapısal programlama modeli her ne kadar C dilinden önce de yapılıyor idiyse de asıl büyük gelişmeler C dili ile birlikte olmuştur. C gibi makine diline göre yüksek seviyeli programlama dilleri ile büyük projeler yapılabiliyordu. Artık uygulamalar sadece bilimsel çalışma aracı olmaktan çıkıp iş dünyasında kullanılabilen uygulamalar haline geldi. Bütün bu iyi gelişmelerin yanında zaman su gibi akıp gidiyordu, buna paralel olarak projeler büyüyor ve teknoloji artan ivmeyle gelişiyordu. Yavaş yavaş anlaşıldı ki C dili çok büyük projelerde yetersiz kalıyordu. Yeni bir programlama modeline ihtiyaç duyuldu ve C++ dilinin temelleri atıldı. C++ ve Nesne Yönelimli Programlama Yapısal programlama modeliyle çok büyük projeleri kontrol altına almak neredeyse imkansızdır. Bu sorunun üstesinden gelmek için yeni bir model gerekiyordu. Nihayet Bjarne Stroustrup tarafından C dili baz alınarak yeni bir programlama dili geliştirildi. Bu dilin adı : C++’tır. C++, C’nin üzerine inşaa edildiği için ilk başlarda “C with Classes”(Sınıflı C) olarak adlandırıldı. Peki bu dil C’den farklı olarak programcılara ne sunuyordu? C++ dilinin sunduğu en büyük yenilik nesne yönelimli programlamayı destekliyor olmasıdır. Nesne yönelimli programlama tekniği günümüzde de yaygın bir şekilde kullanılan bir tekniktir. Bu teknik gerçek hayatı modellemede büyük bir başarı sağlamaktadır. Söz gelimi bir projeyi parçalara ayrıp bu parçalar arasında programlama yolu ile bağlantılar kurmak çok basit hale gelmiştir. Nesne yönelimli programlama tekniği proje geliştirme aşamasında burada sayamayacağımız birçok kolaylık sağlamaktadır. C++ dilinin diğer bir özelliğide C programcılarına hitap etmesiydi. C dilindeki temel kurallar aynen C++ dilinde de mevcuttur. Bu yüzden C++ dilini ve nesne yönelimli programlama tekniğine geçiş yapmak için C dilini iyi bilmek gerekir. Daha doğrusu C++ dilini sadece nesne yönelimli programlamayı destekliyor şeklinde düşünmemek gerekir. Günümüzde birçok alt seviye işlemlerde(haberleşme, işletim sistemi, aygıt sürücüleri) C++ dilinin yoğun bir şekilde kullanılması bunun bir kanıtıdır. İnternetin Gelişimi ve JAVA Dili İnterneti’in gelişimi bilgisayar dünyasındaki en önemli ilerlemelerden birisidir. Programlama dünyasında JAVA dilinin ortaya çıkması en az internetin ilerlemesi kadar önemlidir. Çünkü C ve C++ dilleri ile yalnızca belirli sistemlere yönelik uygulamalar geliştirilebiliyordu. Oysa internet sayesinde birçok farklı sistem birbirine bağlanır hale gelmiştir. Artık sistemlerden bağımsız uygulama geliştirmek gerekiyordu. Daha doğrusu interneti hedef alacak uygulama geliştirmek gerekiyordu. Programcılar gelişen internet ortamına yabancı kalamazdı. Bu amaç doğrultusunda Sun Microsystems isimli firma önceleri OAK olarak anılan JAVA isimli programlama dilini ortaya çıkardı. JAVA, dil olarak C++ dilinin devamı gibi düşünülebilir. Ama amaç tamamen farklıdır. Zira Sun firması ortaya JAVA dili ile birlikte yeni bir uygulama geliştirme modelide sunmaktaydı. Bu programlama modelinde en büyük hedef sistemler arası taşınabilir kod yazmaktır. Yani bir uygulamayı hem Microsoft platformunda hemde Unix ve Linux platformlarında çalıştırabilmek hedeflenmiştir. Böylece geliştirilen uygulamalar işletim sistemi ve işlemciden bağımsız hale gelecektir. Peki sistemler arası bu yüksek taşınabilirlik nasıl olmaktadır? Cevabı basit : Ara Dil. Evet, JAVA dilinde yazılmış kodlar derlendiğinde kodlar makine komutların çevrilmeden “ara kod” denilen “bytecode” a çevrilmektedir. Bytecode’a çevrilen program çalıştırıldığında Java Sanal Makinesi devreye girer ve uygulamanın çalıştırıldığı sisteme özgün makine kodunu üretir. Bu durumda Sun firmasının bir çok sistemde çalışabilecek Java Sanal Makinesi üretmesi gerekiyordu. Nitekim zamanla günümüzde yaygın kullanılan bütün sistemlerde sorunsuz çalışabilecek Java Sanal Makineleri geliştirildi. Hatta şu an için bazı cep telefonları ve çeşitli sim kartlarında bile JAVA programlarını çalıştırabilecek Java Sanal Makineleri mevcuttur. JAVA ile C++ dili her ne kadar birbirine çok benzer olsada aynı kategoride değildir. Elmayla armutu karıştırmamak gerekir. Eğer “JAVA mı C++ mı” diye bir soru sorulursa cevap “her ikisi de” olacaktır. Çünkü ikisininde kullanım amacı farklıdır. Bir firma bir proje için hiçbir zaman bu iki dilden birisini seçmek durumunda kalmayacaktır. JAVA ile aynı kefeye koyabileceğimiz dil birazdan anlatacağım C# dilidir. C# Dili ve .NET Platformu JAVA’nın platform bağımsız kod üretmedeki başarısı su götürmez bir gerçektir. Bir çok kurumsal dev projede JAVA dilinin ve J2EE platformunun olanaklarından faydalanılması bunun en önemli göstergesidir. Günümüzde büyük projelerde birden fazla programlama dili kullanılabilmektedir. Ancak JAVA’nın diller arası uyumlu çalışmaya destek verememesi JAVA’nın bir eksikliği olarak görülmüştür. Diller arası uyumlu çalışma alanında en büyük başarıyı Microsoft firması sağlamıştır. Son dönemlerde sıklıkla kullanılan COM teknolojisi bu uyumluluğa bir örnektir. COM sayesinde farklı dillerde yazılan yazılım parçacıkları diğer bir uygulamada kullanılabilmektedir. JAVA’nın programlamadaki büyük bir boşluğu doldurması onun en büyük rakibi olan Microsoft firmasının gözünden kaçmadı. En sonunda Microsoft’un bir ürünü olan Visual Studio yazılım geliştirme aracına JAVA yı da ekleme kararı aldı. Visual J++ adı altında Windows platformuna entegre edilen JAVA dili bu platformda pek başarılı olamadı. Bu oluşumun başarılı olmadığını gören Microsoft yeni arayışlar içine girdi. Microsoft başkasının malını kendi ürününe entegre etmek yerine kendi ürününü geliştirmeye karar verdi ve .NET yazılım geliştirme platformunu ortaya çıkardı. .NET temel felsefe olarak J2EE platformuna benzemektedir ancak .NET’in derinliklerine daldıkça çok yeni kavramlarla karşılaşırız. Bu yeniliklerden en önemlisi “diller arası uyumluluk” tur. J2EE platformunda sadece JAVA dili kullanılıyorken .NET platformunda birçok dil kulanılabilmektedir. Bu dillerin sayısı oldukça fazladır. Üstelik Microsoft tarafından .NET platformu için sıfırdan yeni bir dil tasarlanmıştır. Yapı olarak C++ ve JAVA dilllerine benzerliği ile bilinen bu dil Anders Hejlsberg tarafından geliştirilen C# (C Sharp)’tan başka bir şey değildir.. JAVA, C++ diline nasıl benziyorsa C# dilide C++ ve JAVA’ya benzemektedir. Programlama modeli yine her üç ortamda da nesne yönelimlidir. Değişen şey bu modelin uygulanış şeklidir. C++’ta kaynak kod derleyici tarafından makine koduna, JAVA’da bytecode’a C#’ta ise IL(Intermediate Language-Ara Dil)’a çevrilmektedir. Burda vurgulanması gereken en önemli nokta JAVA’da bytecode JAVA sanal makinesi tarafından yorumlanarak çalıştırılırken, .NET’te IL kodları derlenerek çalıştırılmaktadır. Hemen şunu da belirtelim ki, derleme işlemi yorumlama işleminden performans açısından daha öndedir. C# dil olarak C++ ve JAVA’ya çok benzemektedir. Bu yüzden C# dilini konuşurken .NET platformunu göz önünde bulundurmalıyız. Dilleri sadece birer araç olarak görmemizde fayda var. İsterseniz lafı daha fazla uzatmadan JAVA/J2EE ve C#/.NET’i karşılaştırıp benzerliklerini ve farklılıklarını ortaya koyalım ardından C#’ı diğer .NET dillerinden ayıran özellikleri inceleyip “neden C#” sorusuna cevap arayalım. C# ile .NET mi JAVA ile J2EE mi? Saf C# ve JAVA dilleri düşünüldüğünde birkaç nokta dışında bu iki dil birbirine benzemektedir. Bu yüzden karşılaştırma yaparken bu dillerin kullanıldıkları platformlarıda göz önünde bulundurmak gerekir. Maadde madde her bir özelliği iki platform için değerlendirelim. 1. Mimari : .NET ve J2EE çalışma biçimi olarak birbirine çok benzer. Her iki platformda da uygulama kaynak kodu ara bir koda dönüştürülür. Aradaki en büyük fark bu ara kodun işletilmesi sırasında görülür. .NET’te ara kod çalışma zamanında derlendikten sonra çalıştırılırken JAVA’da yorumlanarak çalıştırılır. 2. Çalışma Zamanı(Runtime) Mimarisi : J2EE platformundaki Java Sanal Makinesi ile .NET platformundaki CLR(Common Language Runtime) birimi eşdeğerdedir. JVM, bytecode’un işletilmesinden sorumlu iken CLR, IL kodlarının işletilmesinden sorumludur. 3. Sistemler Arası Taşınabilirlik : Teorik olarak C# ve JAVA ile yazılmış uygulamalar sistemden bağımsızdırlar. Günümüzde C# ile .NET ortamında geliştirilen uygulamaların bir çok mobil cihazda ve Windows sistemlerinde kullanıldığını düşünürsek bu teorinin yavaş yavaş gerçeğe dönüştüğü görülebilir. Yakın bir gelecekte .NET altyapısının Linux versiyonunun da çıkacağı bilinmektedir. JAVA ise bu konuda kendisini çoktan kanıtlamış durumdadır. 4. Diller Arası Uyumluluk : J2EE platformunda sadece JAVA dili kullanılırken .NET ortamında C#,C++,VB.NET ve hatta JAVA dili bile kullanılabilmektedir. Üstelik farklı dillerde yazılmış parçacıklar diğer bir dilde sorunsuzca kullanılabilmektedir. Bu sayede bütün programcıların .NET platformunda rahat programlama yapabilmesi sağlanmıştır. .NET uyumlu herhangi bir dilde geliştirilen bütün uygulamalar aynı ara koda dönüştürüldüğü için .NET dilleri arasında büyük performans farklılıkları meydana gelmez. 5. Web Servisi Kullanımı : Web Servisleri dağıtık yapıda geliştirilen uygulamaların temel parçası olmuştur. Özellikle iletişimin XML tabanlı olması web servislerinin önemini göstermektedir. Her iki dil ile web servislerine erişmek mümkün olsada C# ile bir web servisini kullanmak oldukça kolaydır. C# ve .NET’in web servislerine kolay erişmesi bir avantaj olarak görülebilir. 6. Bellek Yönetimi : C#’ta aynen JAVA’da olduğu gibi kullanılan nesneleri toplama programcının görevi değildir. Kullanılmayan gereksiz nesneler gereksiz nesne toplayıcısı tarafından zamanı geldiğinde bellekten silinirler. Buna rağmen C# programcıları isterse belleği kendileri de yönetebilir. Yani C# dilinde bellek adreslerini tutan göstericiler(pointer) hala kullanılabilmektedir. JAVA dilinde bu imkan yoktur. C#’ı JAVA dan ayıran en büyük fark budur. Zira gösterici kullanımı sayesinde geriye dönük uyumlulukta sağlanabilmektedir. Örneğin parametre olarak bir gösterici alan sistem fonksiyonunu C#’ta kullanmak mümkündür. 7. Veri Tipleri : C# dilinin temel felsefesi herşeyin bir nesne olmasıdır. Temel veri türleride dahil olmak üzere herşey birer nesne olarak tanımlanır. C# ve JAVA sağladığı temel veri türleri bakımından birbirlerine çok yakındır. 8. Tekrar Kullanılabilirlik : Nesne yönelimli programlama modelinin en önemli özelliği geliştirilen sınıfların paketlenerek sonradan tekrar tekrar farklı uygulamalarda kullanılabilmesidir. C#’ ta sınıflar isim alanları(namespace) içerisinde paketlenerek diğer uygulamalar içinde kullanılabilir. Java’da ise sınıflar “package” dediğimiz bir kavramla paketlenir. Sonuç olarak her iki dilde eşit oranda bu özelliği desteklemektedir. 9. Kontrol Mekanizmaları : Kodların içinde en çok görülen bloklar olan for,while ve if gibi yapılar her iki dilde de vardır. C#’ta JAVA dilinde olmayan ayrıca foreach döngüsü bulunmaktadır. foreach döngüsü ile koleksiyon tabanlı nesnelerin elemanları arasında tek yönde rahatça dolaşılabilmektedir. 10. Türetme ve Çok Biçimlilik : Nesne yönelimli programlama modelinin C++ dilinden beri kullanılan mekanizmaları olan türetme ve çok biçimlilik her iki dilde de mevcuttur. C++’tan farklı olarak C# ve Java’da sadece tekli türetme mevcuttur. 11. İstisnai Durumları Yönetme : Uygulamların en büyük düşmanı olan istisnai durumların(exceptions) her iki dilde de ele alınış biçimi hemen hemen aynıdır. 12. Sınıf Kütüphanesi : Veritabanı ve dosya işlemleri gibi burada sayamayacağımız bir çok temel işi yapan sınıflar .NET ve J2EE platformunda mevcuttur. Gerek bu sınıfların organizasyonu gerekse de sınıfların kullanılış biçimi bakımından .NET platformunun daha avantajlı olduğunu söyleyebiliriz. Bütün bu maddeler bir bütün olarak ele alındığında C#’ın JAVA’dan bir kademe önde olduğu görülmektedir. Bu durum elbette programcıların seçimlerini etkilemektedir. Bu arada JAVA’nın halen yaygın bir şekilde kullanıldığını da gözardı etmemeliyiz. Buraya kadar söylediklerimden belki şöyle bir soru işareti doğmuş olabilir : “C# mı JAVA mı” sorusunu “C# mı C++ mı” şeklinde sorsak neler değişir? Cevap : Çok şey değişir. Evet C#’ın JAVA ile olan ilişkisi C++ ile olan ilişkisinden tamamen farklıdır. C# ile JAVA’yı ancak saf dil olarak karşılaştırabiliriz. Yani dilin sentaksından bahsediyorum. Bu iki dilin kullanıldığı ortam farklıdır. Birinde bir sisteme özgün makine kodu üretilirken diğerinde sistemden bağımsız ara bir kod oluşturulmaktadır. Bu durumda C++ ve C#’ı bir bütün olarak karşılaştırmak doğru değildir. Çünkü ikisi farklı kategorilerde yarışıyor. Eğer bir gün .NET’in ürettiği ara koddaki komutlar ile çalışan mikroişlemci geliştirilirse o zaman belki C# ile C++’ı karşılaştırabiliriz. Peki C# mı C++? Cevap : Her ikiside. Eğer bir geliştirici Intel işlemciler için bir işletim sistemi geliştiriyorsa elbette C++ ve C dilleri seçilmelidir. Şirketiniz dağıtık yapıda çok geniş bir çalışma ağı olan bir uygulama geliştiriyorsa o zaman C# ve .NET’i seçmeniz daha doğru olacaktır. Bu seçim bir projede hangi dilin kullanılacağını değerlendirmek içindi. İşe bir de programcılar açısından bakalım. Bir programcının hem C++ hem C# hemde JAVA bilmesine gerek var mı? Bence gerek var yada yok. Kesin bir cevabı verilemez bu sorunun. Daha doğrusu bir programcı ihtiyaç dahilinde herhangi bir programlama dilini kullanabilmelidir. Ancak şunu da unutmayalım ki iyi bir programcı çok sayıda programlama dili bilen demek değildir. İyi bir programcı .NET platformunda olduğu gibi programlama dilinden bağımsız kod üretebilmelidir. Diğer .NET Dilleri ve C# Daha öncede denildiği gibi .NET paltformunda bir çok programlama dilini kullanabiliriz. Bu dillerin en önemlileri C#, VB.NET, C++.NET ve J# dilleridir. Bu dillerden bir tanesinin özel bir konumu vardır. Tahmin edileceği gibi bu dil C#’tır. C# .NET platformu için sıfırdan geliştirilmiş yeni bir dildir. Diğer diller ise eski versiyonları değiştirilerek .NET’e uyumlu hale getirilmiştir. Özellikle Visual Basic dilinin devamı gibi görünen VB.NET dilinde bir çok radikal değişiklik yapılmıştır. Örneğin VB dili nesne yönelimli programlama tekniğini destekler hale getirilmiştir. Bu eklentilerin çok başarılı oloduğu söylenemez. Çünkü bu şekildeki zoraki eklentiler dilin en başta tasarlanma amacına uygunluğunu ortadan kaldırmaktadır. Bu amaçla Microsoft, hem nesne yönelimli programlama tekniğine tam destek veren, C++ dilinin güçlü özelliklerinden yoksun olmayan ve aynı şekilde Visual Basic dilinin kolaylığından esinlenerek C# dilini çıkardı. Peki .NET dilleri arasında C#’ı tercih etmemize neden olacak başka neler var? Her şeyden önce C# öğrenilmesi kolay bir dildir. Az sayıda anahtar sözcük içermesine rağmen bir çok olanağı programcının hizmetine sunmuştur. C# nesne yönelimli programlama diline tam destek verdiği içinde seçilebilir. C#’ta değişken kavramı neredeyse kalkmıştır. Bunda bütün temel veri türleri de dahil olmak üzere bütün sınıfların Object diye adlandırılan bir sınıftan türetilmesinin etkisi vardır. C# dili güç ve hızlılık arasındaki dengeye estetik bir şekilde korumaktadır. Temsilci ve olaylarla VB’deki olay mantığına benzer bir model sunarken aynı zamanda göstericileri kullanmaya imkan vererek C++ dilinin güçlü özelliklerinden yoksun bırakmamıştır. .NET sınıf kütüphanesinin büyük bir kısmı C# ile geliştirilmiştir. Yani bu kütüphane en etkin biçimde C# ile kullanılabilir. C# için söylenebilecek son söz : C#, modern programlama tekniklerine tam destek veren, internet çağının gerektirdiği tüm yazılım bileşenlerini geliştirmeye izin veren, hızlı ve etkin bir şekilde kodlama yapılabilen, C++ ve JAVA’nın güzel yönlerini alıp geriye dönük uyumluluğu JAVA’da olduğu gibi gözardı etmeyen bir programlama dilidir. Sonuç İnternet’in ve haberleşme teknolojisinin çok ileri bir seviyede olduğu bir dönemde internet üzerinde kullanılabilecek yazılım bileşenlerini programlamak son derece önem kazanmıştır. Her ne kadar C# ve JAVA öncesi dillerle herşey yapılabiliyor olsada projelerin boyutlarının büyümesi bu dillergin artık yetersiz olduğunun bir göstergesidir. Özellikle yeni nesil iş uygulamalarında C# ve JAVA, C++’tan bir adım önde görünüyor. Tabi bu durum C++ dilinin kötü olduğunu göstermez. Nitekim C# ve JAVA dillerinin her ikiside C++ dilini örnek almıştır. Değişen tek şey günün ihtiyaçlarıdır. Aynı zamanda C#’ın da yeni bir dil olmasıyla JAVA, C++.NET, VB.NET ve J# gibi diller önünde de bir adım önde görünüyor. Sefer Algan İstanbul Teknik Üniversitesi Telekomünikasyon Mühendisliği