Bölüm 9
Altprogramlar
ISBN 0-321-49362-1
9. Bölüm konuları
• Giriş
• Altprogram temelleri
• Yerel atıf ortamları (local referencing
environments)
• Parametre geçme yöntemleri
• Altprogram olan parametreler
• Çok anlamlı (overloaded) altprogramlar
• Jenerik altrpogramlar
• Kullanıcı-tanımlı çok anlamlı operatörler
• Korutinler (coroutines)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-2
Giriş
• İki temel soyutlama
– Süreç soyutlama (process abstraction)
• İlk zamanlardan beri var
– Veri soyutlama (data abstraction)
• 1980lerden beri var
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-3
Altprogram temelleri
• Her altprogramın tek giriş noktası var
• Çağıran program, çağrılan program
çalışırken askıya alınır
• Çağrılanın çalışması bittiğinde, kontrol her
zaman onu çağırana geri döner.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-4
Temel tanımlar
• Altprogram tanımı altprogramın arayüzünü ve yaptığı işleri
tanımlar
• Altprogram çağrılması altprogramın çalısması isteğidir
• Altprogram başlığı tanımın ilk kısmıdır. Altprogramın adını,
ne tür altprogram olduğunu (prosedür/fonksiyon) ve formel
parametrelerini içerir
• Altprogramın parametre profili (imzası) parametrelerin
sayısı, sırası ve tiplerinden oluşur
• Altprogramın protokolü altprogramın profilidir. Altprogram
eğer bir fonksiyon ise, o zaman profile fonksiyonun dönüş
tipi de dahil olur.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-5
Temel tanımlar…
• Altprogram deklarasyonu altprogramın protokolünü içerir
(gövde yok).
• C ve C++ dillerinde fonksiyon deklarasyonunun adı: prototip
• Formel parametre (formal parameter) altprogam başlığında
olup gövdede kullanılan bir “kukla” değişkendir (dummy
variable)
• Asıl parametre (actual parameter) altprogram çağrılmasında
kullanılan bir değer veya adrestir
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-6
Asıl/formel parametre
ilişkilendirmesi
• Konuma bağlı
– Birinci asıl birinci formele, ikinci asıl ikinci formele vs.
bağlanır
• Anahtar kelime
– Asıl parametrenin hangi formel parametreye
bağlanacağını çağırma anında belirtiriz.
– Avantajları:
• Parametreleri istediğimiz sırada verebiliriz
• Parametre eşleştirme hataları olmaz
– Dezavantajı: Formel parametre isimlerinin billinmesi
gerekir
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-7
Formel parametre varsayılan
değerleri
• Bazı dillerde (ör: C++, Python, Ruby, Ada, PHP),
formel parametrelerin varsayılan değerleri olabilir.
– C++ dilinde parametreler sıralı olduğundan varsayılan
değerler en sona konur
• Değişen sayıda parametre
- C# metodlarının ayni tipte olamaları koşulu ile değişen
sayıda parametreleri olabilir
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-8
Prosedürler ve fonksiyonlar
• İki tür altprogram var
– Prosedürler : parametresi olabilen komutlar
topluluğu
– Fonksiyonlar prosedür gibi, ancak geri
verdikleri değer (return value) var.
• Prensipte yan etkileri olmamalı
• Pratikte yan etkileri var
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-9
Lokal atıf ortamları (referencing
environments)
• Lokal değişkenler yığıt-dinamik olabilir
- Avantajları
• Özyinelemeyi destekler
• Alt programlar yığıt üzerinde ayni yeri kullanabilir
– Dezavantajları
• Yer alma-yer bırakma (allocation/de-allocation) , ilkleme
zamanı
• Dolaylı adresleme
• Altprogramlar tarihçeye duyarlı değil
• Lokal
değişkenler
statik olabilir
– Avantajları ve dezavantajları yığıt-dinamiğin tersi
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-10
Parametre geçmenin semantik modelleri
• Gir modu (in mode)
• Çık modu (out mode)
• Girçık modu (inout mode)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-11
Parametre geçmenin semantik modelleri...
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-12
Değer ile geçiş (Gir modu) (Pass by value)
• Asıl parametrenin değeri formel parametreyi
ilklemek için kullanılır
– Normalde kopyalama yönemi ile yapılır
– Fonksiyon gövdesinde formel parametre bir lokal
değişken gibi görev yapar
– Kopyalamanın dezavantajları:
• Ek hafıza gerektirir
• Kopyalama zaman alabilir (büyük nesneler için)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-13
Netice ile geçiş (Çık modu)
• Asıl parametre bir değişken olmalıdır.
Altprograma bir değer verilmez. Formel
parametre yerel değişken gibi görev yapar.
Kontrol çağırana dönmeden hemen önce,
formel parametrenin son değeri asıl
parametrenin içine kopyalanır.
– Fazladan deplama ve zaman ihtiyacı
• Olası sorun: sub(p1, p1); en son hangi
formel parametre kopyalanırsa, o değer p1
içindeki değer olur.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-14
Değer-netice ile geçiş (girçık modu)
• Değer ve netice ile geçişin birleşimi
• Formel parametrelerin hafızada yeri var
• Altprogram çağrıldığında asıl parametreyi
formel parametreye kopyala
• Altprogram geri dönerken formel
parametreyi asıl parametreye geri kopyala
• Dezavantajları
– Iki kere kopyala
– İki kere sakla
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-15
Referans ile geçiş (girçık modu)
• Asıl parametrenin adresini geç
• Formel parametreye yapılan herhangi bir
değişiklik anında asıl parametreye yansır
• Advantage: Verimlilik (kopyalama ve çifte
yer ayırma yok)
• Dezavantajı
– Ayni yere birden çok şekilde erişim (aliasing)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-16
İsim ile geçiş (girçık modu)
• Metinsel yerike koyma
• Makro gibi
• Örnek:
– i 1’den n’e kadar olacak şekilde (xi × i)
toplamını bul. Bu işi yapabilecek,
Sum(i, 1, n, x[i]*i) diye çağrılabilecek bir
altprogam yazalım.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-17
İsim ile geçiş (girçık modu)...
real procedure Sum(j, lo, hi, Ej);
value lo, hi;
integer j, lo, hi; real Ej;
begin
real S;
S := 0;
for j := lo step 1 until hi do
S := S + Ej;
Sum := S
end;
Çağırma: Sum(i, 1, n, x[i]*i)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-18
İsim ile geçiş problemi
•
•
•
•
•
•
•
procedure swap (a, b);
integer a, b, temp;
begin
temp := a;
a := b;
b:= temp
end;
• swap(i, x[i]) olarak çağrılmanın etkisi:
•
temp := i;
•
i := x[i];
•
x[i] := temp
• Doğru çalışmaz!
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-19
Parametre geçme yöntemleri
gerçeklenmesi
• Çoğu dilde sistem çalışma-zamanı yığıtı
aracılığı ile
• Referans ile geçiş en kolay: yığıt üzerine
adres koy
• Referans ve değer-netice yöntemlerinde
olası hata: asıl parametrenin değişken
yerine bir değer olması
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-20
Bazı ana dillerin parametre geçme
yöntemleri
• C
– Değer ile geçiş
• C++
– Değer ile geçiş + Reference tipi aracılığı ile referans ile geçiş
(ör: int f(int & x){….} )
• Java
– Tüm parametreler değer ile geçilir
– Nesne parametreler gerçekte nesne işaretçisidirler, onun için
işaretçi değer ile geçilir
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-21
Parametrelerin tip kontrolü
• Güvenirlik için önemli
• FORTRAN 77 ve orijinal C: yok
• Pascal, FORTRAN 90, Java, ve Ada: her zaman
yapılır
• ANSI C ve C++: kullanıcı tercihine kalmış
– Prototipler
• Yenice dillerde (Perl, JavaScript, PHP) yok
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-22
Altporgram ismi olan parametreler:
referans ortamı
• Sığ bağlama: Parametre olarak geçilen
altprogramın çağrıldığı yerdeki ortam
- Dinamik etki alanlı diller için uygun
• Derin bağlama: Parametre olarak geçilen
altprogramın tanımladığı yerdeki ortam
- Statik etki alanlı diller için uygun
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-23
Altporgram ismi olan parametreler:
referans ortamı…
• Özel amaçlı (ad hoc) bağlama: Parametre
olarak geçilen altprogramın parametre
olarak geçildiği yerdeki ortam
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-24
Çok amaçlı (overloaded) altprogram
• Ayni referans ortamında ayni isimde birden çok
altprogram
– Her versiyonun protrokolü farklı olmalı
• C++, Java, C#, ve Ada dillerinde önceden tanımlı
çok amaçlı altprogramlar var
• Ada dilinde, fonksiyonların geri dönüş tipleri
fornkiyonları ayırt etmek için kullanılabilirler,
böylece iki çok amaçlı fonksiyonun parametre
tipleri ayni olabilir.
• Ada, Java, C++, ve C# kullanıcı-tanımlı çok amaçlı
altprogramlara izin verirler.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-25
Jenerik altprogramlar
• Jenerik (polimorfik) altrpogramlar her çağrıldıklarında değişik
tipte parametreler alabilirler
• Çok amaçlı (overloaded) altprogramlar ihtiyaca göre
polimorfizm sağlarlar (ad hoc polymorphism)
• Bir altprogramda altprogramın parametrelerinin tipini
tanımlayan tip ifadelerinde kullanılan ve yine altrpograma
parametre olarak verilen bir tip değişkeni varsa, buna
parametrik polimorfizm denir.
• - Dinamik tip bağlamanın derleme zamanı versiyonu
• Ada dilinde, jenerik altprogramların tipleri açık olarak
belirtilir
• C++ dilinde kullanıldığı ortmabdan tipler belli olur
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-26
Jenerik altprogramlar...
• Java 5.0
– Jenerik parametreler sınıf olmalı
– Jenerik paramtrele olarak geçilebilecek sınıflar üzerine
sınırlamalar konulabilir
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-27
Parametrik polimorfizm örneği: C++
template <class Type>
Type max(Type first, Type second) {
return first > second ? first : second;
}
• Yukarıdaki kalıp, > operatörünün tanımlı olduğu
her tip için geçerlidir. Örneğin, aşağıdaki tanım
otomatik olarak yapılır.
int max (int first, int second) {
return first > second? first : second;
}
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-28
Fonksiyonlar için tasarım problemleri
•
Yan etkilere izin var mı?
–
•
Yan etkileri azaltmak için, parametreler herzaman gir
modunda almalı (Ada’daki gibi)
Hangi tip geri dönüş tipine izin var?
–
–
–
–
–
–
Birçok komutlu dil geri dönüş tipini sınırlar
C dili, dizi ve fonksiyon haricindekilere izin verir
C++ C gibidir, ama kullanıcı-tanımlı tiplere de izin verir
Ada altprogramları, her türlü tipi döndürebilir
(altprogramlar tip değildir, dolayısı ile döndürülemezler)
Java ve C# methodları her türlü tipi döndürebilir
(metodlar tip değildir, dolayısı ile döndürülemezler)
Python ve Ruby’de metodlar birinci sınıf varlıklar
olduklarından, döndürülebilirler
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-29
Kullanıcı-tanımlı çok amaçlı operatötler
• Ada, C++, Python, ve Ruby dillerinde operatörler
çok amaçlı (overloaded) olacak şekilde
“yüklenebilirler”.
• 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, c Vec_Type tipinde
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-30
Korutinler
• Çok giriş noktası olan ve bu giriş noktalarını kendi
kontrol eden altprogram
• Ayni zamanda simetrik kontrol olarak bilinir.
Çağıran ve çağrılan oldukça eşit
• Korutin çağrılmasına tekrar-başla (resume) denir
• İlk tekrar-başla korutinin başından onu başlatır.
Daha sonrakiler kaldığı yerden devam ettirir.
• Korutinle birbirlerini tekrar-başlatırlar (sonsuza
kadar da olabilir)
• Koruntinler program ünitelerinin yalancı-paralel
(quasi-concurrent ) şekilde çağrılmalarını sağlar.
Çalışmaları dönüşümlüdür ama örtüşmez.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-31
Korutin görseli: olası çalışma kontrolü
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-32
Korutin görseli: olası çalışma kontrolü
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-33
Korutin görseli: olası çalışma kontrolü
(döngülü)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-34
Özet
• Altprogram tanımı, altprogram tarafından temsil
edilen faaliyetleri anlatır
• Altprogramlar fonksiyon veya prosedür olabilir.
• Lokal değişkenler yığıt-dinamik veya statik olabilir
• Parametre geçmenin üç kipi (mode): gir, çık, girçık
• Bazı dillerde oparatörler çok amaçlı olabilir
(overloaded)
• Altprogramlar jenerik olabilir
• Korutin, çok giriş noktası olabilen bir altprogram
türüdür.
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
1-35
Download

Alt programlar