Bu sayfadaki yazılar
Sayfanın metni
Sayfa 15
Öğ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.
Klavyeyle gezinmek için ← ve → tuşları.
Sayfa 14
Expert Systems şirketinin yöneticisi Alex Prolog programlama dilinin kullanım değeri üzerine şunları söylüyor: “Yapay Zeka alanında yeni olan bir kişi, Prolog'dan başka bir şey kullandığı takdirde hataya düşmüş olur, çünkü Prolog'u kullanmak LISP'i kullanmaktan daha keyiflidir.'”” Bu bağlamda iki dil daha sözkonusu: VALID ve Occam. Tüm bu diller açısından, geleneksel programlama yönteminden bir sapma gözleniyor. Bu sapma özellikle Prolog'da çok belirgin. Geleneksel programlama dillerinin aksine, Prolog'da, program akışını yönetmesi gereken dil ögeleri (GOTO, FOR-NEXT vs.) hemen hemen hiç yok. Programcı bir algoritmayı kodlamıyor, bunun yerine betimlenecek sorun alanında geçerli olan olguları, ilişkileri ve kuralları veriyor. Uzman sistemler bağlamında şu da söylenebilir: Bilgi, tüm karşılıklı bağımlılıklarıyla ve ilişkileriyle biraraya getirilir. Turbo-Prolog'la yazılmış basit bir örnek:
domains kişiler, spor — simge predicates oynuyor (kişiler, spor) clauses
oynuyor (ahmet, futbol). oynuyor (Ayla, voleybol). oynuyor (Hasan, satranç). oynuyor (Aziz, tenis). oynuyor (Sacit, X) if oynuyor (Ha- san, X). Bu program, küçük bir grubun üye- leri olan insanların herbirinin hangi spor türlerini yaptıklarını veriyor. Programın birinci bölümünde (doma- ins), karşılaşılan sorunda rol oynayan objelerin adları ve hangi türde olduk- ları veriliyor. Örneğimizde hem kişi- ler hem de spor, simge türünde. Di-
ğer olası türler, örneğin, real ve integer. İkinci bölümde (predicates), ilişkilerin adları sayılıyor ve bunlara bağlı objelerin adları veriliyor. Örneğimizde kişiler ile spor arasında bir ilişki oluşturuyor. Böylece açıklama öbeği kapanıyor. Bundan sonra işlem kısmı geliyor. İşlem kısmında (clauses), önce dört olgu belirtiliyor. Beşinci işlem ise kafa (vargı)dan ve gövde (öncüller)den oluşuyor ve hüküm olarak adlandırılıyor. Bunda, Hasan tarafından yapılan her sporun, Sacit tarafından da yapıldığı belirtiliyor. “İf”” yerine çoğunlukla :-da olabiliyor ve bu “eğer” şeklinde okunabiliyor. Bir işlemin gövdesi çoğunlukla daha karmaşıktır ve mantıksal işlemcilerle birbirine bağlanan tekil literallerden oluşur. Burada “,” ve “;”” simgeleri, mantıksal VE ve mantıksal VEYA yerine kullanılır. Beşinci işlemde X değişkeni ortaya çıkıyor. Değişkenler, sabitlerin aksine daima büyük harfle yazılır. Sabitler, tekil kişiler veya kavramlar için kullanılırken, değişkenler farklı zaman noktalarında farklı kişilerin veya kavramların adlandırılması gerektiğinde kullanılır. Derlenmiş ve başlatılmış programa sorular yöneltilebilir. . Turbo- Prolog'da bu talep, ““Goal:-”” şeklinde iletilir. Program, örneğin ““oynuyor (Hasan, satranç).” girişini “true” (doğru) şeklinde cevaplar. ““Oynuyor (Ahmet, tenis).” girişi ise ““no solution” ifadesiyle cevaplanır, çünkü programdan Ahmet'in tenis oynadığını veya oynamadığını belirten bir şey çıkmamaktadır. Sacit'in satranç oynayıp oynamadığı sorusu da kolayca cevaplanamaz. Fakat üçüncü olgu ve programın sonundaki hüküm, sonuçta ifadesini doğururlar. Sorular, değişkenler de içerebilir. Örneğin “oynuyor (1, satranç) sorusu, “IT — Hasan I — Sacit 2 solutions” şeklinde cevaplanır. ““Grupta hangi spor türleri yapılıyor?” şeklinde bir soru sormak da mümkündür. Bu durumda, soruyu soran açısından kimin hangi sporu yapmakta olduğu önem taşımamaktadır. Prolog programına yöneltilen soru, anonim değişken olarak adlandırılan - simgesini içerir. Soru, oynuyor (-,S) şeklinde sorulur ve
“S — futbol S — voleybol S — satranç S — tenis
4 solutions” şeklinde cevaplanır.
Basit programlarda sonuçlar doğal olarak önceden görülebilir, ama karmaşık programlarda durum farklıdır. Prolog'un değerlendirme stratejisi ise hep aynı kalır. Her soru bir hipotez gibi kavranır. Tüm bilgi (olgular, ilişkiler, kurallar), Prolog tarafından, bu hipotezi kanıtlamaya yönelik bir kurallar), Prolog tarafından, bu hipotezi kanıtlamaya yönelik bir deneme ve yanılma yöntemine göre taranır. Bu tarama sırasında, her defasında ikişer Prolog yapısının, serbest değişkenlerin uygun biçimde bağlanmasıyla özdeşleştirilmesi denenir. Bu durum, “oynuyor (1, futbol)” ifadesinde gerçekleşir, çünkü I değişkeni Ahmet sabitine bağlanabilmektedir; fakat “oynuyor (Sacit, voleybol)” ifadesinde gerçekleşmez. Arama, çok zaman harcanmasına neden olabilen Backtracking yöntemiyle gerçekleşir. Fakat işlemlerin içinde uygun yerlere, eğer daha fazla arama gereksiz olacaksa, ! simgesiyle kesmeler konabilir. Prolog'un düşünme sistemi açısından belirleyici olan, programdaki işlemlerin sırasının önem taşımamasıdır. Bu sıra istendiği gibi değiştirilebilir ve programın çalışma tarzında hiçbir değişiklik olmaz. Prolog'da göndermelerin, giriş-, çıkış- ve diğer rutinlerin bulunması nedeniyle, bu dil, geleneksel dillerle çalışan programcılar tarafından başlangıçta çok özel bir dil olarak algılanacaktır. Prolog'da karşılaştıkları ve alışık olmadıkları düşünce tarzı, bu dil-
"le örneğin oyun programlamalarının imkansız olduğu kanısına kapılmalarına neden olacaktır. Halbuki piyasada giderek artan sayıda bulunan Prolog'la yazılmış oyun programları, bu kanının yersizliğini göstermektedir.