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 (x i × 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
Recommend
More recommend