COMAL

Öğrenilmesi gayet kolay bir programlama dili olan Comal, gerek hız gerekse netlik açısından Basic'i geride bırakıyor. Bir kaplumbağası bile var. Ve ekran cinleriyle harikalar yaratıyor. Halen Comal bir Yapay Zeka dili olarak kullanılmamakla birlikte, bu yönde geliştirilme potansiyeli taşıyor.

Küçük Comal ilanı sayfanın bir köşesine sıkışmış, “Yüzyılın Oyunu”nu müjdeleyen dört renkli zevksizlik örneğinin bir kenarında neredeyse gözden kaybolmuştu. Dudaklarımda derinleşen müstehzi bir gülümsemeyle okudum küçük ilanın sıraladığı müthiş özellikleri. İlanın iddiasına göre, Comal 0.14 Basic'in tamamen yerini almak üzere tasarlanmış, üst düzey bir programlama diliydi. Hıh, dedim kendi kendime, bunları daha önce de duymuştuk! Bu Basic, Logo ve Pascal'ın en iyi yönlerinden oluşturulmuş melez bir dildir, diyordu ilan. Yalnızca 20 dolar karşılığında vaadettiği özelliklerse pek inanılacak gibi değildi. Ben de, okuduklarımın bir kelimesine bile inanmamış olarak, Comal'i ilgimi uyandıran ama sonuçta boş çıkan diğer egzantrik diller kategorisine yerleştirip konuyu kapattım.

Mutlu Keşif

Üç ay sonra posta kutumdan yerel kullanıcılar grubumun kütüphanecisi tarafından gönderilmiş bir Comal 0.14 disk kopyası çıktı. Diske iliştirilmiş mektup, bu yeni dilin üstünlüklerinden övgüyle söz ediyordu. Comal'i bilgisayarıma yükledim. Demo programlarını çalıştırdım, gördüklerimden afallamış olarak bir an durdum. Sonra büyük bir rahatlama hissiyle yeni dili öğrenmeye koyuldum. O gece, yapılandırılmış programlamanın keyfini keşfettim. C-64'ün ekran cinlerini, hi-res ekranını ve X-Y grafiklerini yönetmek için gereken tüm komutlar (yani, Commodore'un Basic 2.0'ın repertuvarına almayıp bizi Peek'lere ve Poke'lere başvurmak zorunda bıraktığı bütün o kullanışlı komutlar) dilin bizzat yapısında yer alıyordu. Üstelik, C-64'ün Comal versiyonu 0.14, yalnızca bir öğrenme diliydi. Commodore, gerçek Comal'i (versiyon 2.0'ı) bir 64K ROM kartuşu halinde yıl sonunda satışa sunmaya hazırlanıyordu. Roy Atherton'un Structured Programming With Comal'ini (Comal'le Yapılandırılmış Programlama) açıp, iki haftamı dili tanımaya adadım. Comal tam benim aradığım şeydi. Aldatıcı görüntüsüne kanıp, bunun yeni bir Logo versiyonu veya basitleştirilmiş bir Pascal veya daha da kötüsü C-64 için en yetkin Basic olduğunu düşünebilirsiniz. Bunların hepsi bir ölçüde doğru, ama eksik. Comal bu tanımları aşıyor.

Bu dil ilk olarak, on yıl önce Danimarkalı eğitimci Borge Christianson tarafından tasarlanıp yaratılmıştı. Pascal yeni başlayan bir programcı için çok karmaşık olduğundan ilk dil olarak Basic'i öğretmek durumunda kalan Christianson, Basic'in kullanım kolaylığıyla Pascal'ın yapısını birleştiren ara bir dilin eksikliğini hissediyordu. Bu eksikliği gidermek için Comal'i yarattı. Aradan geçen yıllarda Comal tanımlandı, yetkinleşti, standartlara kavuştu ve zenginleşti. Fakat işlevi hâlâ aynı: Öğrenilmesi ve öğretilmesi kolay bir ilk dil. Bu “aldatıcı dil” etiketinin ardındaysa, Basic'i yerinden edebilecek yetenekte, güçlü bir programlama aracı gizli.

Öğrenilmesi Zor mu?

Her dil başlangıçta zordur, ama hoşgörülü bir dil öğrenmenin azabını hafifletebilir. Comal kullandığım dillerin en şefkatlisi. İşletim sistemi programcının tam bir beceriksiz olduğu varsayımıyla hareket ederek her bir kod satırında sentaks hatası kontrolü yapıyor. Tek bir hatalı satır girmek mümkün değil. Ben Comal'e Basic'ten geldiğim için, bazı kötü alışkanlıkları unutup virgüllerin ve diğer noktalama işaretlerinin nereye konacağını yeni baştan öğrenmek zorunda kaldım. Şimdi geriye bakıyorum da, bu benim için hem eğlenceli hem de kazançlı bir tecrübe oldu. Eğer Comal'i ilk dil olarak seçerseniz, programcılığı ve bilgisayar donanımlarını bir arada öğrenmeniz gerekiyor. Bu da imkânsız bir şey değil: Ben Basic'i böyle öğrenmiştim. Comal'i Basic'ten ayıran çok önemli bir üstünlük, Basic'i okunmaz hale getiren şifremsi steno notasyonunu değil, İngilizceyi kullanması. Comal kodunun her satırına yalnızca tek bir komut, ya da anahtar sözcük girebiliyor. Basic'teyse, komutları iki nokta üst üstelerle birbirinden ayırarak, 80 karakterlik bir satıra sığdığı kadar komutu sıkıştırırsınız. Her ikisinden de birer örneğe bakarsak, netlikten tam neyi kastettiğim daha iyi anlaşılacak:

10 OPEN4,4:GOSUB6021:PRİNTFA4,
CHR$(12):
CLOSE4:0OTO 33 98
3398

Comal'deyse:

select “1p:” //printer kanalını aç
liste'diz //verileri sıraya koy
sayfa //printer'a form
gönder
print'list //verileri printer'a
gönder
sayfa'no //sayfa numarasını
yaz
select “ds:” //printer kanalını
kapat
asıl menü — //iş tamam, menüye
dön

“//” REM anlamına geliyor. İki dil de aynı işi gördü, ama hangisini okumak daha kolay? Tabii. Anahtar sözcüklerin ayrı ayrı satırlar halinde alt alta dizilmesi, programın akışını izlememizi mümkün kılıyor. Bir Comal programını iyi bir kitap gibi okuyabilirsiniz. Fark ettiyseniz, anahtar sözcükleri de İngilizce ve Türkçe'den fazla farklı değil. Daha ileri gitmeden itiraf edeyim: Sizi kandırdım. Yukarıdaki Comal programında select “1p:” ile select “ds:”den başka anahtar sözcük (komut) yok. Bunlar Comal'in anladığı standart anahtar sözcükler. Geri kalanlar (sayfa, asıl_menü, vb.) programcının işlevini tanımlayacak şekilde isimlendirdiği ve yalnızca bir satıra almak yoluyla işleme soktuğu prosedürlerden ibaret. Prosedürler (PROC) subroutine'lerin aynısı. Satır numarası yerine isimle çağrılıyorlar ve işleri bitince program, PROC çağrısının bir altındaki anahtar sözcüğe atlıyor. Basic, subroutine'lere ve GOTO'lara yapılan atlamalara referans olarak satır numaralarını kullanır. Comal'se atlamalar ve dallar için isimli PROC'lardan ve işlevlerden (FUNC'lardan) yararlanıyor. Comal'de satır numaraları bu sırayla işleme konulacak anahtar sözcükler ve PROC'lar listesini düzenlemekte kullanılıyor. Fakat Comal'in satır numaralarına gönderme yapmak mümkün değil. Bu yüzden, Comal program satır numaraları belirtilmez. Programın nasıl işlediğini anlamamız açısından gerekli de değildir zaten. Bu, aynı zamanda GOTO gereğini de ortadan kaldırmakta. Programınızın nereye gittiğini anlamak isterseniz PROC'lara bir göz atmanız yetiyor.

Yapılandırılmış Değil,

Sadeleştirilmiş

“Yapılandırılmış programlama” terimini ilk duyduğumda, pek de matah bir şeye benzemediğine karar vermiştim. Yapılandırılmış terimi aklıma kurallar, karmaşık matematik kavramları ve Boole mantığı üzerine akademik çalışmalar getiriyordu. Cehaletimin paniği her zamanki gibi yersiz çıktı. Tamam, Comal üst düzey bir yapılandırılmış dil, fakat üst düzey yalnızca tek bir anahtar sözcükle pek çok iş görebileceğiniz anlamına geliyor; yapılandırılmışsa sadeleştirilmiş demek. Comal elinizdeki işi çok sayıda küçük küçük işe, PROC'lara ayırmanıza olanak vererek işinizi sadeleştiriyor. PROC'ları büyük işin gerçekleştirilmesi için gereken sırada çağırıyorsunuz. Comal'in yapılandırılmış programlaması bundan ibaret. PROC'ların oluşumunu daha iyi anlamak için, bir örneğe bakalım. Bu PROC'u ekran, çerçeve veya renkleri değiştirmek isteyince çağırabilirsiniz:

proc renk'değiştir
#4
çerçeve 7 // sarı çerçeve
arkaplan 14 // açık yeşil ekran
((pencolor?)) // siyah cursor
endproc renk'değiştir
REM'leri sırf netlik sağlamak için
ekledim; programı yavaşlatmaları söz-
konusu değil. PROC renk'değiştir'i
her çağırdığınızda o üç renk değişiyor,
sonra program devam ediyor. Basic'-
teyse şöyle bir şey olacaktı:
6000 POKE53280,7:POKE53281,14:
PRINT ““|black)”,:RETURN

Comal, Basic programcısının uğraşmak zorunda kaldığı Poke'ler ve Peek'lerin çoğunu elimine etmekte. Her prosedür, PROC anahtar sözcüğü ve kendi ismiyle başlıyor. PROC'un son satırında da ENDPROC deniyor. Bu bir yapı. Başı ve sonu var. Ayrıca, dikkat ettiyseniz, başla son arasındaki satırları bir hane içeriden yazılmış. Bu da netlik için ve Comal bunu kendiliğinden yapıyor. Comal dönüşlü (recursive) bir dil. Yani kısacası PROC'lar kendi kendilerini çağırabiliyorlar.

Programcılara

Tatlı Hayat

Comal 0.14 cin gibi. Sizi alan o ufak tefek işlerden büyük ölçüde kurtarıp, kodun mantığı üzerinde yoğunlaşmanıza imkân sağlıyor. Basic'te olmayıp da yüzlerce Basic uzantısıyla getirilen basit şeyler Comal'in iç yapısında yer almış. Satırların otomatik olarak numaralandırılması, klavye hatası ihtimalini hatırı sayılır ölçüde azaltıyor; satırlar tek tek ya da dizi halinde çıkarılabiliyor ve

Basic usulü tam ekran düzeltme (editing) imkânı, satırların değiştirilmesini kolaylaştırıyor. Daha önce de söylediğim gibi, Comal girdiğiniz her kod satırını kontrol eder. Eğer sentaks hatası çıkarsa, ertesi satırda ekranda İngilizce hatası ibaresi belirir. Cursor'u hatalı anahtar sözcüğün tam üzerine gelir, gerekli düzeltmeyi yaparsınız. Düzeltme yapılınca da, hata mesajı silinir ve üzerinde belirmiş olduğu metin tekrar ortaya çıkar. Yapı sorunları (atlanmış bir ENDPROC, ENDCASE vb.) programı çalıştırdığınızda ortaya çıkar. Bu da ikinci kontroldür. Comal, program çalıştığı sırada da performansını denetlemeyi sürdürür ve mesela “selfmodification” ya da “out of range” bir değer gibi bir hata buldukça haber verir.

Karakter sayısı 78'e kadar çıkabilen, her bir hanesi anlamlı uzun değişken isimleri, programın anlaşılır kalmasını sağlamaktadır. Tüm değişkenler tek bir byte'da simgelendiğinden, bu uzun isimler hafızada gereksiz yer de kaplamazlar. Döküntüleri toplamak, Comal'le birlikte tarihe karışmıştır. Tüm değişkenler, array'ler ve karakter dizileri, korunan tablolarda depolanırlar. Fakat, bunun için, her diziyi kullanmadan önce DIM etmeniz ve ne uzunlukta olacağını önceden belirtmeniz gereklidir. Mesela şöyle: dim filename$ of 16

Gerçek ve tam sayı değişkenlerde bu işlem gerekli değildir. Bir diziyi programın herhangi bir yerinde DIM edebilirsiniz; fakat, netlik açısından, başlangıçta gruplandırılmaları yerinde olacaktır. Diziler, değişkenler ve array'ler genel (yani tüm PROC'lar için geçerli) olabileceği gibi, mevzi, yani yalnızca kapalı PROC'lar için geçerli de olabilir. Dizileri güçlü anahtar sözcük In'le arayabilirsiniz. Örneğin, name$ dizisinde “Jim” harflerinin bulunup bulunmadığını kontrol eder, bulunca da yalnızca dizinin bir bölümünün üstüne yazmak yoluyla onun yerine Jan'ı geçirebilirsiniz. Basic'te bir hayli karmaşık olan ve bir sürü kod byte'ı gerektiren bu iki işlem, Comal'de tek bir anahtar sözcükle gerçekleştirilebilmektedir. Benchmarklar gösteriyor ki, Comal dizi arama işleminde Basic'ten 79 kat daha hızlı. Comal 0.14, yerine getirmekte olduğu işleve bağlı olarak, Basic'le makine dili arasında bir hızla işlemekte. Comal 2.0'sa tüm operasyonlarda makine diline çok yakın bir hız gösteriyor. Çevresel gereçlerle uğraşmak Basic'in en tatsız işlerindendir. Comal bunun zorluklarını da büyük ölçüde azaltıyor. Disk sürücünün rehberini görmek için, CAT anahtar sözcüğüne başvuruyorsunuz. Rehber ekranda yavaş yavaş geçerken, hafızadaki program silinmiyor. Programları printer'da yazdırmak da kolay:

select “1p:” // printer'a CMD
kanalı aç
liste
Kanallar otomatik olarak açılıp'
kapanıyor.

List ve Edit

Comal programını ekranda dökümlediğinizde, satır numaraları görünür ve yapılar otomatik olarak içeriden yazılır. Edit anahtar sözcüğünde de durum buna benzer; fakat burada, satırları daha kolay düzeltebilmeniz için, yapılar içeriden yazılmamaktadır. Ekrandaki dökümleme işlemine ara vermek içinse, boşluk çubuğuna basmanız gerekir. List komutuyla her türlü cihaza program gönderebilirsiniz. Fakat diskte dökümlenmiş bir program çok yararlı olabilecektir. Sentaks Save komutundaki gibidir:

List “benim'programım,

Sonra da, Enter anahtar sözcüğünün aracılığıyla, BENİM'PROGRAMIM.L istendiğinde merge edilebilecek sıralı bir dosya olarak diske kaydedilir. Aynı şekilde, PROC'lar da dökümlenip gerektiğinde Enter edilebilmektedir. Bu da program geliştirme süresini kısaltır. Sık kullanılan PROC ya da FUNC'ları bir diskte depolayıp, sonra gerekenleri merge ederek bir program oluşturabilirsiniz. İstenirse, PROC'lar anahtar sözcük işlevi de görebilir. Comal 0.14, VAL ve STR$ dışında, yaygın olarak kullanılan bütün komutları içermektedir. Bu iki komut için de, onların yerine geçebilecek PROC'lar yazılmıştır ve gerekirse programa Merge edilmeleri mümkündür.

Comal'de programcı döngülerin içindeki değişken koşulları çeşitli yollardan test edebilir. Döngünün sonu Repeat-Until'le test edilir. IF-THEN-ELIF-ELSE-ENDIF ise çoklu koşulları test eder, fakat IF'le ENDIF arasında istediğiniz sayıda kod satırına yer verebilirsiniz. Case yapısı Basic'in ONX-GOTO'su gibidir. Yalnız, burada satır numaraları kullanılmaz ve sınırsız sayıda PROC çağrılabilir:

repeat
cevap$
anahtar$ //bir tuşa bas
until cevap$
“ax'de // a veya x'e
basıldığında geç
case cevap$
when “a”  // “a”ya basıldı
start'program
check'results
end
when “x”  // “x”e basıldı
print “Program Sonu”
end
endcase

Case tuşların değerlendirilmesini kolaylaştırmaktadır. Doğru tuşa basılmadıkça, Repeat-Until döngüsü durmayacaktır. Comal'de, mantık testleri yapmanıza olanak veren iki de sistem sabiti, Doğru ve Yanlış (True and False) yer alır. Comal fonksiyonu da tıpkı bir PROC gibi ele alır. Ne var ki, burada her FUNC (Basic'teki FN) çok satırlı bir denklem olabilir ve parametreler FUNC'a geçirilebilir. FUNC, değerleri çağıran satıra gönderir.