BASIC Öğreniyoruz (4)
Retro bilgisayarBu noktaya kadar değişken kavramını ve değişken türlerini gördük. Ayrıca geçen sayımızda, sayısal değişkenlerin bilgisayar içinde nasıl depolandıklarını da gözden geçirdik. Ancak daha ilk baştan da söylediğimiz gibi, bilgisayar yalnızca sayısal değişkenler üzerinde aritmetik hesaplar yapmakla kalmaz; karakter zinciri dediğimiz türden “harfsayısal” (alphanumeric) değişkenleri kabul ederek, onlar üzerinde de işlem yapabilir. Sıralama, arşiv, database vb. programlarının çoğu bilgisayarın bu yeteneğinden yararlanmaktadır. Peki nasıl oluyor da, yalnızca 1 ve 0'ları tanıyabilen bu alet harfler, kelimeler ve cümleler üzerinde de böyle karmaşık işlemler yapabiliyor.
Konuya bir iki mantık ilkesini gözden geçirerek başlayacağız. Çünkü BASIC'in de temelinde klasik mantığın “Boole cebiri” diye anılan bir formelleştirilmesi yatmaktadır.
Mantığın Temeli: Karşılaştırma
Bütün mantıksal işlemlerin temelini verilerin karşılaştırılması oluşturur. Karşılaştırmanın sonucuna bağlı olarak hangi işlerin yapılacağına karar verilir. Örneğin ödemeleri hesaplayan bir programı ele alalım. Birçok başka program gibi, bu programın da ne zaman duracağını bilmesi gerekir. Bunu sağlamak için makineden gelen her kaydı (örneğin ödeme yapılacak kişilerin isimlerini) “SON” adlı bir veriyle karşılaştırması istenebilir. Karşılaştırmanın sonucu olumsuz ise program işlemesini sürdürecek, yok eğer olumlu ise belirli bir sinyali gönderdikten sonra duracaktır. Kimi bakımlardan mantıksal işlemler aritmetik işlemlere benzetilebilir. Bu benzerliği biraz daha ayrıntılı olarak gözden geçirelim. Herhangi bir aritmetik işlemde birbirinden farklı üç birimin varlığından söz edebiliriz:
— İşlenenler — İşlem işareti — İşlemin sonucu
Aritmetik işlemlerde işlenenler, hesaplamada kullandığımız sayılar, işlem işaretiyse, ne tür bir işlemin yapılacağını belirten simgedir. Sonuç ise bu işaretin gösterdiği işlem sayesinde işlenenlerden çıkarılan sayıdır.
Örneğin, 543-8 problemini ele alalım. Sonuç (8), işlenenlere (yani 5 ve 3'e) + (toplama) işleminin uygulanmasıyla bulunmuştur. | İşareti değiştirdiğimiz, örneğin +'yı | — yaptığımız takdirde, aynı işlenenler bu defa başka bir 10 tabanlı sayıyı, 2 sayısını vereceklerdi. Bu noktadan hareketle farklı işlem biçimlerini (toplama, çıkarma, çarpma, bölme gibi) farklı birleştirme kuralları olarak düşünebiliriz. Çünkü bu işlemler belirli bir sayılar grubuyla, yani işlenenlerle, başka bir sayılar grubunun, yani sonuçların nasıl bir ara-
Sprac+plgoponic niyoruz (4):
12 m Bx ya getirilebileceğini belirleyen kurallardır. İşte işlem işareti bu kuralı ifade eder.
Mantık İşlemleri
Buraya kadar mümkün bütün sayısal bilgilerin ve aralarındaki ilişkilerin bilgisayarda 2 tabanlı sayı sistemi ile temsil edildiğini gördük. Sayısal bilgilerin bu şekilde temsil edilebilmesini mümkün kılan, bilgisayarı oluşturan elektrik devrelerindeki sinyalin yüksek düzeyinin 1 rakamına, alçak düzeyinin ise 0 rakamına tekabül ediyormuşçasına yorumlanabilme imkânıdır. Fakat bilgisayar sadece sayısal bilgileri değil, diğer başka bazı cins bilgileri de işleyebilir. Tek şart bu bilgilerin elektrik sinyalleri tarafından temsil edilebilmesidir. İşte bu yüzden doğru ya da yanlış olabilecek bütün cümleler de, bilgisayar tarafından işlenebilir. Bu durumda, cümlenin doğru olma hali, elektrik sinyalinin yüksek düzeyine (ya da 2 tabanlı sayı sisteminde 1 rakamına), cümlenin yanlış olma hali ise, sinyalin alçak düzeyine (yani 2 tabanlı sayı sisteminde 0 rakamına) tekabül eder.
Peki, bilgisayar ya doğru ya da yanlış olabilecek cümleleri saklayabilir, diyoruz. Bu cümlelerle ilgili olarak daha fazla ne yapabilir? Birkaç cümleden çıkacak sonucun ne olabileceğini söyleyebilir mi? Doğruluğu ya da yanlışlığı kabul edilmiş bir dizi cümleden ne gibi sonuçların çıkarılabileceğini tespit edebilir mi? Bu soruyu cevaplandırabilmek için, cümlelere özgü birleştirme kurallarını gözden geçirmemiz lazım. Yani farklı cümleler üzerinde ne gibi işlemler yapılabileceğini bilmemiz lazım. İşte, 2 değerli, yani sadece doğru ya da yanlış olabilen cümlelerin tamamına Boole cebiri işlemleri ve bu işlemlerin birleştirme kuralını gösteren işaretlere de Boole cebiri işaretleri denir. Bilgisayar, sayısal olmayan bilgiler üzerinde işlem yaparken, bu işlemleri kullanır. Bu işlemlerin işareti genellikle işlemin İngilizce adından oluşur.
VE işlemi: AND
Örnek olarak iki cümle alalım: “Yağmur yağıyor” ve “Sokaklar ıslak”. Şimdi bu iki cümleyi “ve” kelimesi ile birleştirerek yeni bir cümle elde edebiliriz: “Yağmur yağıyor ve sokaklar ıslak”. Eğer ilk iki cümlemizin her ikisi de aynı anda doğruysa, o zaman “ve” işleminin sonucunda elde ettiğimiz cümle de doğrudur. Yok eğer, cümlelerden herhangi biri yahut her ikisi birden yanlışsa, o zaman bu cümlelerden hareketle “ve işlemi” sayesinde elde ettiğimiz sonuç cümlesi de yanlıştır. O halde ve işleminin mümkün sonuçlarını aşağıdaki gibi bir tabloyla gösterebiliriz:
Yağmur yağıyor — Sokaklar ıslak
<ox<Uu
Yağmur yağıyor ve sokaklar ıslak
Bu şekilde herhangi bir Boole cebiri işleminin olası sonuçlarını gösteren tablolara “doğruluk değerleri tabloları” denir. Dikkat edilirse, yukarıdaki doğruluk değerleri tablosunda gösterilen sonuçlar kullandığımız cümlelerin içeriklerinden, yani anlamlarından tamamen bağımsızdırlar. Sonuçlar bakımından önemli olan, cümlelerin ne anlama geldiği değil, sadece doğru olup olmadıklarıdır. Bu sebepten ötürü, herhangi bir işlemin olası sonuçlarını belirtirken, her cümle çifti için ayrı bir doğruluk değeri tablosu çizmemiz gerekmez. Doğru ya da yanlış olabilecek bütün cümle çiftleri “ve” işlemi ile birbirlerine bağlandıklarında aynı sonuçları verirler. Bu yüzden her bir Boole cebiri işlemi için tek bir doğruluk değerleri tablosu yazmamız yeterlidir.
VE işlemi ile birbirine bağlayacağımız iki cümleden birincisini A, ikincisini B ile gösterelim. Ayrıca “doğru” değerini 1, “yanlış” değerini ise 0'la gösterelim. Son olarak Boole cebiri işlemlerinin genellikle söz konusu işlemin İngilizce adı ile gösterildiğini de hatırlayalım. Bu takdirde, ve işleminin doğruluk değerleri tablosunu 2 tabanlı sayı sisteminin sembollerini kullanarak aşağıdaki şekilde yazabiliriz:
A B A AND B 1 1 1 1 0 0 0 1 0 0 0 0
Doğruluk değerleri tablosunun bu şekilde yazılması, bize matematiksel işlemlerle Boole işlemleri arasındaki ilişkiyi görme olanağını da veriyor. Şöyle ki, aşağıdaki birinci örnekte 1 rakamları sayısal birer değeri ifade etmektedir. İkinci örnekte ise aynı rakamlar, bir ve işlemi ile birleştirilen iki cümlenin doğruluk değerlerini ifade etmektedirler.
Commodore 64'ün Can Simidi
1+1=10 (10 sembolünün 2 tabanlı sistemde 10 tabanlı 2 sayısını ifade ettiğini hatırlatalım). 1 and 1=1
VEYA İşlemi: OR
Bir önceki örnekte gördüğümüz iki cümleyi “ve” kelimesi ile birleştirebileceğimiz gibi “veya” kelimesi ile de birleştirebiliriz: “Yağmur yağıyor veya sokaklar ıslak”. Ancak gündelik dilde kullanılan “veya” kelimesi ile bir Boole cebiri işlemi olan “veya” arasında önemli bazı farklar vardır. Şöyle ki, gündelik dilde kullanılan “veya” genellikle “ya biri ya öteki ama ikisi birden değil” anlamına gelir. Dolayısıyla, cümlelerden her ikisinin birden doğru olması halinde, gündelik dilde bu cümlelerin “veya” kelimesi ile birleştirilmesinden elde edilen cümle yanlış olur (Bu bakımdan gündelik dildeki “veya” kelimesi, Boole cebirindeki dar veya işlemine tekabül eder. Bkz. bir sonraki bölüm). Halbuki Boole cebirinin OR kelimesi ile gösterilen “veya” işleminde, cümlelerden herhangi birinin ya da ikisinin birden doğru olması sonuç cümlesinin doğru olmasına yeter. O halde veya işleminin doğruluk değerleri tablosunu şöyle yazabiliriz:
A B A OR B 1 1 1 1 0 1 0 1 1 0 0 0 DAR VEYA İŞLEMİ: XOR
Daha önce de belirttiğimiz gibi Boole cebirindeki “dar veya” işlemi, aynen gündelik dildeki “veya” kelimesi gibidir. Yani “dar veya” işlemi ile birleştirilmiş iki cümleden müteşekkil cümle, bileşenlerinden ancak bir tanesi doğru ise doğrudur. O halde doğruluk değerleri tablosunu şöyle:
A B A XOR B 1 1 0 1 0 1 0 1 1 0 0 0
Daha sonra da göreceğimiz gibi birçok bilgisayar dilinde cümleleri “dar veya” işlemi ile birleştirme imkânı öngörülmemiştir. Ancak bu büyük bir problem çıkarmaz. Çünkü “dar veya” işlemi ile elde etmek istediğimiz sonucu diğer işlemleri birleştirerek elde edebiliriz. Bunun nasıl yapılabileceğini görmek için, bir Boole cebiri işlemi daha öğrenmemiz gerekiyor.
DEĞİL İşlemi: NOT
Diğer işlemlerin aksine, “değil” işlemi iki ya da daha fazla cümleyi birleştirmez, tek bir cümlenin doğruluk değerini tersine çevirir ya da zıtlar. Yani cümle doğru ise, kendisine “değil” işlemi uygulandığında sonuç yanlış olur, yok eğer cümle yanlışsa, değil işleminin sonucu doğru olur:
A NOT A 1 0 0 1
Karmaşık İşlemler
Şimdiye kadar ihtiyacımız olan bütün Boole cebiri işlemlerini gördük. Ama bunlar basit işlemlerdi. Yani iki temel bilgi alıp bunlar üzerine tek bir işlem uygulamakla yetiniyorduk. Ama aynen matematikte olduğu gibi Boole cebirinde de, kimi işlemlerin sonuçlarına yeni işlemler uygulayarak, işlemlerimizi karmaşıklaştırabiliriz. Ama yine aynen matematikte olduğu gibi burada da parantezlerin rolü çok mühimdir. Mesela şu iki karmaşık işlemi karşılaştıralım:
A B C 1 1 1 1 1 0 1 0 0 1 0 1 1 1 0 1 0 0 0 1 0 0 (A OR B) AND C (A OR (B AND C)) 1 1 0 1 0 1 1 1 1 1 1 0 0 0 0
Görüldüğü gibi, parantezlerin nasıl yerleştirildiğine bağlı olarak, işlemler çok farklı sonuçlar veriyor. Çünkü birinci durumda, önce A ve B cümleleri “veya” işlemi ile birleştiriliyor (A OR B), daha sonra bu işlemin sonucu sanki tek bir cümleymişçesine muamele görüyor ve “ve” işlemi ile C cümlesi ile birleştiriliyor ((A OR B) AND C), ikinci örnekte ise önce B ve C cümleleri “ve” işlemi ile birleştirilerek (B AND C) tek bir cümleye dönüştürülüyor. Sonra bu tek cümle gibi yorumlanan sonuç “veya” işlemiyle A cümlesi ile birleştiriliyor (A OR (B AND C)). Şimdi daha karmaşık bir örneği gözden geçirelim. Biraz önce, “dış veya” -XOR- işlemini görecek bir komutun birçok bilgisayar dilinde bulunmadığını, ancak bu işlemin vereceği sonucun, diğer işlemlerin birleştirilmesiyle elde edilebileceğini söylemiştik. Hatırlanacağı gibi XOR işleminin doğruluk değerleri tablosu şöyleydi:
A B A XOR B 1 1 0 0 1 1 1 0 1 0 0 0
Sonuç olarak aynı doğruluk değerleri dizisini şu işlem de verebilir: (A OR B) AND NOT (A AND B). Önce bunun gerçekten böyle olup olmadığını, söz konusu işlemin gerçekten XOR işlemiyle aynı sonucu verip vermediğini sınayalım:
A B A OR B 1 1 1 0 1 0 1 1 0 0 0 0 A AND B NOT (A AND B) 1 0 1 0 1 0
(A OR B) AND NOT (A AND B) 0
Görüldüğü gibi bileşenlerin doğruluk değerleri aynı olduğunda, (A OR B) AND NOT (A AND B) işleminin sonuçlarıyla, A XOR B işlemlerinin sonuçlarının da doğruluk değerleri aynı oluyor. Dolayısıyla bir işlemin yerine ötekini kullanabiliriz. İki işlem arasındaki özdeşliği yaklaşık bir Türkçe'ye çevirdiğimizde de görebiliriz: A veya B doğru olacak ama (ve) hem A hem B doğru olmayacak. 0