Bölüm 9 Alt Programlar ISBN 0-321-49362-1
Bölüm 9 Konular Giriş Alt programların temelleri Alt programların tasarım kouları Yerel başvuru çevreleri Parametre gönderme metotları Alt program adlarının parametre olarak kullanılması Aşırı yüklenmiş alt programlar Genel altprogramlar Fonksiyonlar için tasarım konuları Kullanıcı tanımlı aşırı yüklenmiş operatörler Yardımcı rutinler Wesley. All rights reserved. 1-2
Giriş İki temel soyutlama yeteneği Süreç soyutlama(process abstraction ) İlk başlarda vurgulandı Veri soyutlama(data abstraction) 1980 lerde vurgulandılar. Wesley. All rights reserved. 1-3
Alt programların temelleri Her alt programın tek temel giriş noktası vardır Alt programın çalışması bitene kadar çağıran program durdurulur. Kontrol her zaman,alt program çalışmasını bitirdikten sonra,çağıran programa döner. Wesley. All rights reserved. 1-4
Temel Tanımlamalar Alt program tanımı alt programın arayüzünü tanımlar Bir alt program çağrımı çalışacak olan alt programın kodun içinde açıkça yazılmasıdır. Bir alt program başlığı(header) tanımlamanın ilk kısmıdır, ismini, alt program tipini ve parametrelerini içerir Parametre profilini(yani imzasını signature) içerir. Bu da parametre sayısı, sırası ve parametrelerin tipleridir. Protokol alt programın parame profilleri ve onun geriye dönüş tipidir. Wesley. All rights reserved. 1-5
Temel tanımlamalar C ve C++ da fonksiyon tanımlamalarına genelde prototip (prototypes) denilir. Bir alt program tanımlaması onun gövdesini değil sadece protokolünü içerir. Bir formal parametre alt programın başlığında listelenen ve alt programda kullanılan parametrelerdir. Gerçek parametre fonksiyonun çağrımında kullanılan bellekte yeri adresi olan parametrelerdir. Wesley. All rights reserved. 1-6
Gerçek/Formal parametre uyumu Pozisyonel(Positional) Gerçek parametreler ile formal parametrelerin bağlanması pozisyonel olur: İlk gerçek parametre ilk formal parametre ile eşlenir ve bu şekilde diğerleride yapılır. Güvenli ve etkilidir. Anahtar Kelimeler Gerçek parametre ile hangi formal parametrenin eşleneceği belirtilir. Parametreler herhangi bir sırada olabilir. Wesley. All rights reserved. 1-7
Formal Parametreler Varsayılan Değerler. Bazı dillerde(c++, Ada), formal parametrelerin varsayılan değerleri olabilir (gerçek parametreler atanmamışsa) In C++, default parameters must appear last because parameters are positionally associated C# metotları değişken sayıda parametreyi kabul edebilir. Bunlar aynı tipli olmalıdır. Wesley. All rights reserved. 1-8
Prosedürler ve Fonksiyonlar Altprogramların iki kategorisi olabilir. Prosedürler geriye bir değer döndürmeyen parametreli hesaplama ifadelerinin bulunduğı alt programlardır. Fonksiyonlar yapısal olarak prosedürlerin aynısıdır, metematikteki fonksiyonları modeller ve geriye değer döndürürler. Yan etkilerinin olmaması beklenir ama genelde yan etkileri vardır. Wesley. All rights reserved. 1-9
Alt programların tasarım konuları Hangi parametre geçirme yöntemleri vardır? Parametre tipleri kontrol edilecek mi? Yerel değişkenler static mi yoksa dinamik mi? Alt program tanımlamaları başka alt programlarda görünecek mi? Alt programlar aşırı yüklenecek mi? Alt programlar genel olacak mı? Wesley. All rights reserved. 1-10
Yerel başvuru çevreleri Yerel değişkenler stack dinamik tir. Avantajlar Öz yinelemeye destek Yereller için kullanılan saklama alanı diğer alt programlartarafından da kullanılır. Dez avantajlar Yre tehsis etme(allocation/de-allocation)/ geri alma, ilkleme zamanı Direkt olmayan adresleme Alt programlar tarih duyarlı olmaz yani geçmiş bilgisine sahip değillerdir. Yerel değişkenler static olabilir Daha etkili direkt olmama yoktur Çalışma zamanı aşırı yükleme yoktur Özyineleme desteği yoktur. Wesley. All rights reserved. 1-11
Parametre geçirme yöntemleri Parametrelerin gönderilebilme ya da alt programlardan alınabilme yöntemleri Değer ile gönderme(pass-by-value) Sonuç ile gönderme(pass-by-result) Değer sonuç ile(pass-by-value-result) Referans olarak gönderme(pass-byreference) İsim ile gönderme(pass-by-name) Wesley. All rights reserved. 1-12
Parametre gönderme modelleri Wesley. All rights reserved. 1-13
Değer ile gönderme(pass-by-value) Gerçek parametrenin değeri formal parametreyi ilkleme için kullanılır. Normalde kopyalama ile gerçekleştirilir. Erişim denetimi ile sağlanabilir ama yazma korumasına ihtiyaç duyar(gerçek parametrenin korunması için) Kopyalama kullanıldığında ek saklama yerine ihitiyaç vardır. Saklama ve kopyalama işlemleri yüksek maliyetlidir. Wesley. All rights reserved. 1-14
Sonuç ile gönderme (Pass-by-Result (Out Mode) ) Parametre sonuç olarak gönderildiğinde alt programdan bir değer geriye çevrilmez, uygun gelen formal parametre bir yerel değişkenmiş gibi kullanılır, kontrol alt programı çağırana döndüğünde gerçek parametreye değeri verilir. Saklama ve kopyalama işlemi için ek yere ihitiyaç duyar. Muhtemel problem: sub(p1, p1);geriye döndürülecek olan parametre p1 in mevcut değeri olur. Wesley. All rights reserved. 1-15
Değer Sonuç geriye döndürme(pass-by-value- Result (inout Mode)) Değer ve sonuç olarak döndürmenin kombinasyonudur. Bazen kopya olarak çevirme şeklinde bilinir.(pass-bycopy) Formal parametrelerin yerel saklama yerleri vardır Wesley. All rights reserved. 1-16
Referans olarak çevirme(pass-by-reference (Inout Mode)) Bir erişim yolu(access path) çevirme Ayrıca paylaşarak çevirme adlanır(pass-by-sharing) Gönderme işlemi etkilidir(kopyalama ve ek yere ihtiyaç yok) Dezavantaj Formal parametrelere yavaş erişim İstenmeyen yan etkiler olabilir. İstenmiyen takma isimler Wesley. All rights reserved. 1-17
Ad şeklinde gönderme(pass-by-name (Inout Mode)) Sözcüksel yerine koyma Formaller çağrılma zamanında erişim metotlarında bağlanır fakat gerçek değer adres bağlama işlemi başvuru ya da atama işleminde olur Geç bağlama esnekliğine izin verir. Wesley. All rights reserved. 1-18
Parametrelerin gerçekleştirimi- Gönderme metotları(passing Methods) Bir çok dilde parametre iletişimi çalışma zamanı stack i ile gerçekleştirilir. Referans ile gönderme (Pass-by-reference) gerçekleştirim için oldukça basittir; stack e sadece bir adres konulur. Bir ince fakat ölümcü hata referans ile gönderme ve değer-sonuç olarak değer göndermede görülür: bir sabite karşılık gelen bir formal parametre yanlışlıkla değişebilir. Wesley. All rights reserved. 1-19
Önemli dillerde parametre gönderme metotları Fortran Herzaman in-out şeklindeki model kullanılır. Fortran 77 önce: referans ile gönderme(pass-by-reference) Fortran 77 ve sonra: Skaler değişkenler genellikle değer-sonuç şeklinde gönderilir. C Değer ile gönderme İşaretçiler ile referans ile gönderme C++ Özel bir işaretçi tipi olan reference tipi referans ile gönderme için kullanılır. Java Tüm parametreler değer ile gönderilir. Nesne parametreleri referans ile gönderilir.(aslında referansların değer ile gönderilmesi yapılır). Wesley. All rights reserved. 1-20
Önemli dillerde parametre gönderme metotları Ada Parametre gönderiminde üç model vardır: in, out, in out; in varsayılan modeldir. Formal parametreler out tanımlanmışlarsa atanabilirler fakat referanslanamazlar; in tanımlananlar referanslanabilirler fakat atanamazlar; in out parametreler referanslanabilir ve atanabilir. C# Varsayılan metot: değer ile aktarma Referans ile gönderme formal ve gerçek parametrenin ref ifadesi ile tanımlanması ile yapılır. PHP: C# a oldukça benzer Perl: tüm gerçek parametreler dolaylı olarak daha önceden tanımlı olan @_ işaretli dizi içine yerleştirilir. Wesley. All rights reserved. 1-21
Tip kontrol parametreleri Güvenlik için oldukça önemlidirler. FORTRAN 77 ve orijinal C de yoktur Pascal, FORTRAN 90, Java, ve Ada: her zaman gereklidir. ANSI C ve C++: kullanıcı tarafından seçim yapılır. Prototipler Göreli yeni dillerde Perl, JavaScript, ve PHP tip kontorolüne gerek yoktur. Wesley. All rights reserved. 1-22
Parametre olarak çok boyutlu diziler Eğer çok boyutlu bir dizi bir alt programa gönderilmişse ve alt program ayrı olarak derleniyorsa derleyici tanımlanan bu dizinin boyutunu diziyi tutmak için bilmelidir. Wesley. All rights reserved. 1-23
C ve C++ da çok boyutlu dizilerin parametre olarak gönderilmesi. Programcılar hepsinin boyutunu ilk indis hariç tanımlamalıdır. Esnek alt programlar yazmayı engeller. Çözüm: Diziye bir işaretçinin ve dizi boyutunun başka bir parametre olarak gönderilmesi; kullanıcı bu boyut parametresini kullanmalıdır. Wesley. All rights reserved. 1-24
Pascal ve Ada da çok boyutlu dizilerin parametre olarak kullanılması Pascal Bir problem değildir; tanımlama boyutu dizi tipinin bir alanıdır. Ada Pascal daki gibi kısıtlı diziler Kısıtlı olmayan diziler tanımlanan boyut nesne tanımının bir parçasıdır. Wesley. All rights reserved. 1-25
Fortran da çok boyutlu dizi parametre kullanımı Dizi olan formal parametreler başlıktan sonra tanımlamaya sahiptir. Tek boyutlu dizilerde indis kullanılmayabilir. Çok boyutludiziler için indis değerlerine ihtiyaç vardır. Wesley. All rights reserved. 1-26
Java ve C# da çok boyutlu dizilerin parametre olarak gönderilmesi Ada ya benzer Diziler nesnedir ; hepsi tek boyutludur fakat elemanları başka diziler olabilir. Her dizi içinde length ya da Length gibi dizi boyutunu gösteren adlandırılmış sabitler vardır. Dizi ilk oluşturulduğunda bu değere atama yapılır. Wesley. All rights reserved. 1-27
Parametre gönderme tasarımı İki önemli düşünce Verimlilik(Efficiency) Bir Ya da iki yönlü veri aktarımı Fakat yukarıdaki düşünceler çatışırlar. İyi programlama değişkenlere sınırlı erişime izin verir bu mümkün olan her yerde tek taraflı erişim demektir. Referans ile göndermede büyük boyutlu yapıları göndermede daha verimlidir. Wesley. All rights reserved. 1-28
Alt program isimlerinin parametre olarak gönderilmesi Bazen alt program isimleri parametre olarak gönderilebilir. Konular: 1. Parametrelerde tip kontrolü olacak mı? 2. Parametre olarak gönderilen alt programlar için doğru referanslama nasıl olmalıdır? Wesley. All rights reserved. 1-29
Alt programlarını parametre olarak gönderilmesi C ve C++: fonksiyonlar parametre gibi gönderilemezler fakat fonksiyonlara işaretçiler parametre olarak gönderilebilir.parametreler tip kontrolü yapılır. FORTRAN 95 tip kontrolü yapar. Pascalın sonraki versiyonları ve Ada alt programların parametre olmasına izişn vermez; benzer alternatif Ada da genel (generic) kolaylığı ile sağlanır Wesley. All rights reserved. 1-30
Aşırı yüklenmiş alt programlar Aynı referanslama ortamında metotlar aynı isme sahiplerse aşırı yüklenmişlerdir. Aşırı yüklenen her alt programın protokolü farklıdır. C++, Java, C#, ve Ada da ön tanımlı aşırı yüklü alt programlar içerir. Ada da aşırı yüklenmiş olan fonksiyonun geriye dönüşü ayırt edici olarak kullanılabilir böylece iki fonksiyon aynı parametrelere sahip olabilir. Ada, Java, C++, ve C# kullanıcılara aynı isimli birçok aşırı yüklenmiş alt program yazmaya izin verir. Wesley. All rights reserved. 1-31
Genel Altprogramlar(Generic Subprograms) Bir genel(generic or polymorphic) alt program farklı aktivasyonlardaki farklı değişkenler alabilir. Aşırı yüklenmiş alt programlar anlık çok biçimliliğe izin verir. Alt programda parametrenin tipini belirleyen generic parametre alan alt programlarda parametrik çok şekillilik vardır. Wesley. All rights reserved. 1-32
C++ da bir örnek template <class Type> Type max(type first, Type second) { return first > second? first : second; } Yukarıdaki örnek herhangi bir tip için ilklenebilir. int max (int first, int second) { return first > second? first : second; } Wesley. All rights reserved. 1-33
Fonksiyonlar için tasarım konuları Yan etkilere izin verilecek mi Parametreler yan etkilerin azaltılması için her zaman Ada daki gibi in-mode da mı olmalıdır? Hangi tipteki parametrelere izin verilir? Birçok emirsel dil sınırlı tipteki geriye dönüş tiplerine izin verilir. C diziler ve fonksiyonlar haricindeki diğer tüm tiplere izin verir. C++ da C gibidir fakat ayrıca kullanıcı tanımlı tiplerede izin verir. Ada tüm tiplere izin verir. Java ve C# fonksiyonlara izin vermez fakat metotlar herhangi bir tipe sahip olabilir. Wesley. All rights reserved. 1-34
Kullanıcı tanımlı aşırı yüklü operatörler Ada ve C++ da operatörler aşırı yüklenebilir. Bir Ada örneği Function * (A,B: in Vec_Type): return Integer is Sum: Integer := 0; begin for Index in A range loop Sum := Sum + A(Index) * B(Index) end loop return sum; end * ; c = a * b; -- a, b, and c are of type Vec_Type Wesley. All rights reserved. 1-35
Yardımcı rutinler Bir yardımcı rutin bir alt programdır. Birden fazla girdi vardır ve kendilerini kontrol ederler. Simetrik kontrol adlanır: çağıran(caller) ve çağrılan(called) yardımcı rutinler daha fazla eşit temeldedir. Bir yardımcı rutin çağrımı resume ile yapılır. ilk resume başında yapılır, daha sonrakiler son kalınan yerden itibaren yapılır. Yardımcı rutinler tekrarlı olarak birbirlerini resume eder. Yarı eş zamanlı çalışma(quasi-concurrent execution) sağlarlar. Wesley. All rights reserved. 1-36
Yardımcı rutinler Wesley. All rights reserved. 1-37
Yardımcı rutinler Wesley. All rights reserved. 1-38
Yardımcı rutinler Wesley. All rights reserved. 1-39