Rotaryenlere Bilgi İşlem Nasihatleri
Ali Tuğrul Anıldı
Ege Bilgi İşlem'in kurucusu Cem Musullugil, geçtiğimiz ay İzmir Rotary Kulübü'nün bir toplantısına konuşmacı olarak katıldı ve dinleyicilere işyerleri için bilgisayar seçimi konusunda bilgi verdi. Musullugil'in konuşması, Rotaryenler arasında olağandışı bir ilgi görmedi ama, o gün salonda bulunanların tümü, pek olağan olmayan bir şekilde, konuşmayı baştan sona dikkatle dinledi. Bunda “baş”la “son” arasında çok uzun bir süre geçmemesi, yani Musullugil'in sözü gereksiz yere uzalmaması da önemli rol oynadı.
İşyerinde bilgisayar kullanımına geçişin ilk adımı, her türlü girişimde olduğu gibi, karar vermekle başlıyor. Ancak bu karar karpuz alırken verdiğimiz türden olmuyor, yani danışman firma ile veya bilgisayar bayii ile gireceğiniz ilişki bir tüketici-karpuzcu ilişkisinin çok ötesine uzanıyor. Cem Musullugil bir donanım, yazılım ve danışmanlık kuruluşunun yöneticisi, yani bu ilişkinin odağında bir insan olarak, konuşmasına çok yönlü karar verme sürecini değerlendirerek başladı: “Bilgisayara geçerken, bilgisayara 'evet' ya da deme aşamasındayken, bazı yanlış eğilimler ortaya çıkabilir. 'Nâsıl olsa bunların hepsi aynı, zaten alt tarafı muhasebe, müşteri ve stok kaydetmeyecek miyim?' diye düşünenler olabilir. “Hele önce makineyi bir alalım da' demek, doğru bir düşünce değildir. Karar verebilmek için bir ön çalışma süreci gereklidir. Önce işyerinizin, fabrikanızın, ofisinizin teknik ya da idari iş akışı mekaniğini incelemek, bir model oluşturmak zorundasınız. Bu model bilgisayarlı sisteme en acil ya da en rantabl olarak hangi noktadan oturtulmalıdır, bunu düşünmek zorundasınız. İşyerinizin büyümesi ya da bilgisayar sisteminizin tüm birimlere zaman içinde yaygınlaştırılması durumunda yapılan yatırımın yeni duruma, yani büyümeye ayak uydurup uyduramayacağı da, üzerinizde durulması gereken bir konudur.” Eldeki imkânları ve proje aşamasındaki verileri iyice incelediniz, ya da rakiplerinizin yeni teknolojiyle çalışmaya başladıklarını duyup altta kalmamaya karar verdiniz. Akıl kârı olduğuna inandığınız için de olsa, şan şeref için de olsa, sonuçta bilgisayar alacaksınız, yani bir geçiş sürecinin eşiğindesiniz. Cem Musullugil'e göre bu noktada durup işyerinizin sağlıklı modelini çizmeniz, bilgisayardan ne İstediğinizi tam açıklığa kavuşturmanız gerekiyor. Musullugil, bilgisayarlı iş düzenine geçerken yapılması gereken çalışmaları iki ayrı çerçevede örnekledi: “Diyelim ki, bir firma üretim planlamasını bilgisayarla yapmak istiyor. Firmanın endüstri mühendisi tezgâhların bir birim iş süresini kapsayan zamanlama modeli çıkardı. Bu örnekte makine ile programın hazır olma-:
sına karşın, program için veri beklemek ve makineyi belli bir süre kullanamamak tehlikesi vardır. İkinci bir örnek olarak, aynı bilginin değişik formlara değişik mânâlarda yazıldığı bir işletmeyi örnek alalım. Bilgisayarlı sisteme geçildikten sonra eğer bu bilgi aynı şekilde kullanılmaya, aynı şekilde değerlendirilmeye devarn ederse, hatalı sonuçlar alınması kaçınılmazdır. Sağlıklı çıkarılmamış model yüzünden, bilgisayarın yalnızca depolama özelliğinden yararlanılmış olacaktır... Eğer depoladığınız bilgiler içerde kalıyor ya da bazı işlerin doğru yapılıp yapılmadığını kontrolde kullanılıyorsa, bilgisayardan gerekli verimi alamıyorsunuz demektir. Örneğin basit bir faturalama programı, bilgisayarda kesilen faturanın satılan miktarı stoktan düşmesi, cari hesaplara işlemesi gibi işleri kolayca yapar, bu normaldir. Ama bence önemli olan, yıl sonunda, kesilen faturaları, müşteri ve belli aralıklar bazında firma yöneticisine rapor edebilecek düzeyde bir kullanım gerçekleştirilebilmesidir.” Bilgisayara geçiş süreci boyunca, gerek karar gerekse danışma ve modelleme aşamalarında temel mantık ne olmalı? Cem Musullugil bunu da cevaplıyor: “Sonuç olarak modelden çok şey İsteyin. Çünkü alacağınız makineler, eskiden yapamadığınız birçok şeyi yapmaya yeterlidir.” İşletmenin modeli, sorunların belirlenmesi ve iş akışının denetlenebilmesi açısından basit bir şema oluşturuyorsa, hazır programlar kullanmakta yarar var. İşletmenin gereksinimlerine göre saptanan belli özellikler, program seçiminde, hazır program edinebilme imkânları ile programlama kapasitesi de bilgisayar seçiminde önem verilmesi gereken noktalar. Ancak bu tür değerlendirmelerde bulunmak, Cem Musullugil'in de belirttiği gibi, bir hayli güç: “Eğer bu modeli siz çıkaramayacaksanız iki seçenek var. Ya bir danışman firmaya başvuracaksınız ya da bünyenize bu işten anlayan birisini dahil edeceksiniz. Danışman firma ile görüşürken, onların size vereceği raporları birlikte değerlendirirken, aklınıza takılan her şeyi sorulara dönüştürmelisiniz. Her türlü isteğinizi danışmanınıza bildirmelisiniz... Bu aşamalardan sonra artık sıra donanım ve yazılım seçimine gelmiştir. Yazılım seçimi çok belirleyicidir, çünkü yazılım desteği yetersiz olan, kütüphanesi az olan bir makine tekerleği olmayan bir arabadır, özel benzinle çalışan bir araç gibidir. Eğer isteğinize uygun programlar işletmeniz bünyesinde hazırlanamıyorsa, sizin için yazılım seçimi önce gelmelidir. İyi bir yazılımdan ne beklenir? İsteklerinize tam cevap vermesi, eğitilebilirlik özelliği, güvenilebilirlik özelliği, arkadaşça olup olmadığı, manuellerinin yeterli olup olmadığı ve hızı... Eğer programlarınızı bünyenizde yazdıracaksanız, yazılan program için iyi bir dökümantasyona sahip olup olmadığınız da önem kazanıyor. Çünkü programı yazan kişi bünyenizden ayrıldığı takdirde, işlerinizi toparlamakta bir hayli güçlük çekebilirsiniz.” Donanım seçimine gelince... Gerek işletmenizin modeli, gerekse yazılım desteği çerçevesinde ne istediğinizi aşağı yukarı belirlediniz. Bu aşamada bile “İşte senin istediğin bilgisayar, al kardeşim, güle güle kullan” sözleriyle büronuza taşıyabileceğiniz tek bir ürün seçeneğiyle başbaşa kalmıyorsunuz. Aynı işi yapabilecek değişik markalarda çeşitli modeller var. Bu noktada nasıl davranmanız gerektiğini, yine Musullugil'den dinleyelim: “Her ne kadar makinelerin tanıtım broşürlerinde çok şey yazıyorsa da, bellibaşlı kriterler size sağlıklı karar verebilmenizde yardımcı olacaktır. Hız sizin için önemli mi? Aynı kayıda, aynı anda ulaşacak insan faktörü nedir ve bu durum ne kadarlık zaman aralıkları ile tekrarlanacak? Bu makineyi kaç kişi kullanacak? Makine bozulduğu zaman, sizin için hayati önem taşıyan, yani sisteminizin her durumda mutlaka çalışması gereken kısmı var mı? Önümüzdeki yıllarda ne ölçüde büyüme planları yapiyorsunuz? Eğer modelinizi dikkatlice gözden geçirerek bu soruların tümüne cevap verebilirseniz, makinenizin kategorisi belli olacaktır. Bu kategorileri, mikro bilgisayarlar ve onlarla kurulan yerel işletim ağları, mini bilgisayarlar ve büyük makineler şeklinde belirleyebiliriz. Kategorideki markanın seçimi için de belli kriterler çerçevesinde değerlendirme yapmak durumundasınız. Bellek ve kullanıcı açısından büyüyebilme özelliği ve büyüme aşamalarındaki yaklaşık maliyetler, yedek parça garantisi tamir-bakım, eğitimi, diğer sistemlere bağlanabilme özelliği, işletim sistemi, maliyeti, seçilen programların o makine üzerinde çalışıp çalışmadığı, işletim sistemi ile ilgili olarak makine için yazılmış hazır kütüphanenin büyüklüğü...” Evet, sonunda bilgisayarınızı gönül rahatlığıyla alabilirsiniz. Biraz uğraştınız, biraz zaman kaybettiniz ama istediğiniz bilgisayarın hangisi olduğunu artık biliyorsunuz. Dedik ya, bilgisayar almak karpuz almaya benzemiyor diye. Bu arada sizi de “insan” faktörü açısından uyaralım. Yazılımınızı ve donanımınızı seçmeden önce, danışmanınızı dikkatli seçin, “karpuzcu” mantığında birine düşmeyin. Sonra mal “kelek” çıkabilir.
Siz de mi Câ4'ün -hızından- (daha doğrusu yavaşlığından) şikâyetçisiniz? Hani, “BASIC'de program yazılmaz, yazılırsa çalıştığını görmeye ömür yetmez!” diyenlerden misiniz? Ama biz diyoruz ki: HAYIR, Cb4 HIZLIDIR. Şimdi de bazılarınızın, “Nayır, nolamaz, gene mi makina dili...” dediğini duyar gibiyiz. Ama yanılıyorsunuz. Bahsettiğimiz şey, bildiğimiz BASIC.
Şimdi size birkaç örnek programla birlikte, BASIC programlarınızı nasıl daha hızlı çalışacak biçimde yazacağınızı göstereceğiz. Örneğin, programlardan birinin çalışma süresini 10.45 saniyeden 0.96 saniyeye indireceğiz!! Evet, yanlış okumadınız; programı 590.81 hızlandıracağız!! Güzel değil mi? Ama bu kadar laf yeter, şimdi işbaşına... Ama önce anlatım sırasında izleyeceğimiz yöntemleri biraz görelim. Örneğin, programların çalışma zamanını nasıl ölçeceğiz? Verdiğimiz örnek programların 10 ve 1000 numaralı satırlarına bakarsanız, hepsinde aynı olduklarını göreceksiniz. 10 numaralı satırda, bilgisayarın içindeki saati sıfırlıyoruz. 1000 numaralı satırda ise, 18. ekran satırına o anki saat değerini saniye cinsinden yazıyoruz. Dolayısıyla 10 ve 1000 numaralı satırlar arasında kalan program kısmının kaç saniye sürdüğünü öğrenebiliyoruz. Öğreneceğimiz yöntemlerin bize olan faydalarını görmek için, önce bir program yazacağız ve bu programın çalışma süresini ölçeceğiz. Sonra aynı programın bazı komutlarını değiştirerek elde edeceğimiz zaman kazancını göreceğiz. Bu nedenle, ilk yazacağınız programı silmeyin. Böylece, sonradan gelen programları yeni baştan yazma zahmetinden kurtulacaksınız. Yeni program yazmanız gerektiğinde bu size belirtilecektir.
Tuna ERTEMALP
Bir diğer önemli nokta da, zaman Ölçümlerini “temiz” Commodore ile yapmanız gerektiği. Yani, bilgisayarınızı kapatıp açın ve bu yazıyı okuyup uygulamaya ondan sonra başlayın. Bunu altında yatan neden şu: Eğer Sİ-
MON'S BASIC, EX-BASIC, SUPERGRAP-HIK vs. gibi BASIC ilerletme programlarından yararlanmaya kalkışırsanız, ölçtüğünüz zaman değerleri uzayacaktır. Bu tip programlar ses, grafik vs. gibi işlemlerin dışında kalan programları yavaşlatırlar.
Bir de programı yazıp çalıştırdıktan sonra, bizim verdiğimiz zaman değerlerinden farklı sonuçlar elde ederseniz, sakın şaşırmayın. Eğer o programı birkaç kez çalıştırırsanız, çoğunlukla bizim verdiğimiz değeri elde ettiğinizi göreceksiniz. Ve son olarak... Yazımız ilerledikçe, elde edeceğimiz önemli bilgileri, DİK-KAT başlığı altında sırayla toparlayacağız. İsterseniz bu kuralları bir kâğıda yazıp, bilgisayarlarınızın yanına koyun!
Şimdi ilk programımıza başlayalım. Bu programımız oldukça basit bir iş yapacak. Amacımız, ekrana 374 tane A harfi bastırmak. Önce TEST1 programını yazın. Ama yazarken lütfen gördüğünüzün aynısını yazın; bütün komutları, aynı satır numaraları ile ve komutlar arasındaki boşluklarla birlikte.
Bu ilk programda amacımızı POKE komulları ile gerçekleştiriyoruz. Önce ekran hafızasına, “A” harfinin kodunu yerleştiriyoruz, sonra da renk hafızasına gereken renk kodunu. Bu arada da, bir sayaç değişkeni ile kaç tane yazdırdığımızı kontrol ediyoruz. Zamanı ölçtüğümüzde 10.45 saniye elde ediyoruz. Çok can sıkıcı değil mi? Haydi, bir-iki değişiklik yapalım. 30 ve 40 numaralı satırları şöyle değiştirelim (TEST2):
30 Z-0:VİIDEO- 1024:
RENK — 55296
40 POKE VİDEOM Z, 1:
POKE RENK-4-Z,14
Burada yaptığımız, kullandığımız bazı sayıları, daha önceden değişkenlere yüklemek oldu. Zamanı ölçelim... Aman Tanrım! uçuyor! 7.25 saniye...
Tam 530.62 hız kazancımız var. TEST3 için, 30, 40 ve 60 numaralı satırları aşağıdaki gibi değiştirip, bu sefer tüm sayıları değişkenlere yükleyelim:
30 Z-0O:BİTİSDEGERİ — 374:
VİDEO — 1024:
RENK — 55296:HARF — 1:
BASKI — 14
40 POKE VİDEO 4 Z,HARF:
POKE RENK 4 Z,BASKI
60 İF Z-BİTİSDEGERİ
THEN 1000
Ölçtüğümüzde, 6.03 saniye elde edeceğiz. TEST2'ye göre 16.82, TEST1'e göre 442.29 daha hızlı. Güzeeel... TEST4 için, verdiğimiz programa bakarak gereken değişiklikleri yapın. Burada, daha önce kullandığımız değişken adlarını iki karakter uzunluğa kısalttık. Sonuç: 5.6 saniye. TEST3'den 27.13, TEST1'den 446.41 daha hızlı. Hatta TEST5 için, bu adları daha da kısaltıp tek karakterli yapalım. Gereken değişiklikler:
30 Z-0:B-374:V— 1024:
14
40 POKE VA Z.H:
POKE ZA
60 İF Z-B THEN 4000
Ölçtüğümüzde elde edeceğimiz 5.483 saniye, TEST4'ten 42.08 ve TEST1'den de 447,53 daha hızlı. Aklınıza gelir miydi, değişkenlerin uzunluğunun bu kadar önemli olacağı? Programı hemen hemen, 2 kat hızlandırdık. Ama durun, daha bitmedi! Daha da hızlanacak. Daha önce, İlk kurallarımız yazalım:
il! DİKKAT 1 H!
* Programda sık sık kullanılacak olan, özellikle döngülerin içinde yer alan sayıların programın başında değişkenlere yerleştirilmesi gerekir. * Bir değişkenin sahip olduğu değer, program içinde değişiyorsa bile, programın başında örneğin Z-0 gibi belirtilmesi faydalı olacaktır. * Programın başında, sayıları değişkenlere yerleştirirken, en çok kullanılacak sayıyı ilk önce yerleştirmek hız kazandıracaktır (Bilgisayar, o değişkeni daha çabuk bulabilecektir). * Şimdi TEST6'yı verildiği gibi yazın. Artık POKE komutu yerine, PRİNT komutunu kullanıyoruz. ve yeni bir rekor: 4 saniye. TEST5'e 427.04, TEST1/'e de 261.72 fark attık. Demek ki, PRİNT komutu POKE'dan hızlı çalışıyor. Ufak bir değişiklik yapalım. CHRS (65)'i önceden bir karakter değişkenine yükleyelim. Şu değişiklikleri yapın TEST7):
30
A$ -CHRS(65)
40 PRINTAS;
Zaman ölçümü ve 3.05 saniye ile bir hızlanma daha. TEST1 ise artık çok yavaş kaldı (470.81 fark var!!). Bu hızı, TEST8 ile azıcık da olsa artıracağız. Şu değişiklikleri yapın:
30
40 PRİNT “A”;
2.983 saniye ile bir hızlanma. Az ama önemli (TEST1'den hızlı). Toparlayalım...
!!! DİKKAT 2!!!
* Döngü halinde yazılması gereken yazıları POKE yerine, PRINT ile yazmak çok daha iyidir. * PRINT komutunun arkasından gelenlerin ya önceden yazı değişkenlerine yüklenmiş ya da tırnak içinde yazılmış olması gerekir. Gelelim TEST9'a... Küçücük bir değişiklik ve küçücük bir hızlanma:
60 IF GOTO 1000
THEN yerine GOTO koyduk ve program 2.96 saniye ile 40.77 daha hızlandı. Bir ufak değişiklik daha ve
60 40
Bu sırada, 70 numaralı satırı silebi-
lirsiniz, çünkü artık bir işe yaramıyor. Dolayısıyla programımızı bu ufak değişiklikle, bir satır kısaltmış olduk. Hızımız 2.93 saniye ile 41.01 daha arttı. TEST1'den ise 471.96 daha hızlıyız.
il! DİKKAT 3 Il!
* Döngülerde IF...GOTO komutu, komutundan daha hızlıdır. * Kontrollerde eşit olmama durumunun kontrol edilmesi, eğer programdan satır eksiltiyorsa yararlı olacaktır. Bu arada programlarla örnek vermeden bir diğer kural daha göstereceğiz, hazır laf IF...THEN komutundan açılmışken, Şöyle bir program parçası düşünün:
A-z1 AND B-2
AND C—3 THEN 999
110 GOTO 50
Bilgisayar, her defasında her üç şartı da kontrol edecektir ve ancak her üçü de doğru ise 999'a gidecektir. Diyelim ki, C'nin 3 olma ihtimali çok az, ama A=1 ve B=2 her zaman olabilir. Bu durumda C=3 olmadığı durumlarda da, diğer iki şart kontrol edilecek ve bu da boşuna zaman kaybı olacak. Ancak şöyle bir satır düşünün:
100 İF THEN
IF THEN
IF THEN 999
Bu durumda, sadece ve sadece C=3 olduğunda diğerleri kontrol edilecektir. Hatta A'nın kontrolü için de B=2 şartı aranacaktır. Bunun getireceği hızlanma herhalde tarafınızdan takdir olunur...
ll! DİKKAT 4 Ul!
* Birbirine AND ile bağlanmış birden fazla şarttan oluşan IF...THEN komutlarının, en ender olandan en sık olana doğru sıralanmış bir IF...THEN zincirine çevrilmesi gerekir. Şimdi sıra geldi TEST11'e... Artık biraz stil değiştirmenin zamanı geldi. Deminden beri kullandığımız GOTO komutlarının yerine, BASIC'in bize bahşettiği başka bir komutu, daha doğrusu komut ikilisini kullanacağız: FOR..NEXT Şimdi klavye başına geçin ve şu değişiklikleri yapın:
30 FORZ-1 TO 374
40
S0 NEXT Z
60 numaralı satırı da silebilirsiniz. Yeniden zaman ölçümü yaptığımızda yeni bir hızlanma daha görüyoruz: 1.1 saniye. TEST10'dan 462.45 ve TEST1'den de 489.47 daha hızlı.
Biliyorsunuz, COMMODORE 64 için program yazarken, NEXT komutunun arkasında yer alan değişken adı yazılmasa da oluyor. Bir de bunu deneyelim, bakalım ne olacak?
50 NEXT
Böylece elde ettiğimiz TEST12'nin zamanı, 41 saniye ile TEST11'e 49.09 ve TEST1'e de 490.43 fark atıyor. Eh artık iyice hızlandı. Acaba biraz daha?... Ama önce yeni kurallarımız:
!!! DİKKAT 5!!!
* Döngüleri kurarken, IF...THEN yerine FOR...NEXT komutunu kullanmak avantaj sağlayacaktır. * NEXT komutunun arkasından gelen değişken adı yazılmadığında, programın hızı artacaktır. Şimdiye kadar programı hep hızlandırdık, biraz da yavaşlatalım. TEST13'ü verildiği gibi yazın. Burada programı biraz süslemek, biraz da açıklayıcı hale getirmek için REM komutları kattık. Ölçüm sonucunda da göreceğiniz gibi, programımız 1.2 saniye ile 420 yavaşladı (TEST12'ye göre). Eğer bu REM komutlarını ve diğer komutlar arasında bulunan ve programın okunaklılığını artıran boşlukları ortadan kaldırırsak, dökümünü verdiğimiz TEST14'ü elde ederiz. Çalışma zamanı olarak ölçeceğimiz 1 saniye, sanki bize “Aferin, iyi ettiniz!” der gibi, di mi? Artık son adıma geldik. TEST1'in alabileceği son hızı şimdi göreceksiniz. Her şeyi tek satırda toparlayacağız. Ama bunun için COMMODORE 64 elkitabında belirtilen komut kısaltma yöntemlerine ihtiyacınız var. Biz gene de bir özetleyelim:
PRINT için ? işareti, CHR$ için C ve SHIFT-H, FOR için F ve SHIFT-O, NEXT için N ve SHIFT-E, POKE için P ve SHIFT-O. Artık TEST15'i yaratabiliriz:
10 TI$ — “000000“:PRİNT
CHRS(4147)/:FORZ —- 41TO
POKE214, 18:PRINT:
PRINTTI/60 “SANİYE”:
END
Elde ettiğimiz 0.96 saniye ile TEST14'ten 44 ve TEST1'den de 490.81 hızlı bir program elde ettik. Düşünün 10.45 saniyeden 0.96'ya inebildik. Hani COMMODORE 64 yavaştı?
!!! DİKKAT 6 !!!
*REM komutları ve komutlar arasında boşlukları olmayan programlar daha hızlı çalışır. * Satır sayısını azaltmak amacıyla, bir satıra sığdığı kadar emir koymak da hız sağlayacaktır. Ancak, bu son kuralların programın okunurluluğunu da tamamen ortadan kaldırdığını unutmayın lütfen! Başta, makina dili yok demiştik. Ama gene de, deminden beri uğraştığımız şeyi, yani 374 tane A yazma işini yapan bir makina dili programının da süresini ölçelim dedik. Hadi şimdi de TEST16'yı yazıp çalıştırın. Sonuç 0.083 saniye ile %499.20 fark!!! Fazla söze gerek yok... Bundan sonra, BASIC'in değişik yönlerini inceleyeceğiz. Örneğin, iki sayıyı 300 kere birbiriyle çarpalım. Bunun için önce TEST17'yi yazın. Çalıştırıp, zamanı ölçmeye kalkıştığınızda lütfen sabırlı olun: 13.083 saniye. Kaplumbağalar kıskanacak?
Ufak bir numara yapalım. İki sayının yerini değiştirelim. Şu ufak değişiklikle TEST18'i hazırlayın:
40
Zamanı ölçtüğümüzde, gerçekten de bir hızlanma görüyoruz. 12.683 saniye ile az ama gene de bir hızlanma. Tıpkı 15643 * 5'in hesaplanmasının 5 * 15643'ün hesaplanmasından daha kolay olması gibi. Haydi, minicik bir değişiklik daha yapalım. Ondalık noktasından önce gelen sıfır rakamını atalım (TEST 19):
40 A-.123456789*3
12.483 saniye ile TEST17'den %44.58 daha hızlı olduk.
!! DİKKAT
* Bir çarpma işlemi sırasında, daha uzun olan sayının ilk sayı olarak yazılması gerekir. * Sıfır sayısı yerine sadece ondalık nokta koymak daha fazla hız sağlayacaktır (A=0 yerine A=. ). Ayrıca, ondalıklı sayılarda -1 ile 1 arasındaki değerleri yazarken, ondalık noktasından önce gelen sıfır rakamı yazılmamalıdır. Bir de daha önceden öğrendiğimiz, değişken metodunu uygulayarak TEST20'yi elde edelim:
25 B-.123456789:C-3
40 AzB*C
Göreceğiniz gibi, aniden büyük bir hızlanma ile 1.5 saniyeye geleceğiz. Nasıl ama?! Şimdi de aynı programı, bilgisayarımızın üslü sayıları hesaplamaktaki hızını görmek için kullanalım. Verdiğimiz TEST21'i yazın ve çalıştırın. Göreceğiniz gibi, 4'ün kübünü 300 kere almak bize 10.53 saniyeye patlıyor.
Eh, biz de sayıları değişkenlere yerleştiririz. Hemen bir TEST22 yazalım:
25 Bz4:Cz3
40 A-BAC
Ölçüyoruz... Olamaz, sadece %41.7'lik bir hızlanma ile 10.35 saniye. Hayır, hiçbir şeyi yanlış yapmadık. Sorun, COMMODORE 64'ün üs almada kullandığı metodun kötülüğünde yatmakta. Öyleyse ne yapalım?. Bir-iki ufak değişiklik ile elde edeceğimiz TEST23, bize cevabı verecek:
40 A-—B*'B*B
Yaptığımız, üs alma yerine çarpma kullanmak oldu. Sonuç şaşırtıcı: 2.05 saniye ile TEST21'e göre %480.53'lük bir hızlanma !! DİKKAT 8 !!!
* Üs alma işlemi, mümkün olduğu kadar çarpma haline dönüştürülmelidir. Artık, altprogramları incelemeye geçebiliriz. Önce TEST24'ü yazın. Gördüğünüz gibi, burada altprogramı GOTO komutu ile çağırıp, altprogramdan da gene GOTO komutu ile geri dönüyoruz. Süreyi ölçtüğümüzde, 3.25 saniye elde edeceğiz. Peki, GOTO yerine GOSUB... RETURN kullanırsak ne olacak? TEST25 için şu değişiklikleri yapalım:
40 GOSUB40000
60000 RETURN
TEST1
10
20 PRINT CHRS$C147)
30 2-0
490 POKE 10244*2,1:POKE 5529642,14
60 IF 2-374 THEN 1800
78 GÜT0 48
1080 POKE 214,18:PRINT:PRINT
READY.
TEST4
10
20 PRINT CHR$C(147)
30
40 POKE RE4Z,BA
SO
60 IF Z-BIİ THEN 1888
78 GOTO 48
1008 POKE 214,18:PRINT:PRINT
READY.
TEST6
10
206 PRINT CHR$<147)
30 Z2-0:B-374
40
SO 2-211
68 IF Z-B THEN 1088
78 GOT0O 48 *
1008 POKE 214,18:PRINT:PRINT TI/68
READY.
"SANIYE"
Ölçtüğümüzde elde ettiğimiz 3.15 saniye, TEST24'den %43.07 daha fazla. Bir başka önemli nokta, altprogram ile programın başlangıcı arasındaki uzaklıktır. Şimdi, deminki programlarımızı biraz değiştirelim ve altprogramlarımızı program başına alalım. Önce TEST26'yı yazın. Süremiz, 3.06 saniye ile TEST25'den bile az olacaktır (%42.85). TEST27 için şu değişiklikleri yapın:
6 RETURN
33 GOSUB4A
GOTO yerine GOSUB koyduğumuzda, 2.93 saniye ile daha hızlı bir program elde ediyoruz, gördüğünüz gibi. Bu TEST24'den %49.84 daha hızlı bir değerdir. Yeni kurallarımızı toparlayacak olursak:
!! DİKKAT 9
* Altprogramları GOSUB ile çağırıp, ana programa RETURN ile dönmek, aynı işlemleri GOTO ile yapmaktan daha hızlıdır. * Sık sık kullanılan altprogramların, anaprogramın başlarında olması, hız sağlayacaktır. Artık birkaç ufak-tefek nokta daha kaldı. Önce TEST28'i yazın. Zaman olarak 2.883 saniye olacaktır. Şimdi, DİKKAT7'de belirttiğimiz kurallardan birini deneyelim. 30 numaralı satırdaki A=0 yerine A=. koyarak TEST29'u elde edelim ve zamanı ölçelim. Gerçekten de 2.283 saniye ile bir artış oldu.
TEST13
REM&
m
40
SO NEXT
kalk oka
Şimdi de aynı satırdaki A1 değişkeninin yerine AA değişkenini koyalım ve böylece oluşturduğumuz TEST30'u ölçelim. Elde ettiğimiz 2.3 saniye bize açıkça bir yavaşlamanın varlığını göstermektedir. TEST31'de ise, AA yerine sadece A harfini kullanalım. 2.23 saniye ile TEST28'den %422.65 daha hızlı program elde ettik. Son olarak da, karakter değişkenlerine değer konmasını inceleyeceğiz. Şimdi TEST32'yi yazın. Süresi, 2.45 saniye olacaktır. TEST33'ü elde etmek için 25 numaralı satırı silin ve şu değişikliği yapın:
30
AS —-
Elde edeceğimiz 2.316 saniye, TEST 32'den 45.46 daha hızlı olacaktır.
İl! DİKKAT 410!!!
* Eğer iki karakterden oluşan değişken isimleri kullanılıyorsa, ikinci karakterin bir rakam olmasına dikkat edilmelidir. Ancak en iyisi tek karakterli değişken adlarıdır. * Karakter dizileri, bir karakter değişkenine yüklenirken tırnak içinde verilmişlerse, daha önce bir başka değişkene yüklenmiş olmalarına oranla daha hızlı işlerler. Artık bitti! Herhalde birçok önyargı bu yazıyı okurken yıkılıp gitmiştir. Şimdi daha hızlı programlar yazacağınız günler sizi bekliyor!!
*
& *
*
kok ak ak ak akk kak ok ak ak
PRINT TO 3 EKRANI SILMEK
308 FOR Zzi TO 374:REM 57
4 KARAKTER
999 REM ZAMANI GÖSTERME
1000 POKE 214,18:PRINT:PRINT “SANIYE":END
READY.
TEST14
10 20
38 FORZ-1T0374
40 PRINT"A";
NEXT
1080 END
READY.
TESTİ6
5
10
20 PRIİINTCHRS$<147)
38 SYS7168
1000
20080
29028 READB
2010
2030 POKER,B SO NEXT
2040 NEXT 68 PRINTA
2050 DATA162,0,169,1,157 1000
2060 DATAB,4,169,14,157,0,216 40000 B-4
Zaza 50000
2080 DATA254,4,169/14,157 GOTO5A
Saga READY.
2106 PRINT"MAKINA DILI PROGRAMI OKUNDU. "
PRİNT:PRİNT"BASLATMAK ICİN BİR TUSA BASINIZ..."
2140 GETAS: 140
Sisa
READY. 3 GOT018
3
(EST Ta
İĞ 20
20 PRİNTCHR$(147)
30 FORZ-1T0300
20 SÜ
50 PRİNTA 1000 POKE
1000
READY. .
TEST28
10 sü
ga 30
S0 1000
60 PRINTA READY.
1090 END
READY.
TEST32
TEST24 10
22 PRİNTCKRS$(147)
10 25 T$2"TT"
20 PRİNTCHRS$(147) 30
30 FORZ-İTO300 1000 POKE214,18:PRİNT:PRİNTTİ/60"SANIYE":END
246 READY.
Biraz Aritmetik
Lafı gevelemeden hemen ilk baştan söyleyeyim: Makina dilinde aritmetik hesap yapmak delilere özgü bir uğraştır. Ne yapıp edip, hesap yapacaksanız BASIC kullanın. Ama illa ısrar edenleriniz varsa, günah benden gitti; bunu da anlatacağız.
SAÇMALIK NO 1: Makina dilinde $00-7F arası rakamlar pozitif, $80-FF arası rakamlar negatif sayılır. Tabii hemen dikkat ettiniz (mi?), $80 ve üstü rakamların ortak özelliği, ikili sistemde ifade edildiklerinde
$80= 10000000= 128
Bunun neden negatif olduğunu bugüne kadar anlayabilmiş değilim. SAÇMALIK NO 2: Bunu geçen ayın 4'üncü Anayasa maddesinde de görmüştük. Makina dilinde bir rakamın alabileceği en yüksek değer $FF (255) olduğundan, bu rakamı izleyen değer 256 değil, 0'dır! Yalnız nasıl olmuşsa bir kolaylık düşünmüşler, CARRY (kalan, elde var) diye bir şey icat etmişler. Şöyle ki, herhangi bir hesap sırasında sonuç $FF'ı aşıp sıfırlanırsa, CARRY 0 iken 1 oluyor. Ama CARRY bir tek bit; yani 1 iken 2 filan olmuyor. Yaptığı, sadece, “elde var 256” diye bir şeyi akılda tutmak. Carry ile ilgili iki faydalı komut:
SEC (kodu: 38) SEt Carry —Carry'i 1 yap. CLC (kodu: 18) CLear Carry —Carry'i sıfırla
İki komut daha: BCS (B0) Branch on Carry Set —Bir önceki işlemin sonucunda kalan varsa, parametrenin gösterdiği yere atla. BCC (90) Branch on Carry Clear —öncekinin tersi. Hazır yeri gelmişken devam edelim: BPL (10) Branch if Plus —önceki işlemin sonucu, yukarıdaki saçma mantığa göre pozitifse, dallan. BMI (30) Branch if Minus — negatifse dallan. Tüm “branch” komutlarının relatif adresleme kullandığını, geçen sayıda BEQ ve BNE'yi anlatırken görmüştük. Unutanlar için hatırlatalım; eğer komutun içerdiği koşul gerçekleşmişse, komutu izleyen rakam pozitifse program akışı o rakam artı 1 byte ileriye, negatifse FF eksi o rakam byte geriye atlayacaktır. Şöyle göstersek daha kolay anlaşılabilir: (F0= BEQ; nn= parametre)
program
xXx xx xx xx FO nn xx xx XxX XX «es
FA FB FC FD FE FF 00 81 92 93 ...
Relatif Pozisyon
1. Aas Ba
18
Sonuç: program akışı $C014'ten devam eder; çünkü C000'daki komut
LDA $00 demektir, sonucu
C002'deki komut ise sonuç sıfırsa hex
11 byte ileriden devam et demekte-
dir.
2. COOO a9 a9
COO2 10 70
Sonuç: program $C004'ten aynen devam eder; çünkü C000'da aküye hex A9, yani negatif bir sayı yüklenmekte, C002 ise sonuç pozitifse hex 0F byte geri git demektir. “branch” komutlarında 00 parametresi anlamsızdır, çünkü koşul gerçekleşse de, gerçekleşmese de program bir sonraki byte'tan devam edecektir. FE parametresi, eğer koşul gerçekleşirse, programı kısır döngüye sokar; çünkü programı bir byte geriye, yani koşul komutuna atlatır.
olmaz
Sıra geldi aritmetiğin elifbasına: İki tane basit rakamı nasıl toplayacağız? Elcevap: ADC komutuyla, ADC komutu, akümülatörde o an bulunan sayıya, parametresinde belirtilen sayıyı ekler. Hemen hemen tüm adresleme türlerine sahiptir; yani akümülatöre dolaysız bir rakamı veya mutlak bir adreste, indeksli bir adreste, dolaylı bir adreste vb. bulunan bir rakamı ekleyebilir.
4+1 işlemini nasıl yaparız? Elcevap: LDA #$01 ADC #$01
Bu işlemin sonucu ne olur? Elcevap: Belli olmaz! Zira, ADC komutu, adı üstünde ADd with Carry demektir ve önceki işlemden kalan varsa, toplamanın sonucuna bir ekler. Carry 0 ise işlem sonucu 2, Carry 1 ise sonuç 3'tür. Binaenaleyh, özel birtakım emellerimiz yoksa, ADC işleminden önce CLC komutunu vermeyi asla ve kat'a
Carry'nin hikmetinin ne olduğunu anlatmanın en kestirme yolu, $4F85AC rakamıyla $3120C0 rakamını toplamaya çalışmak (isteyen desimale çevirip uğraşsın) İlk iş, LDA ve STA yöntemiyle bellekte herhangi 6 adrese, yukarıdaki rakamları yazmak. Örneğin, zero page'de $60-65 arasını seçelim:
Adres: 60 61 62 63 64 65
Rakam:1F 85 AC 31
(Bak. Şekil 1.)
20. CO
2011 85 66 STA $66 —50 (80)
Sonuç $50A6'dır. İnanmayan kontrol etsin. Tabii bu programı, X indeksli adresleme kullanıp çok daha kısa yazmak mümkün. Ve hayrettir ki, bu ayın Baytan Bitirmez Bilgisayar Bilgisi Birinciliğinin Birinci Bilmecesi Bu. Toplama böyle. Çıkarmaya gelince, bunun da komutu SBC (SuBtract with Carry) ve işleyişi ADC'nin tam tersi. Nasıl FF'ten artırıp 00'a ulaşınca Carry 1 oluyorsa, 00'dan eksiltip $FF'e ulaşırsak Carry 1 iken sıfırlanıyor (sıfırsa sıfır kalıyor). Nasıl tek haneli ADC işleminde doğru sonuç almak için Carry'i sıfırlamak gerekiyorsa, tek haneli SBC operasyonunda da Carry'i 1 yapmak şart. Yani işlem,
SEC
LDA xx
SBC yy
Çok haneli çıkarma işleminde, herhangi bir hanedeki SBC sonucu eksi ise, Carry sıfırlanıyor; dolayısıyla bir soldaki hanede SBC sonucu bir eksik veriyor.
90 A8 25
sBC A0 AZ 69
50 00 CO
Toplama sonucunu da $66-68'e
Program şöyle:
2090 18 CLC
2001 A5 65 LDA
20803 65 62 ADC $62
2005 85 68 STA $68
2007 A5 GBâ LDA
20609 65 61 ADC $6İ
20B 85 67 STA $67
A5 63 LDA $653
200F 65 6G6ü ADC
Şekil 1
Elde var ©
co <192)
tAC (172)
(108) elde 1 (256)
,
*85 (133)
zAB (166) elde B
31 <49)
*1F (31) 148
Düşünürseniz, tıpkı ilkokuldan bildiğimiz çıkarma işlemi gibi, yalnız eldeleri onar onar değil, 256'şar alıyoruz. Bu arada, sırası gelmişken bir konuya daha değinelim. Geçen sayıda kısaca gördüğümüz CMP (CoMPare, kıyasla) komutu (hatırlayan var mı?), aslında SBC'nin bir benzeri. Aradaki fark şu: SBC, parametrede belirtilen sayıyı akümülatörden eksiltiyor ve sonucu akümülatörde gösteriyor. CMP da aynı işlemi yapıyor, ama akümülatörün içeriğini değiştirmiyor. Her iki durumda da, parametrede belirtilen rakam akümülatördeki rakamdan büyükse Carry sıfırlanıyor; eşit veya küçükse Carry 1 oluyor. Dolayısıyla:
LDA xx CMP yy BCC zz —— IF xx THEN zz LDA xx CMP yy BCS xx 7 —yy THEN zz LDA xx SBC yy BCC zz ——— Ax xx—yy:1F
A < 0 THEN zz
Bit Kaydırmaca
Gelgelelim çarpma ve bölme işlemlerine. Burada bizi acı bir sürpriz bekliyor; zira makina dilinde çarpma ve bölme işlemleri yok. A*B'yi elde etmek için yöntem, A'yı B defa kendi kendisiyle toplamak. Daha bilimsel, üstelik daha keyifli bir yöntem ise bitlerle oynamak. Buraya kadar bitlere bulaşmadan sürdürdüğümüz makina dili dizimiz, artık bit hesabına girmek zorunda. Hepimizin malumu ki, 0-255 arası herhangi bir sayı, iki haneli bir hex rakamla belirtilebileceği gibi, sekiz haneli bir binary rakamla da belirtilebilir. Örneğin, $A9 = 10101001, $87 = 10000111 filan. Onlu sistemde nasıl bir sayıyı onla çarpmak için arkasına bir sıfır eklemek yeterliyse, ikili sistemde de ikiyle çarpmak için arkaya sıfır eklemek yeterli. 1=1; 10=2; 100=4; 1000 = 8. Eğer rakamlarımız sekiz haneyle sınırlıysa, demek ki, ikiyle çarpmak için tüm bitleri bir sola kaydırıp arkada boşalan yere sıfır eklemek gerekiyor.
1010€109ü#E-i
ASL (Arithmetic Shift Left) komutu, akümülatörde bulunan veya parametrede belirtilen byte'ı bir sola kaydırıyor; soldan taşan biti de Carry'e atıyor. Böylece rakam ikiyle çarpılmış oluyor, fakat sonuç 256'dan büyükse, fazlalık 256 Carry'de gözüküyor. LSR (Logical Shift Right), ASL'nin tersi: Rakamı sağa kaydırıp ikiye bölmüş oluyor. Sağdan taşan kesir, Carry'e geçiyor. ASL ve LSR, parametresiz kullanıldıklarında, akümülatörün yükünü sağa sola kaydırıyorlar. Parametreli çeşitlerinden ise, mutlak, zero page, indeksli vb. bilumum adresleme imkânları mevcut. ROL ve ROR, ASL ve LSR'nin ikiz kardeşleri. Şu farkla ki, sola veya sağa kaydırmakla boşalan haneye 0 koyacakları yerde, Carry'de o an bulunan değer'i koyuyorlar. Yani, bir şeyi üst üste 8 kez ASL'lenince sonuç daima sıfır; oysa 9 kez üst üste ROL edilen sayı sonuçta ilk baştaki haline dönüyor. Çünkü, ilk ROL'de soldan taşan bit, bir sonraki ROL'de sağdan gene kuyruğa giriyor. Peki $47 ile $A5'i nasıl çarpacağız? $47'yi ikiliye çevirdiğimizde, arif olan cevabı hemen bilebilir. $47 -> 01000111. Sıfırları atlayıp birleri sayarsak, $47 (onlu 73), = $40 + $04 + $02 + $01 veya onlu 64+4+2+1. Yani bir sayıyı sırasıyla 1, 2, 4 ve 64'le çarpıp sonuçları toplamak, o sayıyı $47 ile çarpmakla eşdeğer. O halde işlem şundan ibaret:
00000001 * A5 * 00000010 * 00000100 * A5* 01000000
$47'yi $60 adresine, $A5'i iki byte'lık bir rakam olarak $61-62'ye koyup, iki byte'lık sonucu $63-64'te elde eden bir program şöyle olabilir:
1184190816
101001600
HAZIRLIK
KISMI
A9 A7 LDA
code 85 STA $68
cag4 AS AZ LDA
85 62 STA $62
A9 BE LDA
Dü
SA
48
casa 85 61 STA $61
85 63 STA $63
COBE 85 STA $64
İŞLEM
A5 62 LDA $62
Ccoi2? 46 LSR #68
gö ga — BCC
Ccai6 65 64 ADC $64
85 64 STA $64
AS S1 LDA $61
& ADC $63
CO1E 85 63 STA $63
ceza “6 ASL
co22 86 si ROL $61
ca24 A5 66 LDA
co26 DO E8 — BNE scaiğ
ceza sa BRK
C012'deki işlem, $60 adresindeki $47 sayısını tüp gibi sıkıp, sağdan bir biti-
ni taşıyor. Eğer taşan bit sıfırsa (carry clear), yapacak tek iş, $61-62'deki sayıyı ikiyle çarpıp devam etmek. Yok birse, (carry set) $61-62'de habire ikiye çarpılan sayının mevcut hali, $63-64'teki sonuç hanesine ekleniyor. İlk geçişte taşan 1 ve $A5 sonuca ekleniyor. İkinci geçişte de taşan 1, eklenen $A5*2. Üçüncüde yine 1, eklenen $A5*2*2. Dördüncü, beşinci ve altıncıda sıfır. Yedincide yine 1, eklenen $A5*2*2*2*2*2*2. C024-26, tüp sıkılıp bitti mi diye soruyor. Bitmediyse (BNE) baştan. Bittiyse, bu seferlik BRK.
* * «*
Ananevi yarışmamız bu sefer epeyce yüklü: MADDE 1: $AF85A6 ile $3120C0'yu toplayan programımızın X indeksli olarak kısa yazılışı. MADDE 2: $47 ile $A5'in çarpım sonucu. BÜYÜK İKRAMİYE: Tek byte'lık herhangi bir bölme işlemini, virgülden sonra sekiz bite kadar hesaplayan program.
COMPU-TOBİ
Geçtiğimiz sayıda bilgisayarla ilgilenenler arasında, aynı zamanda astrolojiyle -ve diğer falcılık türleriyle- ilgilenenlerin hatırı sayılır bir yekûn tuttuğunu söylemiş ve aradaki ilişkinin arızi olmadığını iddia etmiştik. Sıradan bir kullanıcı için bilgisayar dili tılsımlı bir değnek gibidir; astroloji ve genel olarak falcılık ve büyü ise dilin tılsımlı bir gücü olduğu inancına dayanır.
Ancak her iki dilden anladıkları birbirlerine neredeyse taban taban zıttır. Bu sayıda da gelin biraz bu fark üzerinde duralım.
Bilgisayar ve Astroloji II
Bilim, Bilgisayar ve Sayısal Düşünce
Genellikle, astrolojiyle gırgır geçmek istediğimiz zaman şu tür şeyler söyler ya da sorarız: “Amma da saçma ha!” “Nasıl olur da gökyüzünde kendi halinde duran yıldızlar, kişiliğimizi, başımıza gelecekleri etkilerler? Birtakım görünmez, keşfedilmez ışınlar mı yolluyorlar ki bu gezegenlere?!” Kuşkusuz böyle gırgır geçmek mümkün astrolojiyle; büyük bir ihtimalle de haklı böylesi bir alay. Ama buradan hareket ettiğimizde, Batlamyus (Ptolemaios) gibi, Kepler gibi, Newton gibi geçmiş çağların büyük düşünürlerinin nasıl olup da böylesi saçma hurafelere inanabildiği anlaşılmaz oluyor. Çünkü, astrolojinin temelinde yatan mantık kavranmamış oluyor. Hemen ““astrolojinin”” de bir mantığı olur muymuş?!” demeyin. Her insani faaliyetin olduğu gibi, astrolojinin de kendine özgü bir iç tutarlılığı, bir mantığı vardır. Ama bu mantığı gözden geçirmeye başlamadan önce, her gün, neredeyse ister istemez gazetenin burç köşesini okuduğumuz halde, neden astrolojinin mantığını kavramakta bu kadar güçlük çekiyoruz? Astrolojiye inananlar bile neden neye inandıklarını açıklamakta güçlük çekiyorlar, biraz onun üzerinde duralım: Sayısal (digital) bilgisayarlar için, bilimsel düşüncenin en mükemmel ürünlerinden biri, diyoruz. Ama, sözgelimi aya giden füzeler de bilimsel düşüncenin ürünüdür; üstelik onlar da kendince mükemmeldir. Ama sayısal bilgisayarlarla, bilimsel düşünce arasında (füzeler gibi) herhangi bir teknoloji ilişki bilimsel düşünce arasında olduğundan daha yakın bir düşünce vardır. Neden mi? Sayısal düşünce, bilimsel düşüncenin ta kendisidir de ondan. Ne kastediyoruz sayısal düşünceyle? En kaba tarifiyle her şeyi sayılara vuran, sayılarla düşünen bir düşünceyi kastediyoruz. Ama biraz daha inceltmeye çalışalım bu kaba tarifi: Bunun için de sayı kavramı üzerinde biraz düşünmemiz lazım. Sayı kavramı sadece ölçmek biçmekle ilgili bir şey değildir. Sayılar alabildiğine niteliksiz şeylerdir. Sayı demek sadece ve sadece bir birim demektir. Bunun için sayılarla düşünmek demek, hakkında düşündüğümüz nesne ya da konuyu en küçük birimlerine indirgemek demektir. Bu yüzden, hakkında düşüneceğimiz konunun türdeş nesnelerden oluşması gerekir.
VA
(
&
A GA
Bu yüzden, örneğin okullarda denklemlerini okuduğumuz Pythagoras, büyük bir matematikçi olmasına karşın, sayılarla, sayısal olarak düşünmez. Çünkü sayıları birtakım nitelikleri olan varlıklar olarak düşünür: 2 erkektir, 3 dişi, 4 ise kutsal; dolayısıyla Pythagoras için matematik yapmak demek; bir nesneyi ya da konuyu en küçük birimlerine indirgemek demek değil; hakkında düşündüğü nesne ya da konuyu, sayıların sözünü ettiğimiz nitelikleriyle, ilişkilendirmektir. Örneğin: evliliğin sayısı tabiatıyla 5'tir, çünkü 5 erkek olan 2 ile dişi olan 3'ün birleşmesidir. Ama biz şu ünlü lafla yetiştik: ““Elmalarla armutları toplayamazsın!””. Elmalarla armutlar söz konusu olduğunda sorun yok, bilmem kaç birim meyveden söz edebiliriz. Ama sayısal düşünceyi genelleştirmek, onu bütün evren hakkında bir bilimsel düşünceye dönüştürmek istiyorsak, o zaman nitelikleri ne olursa olsun her şeyi indirgeyebileceğimiz niteliksiz birimlere ihtiyacımız var demektir. İşte önce “atom” kavramı, sonra da “enerji” kavramı, tam da bu ihtiyacı karşılayan kavramlardır. Artık sayısal bilgisayarlarla, bilimsel düşünce arasındaki ilişkiyi ifade edebiliriz. Nasıl bilimsel düşünce, evreni açıklayabilmek için, onu niteliksiz enerji birimlerine indirgiyorsa, bilgisayar da bütün bilgileri, içerikleri ne olursa olsun, bir elektrik sinyalinin varlığına ya da yokluğuna indirger. Bu anlamda bilgisayar, bilimsel düşüncenin bir ürünü olmaktan ibaret değildir; aynı zamanda bilimsel düşüncenin maddeleşmiş, vücut kazanmış şekli olan bir makinadır. Ama bizim konumuz bilgisayar ve astroloji. Daha da doğrusu, bilgisayarın temelinde yatan sayısal düşünce ile astrolojinin ilişkisi. Sayısal düşüncenin yıldızların insan kişiliği ve kaderi üzerindeki etkisini kavrayabilmesi için, yıldızlardan kaynaklanan ve türdeş bir enerji aracılığıyla insana iletilen bir etkinin varlığını saptayabilmesi gerekir. Ama astroloji ya da daha doğrusu astrolojinin temelinde yatan analojik düşünce, yıldızların insan kişiliği ve kaderi üzerindeki etkisini böyle düşünmez ki.
vr
o >
Astroloji ve Analojik Düşünce
Bugün çoğumuz için ““benzerlik” farkına varılması hoş bir şey de olsa, pek öyle uzun boylu üzerinde düşündüğümüz bir şey değildir. Ama büyüklerimizin, babaannelerimizin falan zaman zaman ettiği bir laftır.
Birini bahtı kara bir başkasına, özellikle de ünlü birine, ne bileyim ben, Adnan Menderes'e ya da Deniz Gezmiş'e benzettiğimiz zaman, büyüklerimiz tahtaya vurup ““Allah istikbalini -ya da kaderini- benzetmesin”” der. İşte böyle bir sözde analojik düşüncenin izlerini görmek mümkün. Analojik düşünce, biçimleri benzer olan şeylerin, bu yüzden davranışlarının, geleceklerinin, hattâ karakter ve kaderlerinin bile benzer olmasını bekler. Çünkü, analojik düşünce için benzerlik hiçbir zaman ““sadece benzerlik”ten ibaret değildir. Birbirine benzer olan şeyler arasında derin bir duygudaşlık, bir sempati vardır. Nesneler birbirlerini, birinden diğerine bir enerji aktarıldığı için değil, aralarındaki sempatiden ötürü etkilerler. Sayısal düşünce için “enerjinin sakınımı kanunu” neyse, analojik düşünce için de ““evrensel sempati”” de odur. Tababetten bir örnek verelim: Rönesans tabipleri cevizin baş ağrısına iyi geleceğine inanırlardı. Çünkü cevizin üzerindeki kıvrımlar beynin üzerindekilere benzer; demek ki, cevizle beyin arasında bir sempati vardır. Beynin işleyişinde bir kusur olduğunda, onu normal işleyişine geri çağırmak için, onun normal biçimine benzeyen, onunla arasında bir sempati bulunan bir nesne (ceviz) kullanmak gerekir. Şimdi artık astrolojiye geri dönebiliriz: Astroloji burçlarla insan kişiliği ve kaderi arasındaki ilişkiyi yıldızların insana “yolladığı” bir etki şeklinde düşünmez. Belli bir burç altında doğan insanın, bir anlamda o burca benzediği, onunla arasında bir sempati olduğu düşünülür. Kişiliğinin o burcun özelliklerini yansıtması, hayatının o burcun devinimlerinden etkilenmesi bu yüzdendir. Astrolojik düşünce insanın dünyayla akrabalığını henüz yitirmemiş olduğu çağlara ait bir düşüncedir; insanların tabiata derin bir duygudaşlık bağıyla bağlı olduğu çağlara... Bu çağlarda insanlar taşlara, otlara, çiçeklere, yıldızlara, onlar da kendi kişiliklerinin, kendi kaderlerinin izlerini gördükleri için bakarlardı. Bu yüzden de, merak etmek demek, merak edilen şeyi analiz etmek, en küçük birimlerine indirgemek değil, onunla hasbıhal etmek, söyleşmek demekti. Oysa bizim için dünya artık bir aletler dünyasına dönüşüyor; bize cevap vermeyen, yalnızca kullanabileceğimiz bir eşyalar bütünü. Dolayısıyla giderek sevilmesi güçleşiyor dünyanın. İşte astrolojik düşünceyi anlamanın, dünyanın, tabiatın başka türlü de görülebileceğini hatırlamakla ilgili bir yararı olabilir. Bizim dünyaya bakışımız bizi güçlü kılıyor. Astroloji belki bir güçsüzlüğün ifadesi; ama başka bir erdeme, bizim unuttuğumuz bir erdeme sahip - dünyaya yakın olmak, ona sevgiyle bağlanmak. Böyle bir kültürü anlamak, onu ciddiye almak, belki bizi kendimiz hakkında biraz daha alçakgönüllü olmaya yönelteceği için de önemli.
SAMET KUMAŞ