C dili ve Yapısal Programlama

advertisement
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
Download