Bölüm 9 Altprogramlar
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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
Parametre geçmenin semantik modelleri... Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
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Ü
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Ü
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Ü
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Ü
İ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Ü
İ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Ü
İ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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
Ç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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
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Ü
Korutin görseli: olası çalışma kontrolü Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
Korutin görseli: olası çalışma kontrolü Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
Korutin görseli: olası çalışma kontrolü (döngülü) Tercüme edip geliştiren: Doç. Dr. Zeki Bayram, DAÜ
Ö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Ü