ISBN 0-321-49362-1
Blm 9 Altprogramlar ISBN 0-321-49362-1 9. Blm konular Giri - - PowerPoint PPT Presentation
Blm 9 Altprogramlar ISBN 0-321-49362-1 9. Blm konular Giri - - PowerPoint PPT Presentation
Blm 9 Altprogramlar ISBN 0-321-49362-1 9. Blm konular Giri Altprogram temelleri Yerel atf ortamlar (local referencing environments) Parametre geme yntemleri Altprogram olan parametreler ok
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-2
- 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-3
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-4
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-5
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-6
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
- lup 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-7
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-8
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-9
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-10
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-11
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-12
Parametre geçmenin semantik modelleri...
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-13
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-14
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-15
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-16
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-17
İ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.
İ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
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-20
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
- lası hata: asıl parametrenin değişken
yerine bir değer olması
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-21
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-22
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-23
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
Altporgram ismi olan parametreler: referans ortamı…
- Özel amaçlı (ad hoc) bağlama: Parametre
- larak geçilen altprogramın parametre
- larak geçildiği yerdeki ortam
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-24
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-25
Ç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-26
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-27
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-28
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
- tomatik 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-29
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
- lduklarından, döndürülebilirler
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-30
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-31
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-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ü
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-34
Korutin görseli: olası çalışma kontrolü (döngülü)
Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ 1-35
Ö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