JAVA mı? C# mı? Bakalım Yanıt Hangisi?

JAVA mı? C# mı? Bakalım Yanıt Hangisi? Merhaba arkadaşlar, Programcı olmaya karar verdiniz ve bu konu üstünde evvela yazılım dillerinden hangisini öğreneceğinize karar vermekle başlamalısınız. İkisini de teorik şekilde bilmenizde yarar olsa da seçtiğiniz birisi üstünde yoğunlaşmanızı tavsiye ederim. Yazılım dalında bir çok fazla programcı hangi yazılım dilini öğrenip kullanacaklarına tam şekilde karar veremiyorlar. Microsoft’un tekelindeki C# mı yok ise Oracle elinde bulundurduğu Java mı evvela yok ise aralarında hiç bir ayrım yoktur mu ? Java ve C# her yönüyle karşılaştırıldı ve bir neticeye varıldı.   Java’nın Doğuşu Java; uzun süren çalışmalar sonunda ortaya çıkarılan bir dildir. Aslında daha 1970’li senelerde C++ temelli bir dil oluşturma fikri ortaya atılmıştı. Aslında bu dili oluştururken en büyük erek platform müstakil bir dil oluşturmaktı. Daha sonra Sun, Java’nın niteliklerini basit, nesneye yönelik, dağıtılmış, yorumlanan, sağlam, güvenli, ortam bağımsız, taşınabilir, yüksek performanslı, çok fazla görevli ve dinamik şekilde sıralamıştır. Yıllar geçtikçe Java epey bir popüler bir dil olmuştur.   C# Oluşumu Daha sonra bu piyasanın büyük büyük şirketleri Java dalında bir toplantı yaparlar. Bill Gates de bu toplantıya girer ve Java’yı standart şekilde Windows arasında sunmak ister. Toplantıdaki kuruluş yöneticileri Bill Gates’i tekelcilikle suçlayıp kovarlar. Bill Gates de istediğini yapamayacağını anlayınca Delphi’yi yazan Anders Hejlsberg’i çağırır ve yanına da Scott Wiltamuth’u verir; oturun Java benzeri muhteşem bir dil yazın der. Onlar da C#’ı yazarlar. Projenin yönetimi Anders Hejlsberg’de olduğundan Delphi bilenlerin de ayrım edebileceği bunun gibi C#’ın fonksiyon isimleri Delphi’ninkilere benzer.   C#’ın Java’yla Ortak Özellikleri   C#’ın Java’yla müşterek nitelikleri saymakla bitmez. Burada yalnızca bir kaç anahtar özellik verilecektir. Özellikle C#’ın Java’yla aynı olup C++’la hiç de aynı olmayan özeliklerini dikkat edilmesi gerekir.   * İkisi de bir Intermediate Language‘e (Ara Dil’e) derlenip öyle çalıştırılıyor.   * İki dil de temelden Multi-Threaded, nesneler senkronize edilebiliyor.   * İkisinde de global fonksiyon yada sabit yok.   * İkisinde de Single Inheritance (Tekli Kalıtım) var.   * Dizi ve string’lere erişimde hudut kontrolü var.  * İkisinde de Garbage Collection (Çöp Toplama) var.   * 43 Operatörden 41’i aynı.   * 50 Java keywordü’nden 38’i aynen C#’ta var, 8 tanesi de tıpkı anlama gelen muhtelif sözcükle belirtilmiş.   C#’la Java’nın Küçük Farkları   C#’la Java bünyesinde yalnızca bazı kolaylıklar sağlayan, temel mantıkta değişiklik getirmeyen bir çok fazla özellik var. Bir kaç Örnek vermek gerekirse :   ► C#’ta primitive tipler nesne şekilde kullanılabiliyor. (Bu Java’ya 1.5’de ekleniyor.) Cast etmekten ve her tip için method yazmaktan kurtarıyor. ► Daha kolay iterasyon için foreach yapısı (Buna aynı bir bina Java’ya 1.5’te geliyor.) ► Try-catch bloğunda catch’in boş olması yahut hiç olmaması. ► C#’ta exception yakalamak ve ya deklare etmek mecbur değil. ► C#’ta Property şeklinde bir bina var. Nesnenin property’lerine get/set yazmadan erişilebiliyor. ► C#’ta operator overloding var. Java’ya baş karıştırıcı bulunduğu gekekçesiyle konmamış bu özellik. ► C#’ta funksiyon pointer’ı yerine kullanılan delegate var. Bir funksiyona öbür bir fonksiyon parametre şekilde aktarılabiliyor. ► Event’leri desteklemek için ‘event‘ diye bir keyword var. ► C#’ta C++’taki enum’lar var. (1.5’de Java’ya tip güvenliği olan enum’lar gelecek.) ► C#’ta bir çok fazla insanın lanetlediği ‘goto’ var. Ama daha kısıtlı bir kullanıma sahip. Java’da ‘continue : label’ şeklindeki yapının biraz daha alternatif tanıyan hali. ► C#’ta hem Java’daki ‘jagged’ (değiken boyutlu dizilerle oluşturulmuş diziler) mevcut hem de C++’daki rectangular array’lar var.   C#’la Java’nın mühim Farkları   ► C++’taki struct‘lar C#’ta var. Referans yerine kıymet tipi şekilde tanımlanıyor. ► Method’lara parameter aktarımı ref, out gibi özelliklerle belirtilebiliyor. ► C#’ta attribute’ler, yani derleyiciler için direktifler var. Java’da yalnızca @depracated attributesi derleme sonrasında kullanılıyor. Diğer attributeler yalnızca yorum şekilde işe yarıyor. ► C#’ta pointer var. Eğer ‘unsafe’ diye bir anahtar kelime kullanılırsa bellek erişilebilir duruma geliyor.   .NET’le Java Platformu Arasındaki Farklar   C#’la Java arasındaki farklardan başka, .NET’le Java Platform’u arasında önemli bazı farklar var. ► Java’nın aradili yorumlanıyor. JIT sistemiyle yanında sadce bazı kodlar performanstan kazanmak için yerli koda çevriliyor. C#’ın (.NET’in) mesafe dili herşeyden önce derlenip öyle çalıştırılıyor. Bu nedenden daha hızlı çalıştığı söyleniyor. ► C# Microsofotun COM teknolojisiyle tam entegre çalışıyor. Java, yalnızca windows işletim sisteminde çalıştığı için COM teknolojisiyle direkt entegre olmuyor. ► C#, .NET, bir çok fazla dilden biri. Java ise tek platform ve tek dil.   Java’da pointer (işaretçi) ve pointer aritmetiği işlemleri yoktur. Buna rağmen C#, unsafe block yapıları ile pointer işlemlerine izin verir, her ne kadar bazı kısıtlamalar olsa da. Partial class yapısı, sınıfların, interfacelerin ve Java’da bulunmayan struct yapısının biden fazla kaynak dosyaya bölünebilmesini sağlar. Partial class niteliği C# da var iken, Java’da bu tür bir özellik bulunmamaktadır.   C++ da bulunan virtual method niteliği C# ile de karşımıza çıkıyor. Java’da bütün sınıf methodları otomatik şekilde virtual şekilde tanımlıdır. Bu sayede, herhangi bir sınıfı genişlettiğinizde (extends) super sınıfın methodlarını herhangi bir ekleme gerektirmeden, direkt override edebiliyoruz. Ancak C# da bu böyle değil aynen C++ da bulunduğu gibidir. C# ile, herhangi bir sınıfın methodunu override etmek için super classda bu method virtual şekilde deklare edilmelidir. Java’da final methodlar tanımlayarak, methodların override edilmesini önleyebiliyoruz. Preprocessor (Önişlemci) direktifleri C# ile kullanılabiliyor. Bu sayede, kodun belirli bölgelerini belirli durumlar için derlenmesini sağlayabiliyoruz. Ancak Java’da preprocessor niteliği bulunmuyor.   Generic tipler Java ve C# dillerinde mevcut. Ancak Java’da, generic tipler primitive tiplerle kullanılamazken, C# ile kullanılabiliyor. C# da goto komutu varken, Java’da yoktur. C# bazı kısıtlamalar dahilinde operator overloading işlemine izin verirken Java, izin vermez.   C# da method override işlemini yapabilmek için, override anahtar sözcüğünü kullanımı gerekiyor. Override anahtar sözcüğü kullanmadan yapılan işlemler C# da, yeni bir method şekilde ele alınır. Ancak Java ile herhangi bir anahtar kelime gerektirmeden direk super class methodlarını override edebiliyoruz.   Java daki her primitive data type ın C# da bir karşılığı vardır. Ancak C#, Java’ya oranla aşırı daha fazla primitive data type sunar. Java’daki bütün primitive typeların tıpkı isimle karşılığı C# da da bulunmaktadır. Ancak Java’daki byte ın karşılığı C# da sbyte dır. C# byte veri tipi unsigned dır. Bunun haricinde C# Java’da olmayan işaretsiz tamsayı değerleri de sunar.ulong, ushort, uint ve decimal tipler Java’da yoktur.   C#, Java’da olmayan method pointerlar sunar. Delegate ismi verilen bu bina ile C# da, methodlar parametre şekilde başka methodlara geçirilebiliyor. Delegateler, C# da event handling (olay yönetimi) ve callbackler için kullanılıyor. Olay yönetimi Java’da Observer tasarım şablonu ile gerçekleştirilirken, C# da hadise yönetimi, dil seviyesinde delegate ler yardımı ile yapılmaktadır. C# da Java’da bulunan checked exception sistemi yoktur. C# sadece, çalışma zamanında yönetilen unchecked exception sistemini destekler. C#, Java’da setter ve getter methodlar ile yapılabilen instance field işlemlerini Properties adı verilen bir mekanizma ile yapılmasını sağlar. Bu sayede extra getter setter methodlar yazılmasına gerek kalmıyor. C#, Java’da bulunmayan ve indexer adı verilen bir bina ile [] operatörünü overload ederek, sınıf örnekleri üstünde array tarzı işlemler yapılabilmesini sağlar.   C# da, C/C++ da bulunan struct yapısı var ve veri tipi şekilde kullanılırken Java’da bu bina bulunmuyor. C# Exception tanımlamak ve yakalamak bu gibi bir zorunluluk yok. Java, ortaya çıkış felsefesi gereği (robust application) buna izin vermez.   Java’da C# da bulunan static class yapısı yoktur. Static sınıflar, instance field, instance constructor benzeri yapılara izin vermez. Başka bir sınıf aracılığıyla genişletilemez. C# da iterasyon işlemini kolaylaştırmak için, Java’da bulunmayan yield adında bir anahtar kelime bulunmaktadır. Ancak tam şekilde ne işe yaradığını bilmiyorum. C# da ref ve out  gibi anahtar sözcükler ile methodlara parametre geçirilebiliyor. Java’da böyle bir bina yok.


Yapılan Yorumlar
Erdem OFLAZ

Bir mum, diğer mumu tutuşturmakla ışığından bir şey kaybetmez.
 Kategoriler
 Popüler yazılar