BASIC DERLEYİCİLERİ

A miga'nin diğer dilleri (C, Assembler vs.) ile karşılaştırıldığında, BASIC bir hayli yavaş kalmakta. Bu sorunu ortadan kaldırmak için, bazı programcı firmalar BASIC programları en hızlı programlama dili olan makine diline çeviren derleyiciler (compiler) çıkarttılar. Şimdi bu derleyicilerin çalışma şekillerini ve örnek olarak seçtiğimiz iki-üç tanesini inceleyelim.

Cem GENCER Evet, Amiga'da BASIC dili ile çalışmış olanlar bilirler; program biraz uzamaya başladığında çalışması yavaşlar. Bunun sebebi, WorkBench ile birlikte verilen ABASIC'in compiler değil de, bir interpreter olması. Şimdi bilgisayara yabancı olanlar soracak: 'Interpreter ne demek?'. Interpreter, compiler programlama dilinin temel çalışma şeklini anlatır. Compiler'larla, program genellikle bir text editörüyle yazıldıktan sonra CLI'dan bazı komutlar kullanarak ya da ayrı bir program sayesinde makine diline çevrilirler. Bir programı compile etmek, programın uzunluğuna göre değişecektir; fakat genelde bu işlem 2-3 dakika sürer. Compiler'ların bir ufak dezavantajı varprogramı bir hayli uzatırlar ve genelde compile edilen bir programı herhangi cruncher yardımıyla sıkıştırmak mümkün değildir. Programın uzamasının sebecompiler'ın, kullanılan tüm komutların ne dili karşılıklarını programın sonualt-rutin olarak yerleştirmesidir. Fakat bazı compiler'larda bu sistem değiştirilmiştir. Örneğin HiSoft BASIC, programı compile edince diğer compiler'lara göre çok daha kısa bir dosya yaratır. Fakat bunu çalıştırabilmeniz için, HiSoft BASIC'in ana disketinde LIBS di rectory 'sinde yer alan HiSoft Basic.library dosyasını da compile edilmiş programın bulunduğu disketin LIBS directory 'sine aktarmalısınız. Bunun sebebi, bu gibi compiler'ların BASIC kontlarının makine dilinde karşılıklarının sistem library'si (sistem rutinlerinin -olunduğu alt-rutin paketi) gibi bir dosyada saklanmasıdır. Ayrıca compiler'ların pek büyük olma- Yan bir sorunu daha var: hazırladığınız dosyaları, ASCII dosya olarak compiler'a atarma gereği. Bunun anlamı, program dosyası içinde yazıcı kumanda karakterle Escape kodları) gibi, ASCII tablosunda yer almayan kodlan direkt olarak kullanamayışınızdır. Bunları, ancak DATA satırlarında sayısal karşılıkları ile tanımladıktan sonra program içinde READ komutunu kullanıp okutarak kullanırsınız. Fakat bu da bir bakıma avantajdır. PC gibi standart BASIC komutlarıyla çalışan bilgisayarda mevcut istediğiniz bir BASIC programı, Amiga'ya aktarıp doğrudan compile edebilirsiniz. Bu da, bir hayli hazır BASIC programa sahip olmanız anlamına gelmekte.

Amiga BASIC'in değişik bir huyu daha var; programlan kaydederken SAVE komutunda hiçbir takı kullanmazsanız, program dosyanız sıkıştırılarak kaydedilecektir. Bu sayede programlarınız diskette daha az yer kaplarlar; ancak bu da, compiler'lar için sorun çıkanr. Nedeni gayet açık; dosyalar sıkıştırıldığında, saf ASCII yazı dosyaları olmaktan çıkarlar. Böyle bir dosyayı yukarıda da belirttiğim gibi compiler yüklememekte ısrar edecektir. Bunun da çözümü gayet basit: Dosyayı AmigaBASIC'te yükledikten sonra diskete SAVE "<isim>",A komutu ile kaydedin.

Interpreter ise, AmigaBASIC gibi editörü de üzerinde olan ve hiçbir bekleme süreci olmadan programları yükledikten sonra doğrudan çalıştırabileceğiniz bir programdır. Burada program çalıştırıldığında, sadece programın işlenen satırı makine diline çevrilir. Bu, tabii ki büyük bir hız kaybı oluşturur. Hele bir de programda alt-rutinler ve dallanmalar (GOTO..., GOSUB..., CALL...) fazlaysa, program daha da yavaşlar. Interpreter'lara en güzel örnek, Amiga BASIC'tir. HiSoft BASIC, GFA-BASIC ve AC-BASIC ise compiler'lar arasında yer alır.

Compiler ve interpreter arasında bir bakıma büyük bir benzerlik vardır; ikisi de programın işlenmesi gereken satırını karakter karakter hafızadan okurlar ve bu karakterlerin doğruluğunu, sıralanışlarını ve özel işaretlerin yerlerini kontrol ederler. Ancak bu şartların hepsi yerine gelirse, o satır makine diline çevrilir. Interpreter, çevrilen bu satırı hemen çalıştırır; fakat compiler, makine diline çevrilen bu satın öncekilerin sonuna gelecek şekilde hafızaya atar ve bir sonraki satırın kontrollerine geçer.

Compiler ve interpreter'ların çalışma şeklini Şekil I ve Şekil II'den de anlayabilirsiniz. Ayrıca bir program satırı kontrol edilirken yapılan işlemleri, Şekil IH'teki akış diyagramında görebilirsiniz.

Gelelim inceleyeceğimiz üç compiler'a; bunlar AC-BASIC, HiSoft BASIC ve GFA-BASIC'dir. Niye bunları seçtiğimi soracak olanlara cevabım gayet basit; diğer compiler'lar ülkemize gelmediğinden, pek onlara değinmek istemiyorum. Ayrıca AMOS gibi standart BASIC dilindekilerin yanı sıra bir sürü kendi komutları olan derleyicileri de bu teste katmıyorum. Adı geçen üç programın da avantajları ve dezavantajları; bazılarının da kendi özel komutları var. Bütün bunları aşağıdaki satırlarda okuyabilirsiniz.

ŞEKİL lib Compile edilerek makine diline çevrilmiş

* AC-BASIC COMPILER: Piyasaya ilk çıkan compiler sıfatını taşıyan AC-BASIC, Amiga çıktıktan çok kısa bir süre sonra piyasaya sürüldü. Şimdiye kadar değişik versiyonları olan bu compiler, editörü olmayan kendi başına bir program. Programı hazırlamak için ya bir text editör ya da Amiga BASIC'i kullanmanız gerekmekte. Amiga BASIC'i kullandığınız takdirde, programı yazarken çalışıp çalışmadığını her an kontrol edebilme imkanına sahipsiniz. Fakat Amiga BASIC'in kendisi de, editörü de bir hayli yavaş. Bu yüzden uzun bir programı bitirmeniz oldukça uzun sürebilir. Bu durumda, programı text editörde yazmanın daha uygun olduğu ortaya çıkar. Programı denemek istediğiniz zaman diskete kaydeder, AmigaBASIC'e geçerek bunu yükleyip çalıştırabilirsiniz. Bunun da dezavantajı, programı istediğiniz zaman test edemeyişinizdir. Buna bulduğum en uygun iki çözüm şunlar: Hafızaya kullandığınız text editörü ve AC_BASIC'i atar ve ikisini de RUN ile çalıştırırsınız. Bu yöntem 1MB'ta verimli olmakta. Diğer yöntem ise, deminkinin yanısıra hafızaya bir de AmigaBASIC derleyicisini atmaktır. Fakat bu yöntem 1MB'tan daha fazla belleği olanlar tarafından kullanılır.

Her iki durumda da, elimizde sonuçta saf ASCII karakterlerden oluşan bir progprogramın çalışma prensibi.

ram olacaktır. Artık bu programı rahatlıkla AC_BASIC'e vererek compile edebilirsiniz.

Şimdi gelelim programın dezavantajlarına; ilk olarak bazı komutları AC-BASIC'in kabul etmediğini belirtmem gerek. Bunlar; CONT, DELETE, LIST, LLIST, LOAD, MER-GE, NEW, SAVE, TRON, TROFF.

Şimdi bazılarınız hemen AC-BASIC'in olduğu disketi yok etmek isteyebilir. Fakat biraz düşünürseniz, bütün bu komutların compile edilen programın makine dili versiyonunda gerekli olmadığını görebilirsiniz. Bazı komutlar, da, AC-BASIC'te değişik sonuçlara yol açarlar. Bu komutlar da şunlar: END, STOP, SYSTEM, RUN, CHAIN, COMMON, CLEAR^RE.

END, STOP ve SYSTEM komutları, compiler için hiçbir anlam taşımazlar; her üçü de aynı görevi yaparlar. Programdan çıkıp tekrar CLI'a dönmenizi sağlarlar.

RUN ve CHAIN komutu hatasız olarak çalı ırlar. Fakat burada çalıştırı ş lan BASIC programlar değil de, yine compile edilmiş programlar olacaktır. Fakat AC-BASIC, compile edilen programların sonuna < prog* .run> takısını eklediğinden, ya ana ramı comp RUN ve ile etmeden önce CHAIN komutlarının kullandıkları dosya isimlerinin sonuna bu takıyı eklemeli ya da tüm programlan compile ettikten sonra isimlerini CLI'dan RENAME komutunu kullanarak değiştirmelisiniz (sonlarındaki takıları silerek). CHAIN komutuyla kullanılan COM-MON komutunda hem ana programda, hem de yüklenen alt-programda gerekli değişkenleri ve sabitleri programın ilk satırında tanımlamanız gerekir. Bu tanımlama sırasında tüm değişken ve sabitleri ana programdaki COMMON satırında nasıl sıralamışsanız, alt-programlarda da aynı sırayı kesinlikle takip etmeniz gerekli. Ayrıca matris değişkenleri de COMMON kullanılarak sadece aşağıdaki şekillerde tanımlanabilir: DIM STATIC B( 10,3,2) COMMON B ya da COMMON K(4) DIM K(8,12,2,6)

Bu akış diyagramı aynı şekilde istenildiği ka-

dar uzatılabileceğinden burada kesiyoruz

ŞEKİL III Bir satırın karakter karakter kontrol edilmesi ve uygulanması.

FRE komutu ile kullanılabilen -1, 0 ve 1 parametreleri, nedense hep aynı değerleri vermekte. Bunun sebebi, herhalde AC-BASIC'in programlanmasındaki bir hatadan kaynaklanmakta. Bu yüzden bu komutu kullanmanın pek anlamı yok. Aynı şekilde CLEAR komutu da çalışmakta. İstediğiniz değeri girin, AC-BASIC bunu CLEAR gibi algılayacaktır. Bu komutun zaten pek faydası yok; çünkü compile edilen programlar sistem rutinlerini kullandıklarından gerektiği kadar hafızayı otomatik olarak ayırırlar.

AC-BASIC'in bir diğer dezavantajı da matris değişkenlerinde ortaya çıkıyor. Bildiğiniz gibi, AmigaBASIC maksimum 255 matris değişkenine izin veriyor. AC-BASIC bu konuda çok daha cimri; izin verdiği matris değişkeni sayısı 7!

Alt-rutinlerde DIM SHARED komutu kullanılamaz; çünkü compiler hazırlanırken, piyasadaki AmigaBASIC de bu komutu alt-rutinlerde kullanamıyordu. Fakat compiler ile birlikte verilen SORTSUBS programı sayesinde bu tür hatalar engellenebilir.

AmigaBASIC matris değişkenlerinin hepsi dinamiktir. Bu, matrisin gerektiğinde ekstra komut kullanımı gerekmeden istenilen boyuta getirebileceği anlamına gelmekte. Fakat compiler bunun yanı sıra bir de statik matrislere izin vermekte. Bunları tanımlamak için matrisi DIM komutu ile yaratırken satırın sonuna STATIC kelimesini eklemek yeter. Bu durumda derleyici compile işlemi sırasında tüm statik matrisleri ve bunlara ait tüm adresgöstergeçleri (addresspointer) yaratarak bunları programa hafıza adresleri olarak girer. Bu sayede compile edilen program, sonuçta bir hayli hızlı çalışacaktır. Fakat bu hızın da bir (hatta daha çok) bedeli vardır:

1. ERASE komutu statik matrislerde kesinlikle kullanılamaz.

2. Statik bir matris değişkeninin boyutları, program akışı sırasında değiştirilemez, sabit kalmalıdır.

3. Matris değişkenlerinde grafik saklanacaksa (grafik için olan GET ve PUT komutlarıyla), bunların boyutunu iyi planlayarak hesabınızı yapmanız gerekmekte. Grafikler çok renkli ise, 3 boyutlu bir matris işinizi görecektir.

4. OPTION BASE komutunu, ilk matris tanımlamasından (gerek statik, gerek dinamik) ve ilk matris kullanımından önce kullanmalısınız.

DEF (DEFDBL, DEFINT, DEFLNG, DEFSNG, DEFSTR ve DEF FN) komutlarını kullanırken de bazı garipliklere rastladım. Bunun sebebi, komutu yanlış yerde kullanmam oldu. Bu komutlar DIM SHARED komutundan önce kullanılmalı. Ayrıca DEFINT'te de nedenini çözemediğim bir hata var. Bu yüzden bu komutu ya kullanmamanızı ya da çok dikkatli olmanızı tavsiye ederim.

Bu kadar hatanın ve dezavantajın üzerine AC-BASIC compiler'ın avantaj ve fazlalıklarına geçebiliriz. Bunlar arasında en yararlı bir tanesi var ki, bunun sayesinde kilometrelerce süren IF ... THEN ... ELSE ... IF ... dizimlerinden kurtulabiliriz. Sadece compiler'da bulunan bu güzel komut paketi, SELECT ... CASE ... END SELECT komut dizimidir. Bunlar sayesinde rahatlıkla iç içe döngüler gerçekleştirebilirsiniz. Aşağıda bu iki yeni komutu kullanan ufak bir program bulunmakta. Bu sayede, komutların kullanımını rahatlıkla öğrenebilirsiniz:

INPUT a,b 
PRINT "a değişkenini" 
SELECT CASE a 
CASE-1,>0 
PRINT "ya -1 ya da pozitif bir değerdir." 
CASE 7 TO 11 
PRINT "6'dan büyük ve 12'den küçük 
bir değerdir."
CASE <b 
PRINT "b değişkeninin değerinden kü- 
çük bir değerdir."
CASE ELSE 
PRINT "şartlarda belirtilenlerden farklı 
bir değerdir."
END SELECT

CASE komutunda kullanılabilecek şart operatörleri; =, <>, >, <, <=, >= ve == olarak sıralanabilir. CASE ELSE'deki işlem, ancak belirtilen bütün şartlar yerine gelmezse gerçekleştirilir. Bu yeni komutları AmigaBASIC anlayamayacağından programınızı test etmek zorlaşacaktır. Zira CASE komut dizimine eş düşen IF komut dizimi, bir hayli karışıktır.

AC-BASIC'in başka bir iyi yanı ise, alt-rutinlerin rekursif olabilmesidir. Bu, alt-rutinin kendi kendini direkt olarak ya da başka alt-rutinler yardımıyla dolaylı olarak istediği kadar çağırabilmesi anlamına gelmekte. Bu sayede, yapay zeka programları gayet rahat bir şekilde yapılabilir. Fakat AmigaBASIC'te böyle bir şey yapmak bir hayli zordur ve genelde karşınıza bir sürü anlamsız hatalar çıkabilir.

AC-BASIC'in tanıtımı için bu kadar bilgi yeter herhalde. Bu arada bu compiler hakkında daha detaylı bilgi edinmek isteyenlere, gelecek sayılarda açıklanacağını müjdeleyebilirim.

* HI-SOFT BASIC: Kaliteli ve hızlı bir editörle, yine kaliteli ve hızlı bir compiler'ı birleştirirseniz ne olur? Gayet basit, elinizde Hi-Soft Basic olur! Editörü üzerinde olan ve compile işleminin menüler üzerinden yapıldığı bir derleyici, sanırım herkesin hoşuna gider. Kullanıcıya bir sürü yeni komut sağlayan bu compiler hakkında, mümkün olduğunca detaylı bilgi vereceğiz. Gerekli yerlerde AmigaBASIC ile karşılaştırma yaparak anlatacağımdan, bu güzel compiler'ı anlamakta zorlanmayacağınızı umuyorum.

İlk ele alacağımız komut, sistem library'lerindeki alt-rutinlerin kullanımına izin veren LIBRARY komutudur. Bu komut, Hi-Soft'ta iki şekilde kullanılabilir:

LIBRARY "libs/dos.library" 
DECLARE FUNCTION CreateDir& 
LIBRARY
... (programın devamı) 
END 
İkinci varyasyon: 
GOSUB IncludeLibs 
... (programın devamı) 
IncludeLibs: 
LIBRARY "libs/dos.library" 
DECLARE FUNCTION CreateDir& 
LIBRARY 
RETURN

Bu iki yöntem de, normal çalıştırmada hatasız çalışırlar. Fakat compile işleminden sonra, ikinci varyasyonumuz bazen hatalar çıkarabilir. Bu hatalar, genelde görüntüde oluşabilecek bazı bozukluklar şeklindedir. Fakat, Exec ve Dos library'leri kullanıldığında alet kilitlenebilir.

AmigaBASIC'te SUB ile tanımlanan alt-rutinler, programın istenen yerinde olabilir. Fakat compiler'ımız bu alt-rutinleri illa programın sonunda istemekte.

Compiler'ın program yazımında koyduğu bazı kurallar var. Bu kurallar, programlama stili ile alakalıdır ve düzgün stilde yapılmayan programlar devamlı hata verir. Aşağıda iki örnek görebilirsiniz. Bunlardan ilki, normalde AmigaBASIC'te çalışabilir, fakat compiler'da çalıştırılmaya kalktığınızda, güzel bir hata mesajı alabilirsiniz. Aynı programın değişik bir stilde yazılmışı (ikinci program) ise hem AmigaBASIC'te, hem de compiler'da hatasız olarak çalışabilir.

FOR i=l TO 10 
IFdeg=l THEN NEXT i 
... (programın devamı)

Burada FOR ... NEXT döngüsü sadece 'deg' değişkeninin değeri 1 olduğunda devam eder. Aynı rutinin daha düzenlisi aşağıdaki şekilde olabilir:

FORi=l TO 10 
IF deg<>l THEN con 
NEXT i 
con:
... (programın devamı)

Burada koşulun tersi alınarak komutların dizilişinin de değiştirildiği gözünüze çarpmıştır. Ama iki programın da işlevi aynıdır.

Fakat daha düzgün şekilde çalışmayı sevenler için Hi-Soft'un yeni komutları arasında REPEAT ... END REPEAT, DO ... UNTIL ve WHILE ... WEND döngü komutları vardır. Bunlarla iki örneğe bakacak olursak:

WHILE sart=l
WEND 
Veya 
Do 
……… 
UNTIL sart<>l

AmigaBASIC'te FOR ... NEXT döngüsünde, döngü değişkeninin NEXT'ten sonra tekrar verilmesi gerekmez. Hi-Soft da aynı toleransı göstermekte; fakat iç içe döngüler kurduğunuzda, karşınıza bazen hatalar çıkabilir. Bu yüzden, NEXT'ten sonra döngü değişkenini her zaman vermenizde fayda var. Hem böylece programınızın okunabilirliğini artırırsınız.

Aynı şekilde CALL ... SUB prosedür komutlarında CALL komutu girilmeden de prosedür çağrılabilir, fakat compiler'da bu bazen hata çıkarabilir. Ayrıca prosedür çağrılırken bunu ayrı bir satırda yaparsanız bazı sinir bozucu ufak hatalardan da kurtulabilirsiniz.

Bu compiler'ın kötü yanlarından bir diğeri, değişken ve alt-rutin isimlerinin aynı tabloda toplanmasıdır. Bu, değişken isimlerini alt-rutin ismi olarak kullanamayacağımızı şart koşan bir eksiklik. Buna bulduğum en uygun çözüm; değişken isimlerinin başına VAR, alt-rutin isimlerinin başına da JMP harflerini eklemek oldu. Bu sayede değişkenlerle alt-rutin isimleri gayet güzel ayrılmış oluyor.

Bildiğiniz gibi AmigaBASIC'te komutların yanı sıra bazı özel kelimeler değişken ya da alt-rutin ismi olarak kullanılamaz. Aynı kural HiSoft için de geçerli. HiSoft'ta normal BASIC komutlarına ek olarak kullanılabilecek komutlar da aynı şekilde değişken/alt-rutin ismi olarak kullanılamaz. Ayrıca bir library açtığınızda buna ait tüm alt-rutinlerin isimleri de programınızda değişken/alt-rutin ismi olarak kullanılamaz. Tüm library'lerde kullanılan alt-rutin isimlerini ROM Kernel Manual: Libs & Devices'ta bulabilirsiniz.

Alt-rutinlerle ilgili bir kural daha: Uzun bir program hazırlamaya başladığınızı farz edin. Böyle bir programda genelde bir menü ve bunun aracılığıyla erişilebilen alt-menüler bulunur. Normalde ana menü ekranını hazırladıktan sonra bunun alt-rutinlerini yavaş yavaş ekleyebilirsiniz. Programı AmigaBASIC'te çalıştırdığınızda menü çıkacaktır; fakat daha alt-rutini hazırlanmamış bir fonksiyon seçtiğinizde, program gayet haklı olarak hata mesajı vererek çıkacaktır. Fakat HiSoft'ta böyle bir şey mümkün değil. Ana menüyü hazırladıktan sonra tüm alt-rutinleri yaratmanız gerekmekte. Derleyicimiz compile işlemi sırasında tüm alt-rutinlerin hafızadaki yerlerini hazırlayacağından eksik bir alt-rutin ya da fazla bir alt-rutin ismi hata mesajı ile karşılaşmanıza yol açacaktır. Bunun için en basit çözüm tüm alt-rutinleri hazırlayarak bunları boş bırakmak. Daha sonra zaman buldukça bu alt-rutinleri teker teker yazmaya başlayabilirsiniz. Fakat dikkat edin; eğer alt-rutine GOSUB ile gidiyorsanız alt-rutinin sonuna (bu durumda başına) RETURN eklemeyi unutmayın. Alt-rutini yazacağınız zaman, alt-rutin ismiyle RETURN komutu arasına boş satır açar ve buraya programınızı yazabilirsiniz.

AmigaBASIC'te CLEAR komutu yardımıyla fazladan hafıza kullanabilirken (biliyorsunuz, AmigaBASIC açılışta sadece 25000 byte'lık text saklama bölgesi açmakta), HiSoft'ta bu komut pek işe yaramamakta. Nedeni de basit; çalışma alanının boyutunu menüden preferences yardımıyla ayarlayabilirsiniz. Fakat yine de programınızın kendi hafızasını ayarlamasını istiyorsanız ilk satıra şu komutu girin:

REM SOPTION k80

Bu size 80 KByte'lık bir çalışma alanı açacaktır. k80 yerine istediğiniz KByte değerinin başına <k> harfi koyarak kullanabilirsiniz.

Çalışma alanı hakkında bir diğer dikkat edilecek husus da çalışma alanının büyüklüğünün, programın disketteki uzunluğunun en az 4 katı olması gerektiğidir. Bunun nedeni, compile edilen programın her zaman ilk halinden daha uzun olmasıdır.

Biz biraz cömert davranarak 4 katı kullandık; bu sayede derleyicimiz çok daha rahat çalışabilir.

Bu arada yine çalışma alanıyla ilgili olan ve benim karşıma çıkan bazı ufak sorunları kısaca tanımlamak istiyorum. Bu sorunlardan ilki, bilgisayarın hafızası 1 MByte'da iken ve program uzunluğu 100 KByte'dan uzun olduğunda bazen ortaya çıkıyor. Hafızadaki program gayet iyi bir şekilde hatasız olarak compile ediliyor; fakat çalıştırıldığında, karşıma bir 'INTERNAL ERROR' mesajı çıkıyordu. Bunun sebebi, compiler'ın değişkenler için ayırdığı hafızanın yetmemesinden kaynaklanıyor olması. Ayrıca program uzun olunca, dallanmalarda da belki sorun yaratıyor olabilir. Bunun için bulduğum gayet basit bir yöntem var: programın içindeki tüm gereksiz REM satırları, boşlukları ve satır aralıklarını silmeniz gerekli. Ayrıca mümkünse bilgisayarınızın hafızasını artırın.

Uzun programlarda çıkan başka bir hata, compile işlemi sırasında HiSoft BASIC'in programınıza zaman zaman istenmeyen bir karakter eklemesi. Bu, benim başıma sık geldi ve kısa sürede buna da bir çözüm buldum: saçma karakter eklenen satırı bir aşağı itin ve aradaki boş satırın başına REM yazarak ekran sonuna kadar boşluk verin. Artık yine saçma bir karakter çıktığında bu, REM satırına denk geleceğinden hiçbir sorun yaratmaz. 100-150 KByte arası programlarda bu hata değişik yerlerde bir hayli çıkabiliyor. Bütün hata yerleşen yerlere bir REM satırı probleminizi çözecektir.

Çok ender olarak karşılaştığım diğer bir hata, LOCATE komutunun çalışmamasıydı. Buna da çözüm gayet basit. Aşağıdaki satırları programınıza eklemeniz yeterli:

REM Bu iki satır programın başına ge- 
lecek: 
LIBRARY "graphics.library" 
rastport&=WINDOW(8)

REM Bu satırlar ise en sona eklenmeli: SUB XPRINT(x,y,t$)

CALL Move&(rastport&,x,y) 
CALL 
Text&(rastport&,SADD(t$),LEN(t$)) 
END SUB

Bu satırları programınıza ekledikten sonra aşağıdaki satırda olduğu gibi bu prosedürü çağırırsanız; hem yazılar ekrana normal PRINT komutunda olduğundan daha hızlı gelir, hem de yazıyı grafiksel olarak istediğiniz x, y koordinatlarında basabilirsiniz.

CALLXPRINT 100,50,"Selam!**

Son bir hatadan daha bahsetmek istiyorum. Grafik için kullanılan GET ve PUT komutlarının kullanımına dikkat edin. Ekran dışından bir bölgeyi GET ile alıp, bunu PUT ile tekrar basmaya kalkıştığınızda, bilgisayarınızın ruhu bir an Hindistan'a gidip gelebilir (=Guru Meditation). Bu şekilde bilgisayarı kilitlemek gayet basit; bu sebeple programlarınızı yazarken, mümkün olan tüm hata kontrollerini kullanmanızda fayda var.

Gelelim HiSoft BASIC'in kullanıcıya kazandırdığı ekstra komutlara. CONST komutu yardımıyla, sabitleri daha rahat tanımlayabilirsiniz. Bu sayede de hafızadan tasarruf edebilirsiniz. Zira LET komutuyla tanımlanan değişkenler hafızadan 4 byte yerken CONST komutuyla tanımlanan sabitler hiç hafıza yemez. Aşağıda bu komutu kullanan bir örnek bulabilirsiniz:

CONST InterLace=4 
CONST BitPlanes=3 
SCREEN 1,640,512,BitPlanes,InterLace 
Hem bu yöntem kullanılarak bazı sayı- 
ların ne anlam taşıdığını da kolaylıkla gö- 
rebilirsiniz.

DECR ve INCR komutları yardımıyla bir değişkeni birer birer artırıp azaltabilirsiniz.

DECR x ===> x=x-1 INCR x ===> x=x+1 REDIM komutuyla, bir matris değişkenini tekrar tanımlayarak boyutunu rahatlıkla değiştirebilirsiniz. AmigaBASIC'te bunu yapmak için ilk önce ERASE komutunu kullanarak matrisi hafızadan silmeniz, ardından da DIM yardımıyla tekrar tanımlamanız gerekliydi. REDIM komutu yardımıyla boyutu değiştirilen bir matrisin içeriği tümüyle silinir. Fakat bunu da engelleyebilmek mümkün. REDIM APPEND kullanıldığında, matrisimizin hem boyutu değişmiş, hem de eski bilgiler silinmemiş olacak. Bu yöntem yardımıyla, örneğin bir kartoteks programında hafızanın otomatik olarak kart sırasına göre artması hızlı bir şekilde sağlanır.

AmigaBASIC'te bir dosyanın diskette olup olmadığını kontrol etmek için, normalde dosyayı açmaya çalışmamız gerekli. Eğer hata mesajı alırsak, bunu ON ERROR... komutuyla algılayıp gerekli işlemleri yapmamız lazım. Fakat bu işlemler uzun sürer ve tam da güvenilir olmaz. Hi-Soft BASIC'teki FEXISTS komutuyla tüm bu işlemler bir IF..THEN döngüsü içinde kolaylıkla kontrol edilebilir. Aşağıda bu komutu kullanan ufak bir rutini inceleyerek kullanımını rahatlıkla öğrenebilirsiniz:

IF NOT FEXISTSS("Dosya") THEN

PRINT "Dosya bulunamadı." END IF Parantezler arasındaki tırnaklar içine dosyanın directory'sini ve ardından da dosyanın ismini yazmak mümkün. Burada uyacağınız kural gayet basit; isim, ilk önce device ismi (DF0:, vs...), directory ismi, </> işareti ve file ismi gelecek şekilde yazılmalı.

Diskette directory yaratmak için MKDIR komutunu kullanabiliriz: MKDIR ("yenidirectory"). RMDIR ise, açılmış olan içi boş bir directory'i siler; kullanımı, MKDIR ile aynıdır.

Dosyalarla ilgili diğer bir komut RESET'tir. Bu komut hiçbir parametreye gerek duymadan kullanılır ve açık olan tüm dosyaları kapar.

BLOAD ve BSAVE komutları yardımıyla hafızanın istediğiniz belli bir bölümünü dosya olarak diskete kaydedebilirsiniz. PCOPY yardımıyla ekranın kopyasını grafik olarak yazıcıdan alabilirsiniz.

Eklenen komutlar arasında döngüleri kolaylıkla yapmamızı sağlayan bazı komut grupları mevcuttur. Fakat bunlara geçmeden önce WINDOW komutuna yapılan eklemeleri tanıtmak istiyorum. Bunların hepsi de pencere tipini (window type) belirlemeye yarar.

32: Pencere çerçevesiyle içeriği ayrı ayrı değerlendirilir. Bu şekilde sol üst köşe, artık pencerenin sol üst köşesi değil de, penceredeki kullanıma izin verilen alanın sol üst köşesi olur.

64: Pencere, daima mevcut pencerelerin en arkasında kalır.

128: Pencerenin kenarları olmaz. 256: Verilen koordinatlar, pencerenin çerçevesi dahil ekranda kaplayacağı alanı belirler.

Son olarak da değişik şekillerde döngü kurmaya yarayan komut paketlerini vereceğime söz vermiştim. Bu komutlardan ilki DO ... LOOP. Döngüye başlamak için verilebilecek komutlar şunlar:

DO DO WHILE n=1 DO UNTIL n=1 Döngünün sonunda da aşağıdaki komutlardan birini kullanabilirsiniz:

LOOP LOOP WHILE LOOP UNTIL

Sadece DO kullanılan yerde ya LOOP UNTIL ya da LOOP WHILE komutu, son komut olarak kullanılmalı. Aynı şekilde ilk komut olarak DO WHILE ya da DO UNTIL kullanılan döngüde de son komut olarak sadece LOOP kullanılabilir. Ayrıca döngünün ortasından da çıkabilirsiniz. Bunun için ya EXIT LOOP ya da EXIT DO komutlarını kullanmalısınız.

Size bu komutu daha iyi anlayabilmeniz için DO komutunun kullanıldığı kısa bir örnek vermek istiyorum:

i=0 
f=l 
DO 
INCR i 
f=f*i 
UNTIL i=5 
Bu döngü, <i> değişkeni 5 değerine ula- 
şıncaya kadar tekrarlanır.

Son olarak da HiSoft BASIC'de uygulayabileceğiniz kısa bir rekursif program vermek istiyorum. Bu sayede de rekursif programlamayı daha iyi kavrayabilirsiniz.

DEF FN fa(n) 
IF n<=l THEN 
FNfa=l 
ELSE 
FNfa=n*FNfa(n-l) 
END IF 
END SUB 
Bu şartlı döngü, <n> değişkeninin değe- 
ri 1 'e eşit ya da 1 'den küçük olana kadar 
kendini çağıracaktır. Tabii bu rutin bazen 
kendi kendini çok kez çağırarak daha de- 
rin döngülerin otomatik olarak oluşmasını 
sağlayacaktır. Her döngü aşamasının de- 
ğerlerini kaybetmemek için, bu değerler 
belleğe yazılır. Fakat belleğin de yeterli 
boyutta olmasına dikkat edin. Bu bellek 
dolduğu anda eski bilgiler silinebilir.

Rekursif rutinlerin sadece bir dezavantajı vardır. Her seferinde değerler belleğe aktarılıp saklanacağından rutininiz biraz yavaşlayabilir. Bu yüzden programınızda sadece gerektiğinde rekursif programlamayı kullanmaya çalışın. Unutmayın, rekursif rutinleri biraz fazla çaba göstererek iç içe FOR...NEXT döngüleriyle yapmak mümkün.

HiSoft BASIC'in kullanıcıya compile sırasında sağladığı birçok yardımcı fonksiyon mevcut. Bunlar yardımıyla isterseniz single-file compiling, isterseniz de library compiling şeklinde programınızı makine diline çevirebilirsiniz. Bunlardan ilki AC-BASIC gibi uzun bir dosya yaratır; fakat sonuçta, elinizde tek dosya olur. Fakat ikincisini seçtiğinizde, sonuç program dosyası kısa olacak; buna karşın sizden libs directory'sinde kendi library'sini isteyecektir. Diğer compile fonksiyonları ise, global hata mesajları ve kontrollerini sınırlandırmaya yarar. Global hata mesajları ve kontrolleri arasında Break Check (<CTRL>+<C> durdurma tuşlarının kullanımına izin verir), Error Checks (hata anında programı ya durdurur, ya da devam ettirir) ve Variable checks (değişkenlerin doğruluğu kontrol edilir) gibi fonksiyonları açıp kapatabilirsiniz.

Gelecek ay GFA Basic 3.0'ı inceleyeceğiz. Hoşça kalın.

AYINKONUKLA