4 Aralık 2011 Pazar

Programlama Dilleri Ders Özeti


Programlama dili, yazılımcının bir algoritmayı ifade etmek amacıyla, bir bilgisayara ne yapmasını istediğini anlatmasının tektipleştirilmiş yoludur.
Bir programlama dili, insanların bilgisayara çeşitli işlemler yaptırmasına imkan veren her türlü sembol, karakter ve kurallar grubudur.
Küçük istisnalar dışında tüm programlama dillerinin tasarımı daha önceki programlama dillerindeki tecrübelerden fazlasıyla etkilenmiştir.
    Fortran ilk yüksek seviyeli yaygın dillerden biridir. Sembolic tanımlamaları, dizileri ve prosedürleri (subroutine)  parametrlerlerle ifade etmiştir. Zayıf yönleride vardır. Örneğin şartlı ve şartsız dallanmalar yüzünden kontrol akışı etkilenmektedir. İlk çıkışından son haline gelmesi çok vakit almıştır. Son versiyonu 1997 yılında standart hale getirilmiştir.
    Cobol:İlk yüksek seviyeli yaygın dillerden biride COBOL’dur. Programlama dilleri tasarımına en büyük katkısı veri tanımlamaları kavramıdır. Günümüz data tiplerinin öncüsüdür. Fortran gibi zayıf yönleride vardır. Kontrol akışı fortranda olduğu gibi düşük seviyelidir. İlk çıkışından son haline gelmesi Fortran’da olduğu gibi çok vakit almıştır. Son versiyonu 2002 yılında standart hale getirilmiştir.
    Algol:Sadece bir bilgisayarda program yapmak için tasarlanmamıştır. Communication  algoritmaları için tasarlanan ilk yaygın programlama dilidir.
    Blok yapısı kavramını ilk olarak ALGOL önermiştir ve kullanmıştır. Bu yapının yardımıyla değişkenler ve prosedürler programda ihtiyaç duyuldukları yerlerde ifade edilmişlerdir. 
    Rekürsif prosedürleri destekleyen ilk yaygın programlama dilidir. Bir çok programlama dilinin tasarlanmasına ilham kaynağı olmuştur. Bu diller literatürde ALGOL-benzeri diller olarak ta sınıflandırılmaktadır.
    PL/I ise bu üç dilin kaynaştırılması ile elde edilmiş genel amaçlı programlama dilidir. Bu üç dilin avantajlarının yanı sıra yeni özelliklerde sunmuştur. Örneğin düşük esviyede exception (kural dışılık) ve concurrency (eşzamanlılık) kavramları gibi
    Meydana gelen dil hantal, karmaşık, abuk subuk ve gerçekleştirilmesi zor bir dil haline dönüşmüştür.
PL/I tasarım tecrübesi göstermiştirki bir programlama dilini daha güçlü ve genel amaçlı hale getirmek için farklı programlama dillerinin kümelenmesi iyi bir yol değildir
    Algol68 :Programlama dilini daha anlamlı biçimde güçlendirmek için daha iyi bir yol gerekmektedir. Bunun içinde daha uygun kavramlar kümesi seçilmeli ve bu kavramların sistematik olarak birleştirilmesine izin verilmelidir. Bu ALGOL68’in tasarım felsefesi olarak ortaya konmuştur.
    Pascal:ALGOl-benzeri diller içinde en popüler olan pascal dilidir. Pascal; basittir, sistematiktir ve verimli olarak gerçekleştirilebilir. Pascal ve ALGOL 68  çok zengin kontrol yapıları (şartlı ve iteratif komutlar) ve data tipleri (diziler, kayıtlar ve rekürsif tipler) olan yaygın programlama dilleridir.
    C dili esasında Unix işletim sisteminin sistem programlama dili olarak tasarlanmıştır. C dili hem düşük seviyeli kod yazımına hem de yüksek seviyeli kod yazımına uygun bir dildir.
    ADA:Pascal’ın daha güçlü bir halefi ise ADA’dır. ADA; daha büyük modüler programlar gerçekleştirmek için paket ve generic birimler kavramlarını önermiştir. Ayrıca yüksek seviyeli exception (kural dışılık) ve concurrency (eşzamanlılık) kavramlarını da kullanmıştır.
    ADA’da PL/I gibi genel amaçlı bir programlama dili olması için tasarlanmıştır.
    Çok eleştirilmiştir. Fakat eleştirlerin çoğu haksızdır. ADA; yüksek kalitede yazılım geliştirmek için iyi tasarlanmış bir dildir. Özellikle kritik uygulamalarda (örneğin uzay sanayinde) tercih edilmektedir.
SOYUTLAMA
    Programlama dillerinin tarihsel gelişimi incelendiğinde gittikçe artan seviyede soyutlamalar (abstraction) görülmektedir.
    Örneğin assembly dilindeki sembolik etiketlemeler ve anımsatıcı simgeler işlem kodlarını ve makine adreslerini soyutlamaktadır.
    Değişkenler ve atama işlemleri (assignment) hafıza adreslerinin güncelleşmesini ve denetleme işlemlerini soyutlamaktadır.
    Veri tipleri, hafıza yapılarını soyutlamaktadır
    Kontrol yapıları, atlamaları (jump) soyutlamaktadır.
    Prosedürler, Subroutineleri soyutlamaktadır.
    Paketler (packages) encapsulationu gerçekleştirmektedir ve bu sayede programın modülerliği artmaktadır.
Generic birimler prosedürleri ve paketleri çalışılan veri tipinden soyutlamaktadır ve böylece yeniden kullanılırlık sağlanmaktadır
PROGRAMLAMA DİLLERİNİN SINIFLANDIRILMASI
    İmperative (prosedürel):Tarihsel gelişmede bahsedilen tüm diller imperativ dilleri desteklemektedir. Komutlar ve prosedürler kullanarak değişkenleri güncellemesi ile karakterize edilir.
    concurrent :PL/I ve ADA concurrent programlamayı desteklemektedir. Eşzamanlı süreçlerin kullanılması ile karakterize edilmiştir
    Nesneye dayalı:
Bu diller nesnelerin sınıflandırılması esasına dayanır.
Bir nesnenin belirli işlemlerle donatılmış değişken bileşenleri vardır. Nesnenin değişken bileşenlerine sadece bu işlemlerle erişilebilir.
Benzer değişken bileşenlerine ve işlemlerine sahip olan nesnelerin ailesine sınıf denir. Tüm yaygın nesne tabanlı diller geniş sınıf kütüphanelerine sahiptirler. Bu diller uygun yeniden kullanılabilir program birimleri meydana getirir.
Nesne ve sınıf kavramları ilk olarak bir başka algol benzeri dil olan SIMULA’da önerilmiş ve kullanılmıştır.
Tüm programların sınıflardan oluşturulduğu ilk nesne tabanlı dillerden biride SMALLTALK’dır
C++ ise nesne tabanlı kavramlarını C diline ekleyerek elde edilmiştir. C++ hem C dilinin avantajlarını hem de nesne tabanlı programlamanın avantajlarını kullanmaktadır.
Çok popüler olmuştur. Ama tasarım acemice yapılmıştır C dili tasarımındaki tüm eksiklikleri C++’da miras oalrak almıştır. Kendi eksiklikleride vardır.
JAVA ise C++’yı basitleştirmek için tasarlanmıştır. C++’daki noksanlıkları ve tasarım eksikliklerinin çoğunu yok etmiştir.
Basit bir nesne tabanlı dil olmasının yanı sıra JAVA aynı zamanda distributed ve concurrent programlama içinde kullanılmaktadır. 
Applet (web sayfalarına gömülen küçük taşınabilir program parçacığı) yazmak için uygundur. Yüksek taşınabilir gerçekleştirimi sayesinde tüm yaygın web browserlerle birleştirilmiştir (Java Virtual Machine). Web ile bu ilişkisinden dolayı oldukça popülerdir
C# ise  tasarımdaki küçük değişikler hariç JAVA’ya çok benzemektedir. Daha verimli gerçekleştirilmesi sebebiyle sıradan uygulama programları için daha uygundur.
    Fonksiyonel
Fonksiyonel programlama fonksiyon tabanlıdır. İlk fonksiyonel dil Lisp’dir.
ML ve HASKELL modern fonksiyonel dillerdir. Bu diller fonksiyonlara rasgele değerler gibi davranmaktadır 
ML ile lisp karışık programlama dilleridir. Değişken ve atama  işlemlerini desteklemektedir.
Haskell ise tamamen saf fonksiyonel bir dildir. Değişken ve atama  işlemlerini desteklememektedir.
    Lojik
Lojik programlama lojiğin alt kümesi tabanlıdır. Lojik programlar, verilen giriş değerinden çıkış elde edilmesi mantığıyla çalışmazlar, verilen bilgiler arasından ilişkiler çıkarırlar. Prolog ilk lojik programlama dilidir ve halen bu diller içinde en popüleridir.
Sadece lojik formunda olduğundan zayıf ve verimsizdir.  Ekstra lojik özellikleri eklenerek daha kullanışlı hale Getirilmiştir.
    Scripting
Programlama dilleri uygulama programları ve sistem programları yazmak için tasarlanmıştır. Scripting dillerden en popülerler Perl ve Python’dur. İmperativ dillere farklı tasarım kısıtlamaları vardır.
Bu diler genelde;
-          daha kısa koda sahip
-          daha yüksek seviyeye sahip
-          Daha hızlı gerçekleştirilebilen
-          Farklı dillerde yazılmış alt sistemlerin birleştirilmesinde kullanılır
    Vs…
BÖLÜM 2
PROGRAMLAMA DİLLERİNİ ÖĞRENMENİN NEDENLERİ
          Fikirleri ifade etme yeteneğinin arttırılması
Yazılım sürecindeki programcılarda benzer şekilde zorlanmaktadır. Programcıların yazılım geliştirdikleri programlama dilinin limitleri vardır. Örneğin o dilin Kontrol yapıları, veri yapıları, soyutlamaları, vs. gibi
Değişik yapıdaki bir çok programlama dili özelliğinin bilinmesi bu limitlerin azaltılmasını sağlamaktadır.
Programcılar yeni dil yapıları ve kavramları öğrendikçe yazılım geliştirme ufukları artmaktadır.
          Uygun dilleri seçebilme bilincinin geliştirilmesi
Bir programcının öğrendiği programlama dilinin ömrü çok uzun olmayabilir.
Veya öğrendiği dillere eklenen yeni özellikleri bilmeyebilir.
Bu programcıya yeni bir proje verildiğinde en uygun dili seçmek yerine bildiği dili tercih etmesi beklenir. Bu programcı diğer programlama dillerinin özelliklerini ve kavramlarını bildiği takdirde daha verimli projeler gerçekleştirecektir.
          Yeni diller öğrenebilme yeteneğinin geliştirilmesi
Bilgisayar programlama genç bir bilim dalı. Halen gelişme evresini tamamlayamamış. Gerek programlama dillerinde gerek yazılım geliştirme araçlarında gerekse tasarım yöntemlerinde gelişim halen devam etmektedir. Bundan dolayı bilgisayar programcılığı ömür boyu öğrenme yeteneği isteyen bir bilim dalı olarak karşımıza çıkmakta.
Bir veya iki programlama dili bilen ve programlama dilleri kavramlarını bilmeyen programcıların yeni programlama dilleri öğrenmeleri hem uzun zaman almaktadır hem de zor olmaktadır
Programlama dillerinin genel kavramlarını iyi bilen bir programcı yeni öğreneceği dilde bu kavramların nasıl birleştirildiğini ve kullanıldığını daha rahat anlayacaktır. Programlama dilinin tasarımı hakkında bilgi sahibi olacaktır.
Örneğin veri soyutlama (data abstarction) kavramını bilen bir programcı JAVA’da soyutlanmış data tiplerinin nasıl oluşturulduğunu daha iyi ve çabuk anlayacaktır. Veya nesne tabanlı programlama kavramını bilen bir kişi C++ veya Javayı daha çabuk anlayacaktır.
          İmplementasyonun öneminin daha iyi anlaşılması
Programlama dilleri kavramı öğrenilirken implementasyon sorunlarına da dikkat etmek gerekir. Çünkü  implementasyon sorunları programlama dilleri kavramlarını etkilemektedir. Bazen bir implementasyon sorununu bilmek, programlama dilinin nasıl tasarlandığı konusunu da anlamamıza yardımcı olmaktadır. Sonuç olarak implementasyonu sorunları ve bunları aşmak için geliştirilmiş programlama dilleri tasarımları bilindiğinde bildiğimiz bir programlama dili daha zekice kullanılmaktadır.
İmplementasyon detaylarını bilen bir programcı program bug (hatalarını) bulup düzeltebilir.
İmplementasyonu iyi bilmenin bir avantajıda bilgisayarın değişik dil yapılarını nasıl çalıştırdığını kafamızda canlandırmamıza yardımcı olur.
Bir avantajıda aynı işi yapan farklı yapılar varsa. İmplementasyonu bilen programcı hangisinin daha verimli olduğunu anlayabilir.
Bu derste İmplementasyona kısaca değinilicek. Daha detaylı bilgi derleyici tasarımı dersinde verilecektir.
          Bilinen programlama dillerinin daha iyi kullanılması
Programlama dilleri çok büyük ve karmaşıktır. Bu dilleri bilen bir programcının dilin tüm özelliklerini bilmesi pek rastlanan bir durum değildir.
Programlama dilleri kavramını bilen bir programcı daha önce bilmediği ve kullanmadığı özellikleri daha rahat öğrenip kullanabilir.
Bilgisayar biliminde kapsamlı ilerleme
Kendi dönemlerinde popüler olan programlama dillerinin en iyi programlama dili olmadığı zamanla görülmüştür.
Örneğin ALGOL60’ın Fortranın yerine geçeceğine kesin gözüyle bakılmış fakat 1960’lar da ALGOL’un okuma ve yazma sını  karmaşıklığından dolayı insanlar bu düşüncelerinden vazgeçmeye başlamışlardır. 
PROGRAMLAMA UYGULAMA ALANLARI
          Bilimsel Uygulamalar
         Genelde basit veri yapıları  ve Çok sayıda kayan nokta(floating point) hesaplamaları içerirler
         En sık kullanılan veri yapıları diziler ve matrislerdir
         Fortran
          Ticari Uygulamalar
         Rapor üretmek, ondalık sayılar ve karakterler kullanmak
         COBOL
          Yapay Zeka (Artificial intelligence)
         Sayılar yerine semboller işlenir
         Dizilerden ziyade link listler genelde kullanılır
         Esnek dillerdir. Bazı AI uygulamalarında kod segmentleri program çalışırken meydana gelmektedir
         LISP
          Sistem programlama
         Devamlı kullanım nedeniyle verimlilik gereklidir.
         Harici aygıtlara ulaşabilmesi için düşük seviyeli dillerin özelliklerini de içermesi gerekmektedir.
         C (Örneğin UNIX işletim sistemi C ile yazılmıştır)
          Web Yazılımı
         Dillerin seçmeci/derlemeci(eclectic) koleksiyonu: işaretleme(etiketleme)(markup) (örn, XHTML), betik(scripting) (örn, PHP), genel-amaçlı(örn, Java)
DİL DEĞERLENDİRME KRİTERLERİ
          Okunabilirlik(Readability): programların okunabilme ve anlaşılabilme kolaylığı
          Genel Kolaylık
          Çok sayıda basit yapıdan oluşan bir dilin okunabilirliği nasıldır?
          Kullanışlı nitelikler(features) ve yapılar(constructs) kümesi
          Özellik çokluğu(feature multiplicity)(aynı işi yapmanın birkaç tane yolu olması)
Örneğin JAVA’da bir değişkenin değerini 1artırmak istersek:
Count=Count+1
Count+=1
Count++
++Count
Yukarıdaki ifadeler birebir aynı değildir. Fakat yalnız kullanıldıklarında aynı anlama gelirler.
         Minimum operatör aşırı yükleme(operator overloading)
          Örneğin + operatorü birden fazla işlem için atanmış olabilir. Örneğin tamsayılarda toplama, reel sayılarda toplama, matrislerde toplama gibi. Bu özellik, operatör sayısını azalttığı için avantajlı bir durum olarak görülse de bazen programın okunabilirliğini azaltmaktadır. Bir dizideki tüm elemanların toplamı için + operatörünün programcı tarafından atandığını varsayalım. Bu programı okuyan bir kişi + operatörünün ne amaçla kullanıldığı hakkında şüpheye düşecektir. Buda okunabilirliği azaltır.
SONUÇ OLARAK: BASİTLİK OKUNABİLİRLİĞİ ARTIRIR AMA ÇOK FAZLA BASİTLİKTE TERSİ ETKİ YAPABİLİR. ÖRNEĞİN ASSEMBLER DİLİ EN BASİT DİL OLMASINA RAĞMEN OKUNABİLİRLİĞİ EN UYGUN DİL DEĞİLDİR
          Ortogonallik(Orthogonality)
         Bir programlama dilinin kontrol ve veri yapıları; çok küçük kümeye sahip ilkel yapılar ve  bu yapıların çok az yolla birleştirilerek oluşmasına ortogonallik denir.
         Her mümkün kombinasyon kurallara uygundur
         Örneğin 4 tip ilkel yapı (integer, float, char ve double.) ve 2 operatör (array ve pointer )olduğunu varsayalım. Bu 2 operatör kendi kendilerine ve ilkel veri yapılarına uygulanabilirse çok sayıda veri yapısı elde edilebilir.
         IBM ve VAX32 için hazırlanmış 2 farklı assembler dilini bir örnek üzerinde inceleyip ve ortogonalliklerine bakılırsa;
         Örnek: biri hafızada diğeri registerde olan 2 tane 32 bitlik sayıyı toplayıp sonucu bu hafızalardan birine yazdırmak istersek;
IBM:
A Reg1, memory_cell

Hiç yorum yok:

Yorum Gönder