Bu sayfadaki yazılar
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ı.
Sayfa 20
“Büyük Beyin
Ağırlıklı” Kişi Bu kişi, bilgisayarı kendi beyin kabuğunun bir “açılımı” olarak görür ve bunu gittikçe daha karmaşık “deneme modelleri” ile dünyaya ya da kendi düşüncelerine ilişkin deneyler yapmak için bir araç olarak kullanır. Tabii bunun için, en çok kendi başına program yapmayı sever ve hatta ince hilelerle, bilgisayarı üstesinden gelmek zorunda olmadığı şeyleri yapmaya zorlar. “Büyük Beyin Ağırlıklı” kişi ya en sevdiği program dilinin (daha çok FORTH ya da LISP) fanatik bir izleyicisidir ya da aynı zamanda beş değişik dile hâkimdir, makinelerin dili bile onu ürkütmez. Aynı şekilde onun programları ya o alanın dışında kalanlar için tümüyle anlaşılmazdır ya da ideal bilgi vericilerdir. Ama o, sistematik testlerde ve yanlış aramalarda her zaman büyüklüğünü gösterir. Bütün bunları yaparken, tıpkı kendi “düşünce aygıtı”nda olduğu gibi az problem ortaya çıkar ve bundan dolayıdır ki bu kişi, başkalarında durumun belki de farklı olabileceğini asla anlayamaz. Özellikle, başka bir beyin alanında güçlü olan bir kullanıcı için bir program geliştirmek zorunda kaldığında, durum iyice nazikleşir. Oyunlarda onu çeken, karmaşık serüvenlere atılma ve stratejik durum-
e Light-Pen
— ISEPIC lardır, salt beceriklilik ve hız oyunlarından daha az hoşlanır. Çalıştığı yere bilgisayar sokan bir şef olarak büyük bir plancıdır -hatta kimi zaman sokmakla yetinmeyip daha fazla şeyler de planlar: Çünkü her zaman karşılaştırır ve daha iyisinin gelip gelmeyeceği konusunda tereddüte düşer. Talihimizden her birimizde üç beyin de etkili olduğundan, ilginç karışımlar karşımıza çıkar: En çok eski beyinden pay alan büyük beyin örneğin ortaya müşkülpesent kişiler çıkartır; ara beyin payının büyük olduğu durumda ise doğaçlama yönü güçlü sanatçılar görülür. Üç temel tipten hangisine kendinizi sokarsanız sokun, önemli olan kendi kendinizden memnun olmanızdır.
Hellmut Wolfram
Çeviren: Güven Savaş
KIZILTAN