Sıra | DOSYA ADI | Format | Bağlantı |
---|---|---|---|
01. | Programlama Dilleri Kavramlarını Öğrenmenin Nedenleri | ppt | Sunumu İndir |
Transkript
Bölüm 1: GİRİŞCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-1
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-2Bölüm 1 Konular1. Programlama Dilleri Kavramlarını Öğrenmenin Nedenleri2. Programlama Alanları3. Dil Değerlendirme Kriterleri4. Dil Tasarımını Etkileyen Faktörler5. Dil Kategorileri6. Dil Tasarımında Verilen Ödünler(Trade-Offs)7. İmplementasyon Metotları8. Programlama Platformları(Environments)
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-31.1 Programlama Dilleri Kavramlarını Öğrenmenin Nedenleri• Fikirleri ifade etme yeteneğinin arttırılması• Uygun dilleri seçebilme bilincinin geliştirilmesi• Yeni diller öğrenebilme yeteneğinin geliştirilmesi• İmplementasyonun öneminin daha iyi anlaşılması• Bilinen programlama dillerinin daha iyi kullanılması• Bilgisayar biliminde kapsamlı ilerleme
Fikirleri ifade etme yeteneğinin arttırılması• Düşüncelerimizdeki derinliğin; düşüncelerimizi ilettiğimiz dilin ifade gücü tarafından etkilendiğine inanılmaktadır.• Diğer bir deyişle insanların sözlü veya yazılı olarak tanımlayamadığı yapıları kavramlaştırmaları zordur.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-4
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ırCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-5
Fikirleri ifade etme yeteneğinin arttırılması• Herhangi bir programlama dilini kullanması için zorlanan bir programcının Programlama dilleri kavramlarını ve yapılarını öğrenmesinin bir anlamı varmıdır?Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-6
Fikirleri ifade etme yeteneğinin arttırılması• Evet vardır. Bu yapılar ve kavramlar mecburi tutulan dilde simüle (benzetim veya taklit) edilebilir. • Örneğin FORTRAN 90 dilinde substring arama fonksiyonu INDEX’tir. Pascal dilinde benzer bir fonksiyon yoktur fakat pascal kullanması için zorlanan bir programcı bu fonksiyonun yaptığı işi altprogram yazarak çözebilir. • Eğer dil seçiminde zorlama yoksa simüle edilen dildense gerçekten o özelliği barındıran dili kullanmak gerekir. Çünkü o özelliği simüle eden dil direk barındıran dile göre daha hantal ve daha karmaşıktırCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-7
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. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-8
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. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-9
Yeni diller öğrenebilme yeteneğinin geliştirilmesi• 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.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-10
İ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. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-11
İmplementasyonun öneminin daha iyi anlaşılması• İ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.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-12
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.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-13
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. • ACABA JAVA SONSUZA KADAR KULLANILACAK MI?Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-14
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-151.2 Programlama Alanları• 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
1.2 Programlama Alanları• 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)Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-16
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-171.3 Dil Değerlendirme Kriterleri• Okunabilirlik(Readability): programların okunabilme ve anlaşılabilme kolaylığı• Yazılabilirlik(Writability): Bir dilin program yazmada kullanılabilme kolaylığı• Güvenilirlik(Reliability): şartlara(specifications) uygunluk (yani, şartları sağlaması) • Maliyet(Cost): en son toplam maliyet
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-18
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-19Değerlendirme Kriterleri : Okunabilirlik• 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+1Count+=1Count++++Count Yukarıdaki ifadeler birebir aynı değildir. Fakat yalnız kullanıldıklarında aynı anlama gelirler.
Değerlendirme Kriterleri : Okunabilirlik– 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İRCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-20
Ortogonallik(Orthogonality) • 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. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-21
Örnek:Hangisi ortogonaldir? Neden?– 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_cellAR Reg1, Reg2Semantiğine bakılırsa:Reg1 ← contents (Reg1) + contents (memory_cell)Reg1 ← contents (Reg1) + contents (Reg2)• Vax32:• ADDL operand_1,operand_2• Semantiğine bakılırsa:• Reg1 ← contents (operand_1) + contents (operand_2)Yukarıda ki örnekten görüldüğü gibi Vax32 tasarımının ortogonal olduğu görülmektedir. Tek bir komutla hem registerler hemde hafıza hücrelerinde işlem yapılabilmektedir.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-22
Ortogonallik(Orthogonality) • Fonksiyonel diller (örneğin Lisp) basit ve ortogonal dillerdir. Bu dillerde fonksiyonlar doğrudan parametrelere uygulanır. C, C++ ve Java’da olduğu gibi değişkenlerle ve atamalarla uğraşmaz. Fonksiyonel dillerin basitlik ve ortogonallik özelliklerinden dolayı halen tercih edilmektedir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-23
Veri Tipleri ve veri yapıları• Bir programlama dilinde veri tip ve veri yapıları tanımlamada ki esneklik’te okunabilirliğe katkı sağlamaktadır. • Örnek:Bir dilde Timeout=1 yazmak yerineTimeout=true yazmak okunabilirliği artırmaktadır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-24
Syntax tasarımı• Bir programın syntax tasarımı okunabilirlik için en önemli etkenlerden biridir• Örneğin değişken isimlerini kısa tutmak okunabilirliği azaltır. Fortran 77’de değişken isimleri 6 karakterle sınırlandırılmıştır. • Örnek: ogrenci_no biçiminde okunabilirliği artıracak bir değişken ismi verilemez.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-25
Syntax tasarımı• Özel kelimelerde (for, end, do, vb.) okunabilirliği etkiler.• Birleşik durumların gösterim biçimide okunabilirliği etkiler. Örneğin bir döngü ifadesi verilebilir. • Özel kelimeler değişken ismi olarak tanımlanırsa da okunabilirlik etkilenir. • Örneğin fortran 95 de Do ve End özel kelimelerinin değişken ismi olarakta tanımlanmasında bir sınırlama yoktur. Bu durum okunabilirliği azaltmaktadır.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-26
Syntax tasarımı• Bir diğer problemde anlam ve biçim.Örneğin C programlama dilinde static kelimesi kullanılış biçimine göre farklı anlamlara gelmektedir.Eğer bir fonksiyonun içinde değişken tanımlamak için kullanılıyorsa değişkenin derleme zamanında (compile time) oluşturulacağı anlamına gelmektedir.Eğer tüm fonksiyonların dışında değişken tanımlamak için kullanılıyorsa bu değişken bu dosyadan alınamaz ve ancak ve ancak tanımlandığı dosyada görülebilir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-27
Syntax tasarımı• ÖRNEK: UNIX’ in shell komutları çoğu zaman alakasız bir fonksiyonu göstermektedir. Bu da okunabilirliği azaltmaktadır.grep komutu size herhangi bişey anımsatıyormu?g harfi global komut olduğunu gösteriyor.re regular expressionp regular ifadeyi içeren substring’lerin yazılması komutudurCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-28
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-29Değerlendirme Kriterleri : Yazılabilirlik
Yazılabilirlik• Bir program yazılırken programlama dilinin ne kadar kolay olduğunun ölçülmesine yazılabilirlik denir. Okunabilirliği etkileyen faktörler (basitlik, ortogonallik, veri tipleri ve veri yapıları, syntax tasarımı ) yazılabilirliği de etkilemektedir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-30
Yazılabilirlik• Programlama dillerinin yazılabilirliği uygulamaya göre de değişebilir. Grafiksel arayüzü olan bir program tasarlanacağı zaman Visual basic’in yazılabilirliği C diline göre daha iyidir.• Bir işletim sistemi yazılacağı zaman ise C dili Visual basic diline göre yazılabilirliği daha iyidir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-31
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-32Basitlik ve ortogonallikEğer bir programlama dilinde çok fazla sayıda farklı yapılar olursa programcının tüm bu yapıları öğrenmesi zordur. Programcı bildiği yapıları kullanmak isteyecek ve belki aynı işi yapan daha verimli bir yapının farkında bile olmayacaktır. Bu yüzden az sayıda ilkel yapı ve bunları birleştirmek için oluşturulan legal kombinasyonları (ortogonallik) kullanmak yazılabilirliği artırmaktadır. Çok fazla ortogonallik; okunabilirliği azalttığı gibi yazılabilirliği de azaltabilmektedir. Fazla ortogonallik programdaki hataları bulmayı zorlaşmaktadır.
Soyutlama(abstraction) desteğiKarmaşık yapıları veya işlemleri, ayrıntıları gözardı ederek tanımlayabilme ve kullanabilme yeteneğine soyutlama denir.Günümüzde tercih edilen programlama dillerinin tasarımında ki en önemli kavramlardan biridir. Programlama dilinde kullanılan soyutlamanın derecesi ve doğal ifade edilebilme özellikleri yazılabilirliği etkilemektedir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-33
Soyutlama(abstraction) desteğiProgramlama dillerinde 2 çeşit soyutlama sınıfı vardır. Process (işlem) soyutlama ve veri soyutlama. Proses soyutlamaya en iyi örnek altprogramlardır. Örneğin sıralama yapan bir alt program kod yazarken tekrarları azaltır. Veri soyutlamaya bir örnek Fortran77 programlama dilinde binary bir ağaç tanımlanmasıdır. Fortran77 dili pointer ve heap ile dinamik hafıza yönetimini desteklememektedir. Fortran 77 kullanarak binary tree oluşturulabilir. Fakat oluşturmak zordur ve yazımı anlaşılabilir değildir. Fakat soyutlama özelliği olan Java gibi bir dil kullanıldığında binary tree’yi oluşturmak (2 pointer ve 1 integer ile) ve kullanmak çok daha kolaydır. Yazılabilirliği de fortran’a göre çok iyidir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-34
Anlamlılık(Açıklayıcılık)(Expressivity)– İşlemleri belirtmenin nispeten elverişli yollarını kullanmak yazılabilirliği artırır.– Örnek: Birçok modern dilin for ifadesini içermesi– C programlama dilinde count++ ifadesi count=count+1 – İfadesinden daha açıklayıcıdır. Yazılabilirliği artırır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-35
Değerlendirme Kriterleri : Güvenilirlik• Bir program tüm şartlar altında istenilen görevi doğru olarak yapıyorsa güvenilirdir denir. • Tip Kontrolü(Type checking)– Tip hataları(errors) için test etme• İstisna İşleme (Exception handling)– Yürütme zamanı(run-time) hatalarını yakalama ve düzeltme önlemleri alır• Farklı Adlandırma(Aliasing)– Aynı bellek konumu için iki veya daha fazla farklı referans metodunun(referencing method) varlığı• Okunabilirlik ve yazılabilirlik– Bir algoritmayı ifade etmenin “doğal” yollarını desteklemeyen bir dil, ister istemez “doğal olmayan”, bu yüzden güvenilirliği azalmış yaklaşımları kullanacaktırCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-36
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-37Değerlendirme Kriterleri : Güvenilirlik
Tip kontrolü (type checking)• Programın çalışması veya derlenmesi süresince verilen programın tip hatalarının test edilmesine tip kontrolü (type checking) denir. Tip kontrol özelliği dilin güvenilirlik için önemlidir. Derleme zamanında (compile time) tip kontrolü yapmak az maliyetli olduğundan tercih edilmektedir. Çalışma zamanında (run time) tip kontrolü maliyeti fazladır ve tercih edilmez. Programda ki tip hatalarının tesbiti erken yapıldığından hatalar erken fark edilmekte ve düzeltilmeleri sağlatılmaktadır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-38
Tip kontrolü (type checking)• Örnek: Bir fonksiyonda kullanılan bir parametrenin tip kontrolünün programlama dili tarafından yapılamadığını varsayalım.• İnt olarak tanımlanması gereken 23 sayısı yerine float olarak aynı sayı girildiğinde ne olur?Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-39
İstisna İşleme (Exception handling)Yürütme zamanı(run-time) hatalarını yakalama ve düzeltme önlemleri alırAda, C++ ve Java bu özelliği içermektedir ama C ve fortran gibi dillerde bu özellik yoktur. Daha sonraki konularda detaylı tartışılacaktır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-40
Farklı Adlandırma(Aliasing)Aynı hafıza hücresine erişim için 2 veya daha fazla farklı ismin tanımlanmasıdır. Programlama dilleri için tehlikeli bir özellik olduğu kabul edilmektedir. Fakat bazı programlama dilleri bazı tip aliasing’lere izin vermektedir. Örneğin iki pointer aynı değişkeni göstermek için kullanılabilir. Programcının dikkatli olmasını gerektirmektedir. NEDEN?Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-41
Okunabilirlik ve yazılabilirlikBir algoritmayı ifade etmenin “doğal” yollarını desteklemeyen bir dil, ister istemez “doğal olmayan”, bu yüzden güvenilirliği azalmış yaklaşımları kullanacaktır. NOT: Okunabilirlik, güvenilirliği 2 farklı yönden etkilemektedir. -Okunabilirlik, yazılabilirliği etkiler. Yazılabilirlik te güvenilirliği etkilediğinden doğal olarak okunabilirlik güvenilirliği etkiler. -Okunabilirlik programın bakım ve onarım kısmını etkilediğinden güvenilirliği de etkilemektedir. Okunabilirliği az olan programı anlayıp bakımını yapmak ta zor olacaktır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-42
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-43Değerlendirme Kriterleri : Maliyet• Dili kullanacak programcıların eğitilmesi. Bu özellik basitlik ve ortogonallik ile alakalıdır. Ayrıca programcının tecrübeside önemlidir. • Programları yazma (özel uygulamalara yakınlık). Dilin yazılabilirliği ile alakalıdır. • Programları derleme(compiling) maliyeti. Ada programlama dilinin ilk versiyonlarında derleme maliyetleri çok fazlaydı. Daha sonraki versiyonlarda maliyet azaltıldı
Değerlendirme Kriterleri : Maliyet• Programları yürütmek (executing) maliyeti• Örneğin tip kontrolüne çok fazla run time ayıran bir programlama dili bu maliyeti artırır. • SORU: Derleme maliyeti ile yürütme maliyeti arasında optimizasyon nasıl yapılabilir?• Dil implementasyon sistemi: • ücretsiz derleyicilerin(compilers) kullanılabilirliği. Örneğin Java’nın derleyicisinin ücretsiz olması maliyeti azaltmaktadır. Veya daha pahali bir donanımda çalışması gereken programlama dilleri maliyeti artırır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-44
Değerlendirme Kriterleri : Maliyet• Güvenilirlik(Reliability): • Zayıf güvenilirlik yüksek maliyetlere yol açar. Örneğin bir uzay çalışmasında kullanılan programlama dili çökerse maliyet çok artar. Veya kriptoloji uygulamasında kullanılan bir programlama dilindeki güvenlik açığının maliyeti zarar verir. • Programların bakım (maintaining) maliyeti• Tüm maliyet içinde en yüksek oranda olan maliyettir. Yazılım mühendisliği dersinde ayrıntılı görülecektir. Bir yazılım projesinde eskiden maliyeti etkileyen en önemli parametre kodlama kısmı iken şimdi bakım maliyeti en önemli parametre haline gelmiştir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-45
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-46Değerlendirme Kriterleri: Diğerleri• Taşınabilirlik (Portability)– Programların bir implementasyondan diğerine taşınabilme kolaylığıdır. Dilin standartlaşma derecesi ile alakalıdır. BASIC standartlaşma derecesi kötüdür. Bu dilde yazılan bir programı başka bir implementasyona taşımak zordur. – Standartlaşma çok vakit alan maliyetli bir işlemdir. 1989 yılında C++’yı standartlaşmak için kurulan bir komite 1998 yılında çalışmasını tamamlamıştır.
Değerlendirme Kriterleri: Diğerleri• Genellik (Generality)– Çok çeşitli uygulamalarda uygulanabilirliği olması• İyi-tanımlanmış olması(Well-definedness)– Dilin resmi tanımının kesinliği(doğruluğu)(precision) ve tamamlanmış olması(completeness)Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-47
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-481.4 Dil Tasarımını Etkileyen Faktörler• Bilgisayar Mimarisi(Computer Architecture)– Diller, von Neumann mimarisi olarak bilinen yaygın bir bilgisayar mimarisi etrafında geliştirilir• Programlama Tasarım Yöntemleri– Yeni yazılım geliştirme metodolojileri yeni programlama örneklerine bunların sonucunda da, yeni programlama dillerine yol açtı.– (örn., nesneye-dayalı(object-oriented) yazılım geliştirme)
Bilgisayar Mimarisi Etkisi• Bilgisayarların temel mimarileri programlama dili tasarımında çok etkilidir.• Son 50 yılda popüler olan programlama dillerinin çoğu ünlü bir bilgisayar mimarisi olan Von Neumann mimarisi dikkate alınarak tasarlanmıştır.• Bu diller imperative diller olarak bilinirler.• Von Neumann bilgisayarları nedeniyle imperatif diller (imperative languages) hakimdir Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-49
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-50Bilgisayar Mimarisi EtkisiVon Neumann mimarisinde:–Veri ve programlar bellekte saklanır–Bellek, CPU’dan ayrıdır–Komutlar ve veri bellekten CPU’ya iletilir(pipe)–CPU’da ki İşlemin sonucu hafızaya geri gönderilir.–1940’dan sonra üretilen bilgisayarların çoğunda Von Neumann mimarisi hakimdir.
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-51 Von Neumann MimarisiBellek(komutları ve veriyi saklar)Veri ve komutlarİşlemlerin sonuçlarıGirdi ve çıktı aygıtları
– Von Neumann’dan dolayı İmperatif dillerin temelleri;• Değişkenler(variables) bellek hücrelerini modeller• Atama ifadeleri(Assignment statements) iletim (piping) işlemi temeline dayanır• İterasyon (iteration) bu mimaride tekrarı gerçekleştirmenin en verimli yoludur.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-52
•İfadelerdeki operatörler CPU tarafından hafızadan alınırlar, ifade işlemden geçtikten sonra hafızaya geri gönderilir. Bu işlem atamanın sol tarafı (left side of assignment) olarak bilinir. Örnek: a=b+c;Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-53
• Von Neumann bilgisayarlarda iterasyon hızlıdır çünkü komutlar hafızada birbirlerine yakın hücrelerde bulunmaktadır. Bir iterasyonda aynı komut bir çok kere çağrılacağından komutlardaki yakınlık hızı da beraberinde getirmektedir.• Bazı uygulamalar için rekürsiflik daha doğal olmasına rağmen Von Neumann mimarisinin bu özelliğinden dolayı iterasyonlar rekürsif ifadelere göre daha verimlidir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-54
• Makina kodunun bir Von Neumann mimarisinde işlenmesi işlemine fetch-execute işlemi denir. Çünkü komutlar hafızada bulunmaktadır ama CPU’da işlenmesi gerekmektedir. İşlenecek tüm komutların hafızadan CPU’ya getirilmesi gerekmektedir. Bir sonra işlenecek olan komutun adresi program counter diye bilinen registerlerla sağlanır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-55
• Fetch-execute basitçe aşağıdaki algoritmayla tanımlanabilir.repeat program counter da adresi verilen komutu hafızadan getirbir sonraki komutun adresini göstermesi için program counter’i bir artırkomutu çöz (decode)komutu çalıştırend repeatCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-56
• Fonksiyonel dillerde imperative diller de ki değişkenler, atama ifadeleri ve iterasyonlar yoktur. Bu dillerde hesaplamalar yapılırken fonksiyonlar doğrudan değişkenlere uygulanır• «Fonksiyonel dillerin bir çok yararlı özelliğine rağmen bu dillerin imperative dillerin yerine geçme şansı günümüzde yoktur.Ancak günün birinde fonksiyonel dilleri verimli bir şekilde işleyecek bir Von Neumann mimarisi tasarlanırsa bu durum değişebilir» John Backus 1978.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-57
• Başka bir grup bilim adamı ise imperativ dillerin daha doğal olduğunu, fonksiyonel dilleri verimli gerçekleştiren bilgisayar mimari yapıları tasarlansa bile halen imperative dillerin tercih edileceğini iddia etmektedir.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-58
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-59Programlama Tasarım Yöntemlerinin etkisi• 1950’ler ve 1960’ların başlangıcı: Basit uygulamalar; makine verimliliğiyle ilgileniyordu• 1970’lerde programların maliyeti donanımdan yazılıma doğru kaymaya başladı. Donanımların fiyatı düştü, yazılımcıların maliyeti ise arttı. • 1960’ların sonları: İnsan verimliliği önem kazandı; okunabilirlik, daha iyi kontrol yapıları(control structures)– Yapısal programlama(structured programming)– Yukarıdan aşağıya(top-down) tasarım ve adım adım şekillendirme/rötüş (step-wise refinement)• 1970’lerin sonları: İşleme-dayalı(Process-oriented) dan veriye-dayalıya(data-oriented) geçiş– Veri soyutlama(data abstraction)Veriye dayalı programlama çok tercih edilmesine rağmen işleme dayalı programlamada hiçbir zaman terk edilmedi. Özellikle concurrent dillerde halen tercih edilmekte. Örneğin Ada, c#,Java
• 1980’lerin ortaları: Nesneye-dayalı(Object-oriented) programlama– Veri soyutlama + miras + polimorfizm (Data abstraction + inheritance + polymorphism)• Fonksiyonel ve mantıksal dillerede nesne tabanlı özellikler eklendi. • CLOS (nesne tabanlı fonksiyonel dil)• Prolog++ (nesne tabanlı mantıksal dil)Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-60
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-611.5 Dil Kategorileri• Zorunlu(Imperative)– Temel özellikleri değişkenler(variables), atama ifadeleri(assignment statements), ve iterasyondur(iteration)– Örnekler: C, Pascal• Fonksiyonel(Functional)– Hesaplamaları yapmanın temel yolu, fonksiyonları verilen parametrelere uygulamaktır– Örnekler: LISP, Scheme• Mantıksal(Logic)– Kural temelli(Rule-based) (kuralların sırası belirli değildir)– Örnek: Prolog• Nesneye-dayalı(Object-oriented)– Veri soyutlama(Data abstraction), miras(inheritance), geç bağlama(late binding)– Örnekler: Java, C++• Diğerleri- Visual (görsel) diller- Scripting diller- Hibrid diller (markup dil/programlama dili)- özel amaçlı diller-…….
• Nesne tabanlı dil kavramının, imperative dillerde kullanılan prosedür tabanlı dil kavramından çok farklı olmasına rağmen imperative bir dilin nesne tabanlı programlamayı desteklemesini sağlamak çok zor değildir. • Örneğin atama ve kontol ifadeleri C ve Java’da hemen hemen aynıdır (diğer taraftan diziler, altprogramlar, ve Java’nın semantiği C’den oldukça farklıdır). • Benzer ifadeler nesne tabanlı programlamayı destekleyen fonksiyonel diller içinde geçerlidir. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-62
Mantıksal diller• Mantıksal diller kural tabanlı dillerdir. İmperative dillerde çözülecek algoritmanın tanımı ayrıntılı yapılır, komutların ve işlemlerin sırası bellidir. • Mantıksal programlamada ise ayrıntıda yoktur. Sıralamada belli değildir. Programlama dili, sonucu elde etmek için hangi kuralı hangi sırayla kullanacağını belirlemelidir. • Bu yaklaşım diğer üç dil kategorisine göre çok radikaldir. Hiçbir kategoriye girmediği ve kendi başına ayrı bir kategori olduğu açıktır. En yaygın mantıksal dil prolog’durCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-63
Visual (görsel) diller• Visual diller ayrı bir kategori olarak görülse de imperative dillerin alt kategorisindedir.• En popüler olanı Visual BASIC.NET (VB.NET)• Bu diller sürükle bırak (drag and drop) mantığıyla çalışırlar. • Visual diller kullanıcıya rahat grafiksel ara yüzler tasarlamak için kullanılırlar. Örneğin bir düğme veya bir text kutusu gibi bir kontrol yapısı kodlamak için VB.NET’de tek bir tuşa basmak yeterlidir. Bu özellikler günümüzde tüm .NET dillerinde vardır.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-64
Scripting diller• Bazı bilim adamları bu dilleri ayrı bir kategori olarak görürler. Ama bu diller de imperative dillerdir. Bu dillere örnek verilirse; Perl, JavaScript, RubyCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-65
Hibrid (melez) diller • Son yıllarda hibrid dil (Markup/programlama dili) kategorisi denen bir kavram ortaya çıkmaktadır. • Markup dilleri programlama dili değildir. Örneğin XHTML• XHTML veya XML gibi markup dillerin bazı versiyonlarının içine bazı programlama dili kabiliyetleri serpiştirilmiştir. • Örnek: JSTL (Java Server Pages Standart Tag Library)• XSLT (eXtensible Stylesheet Language Transformations)Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-66
Özel amaç için tasarlanmış diller• Son 50 yılda özel uygulamalar için bir çok programlama dili tasarlanmıştır. • Örnek:RPG (Report Program Generator): ticari raporlar üretmek için tasarlanmıştır.APT (Automatically Programmed Tools): programlanabilir makinalar için tasarlanmıştır.GPSS (General Purpose Simulation System): sistem simulasyonu için tasarlanmıştır.Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-67
1.6 Dil Tasarımında Verilen Ödünler• Dil gelişimi ile ilgili kriterler önceki bölümlerde anlatıldı. Bu kriterler bir programlama dili tasarlanırken gerekli çatı hakkında temel ipuçlarını verdi. Fakat bu çatıda birbiri ile çelişen bir çok durum var.• «Programlama dili tasarlanırken çok önemli bir çok kriter var ama bu kriterler birbirleri ile çelişmektedir. Bu çelişkili kriterlerle iyi bir dili tasarlamak çok zor bir mühendislik görevidir.» Hoare (1973)Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-68
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-691.6 Dil Tasarımında Verilen Ödünler• Güvenilirlik ve yürütme(execution) maliyeti– Çelişen kriterlerdir– Örnek: Java ‘da tüm dizilerin indislerinin doğru aralıkta olup olmadığının kontrolü yapılır. Bu işlem Java’da execution maliyetini çok fazla artırır.– C’de ise dizilerin indislerinin aralık kontrolü yapılmaz . Dolayısıyla C’de yazılan programın semantik olarak aynı olanı Java’da yazılırsa C’de yazılan program dahahızlı execution yapar. – Java programlar ise daha güvenilirdir. Java tasarımcıları güvenlik için execution verimliliğinden ödün vermişlerdir.
1.6 Dil Tasarımında Verilen Ödünler• Okunabilirlik ve yazılabilirlik– Diğer çelişen kriterler– Örnek : APL pek çok güçlü operatör (ve çok sayıda yeni sembol) sağlayarak karmaşık hesaplamaların kolayca yapılabilmesine imkan sağlarken okunabilirliği azaltmaktadır.– «4 satırdan oluşan APL programın anlamak için 4 saat uğraştım» Daniel McCracken– APL tasarımcıları yazılabilirlik için okunabilirlikten ödün vermişlerdir. • Yazılabilirlik ve güvenilirlik– Diğer çelişen kriterler– Örnek : C++ pointerları çok güçlü ve esnek olmasına rağmen güveniliriliği azdır. Bu yüzden Java’da pointer kavramı yoktur. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-70
1.7 İmplementasyon Metotları• Bilgisayarın iki temel bileşeni vardır. Dahili hafıza ve işlemci.• Dahili hafıza, programları ve verileri depolamak için kullanılır. • İşlemci ise mantıksal ve aritmetiksel işlemleri yapmak için tasarlanmış elektronik devrelerdir. İşlemci komutlara göre işlemleri yapmaktadır. Bu komutlara makrokomutlarda denir. makro komutlar mikrokomut kümelerinden oluşur. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-71
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-721.7 İmplementasyon Metotları• Derleme(Compilation)– Programlar makine diline çevirilir• Saf Yorumlama(Pure Interpretation)– Programlar yorumlayıcı(interpreter) olarak bilinen başka bir program tarafından yorumlanır• Hibrit(melez--Hybrid) İmplementasyon Sistemleri– Derleyiciler(compilers) ve saf yorumcular(pure interpreters) arasındaki uzlaşmadır
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-73Bilgisayarın katmanlı(layered) görünümü
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-74Derleme(Compilation)• Yüksek-düzeyli(high-level) programı (kaynak dil--source language), makine koduna(machine code-- machine language) çevirir• Yavaş çeviri, hızlı yürütme(execution)• Derleme işlemi birkaç evreden oluşur: – Sözcüksel analiz (lexical analysis): kaynak(source) programdaki karakterleri sözcüksel(lexical) birimlere çevirir– Sentaks Analiz (sözdizim-syntax analysis): sözcüksel birimleri gramer/sözdizim ağaçlarına (parse trees) dönüştürür, bu ağaçlar programın sözdizimsel(syntactic) yapısını gösterir– Semantik Analiz(anlamsal-Semantics analysis): ara (intermediate) kod üretilir– Kod üretimi: makine kodu üretilir
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-75
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-76Biraz daha derleme terminolojisi• Yükleme Modülü(Load module) (yürütülebilir görüntü-executable image): kullanıcı ve sistem kodu birlikte• Bağlama ve Yükleme(Linking and loading): sistem programını toparlama ve kullanıcı programa bağlama
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-77Makine kodunun yürütülmesi• (Bulma-yürütme-çevrimi)Fetch-execute-cycle (bir von Neumann mimarisi üzerinde)initialize the program counter (program sayacını başlat)repeat foreverfetch the instruction pointed by the counter (sayacın gösterdiği komutu bul) increment the counter (sayacı arttır) decode the instruction (komutu çöz) execute the instruction (komutu yürüt)end repeat
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-78Von Neumann Darboğazı(Bottleneck)• Bir bilgisayarın belleği ve işlemcisi arasındaki bağlantı hızı o bilgisayarın hızını belirler• Program komutları(instructions) çoğu kez yukarıda bahsedilen bağlantı hızından çok daha hızlı yürütülebilir; bağlantı hızı bu yüzden bir darboğaza(bottleneck) sebep olur• Von Neumann darboğazı(bottleneck) olarak bilinir; bilgisayarların hızını sınırlayan birinci faktördür
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-79Saf Yorumlama(Pure Interpretation)• Çeviri (translation) yoktur• Programların implementasyonu daha kolaydır (çalışma-zamanı hataları(run-time errors) hemen ve kolayca gösterilir)• Daha yavaş yürütme (Derlenmiş programlardan 10 ile 100 kat daha yavaştır)• Çoğu kez daha fazla boş alana ihtiyaç duyar• Yüksek-düzeyli(high-level) dillerde gittikçe daha nadir kullanılmaktadır• Bazı Web yazı dillerde(Web scripting languages) kullanımı önem kazanır(örn., JavaScript)
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-80Saf Yorumlama(Pure Interpretation) İşlemi
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-81Hibrit İmplementasyon Sistemleri• Derleyiciler(compilers) ve saf yorumlayıcılar(pure interpreters) arasında bir uzlaşmadır• Bir yüksek-düzeyli dil programı kolayca yorumlanabilecek bir ara(intermediate) dile çevrilir• Saf yorumlamadan daha hızlıdır• Örnekler– Perl programları, yorumlamadan önce hataları tespit etmek için kısmen derlenir– Java’nın ilk implementasyonları hibritti; ara form, yani bayt kodu(byte code), bir bayt kodu yorumlayıcısı(byte code interpreter) ve bir çalışma-zamanı(run-time) sistemi olan herhangi bir makineye taşınabilirlik sağlar (birlikte, bunlara Java Sanal Makinesi (Java Virtual Machine) adı verilir)
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-82Hibrit İmplementasyon İşlemi
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-83Tam-zamanında(Just-in-Time) Implementasyon Sistemleri• Önce programları bir ara(intermediate) dile çevirir• Sonra ara dili makine koduna derler (machine code)• Makine kodu sürümü(version) birbirini takip eden çağırmalar(subsequent calls) için tutulur• JIT sistemleri Java programlarında çok kullanılır• .NET dilleri bir JIT sistemiyle geliştirilmiştir
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-84Önişlemciler(Preprocessors)• Önişlemci makroları(macros (instructions-komutlar)) başka bir dosyadan dahil edilecek kodu belirtmek için yaygın olarak kullanılır• Bir önişlemci, gömülü(embedded) önişlemci makrolarını genişletmek için programı derlenmesinden hemen önce işler• İyi bilinen bir örnek: C önişlemcisi– #include, #define, ve benzeri makroları genişletir
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-851.8 Programlama Platformları• Yazılım geliştirmede kullanılan araçlar(tools) koleksiyonuna programlama platformu denir. • Bu paltform; bir dosya sistemi, text editor, linker, ve compiler içerebilir. Veya çok fazla birleşik tool’dan oluşan ve tool’lar arası geçişi grafiksel arayüzle sağlayan bir platformda olabilir. • Tüm bunlardan dolayı yazılım geliştirme sisteminin kabiliyetini ölçmek için tek yöntem programlama dilinin karakteristiği değildir.
1.8 Programlama Platformları• UNIX– Eski bir işletim sistemi ve araç koleksiyonudur.– UNIX’in ilk versiyonlarının en büyük eksiği araçları arasında geçiş için grafiksel özelliğinin olmamasıydı. Bu eksiklik yüzünden öğrenilmesi ve kullanılması zor bir platformdu. Bu eksiklik günümüzde giderildi ve unix’e GUI özelliği eklendi. UNIX GUI’lere örnek: Solaris Common Desktop Environment (CDE), GNOME ve KDE. Bu GUI’ler sayesinde Unix ‘i windows ve macintosh sistemlerine benzer şekilde görünmesini sağlamıştır. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-86
1.8 Programlama Platformları• Borland JBuilder– Java için bir tümleşik geliştirme platformu(integrated development environment)– Compiler, editor, debugger, ve dosya sistemi ni birleşik olarak kullanıma sunan bir platformdur. Bu dört özelliğe grafiksel arayüzle erişilir. Jbuilder, Java yazılımı geliştirmek için güçlü ve kompleks bir sistemdir. • Microsoft Visual Studio.NET– Büyük, karmaşık bir görsel platform(visual environment)– Pencere arayüzlerle araçlarına erişilir. Çok fazla yazılım geliştirme aracına sahiptir. – Bu platform aşağıda isimleri verilen 5 farklı dilde program geliştirmek için kullanılır. C#, Visual BASIC.NET, Jscript (Javascript’in microsoft versiyonu), J# (Java’nın microsoft versiyonu), veya C++ ile programlama yapılırCopyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-87
• NetBeans, öncelikli kullanım amacı java ile web uygulaması gerçekleştirmektir. Aynı zamanda Javascript, Ruby, ve PHP’yi de desteklemektedir. • Hem NetBeans hem de Visual Studio programlama platformu oldukları gibi aynı zamanda framework özelliğide taşırlar. Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-88
Copyright © 2011 Pearson Addison-Wesley. All rights reserved. 1-89Özet• Programlama dillerini öğrenmenin öneminin bazı nedenleri:– Farklı yapıları kullanabilme kapasitemizi arttırması– Dilleri daha akıllıca seçebilir hale gelmek– Yeni dilleri öğrenmeyi kolaylaştırması• Dil değerlendirme kriterlerinin en önemlileri:– Okunabilirlik(Readability), yazılabilirlik(writability), güvenilirlik(reliability), maliyet(cost)• Dil tasarımı etkileyen ana faktörler makine mimarisi(machine architecture) ve yazılım geliştirme metodolojileridir• Programlama dillerinin implementasyonunun ana metotları: derleme(compilation), saf yorumlama(pure interpretation), ve hibrit implementasyon