BASIC DİLİNİN ÖZELLİKLERİ

BASIC dilinin geliştirilmesinin ana nedenlerinden birisi sıradan insanların kolayca öğrenip uygulayabileceği bir program diline duyulan gereksinme idi. Bu amaca yönelik olarak son derece başarılı olduğu da söylenebilir. Ama özellikle C-64 versiyonunda belli eksiklikler olduğu söylenebilir. Bu yazıdaki amacımız da bu dili eleştirmek değil, bilgisayarın belleğindeki yapısını daha iyi kavramanızı sağlayarak, programlarınız için mevcut sınırlı bellek alanını en iyi şekilde nasıl değerlendirebileceğiniz konusunda size bazı ipuçları verebilmektir.

KODLANMIŞ BELLEK

Programınızı yazarken, belli bir zamanda onun belli bir kesimini görmek isteyebilirsiniz. Bunu yapmak için LIST komutunu verirsiniz ve program başından sonuna gözünüzün önünde akmaya başlar. Doğallıkla sizin ekranda gördükleriniz ve bilgisayarın belleğindekiler tamamıyla farklı şeylerdir. Gözünüzün önünden geçen satırlar, bellekten ekrana yolculuklarında birçok değişikler geçirirler. O zaman bellekteki programı nasıl görebileceğimiz sorusu gündeme gelir. BASIC belleğinin başlangıcı $0801'dedir. (Onluk sistemde 2049) Bu nedenle örneğin ilk elli bellek baytını görebilmek için, şöyle bir şey yapmanız gerekirdi:

FOR A = 2049 TO 2099:PRINT PEEK(A):NEXT A. Bu direkt modda yapılırdı. Şimdi gördüğünüz 0-255 arasında bir dizi onluk sayı olacaktır. Bu sayılar bellekteki sayıların onluk sistemdeki eşdeğerleridir. Bellekteki sayılar da klavyeye yazdıklarınızı bilgisayarın yorumlamasıdır. Bu durumun daha net anlaşılması için şekil 1'e bakın. Bu yedi satırlık basit bir BASIC programıdır. Şimdi şekil 2'ye bakın. Bu da yedi satırlık programın bilgisayarda nasıl depolandığını göstermektedir. Şimdi programın nasıl oluştuğunu satır satır açıklayacağız. Her BASIC satırında beş baytlık bir üst ve satırın kendisi vardır. Bu

baytlar beş bayt, bir link (bağlantı) adresi, satır numarası ve bir satırın sonunu gösteren bir izleyici sıfır baytından oluşur. Link adresi ekran editörünü kullandığınız, yani bir BASIC programının satırlarını ekler ve çıkartırken sistem tarafından kullanılır. Program çalışırken üzerlerinde durulmaz (link adreslerine sonra daha ayrıntılı olarak değineceğiz). Şimdi kısa örneği-

PROGRAM ADI 1 ÖRNEK PRG,
00010 FOKE
©0028 FRIMNT "<HOME)* <000)>
009020 PRINT "HERKESE MERHABA"
80940 FOR Asi TO 85
68858 NEKT
©0868 PRINT "DEMO SONU"
00878 GOTO 78 -
PROGRAM 1 PRG 6880 0080
c30d 1 88 OE BA 90 97 35 33 C7
©6808 ı 38 30 20 31 JA 97 35 96
0810 : 33 32 38 31 32 60 260 Es
©3818 * 08 14 993 22 13 82 06 Rİ
09820 © 37 66 iİ€ 08 99 EE da a5 29
© S2 4B 45 54 45 206 45 Fi
©0238 © Sö 46 Adi 42 di öz 42 EB
ÖZELE 6s de dö Bi di üz 31 Aa 30
1 28 25 üğ 43 928 38 60 te 4D
6248 gö SA OG 30 89 s9 22 44 DD
B350 1 45 4D c0 53 4F 4E 55 A7
0050 : Be öö GE 86 d8 960 83 37 Bb
cğüğ : 30 Ad dö 00 20 2a 33 ge

mize dönelim. Şimdi tüm bunlar ne demek oluyor? İnsanın aklına ilk önce şu soru gelebilir: Bilgisayar KOMUT sözcüklerini nasıl seçeceğini nereden biliyor? Yanıt son derece basit. Komutlar ya da (keywords) $7F ile $CB onaltılık sistem değerleri arasında değerlere sahiptirler. Return tuşuna bastığınızda, data yorum için klavye buffer'ına yollanılır. Sonra bir tarama tablosu kullanılır ve satırınızda komutlar aranır. Aranızdaki bazı dikkatli kişilerin “Ya PRINT “PRINT” yazarsam ne olacak” diye kendi kendinize sorduğunuzu duyar gibi oluyorum. Bu iki adet print ifadesi olarak yorumlanmaz mıydı? Yanıt hayırdır. Arama tablosunun görevlerinden biri de tırnak işaretlerini kontrol etmektir. Eğer bir komut tırnak işaretleri arasında ise, o zaman bir print ifadesi içinde olması gerekir. Yine örneğimize dönelim. Bellek adresi $0800 $00'ı içerir. BASIC programının doğru işlemesi için, BASIC belleğinin başlangıcından hemen önceki adres bir sıfır baytı içermelidir. Sonraki ilk bayt $17 ve $08'i içerir. Bu baytlar düşük/yüksek adres formatında link adresini temsil ederler ve bilgisayara sonraki BASIC satırının nereden başladığını söylerler. Sonraki iki bayt $0A ve $00'ı gösterir: Bu yüksek/düşük bayt formatında bir kere daha gösterilen satır numarasıdır. Sonraki bayt $97'dir. Komutların içinde bulunduğu spektrumu anımsarsanız bunun bir komut olduğunu anlarsınız. İşin aslında da bu POKE komutu için ikilik sistem karşılığıdır. Sonraki beş bayt 53200 sayısını temsil eder. Sonraki bayt ise, bir virgül olarak yorumlanan $2C'dir. Örneğin geri kalanına bakıp satır satır takip etmeye çalışın.

SATIRLARIN SONU

Bir bilgisayarın, bir BASIC programının sonuna vardığını nasıl anladığını merak ediyor olabilirsiniz. Sözünü önceden ettiğimiz link adresini anımsadınız mı? Eğer link adresinde çift sıfırlı bir bayt varsa programın sonuna geldiniz demektir. Bir BASIC programının başını ve sonunu bulabilmek için şu yerlere her zaman peek edebilirsiniz: $2D/2E ve $2B/2C. Bu sayfa sıfır yerleri VARTAB ve TXTTAB olarak bilinirler. Yeniden örneğimize dönecek olursak, $0862 sayılı yerin küçük demo programımızın sonunu gösterdiğini göreceksiniz. Baytları sayarsanız, bu küçük yedi satırlık programın 97 bayt aldığını göreceksiniz. Gördüğünüz gibi, BASIC belleği çok hızlı tüketiyor. O halde mevcut belleğin tümünü kullanabilmek için ne yapmalı? Birçok durumda bu ikinci harfi yalnızca shift edilmiş modda yazmak demektir. Bazen de ilk iki harfi yazıp, üçüncüyü shift edilmiş olarak yazmanız gerekir. Bu kuralın bir istisnası PRINT emiridir (statement). Bu ? tuşuyla kısaltılabilir. Örneğin, ?“MERHABA” yazmakla PRINT“MERHABA” yazmak arasında bir fark yoktur. P harfini izleyen bir shift edilmiş O da POKE yerine geçer. Peki tüm bunların yararı nedir? Programınızda ne kadar az satır olursa, o kadar az baytlık yer kaplarsınız. Shift edilmiş komutlar kullanmanın nedeni de, C-64 ekran editörünün bulunan en iyi editörlerden birisi olmasına karşın, bizi her program satırı (iki ekran satırı) başına 80 karakterle sınırlandırmasıdır. Yani shift edilmiş komutlar kullanarak, her program satırına daha fazla direktif sığdırabiliriz. Bellekten tasarruf etmenin diğer bir yolu da tek bir program satırına birden fazla direktif yerleştirmektir. Bunu en iyi örneklerle gösterebiliriz. Şekil 3'te yedi satırlık demomuzun yukarıdaki kolaylıklara başvurulduktan sonraki halini görüyorsunuz. Şekil 4'te de onu bellekte depolamanın yeni yöntemi var. Burada aslında tüm komutların kısaltılmış olduğunu, ama açıklık kaygısıyla normal gösterildiğini unutmayın. Şimdi baytları sayacak olursanız, 73'ü bulduğunu göreceksiniz. Kısa bir programda bile 24 baytlık tasarruf sağlayabildik. Uzun bir programda yapabileceğiniz tasarrufu düşünün bir de.

DEĞİŞKEN UZUNLUKLARI

Bellekten tasarruf edebileceğimiz bir başka alan da değişkenlerimiz. Ne cins olduklarını, nasıl oluştuklarını ve bellekte nasıl depolandıklarını bilmek de önemli. BASIC dilinde üç cins değişken bulunur. Dizgi (string), tam sayı (integer) ve gerçek (real). Fonksiyon adlarını da eklerseniz dördü bulurlar. Dizgi değişkenlerinde addan sonra dolar işareti, tam sayılardan sonra yüzde işareti gelir, gerçeklerden sonra hiçbir şey gelmez. Eksik değer gerçek değerdir. Bu noktada bir değişkenin nasıl oluşturulduğunu ve bir anda nelerin dahil edilip edilemeyeceğini bildiğinizi varsayacağım. Esas amacımız bellekte nasıl depolandıklarını görmektir. Tüm değişkenler, bellekte BASIC programından hemen sonra depolanırlar ve oluşum sırasıyla depolanırlar. Ama dizgilerin iki pointer'ı vardır. Biri dizginin adresi, öbürü de uzunluğudur. Dizgiler aynı zamanda BASIC belleğinin üstünde yerleştirilir ve aşağı doğru çalışırlar. Değişkenler ya basit ya da dizinli (subscripted) olurlar. Basit değişkenler yedi bayt-

PROGRAM ADI

RKEŞE MERHABA

KISA PRG.

00010 POKE "HE
Asi TO 1
PRİNT "DEMO SONU"
68828 GOTO 828 <206)
PROGRAM 5 ©6800 0850
©8080 1 80 41 028 BA ©0 87 35 33
#808 32 38 30 20 31 3A 97 35 86
©0910 « 33 32 38 3i 20 32 3A 99 Gi
: £2 de 45 Sa 4B 45 53 45 Bi
© 20 4D 45 52 40 41 42 41 8D
* 22 3A Si di 31 A4 32 898
©6838 35 SA S2 3A 99 44 45 Bö
62328 : 4D 4F 20 53 4F 4E 55 22 A0.
0340 1 00 45 14 80 a9 32 30 DF
©8348 < 00 00 90 28 26 20 20 51

lık bir üst kullanır. Bunlar sırasıyla şöyledir:

bayt değişken adını tutar. Dizgiler için, sonraki baytta dizginin uzunluğu, daha sonraki iki bayt da yüksek/düşük formattaki pointer'ı bulunur. Kalan iki tanesi kullanılmaz. Tam sayılar değer için üçüncü ve dördüncü baytları kullanırlar; geriye kalanlar hiç kullanılmaz. Gerçek ifade olarak üçüncü baytı, imi ve ondalık bölümü olarak dörtle yedi arasındaki baytları kullanır. Fonksiyon da yedi bayt kullanır. Üçüncü ve dördüncü tanıma, beşinci ve altıncı değişkene, yedinci de değerine işaret eder. Dizinli değişkenler, basitlerinin aksine, yalnızca depolama için gereken ilişkili değerleri gerektirirler. Örneğin dizgi (string) dizinleri uzunluğun yalnızca üç fazlasına ihtiyaç gösterirler. Tam sayılar da iki. Daha önceleri, bir satıra mümkün olduğu kadar çok direktif sığdırarak ve kısaltılmış komutlar kullanarak bellekten tasarruf etmenin yollarından söz etmiştim. Şimdi de BASIC programını daha hızlı çalıştırabilmeniz için bir iki ipucu. Doğallıkla, satır sayısı azaldıkça program da daha hızlı işleyecektir. Tüm önemli değişkenlerin programın başına mümkün olduğu kadar yakın olmasına gayret gösterin. Bu da arama zamanından tasarruf sağlayacaktır. Üçüncü olarak, çok fazla GOTO ve GOSUB olmamasına çalışın. Tüm bu gidiş gelişler zaman yitimine yol açacaktır. Ayrıca çok fazla DATA'nız varsa, bunları programın başına koymaya çalışın. Bu her READ komutu sırasında size zaman kazandıracaktır.