Yapay Zeka ve GAWK

0
FZ

Neden Yapay Zekâ için GAWK?

YZ programlama sınıfında kullandığımız programlama dilinin GAWK olduğunu duyan insanların çoğu epey şaşırıyor. Bunu anlayabiliyorum. Evet, GAWK kullanıyoruz. GAWK, Aho, Weinberger ve Kerninghan tarafından geliştirilmiş ve pek çok kişi tarafından programlama dili olarak bile kabul edilmeyen şu eski kalıp tanıma dilinin Gnu versiyonudur. PERL veya TCL örneklerinde olduğu gibi pek çok kişi bu dili "scripting dili" olarak ele alır. İçinde nesneler yoktur, fonksiyonel değildir, gömülü olarak mantık programlama öğelerini barındırmaz. İnsanların şaşkınlığı şunları duyunca tam bir kafa karışıklığına dönüşüyor: (a) her ne kadar öğrenciler projelerinde istedikleri dili kullanma hakkına sahip olsalar da; (b) sadece tek bir istisna hariç, en iyi sonuca ulaşan öğrenciler GAWK ile proje geliştirenler (not: söz konusu istisnanın sahibi PASCAL kullanmış olan bir programcı, kendisi şu anda NSF bursu ile Harvard'da matematik doktorası yapıyor.) C, C++ ve LISP programcıları GAWK ile çalışanların performanslarına yaklaşamadılar (PROLOG ve JAVA kullanarak proje yapan bir öğrencimiz çıkmadı henüz).

Neden GAWK?

Basit cevaplar genellikle lisans seviyesindeki programlama pragmatiği ile ilişkili. Biraz daha detaylı cevap arayanlar programlama paradigmalarına veya YZ dilleri tarihine göz atabilirler. Ve daha derin, felsefi cevaplar ise akıl yürütme ve sembolik YZ ile ilgili. Bence cevaplar, özellikle sonuncu kategorideki cevaplar YZ programlamada GAWK kullanımının etkin olduğunun gözlemlenmesinden çok daha şaşırtıcı.

Öncelikle şunu belirtmek istiyorum ki PERL programcıları da yapay zekâ projelerinin altından güzelce kalkıyorlar. GAWK'ın çekiciliği PERL içinde büyük oranda mevcut ve PERL'in popülaritesi GAWK'ın başarısının düşünülmesini biraz perdeliyor. Her ikisi de çok güçlü dizi-işleme dilleri ve UNIX ortamından sonuna dek faydalanması için programcıya gerekli araçları sunuyorlar. Her ikisi de çok çeşitli tipteki veri yapıları programcının kolayca başa çıkabilmesini sağlıyor. Her ikisi de derlenmek yerine yorumlanarak çalıştırıldıkları için geliştirme süresi bir hayli kısalabiliyor. Her ikisini de öğrenmek çok fazla vakit istemiyor. GAWK kılavuzu tek bir laboratuvar seansında okunabilir ve ortalama bir öğrenci bir iki gün içinde bu dilde ustalaşmaya başlayabilir. GAWK'ın otomatik olarak değişken ilklendirmesi, veri tiplerini birbirine dönüştürmesi, G/Ç desteği ve işaretçi (pointer) içermemesi gibi özellikleri pek çokgenç programcının yapabileceği hataları daha baştan engelliyor. C dilini gören ama ustalaşamamış olanlar ise GAWK dilindeki söz diziminin C dilindekini andırmasından memnunluk duyuyorlar. Bazı kişiler PERL'in fonksiyonalitesinin çok daha üstün olduğunu iddia edebilirler ancak hızlıca geliştirilmesi gereken YZ uygulamaları için ekstra fonksiyonalite çok da önemli değildir. Aslında PERL'in garip söz dizimi düzenli ifadeler (regular expressions) ve HTML, WWW adresleri veya kabuk (shell) komutları içeren karakter dizileri çoğalınca biraz daha garipleşir. PERL bir şeyleri yapmanın yeni yöntemlerini sunar ancak bu yeni şeyler yapmanın yöntemlerini sunduğu anlamına gelmez.

Sonuç olarak ufak tefek farklarla birlikte hem PERL hem de GAWK programcı zamanını minimize ederler. Her ikisi de programcının, programın çalışması esnasında ortaya çıkabilecek detaylı çalışma-zamanı hatalarına maruz kalmasını engeller.

Başlıktaki soruya verilebilecek başka basit cevaplar da vardır. Belki de en iyi bilineni lisans seviyesindeki YZ programlamada Internet'in öneminin giderek artıyor olması gerçeğidir. Oren Etzioni (University of Washington, Seattle) "softbot" kavramının makine mühendislerinin robot kavramına tekabül ettiğini ve YZ uygulamaları için en önemli test alanı haline geldiğini iddia etmektedir. Eğer davranışları zekice kontrol edilmesi gereken şey bir yazılım ajanı ise (software agent) bu durumda yazılım ortamını kontrol edecek şey de uygun bir dil olacaktır. Bu bir "scripting dili" demektir. Eğer robot KAREL ise o zaman doğru dil dil şöyle komutları içerecektir "turn left; turn right." Eğer robot Netscape ise o zaman doğru dil elan ile "netscape -remote 'openURL(http://cs.wustl.edu/~loui)'" gibi dizileri üretecektir.

Elbette daha derin cevaplar da mevcuttur. Jon Bentley, GAWK dilinde iki inci bulmuştur: düzenli ifadeler (regular expressions) ve çağrışımlı dizilier (associative arrays). GAWK, veri organizasyonu için dosya sisteminin, hata ayıklama ve diğer alt seviye fonksiyonlar içinse işletim sisteminin kullanılmasını ister programcıdan. Kullanıcı arabirimi diye bir mesele yoktur. Bu da programcıyı programın nasıl göründüğüne değil özüne yani ne yaptığına yöneltir. Mesela binsort diye bir şey programlamak yerine programcı bu işi sistemde standart olarak bulunan /bin/sort yazılımına havale eder ve bunun için vakit harcamaz (not: IBM'de çalışan dostum Ben Grosof'un Palo Alto ile ilgili tavsiyesi aklıma geldi: 101. mi yoksa 280. otoyol mu olduğunu boşver. Kuzeydeki bir giriş için güneye gitmen gerektiği durumunu dert etme. Tek yapman gereken bir an önce otoyola çıkabilmek.)

GAWK ile LISP arasında da bazı benzerlikler vardır ve bunlar aydınlatıcıdır. Her ikisi de güçlü ve tek tip bir veri yapısı sunar (GAWK örneğinde harman (hash) tablosu kullanılarak geliştirilmiş çağrışımlı diziler ve LISP örneğinde S-ifadesi veya listeleri içeren listeler). Her ikisi de kendi ortamlarında ciddi desteğe sahiptir (GAWK UNIX'in çocuğudur ve LISP de lisp makinalarının merkezinde yer alır). Her ikisinin de söz dizimi (syntax) basittir ve her ikisi de gücünü, basit parçaları bir araya getirerek karmaşık yapıları kurmaya çalışan programcının iradesinden alır.

Bütün bunlardan daha derinde yer alan şey ise YZ programlamanın doğasıdır. YZ işlevsellik ve keşfedici programlama mantalitesi üzerine kuruludur. Mesele aşağıdan yukarı (bottom-up) doğru tasarım yapmak ve daha karmaşık davranışları modellemektir. "Bu alt rutin cümleyi parçalarına ayırır" gibi düşük seviye eklemelerini gerçekleştiremeyeceğini gören ve yukarıdan-aşağı (top down) çalışan YZ programcısının işi zordur! Problemin yüksek seviyeli modeli yeniden düşünülüp elden geçirildiğinde, geliştirmiş olduğu veri yapısını heapsort için mükemelleştirmiş olan ama bunu çöpe atmak zorunda kalan programcının işi zordur.

YZ programlama yüksek seviyeli düşünmeyi gerektirir. Tabii ki yüksek seviyede düşünüp assembly dilinde yazabilen çok yetenekli programcılar her zaman olmuştur. Yine de çoğu kişi yüksek seviyede düşünebilmek için yüksek seviyeli ve soyut kavramlara ihtiyaç duyar.

Şimdi gelelim şaşırtıcı felsefi cevaplara. Öncelikle YZ disiplini kaba-kuvvet ile oluşturulan kombinasyon yöntemlerinin zeki davranışa yol açmakla birlikte genelde çözüme yol açmadığını gördü. Satranç, yapay sinir ağları ve genetik programlama kaba hesaplamanın limitlerini gösterir. Bunun alternatifi akıllıca program organizasyonudur (not: bazıları önceki YZ yaklaşımlarının çalıştığını ama kolayca göz ardı edildiğini söyleyebilirler: Bunlar genelde işe yarayan yaklaşımlardır ancak özelde değil çünkü akıllıca düzenleme dediğimiz şey zaten bir problem alanından diğerine değişen bir şeydir). Yani YZ programcılar programlarının içeriğini genişletmeye çalışırlar, yaklaşımlarını optimize etmeye değil. İstedikleri akıldır, bir yığın zeki gibi görünen böcek değil. Büyük arama uzaylarını tek tek saymak yerine arama yapabilecekleri alanı akıllıca daraltmaya çalışırlar, eldeki göreve uygun bilgi alanlarını kullanmak isterler. Sonuç olarak programcının erişmeye çalıştığı hedeflerde binbir spesifik kontrol sağlayan değil bu hedeflere ulaşmada programcının işini kolaylaştıran bir dildir YZ dili olarak aranan.

Yukarıdaki gerekçelere ek olarak: Mantıksal çıkarım dediğimiz şeynotasyonun açık olarak yazılmasından öte bir şey değildir. Elimizdeki YZ programının merkezindeki mantığın bulanık, probabilistik, deontik veya dedüktif olması mesele değildir. Mantık dediğimiz şey bir karakter dizisinden diğerine nasıl geçiş yapacağımızı tanıyan kurallardan ibarettir. Karakter dizileri ile işlem yaparken bize en geniş ve sağlam desteği sunan dil sonuç olarak mantık için de, değişik mantık dizgelerinin keşfedilmesi için de en iyi desteği sunar ve zaten pek çok durumda "çıkarım yapma" dediğimiz şey nihai olarak "mantık"tır. Bu da şunu getirir: YZ programcısını bir birleştirici yazmaktan kurtaran PROLOG (belki bir GAWK programcısının bunun için 20-25 satır kod yazması gerekir) bunu başka herhangi bir yaklaşımın mantığının ve sembolik temsilinin göz ardı edilmesi pahasına gerçekleştirir.

Bahsi geçen bu son iki noktanın sadece programlama camiası için değil aynı zamanda son 10 yılın deneyimlerinden pek de ders çıkarmayan YZ camiası için de haber değeri taşıdığını düşünüyorum.

Aho, Weinberger ve Kernighan tarafından en fazla bir grep veya bir sed kadar önemli olduğu düşünülen GAWK dilinde, ben, YZ eğilimleri, YZ tarihi ve YZ temelleri üstüne bazı dersler çıkarıyorum. Şaşırtıcı olmakla kalmayıp aynı zamanda ümit verici bulduğum bir başka nokta da şu ki benzer konuşmaları halen programlamaktan zevk alan YZ uzmanları ile yaptığımda dediklerimi hiç de şaşırtıcı bulmamakta ve doğal karşılamaktalar.

(c) 1996, Ronald P. Loui

R. Loui (loui@ai.wustl.edu), St. Louis'deki Washington Üniversitesi, Bilgisayar Bilimleri bölümünde profesör olarak çalışmaktadır. Katkıda bulunduğu yayınlar arasında: AI Journal, Computational Intelligence, ACM SIGART, AI Magazine, AI and Law, ACM Computing Surveys Symposium on AI, Cognitive Science, Minds and Machines, Journal of Philosophy gibi dergiler vardır.

===================================================================

Orjinalinden (izin alarak ;) tercüme eden: FZ

FZ'nin notu: FZ Gnu ile gönül bağı olmakla birlikte gene de Debian GNU/Linux ile standart olarak gelen mawk isimli awk uygulamasını tavsiye ediyor herkese.

Görüşler

0
FZ
Yapay zekâ ile alakası yok ama: awk gibi basit (!) bir scripting dili ile nasıl TETRIS yazılır merak edenler http://igor2.mcomp.hu/gpl/tetris.sh/ sayfasına baksınlar, hatta üşenmeyip kendi sistemlerine çeksinler ve çalıştırsınlar. Ben Debian GNU/Linux 3.0 ortamında denedim ve gözlerim yaşardı ;-)

Not: CYGWIN'de çalışmaz, bu CYGWIN'in problemi!
0
FZ
Yukarıdaki adresten beni haberdar eden sundance arkadaşıma da saygılarımı sunarım ;-)
0
FZ
Hem yukarıdaki yazı bağlamında hem de genel olarak FZ cümle aleme AWK (gawk, mawk, nawk artık elinizde hangi versiyonu var ise) programlama diline şöyle bir ciddi ciddi göz atmasını tavsiye ediyor. Hayır ben dinozor değilim :) Hayır, Perl'in yerini tutar da demiyorum. Evet, çok pratik ve ciddi ciddi iş yapabileceğiniz bir dil olduğunu iddia ediyorum (el atacağınız her tür UNIX ortamında da bulunması cabası). Hazır programlama dili anketi yapıyor iken bunları da belirteyim dedim.
Görüş belirtmek için giriş yapın...

İlgili Yazılar

Xynth 0.8.40 ve Java

darkhunter

Xynth surum 0.8.40'i yayınladik. Bu sürümde yeni özellik getirilmemesine rağmen birçok kücük hata düzeltildi ve alt yapı da iyileştirilme yapıldı, özellikle de server tarafında hızlanma sağlandı. Bununla birlikte, paketle birlikte gelen çeşitli kütüphane ve program patchleri de iyileştirildi. changelog'a buradan ulaşabilirsiniz.

Java(TM) 2 SDK, Standard Edition sürüm 1.4.0 çıktı

conan

En son Ocak sonunda Release Candidate (Sürüm adayı?) haberini gördüğüm J2SE`nin son sürümü olan 1.4.0 çıkmış. (Ya sessiz sedasız çıktı ya da sağırım :) Çıkış bildirisini buradan, dökümanlara buradan, yeni özelliklerine tam buradan, karar verdim indireceğim diyorsanız da buradan ulaşabilirsiniz. ;)

Vim 7 çıktı!

sundance

Unix camiasının en eski editörlerinden vi'ın steroidli hali, VİM'in 7.0 sürümü Bram Moolenar tarafından anons edildi.

Yeni özelliklerini görmek ve kullanmak istiyorsanız buradan indirebilirsiniz. Daha Amiga sürümü çıkmadı, Amiga'cılar bir zahmet Subversion'a.

Tabi bir de unutmadan; cat flames.txt > /dev/null

Xynth'i GP32X'e Taşıdık

anhanguera

Selam,

Dün şu çok ses getiren GP32X'den bir tane de ben aldım. Evet güzel bir oyuncak, ama Sony PSP ile kıyaslanamayacak kadar da amatör ;)

Ofis Yazılımlarımızı Yükseltelim Lütfen!

conan

Bu ay GNU/Linux dünyasında Ofis yazılımları ayı sanırım! Dün gnomedesktop.org GNOME Office 1.0 sürümünün çıkarıldığının haberini verdi. Bu Ofis sürümünün içindeki AbiWord de böylece 2.0 sürümüne ulaşmış oldu. GNOME Office içinde aynı zamanda GNOME-DB 1.0, Gnumeric 1.2.0 da bulunuyor.