You are on page 1of 39

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

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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ı?

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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-by-
reference)
– İsim ile gönderme(Pass-by-name)

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-12
Parametre gönderme modelleri

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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-by-
copy)
Formal parametrelerin yerel saklama yerleri vardır

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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).
Copyright © 2007 Addison-
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.
Copyright © 2007 Addison-
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.
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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?

Copyright © 2007 Addison-


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
Copyright © 2007 Addison-
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.

Copyright © 2007 Addison-


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.
Copyright © 2007 Addison-
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;
}

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


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

Copyright © 2007 Addison-


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.

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-36
Yardımcı rutinler

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-37
Yardımcı rutinler

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-38
Yardımcı rutinler

Copyright © 2007 Addison-


Wesley. All rights reserved. 1-39

You might also like