Commodore sayı 10, sayfa 21
Sayfanın metni

Sayfa 21

Ayhan KALAYLIOĞLU bilgisayar programlama dilinde kısaca kendi kendini çağırabilen altprogramları ifade eder.

Şimdi şöyle bir soru akla gelebilir. Bir altprogram nasıl oluyor da kendi altprogramı oluyor; çelişki yok mu; sınırı nerede, kim ve nasıl belirliyor? Aslında olaya paniğe kapılmadan sakince yaklaşınca konu daha iyi anlaşılıyor. Bu programlama tekniği bilhassa dallanıp budaklanan işlemlerin çözümünde kullanılıyor. RECURSION olayını açıklamadan önce bilinmeyen ya da unutmuş olanlar için altprogram olayının detaylarını açıklayalım. Bilindiği gibi altprogram bir program parçasıdır. Başka bir program tarafından çağırılabilir ve altprogramın bittiğini belirten bir emirle (RETURN emri) asıl programa geri döner. Altprogramların başka bir özelliği de birçok altprogramın birbirlerini çağırabilmesi ve sırayı karıştırmadan doğru olarak geri dönebilmesidir. Bu özellik sayesinde birçok program daha derli toplu, anlaşılır bir biçimde yazılabilmektedir. Modüler programlama denilen olayın temel taşlarından biri de budur. Bütün yapılan işlerin sınırları belirlenir ve hepsi ayrı altprogramlara bölünür. Böylece ufacık bir programla birçok işin halledilmesi mümkün olur. Makine dilinde programlama bilenleriniz veya başka diller kullanmış olanlarınızın duymuş olabileceği bir olay bu sorunun başlıca çözüm anahtarıdır. Çözüm 'STACK' (yığın, bilgi yığını) denilen bir veri yapısı sayesinde sağlanmıştır. Stack'ı bilgilerin yazılıp üst üste konduğu sayfalara benzetebiliriz. En son yazılmış bilgi en üstte olacağı için ilk olarak ele o gelecektir. Yığının (stack) temel çalışma prensibi de budur; “LAST IN FIRST OUT”. (Yığına en son atılan bilginin ilk önce çıkması prensibi.) Altprogram olayına dönersek; BASIC dili GOSUB emrine rastladığında altprogramın geri döneceği adresi yığına atar ve işlemin geri kalan kısmı GOTO emrinin aynısıdır. Altprogram içinde ise RETURN emrine rastladığınızda adres yığından alınır ve program oradan devam eder. Böylece geri dönüş işlemi doğru bir biçimde gerçekleşmiş olur.

zılır.Sırasını ve yerini karıştırmamak için bir göstergeç kullanılır (stack pointer). Bu göstergeç bir sonraki bilginin nereye yazılacağını gösterir. Yeni bir bilgi yazılırken bu bilgi yığının ucuna göstergeç vasıtasıyla eklenir ve hemen ardından göstergeç bir artırılır. Yığından bilgi alındığında tam ters işlem gerçekleşir. Onca yığın göstergeci bir eksiltilir. Hemen ardından bilgi yığından göstergeç vasıtasıyla okunur. Dönelim RECURSION olayına: ayııı altprogramlar-

PROBLEMİN Çözümü

GEÇEN ZAMAN <SAAT,DAKİKA,SANIYE): 200008 BAŞLANGIÇ ŞEKLİ

KK OK kO *S * * 4 * * * HO * * ** * * * Ek kl kk

ÇüZüLMÜŞ ŞEKLİ

ek *SCCCC * * * * *t*k ** — CCCCCCx * * * *CCCE * OOO Akk

İki olayı birleştirip incelersek; geri dönüş adresleri peşpeşe birbirleri üzerine yığılacak, fakat sıraları geri dönüş açısından yorumlandığında doğ- Tu olacaktır. Böylece istenilen seviy de derinliklere inen altprogramlar yazılıp yürütülebilir. Yığının fiziksel yapısına gelince: Yığın bildiğimiz hafızanın belli bir bölgesidir. Bilgiler hafızaya peşpeşe yada olduğu gibi yığın tipi veri yapılarına ihtiyaç vardır. Bu yığın yalnızca geri dönüş adreslerini içermez; aynı zamanda programın her kendini çağırışında içinde bulunduğu durumu gösteren bilgileri de içermelidir. Böylece altprogram kendi kendine (bir üst seviyeye) geri döndüğü zaman kaçıncı seviyede ve ne durumda bulunduğunu hatırlayacaktır. Programımız bir altprogramı çağırıp (altprogramın kendi kendisi olduğunu bir an unutahm), işini yaptırdıktan sonra kaldığı yerden devam edebilmesi sağlanmıştır. Zaten programımız nerede olduğunun farkına varamazsa sonsuz döngülere girecek ve ana işlem ünitesinin yığınını tümüyle doldurup “OUT OF MEMORY ERROR' mesajı ile başarısız bir biçimde sonuçlanacaktır. RECURSION tipi programlar bir veri yapısı üzerinde çalışırlar ve bu veri yapısını değiştirirler (zaten sonuç olarak yapılan net iş budur). Bu çalışma alanı altprogram hangi seviyede olursa olsun, erişilebilir ve diğer seviyelerinde görebileceği biçimde değiştirilebilir olmalıdır. Bu uzun ve karmaşık cümlenin ne anlama geldiğini birazdan vereceğim örneklerle açıklayacağım. Burada vereceğim örnekler birçok bilgisayar programcısının aklına takılan veya merak ettiği ve büyük ihtimalle kafasını karıştırıp vazgeçtiği konuları içermektedir. Mesela: * Satranç nasıl oynanır? ÖNERİ: Bir altprogramımız olsa; diyelim ki yaptığı iş “belli bir pozisyonda olabilecek tüm hedefleri değerlendirmek” olduğu zaman içinde diğer karşı ihtimalleri ve karşı ihtimallerin karşı ihtimallerini vs. değerlendirmek için kendi kendini çağırması gerekecektir ve bu program “RE-CURSIVE” çalışarak sorunu çözecektir. Ne güzel değil mi? * Bir BASIC satırının içindeki karmakarışık bir matematiksel işlemin değeri nasıl hesaplanır? ÇÖZÜM: COMMODORE 64'ümüzün BASIC ROM'unda FRMEVL adında bir altprogram vardır. Bu altprogram çağırıldığında yukarıda söylenen işi yapar. İşlemler soldan sağa okunur; fakat matematiksel olarak bu sırada yürümesi şart değildir. Bu da önemli bir sorun teşkil eder. İşlem sırası çoğu zaman “soldan sağa” ölçüsüne uymaz. Mesela işlemsel önceliklere göre (Örneğin: çarpma veya bölme işlemi, toplama veya çıkarma işlemlerinden önce yapılır) veya parantezlerle işlenme yönü belirtilmişse. Buna göre işlem önceliği sağ taraftaki argümanı bilmeyi gerektiriyorsa

Klavyeyle gezinmek için ← ve → tuşları.