VİRÜSLER 

Virüs, bilgisayar programlarını istem dışı olarak etkileyen ve programların yapması gereken asıl fonksiyonlarını hiç yaptırmayan, kısıtlayan veya yanlış işlemler yaptıran yazılımlardır. Özellikle internet kullanımının yaygınlaşması, bilgisayarlar arasında sürekli bir bağın olması (ağ) virüslerin yayılmasını hızlandırmıştır. Her gün yeni birtakım virüs ortaya çıkmakta ve hızla yayılmaktadır. Virüsler genellikle assembler programlama dili ile hazırlanmış ve kapasiteleri 1 byte ile 3 KB arasındadır. 

Virüslerin aktif hale geçebilmeleri için çalıştırılabilen (EXE – COM uzantılı gibi) programlara bulaşması gerekir. Virüs bulaşan bir program çalıştırıldığında, virüs belleğe taşınır ve bellekte bulunan virüs bulunduğu sürece COMMAND.COM kütüğüne bulaşmayı ilk hedef olarak görür. Virüs bir kez bu kütüğe yerleştikten sonra sistemin her açılışında kendini belleğe yüklemekte ve çalıştırılan her programa bulaşmaktadır. 

 

Virüsler, EXE, COM, SYS, PRG, OVL, OBJ, LIB uzantılı dosyalara ve boot sektöre bulaşabilir. Bomba kısmı ise çalışmak için uygun şartların çalışmasını bekler. Buradaki uygun şart herhangi bir şey olabilir. Zamana bağlı şartlar olabileceği gibi sistemde VGA monitörün bulunması, hard diskin kapasitesi, ülke kodu gibi çok değişik şartlarda gözlenebilir. Bu tamamen virüs yazarının isteğine kalmış bir olaydır. Uygun şartlar oluşmazsa virüs sadece yayılmaya devam eder. Uygun şartlar oluştuğunda ise bomba kısmı çalışmaya başlar. Bomba kısmı sisteme zarar verebileceği gibi ekrana basit bir mesaj yazabilir veya sadece kullanıcıya şaka yapmak amacı ile zararsız etkiler yapabilir. 

Çoğu kişi sisteminde önemli şeyler barındırmaz, eğer sisteminizi ticari amaçlar dışında kullanıyorsanız virüs tüm hard diskinizi silmiş olsa bile fazla zarara uğramanız pek mümkün değildir. Büyük ihtimalle kaybettiğiniz programları çevrenizden bulmanız mümkündür. Fakat sisteminiz ticari amaçla kullanılıyorsa veya bir firmanın kullanımında ise maddi manevi zarar oldukça büyük olacaktır. Artı olarak bu tip bilgilerin yedeklenmediğini düşünün bu durumda problemin boyutları daha da büyüyecektir. Virüslerden korunmak için harcayacağınız emek ve zamanı bu kritere göre belirleyiniz. 

Kendinizin ve diğer kullanıcıların teknik seviyesi ve tecrübesi ne kadardır? Bazı tecrübeli kullanıcılar yedek aldıktan sonra bir şeyden şüphelenmedikçe virüslere karşı tedbir mahiyetinde hiçbir korunma işlemi yapmaya gerek duymazlar. Gerektiğinde virüsü disassambly edip anti virüsünü yazacak kadar tecrübeli kullanıcılar bulunmaktadır. Buna karşılık oldukça tecrübesiz kullanıcılarda vardır.  

Her ortamda virüs bulaşma ihtimali vardır. 1998 sensinde Novel firması 3800 adet virüslü disketi müşterilerine gönderdiyse, IBM ve NASA’nın bilgisayarları virüsten zarar gördüyse, 50 senelik tecrübeye sahip olsanız bile sisteminize virüs bulaşma ihtimali bulunmaktadır. PTT veya su idaresinin bilgisayarlarına girebilecek bir bilgisayar virüsünün aboneler ile ilgili kayıtları bozması sonucu 3-4 milyar telefon faturasını görerek hayatında bilgisayar kullanmamış olsa bile virüslerden zarar görmüş olur. 

 

Virüslerin yapısı 

Virüslerin yapısı temel olarak 3 kısımda incelenir. Bunlar sırası ile kopya üreticisi, gizleyici ve bomba kısımlarıdır. 

Kopya üretici: Bu bölüm virüsün yayılmasını,kendisini bir programdan diğerine kopyalamasını yani kısacası üremeyi sağlarlar. Virüslerin VİRÜS ismini alması temelde bu kısmın gerçekleştirmiş olduğu işlevden gelmektedir. 

 

Gizleyici: Virüsün fark edilmemesi için gereken işlemleri yerine getirir. Bu bir tür savunma mekanizmasıdır. Virüs yazarlarının antivirüslere karşı geliştirdikleri teknikler sonucu ortaya çıkmıştır. Amacı antivirüslerin ve kullanıcıların kendilerini tespit etmesini, antivirüslerin bilgisayar üzerinde çalışır durumda iken etkisiz hale getirilmesini sağlamaktır. 

 

Bomba: Bu bölüm virüs içerisinde yazarın istekleri doğrultusunda şartlar gerçekleştiğinde yapılması gereken olayı icra eden kısımdır. Virüs yazarının durumuna göre basit bir şaka veya korkunç bir HDD formatı olabilir. 

 

Virüslerin yazılma metodları

         Virüsler tip ayrımının yanı sıra, iki farklı metodla yazılabilir. 

1.       Nonresident virüsler (Run – time virüsler)

2.       Resident virüsler 

bütün virüsler temelde iki farklı şekilde çalışırlar. Bu ayırım virüslerin kendisinden değil DOS ortamında çalışan programlara sağlamış olduğu imkanlardan kaynaklanır. İyi bir virüsün yazılabilmesi ancak resident biçimi ile mümkündür. Bu gruptaki virüsler ileri teknikler kullanırlar. 

 

Nonresident virüsler

Nonresident virüsler ister DOSYA virüsü olsun ister BOOT sektör virüsü olsun bulaşma işini, kendileri aktif oldukları anda ilk buldukları diğer hedef bulaşma alanlarına kendilerini bir veya birden fazla kopyalayıp daha sonra kontrolü ana programa, boot sektör virüsü ise işletim sistemine bırakan virüslerdir. Bu tip virüsler için bir sonraki bulaşma işlemini, aynı şekilde yani tekrar çalıştıklarında gerçekleştirirler. Kısacası bu virüslerin yayılabilmesi için muhakkak bulaşılmış bir dosyanın çalıştırılması gerekmektedir. Aynı durum boot sektör virüsleri de geçerlidir. Nonresident virüsler zor fark edilirler çünkü sadece program çalıştırıldığında aktif hale gelip, yapmaları gerekeni yaptıktan sonra kontrolü ana programa vererek devre dışı kalırlar. Hafıza haritalarında gözükmezler. Bu nedenle fark edilmeleri oldukça zordur. 

 

Resident Virüsler

   Resident virüslerin nonresident virüslerden tek farkı adından da anlaşılacağı gibi hafızada sürekli çalışır durumda olmalarıdır Bu tip virüsler hafızada aktif halde bekleyerek kesmeler vasıtası ile bulaşma işlemini gerçekleştirirler. 

Virüs Tipleri  

Virüsler üzerinde yazılmış oldukları bilgisayar sitemlerine göre şekil alırlar. Üzerinde çalışılan donanım ve sistem programı virüslerin tipleri üzerinde belirleyici olarak etkin rol oynarlar. 

Worms (Solucanlar): Adını aldıkları canlılara benzeyen bu virüsler, girdikleri bilgisayar sistemimde birtakım ‘delikler’ açar. Kendilerini kopyalama özelliğine sahiptirler. İnternet yada yerel ağ üzerinde bilgisayardan bilgisayara yayılırlar. Bazıları zararsızdır ancak sistemde yer kaplar ve bilgisayarı yavaşlatırlar. Bazıları ise zararlıdır ve bilgisayara zarar verir. 

Trojan Virüsleri: Bu virüsler kendilerini kopyalayıp çoğalmazlar. Bilgisayara girdiklerinde kendisini özellikle gönderen kişinin buyruğuna girer ve ona hizmet ederler. Eğer bu hizmet kötü niyetli bir kişiye yapılıyorsa bu kişinin keyfiyetine bağlı olarak bilgisayarınızdaki bilgileri kaybedebilir, istemediğiniz bilgilerin bilgisayarınıza girmesini sağlayabilir, gizli dosyalarınıza ulaşabilir,modem yada hard diskiniz bozulabilir. 

Makro Virüsleri: Word Excel gibi makro kullanımına olanak sağlayan programların dosyalarına bulaşan virüslerdir. Bunlar Word yada Excel kullanarak hazırladığınız belgeye yerleşir ve bu belgeye her girişte aktif hale geçer.

Boot Virüsleri: Disketlerin ‘boot sector’ veya sabit disklerin ‘master boot sector’ diye isimlendirilen ilk sektörlerine sıçrarlar ve çoğalarak diğer bilgisayarlara disketler, e.mail gibi yöntemlerle bulaşır ve yayılırlar. Bulunması ve temizlenmesi en kolay virüslerdir çünkü yerleri bellidir. 

Dosya Virüsleri: Com, Exe gibi çalışabilir dosyalara bulaşırlar ve bu dosyalardan diğer dosyalara sıçrarlar. Ne kadar dosyaya sıçradıklarına bağlı olarak dosyanın boyutunu arttırırlar. Dosyaya bulaşan virüs yazılımı dosyanın sonunda bazende ortasında olabilir. Bu virüsler hafızada kalabilme özelliğine sahiptirler. 

Polimorfik Virüsler: Sürekli olarak kendini değiştiren virüslerdir. Bulunması ve temizlenmesi farklı teknoloji gerektiren bir virüs türüdür.  

Hoaxlar: Hoaxlar virüs olduğu söylenen fakat aslında virüs olmayan aldatmacalardır. Bunlar sadece kullanıcılarda panik yaratmak için hazırlanmış olabileceği gibi daha sonradan yazılacak bir virüsün etkisini artırmak amacıyla da hazırlanmış olabilir. 

 

Antivirüs Programları        

Antivirüs programlarının işleyişini genel olarak 3 ana gruba ayırmak mümkündür. Bunları tespit etme, tanımlama ve temizlemedir.

         Her virüs belli bir uzunlukta makine kodu yığınından oluşur. Bu kodlar her virüs için değişiktir ve virüsler bir dosyaya bulaştıklarında bu kodlar bulaşılan dosya üzerine yazılmış olur. Antivirüs programlarının ise virüslerin %95 oranındaki büyük bir bölümü için kullandığı teknik son derece basittir. Virüs üzerinde yapılan inceleme sonucu virüsün her kopyasında sabit kalan mümkün olduğunca uzun(yanlış alarma düşme ihtimalini azaltmak için) kod dizimini aramaktır. Bu şekilde binlerce virüsün imzası bir dosyada toplanır. Daha sonra virüs taraması yapılacak her dosyada bu binlerce imzanın her biri aranır. İmza bulunduğu takdirde dosyaya virüs bulaşmış demektir. Bunlardan sonraki aşama temizleme kısmıdır. Bilinen klasik tarzda yazılmış virüslerin hepsi bu metotla temizlenebilmektedir. Bu metodun dezavantajı yeni çıkan virüslere karşı etkisiz olmasıdır. Bundan dolayı antivirüs programlarının sık sık update edilmesi gerekir.

         Başka bir antivirüs tekniğinde aşılama tekniğidir. Bu teknik virüslerin çalışabilir dosyalara bulaşmak için kullandığı tekniği kullanır. Fakat bu defa bulaşan virüs değil virüsün bulaştığını fark edebilecek bir kod bölümünü programa eklemekten ibarettir. Eklenen bu kod, program her çalıştığında kendi kendisini kontrol etmesini ve temizlemesini sağlar. Aşılama tekniğinde çalışabilir her dosyaya bu program parçasının bulaşması sağlanır.

Virüsün Bulaştığına Dair Şüphe Edilecek Durumlar: 

 

  1. Bazı virüsler bilgisayar üstünde bulunan tüm sürücüleri bulaşılacak dosya bulmak için tarar. Örneğin disketten çalıştırdığınız bir program harddisk üzerinde hiçbir işlem yapılmasına gerek yokken , harddisk’e erişim gerçekleştiriyorsa bunu büyük ihtimalle virüs yapmaktadır. 
  2. Antivirüs programları veya kontrol dosyaları siliniyorsa , yanlışlıkla kendiniz silmediyseniz bunu yapan büyük ihtimalle virüstür.
  3. RAM belleğinizin miktarı belirgin olmayan bir şekilde azalmış ise hafızada bir virüs aktif halde olabilir.
  4. Harddisk’inizin çalışma hızının sebepsiz yere düşmesinde virüslerden kaynaklanıyor olabilir.
  5. Eğer bilgisayarınızın ve programlarınızın çalışma hızı beklenmedik bir şekilde düştü ise resident bir virüsün hafızada aktif olması ihtimali oldukça yüksektir.

 

Virüsün Bilgisayara Bulaşabilme Yolları:  

 

  1. Temiz olduğuna emin olamadığınız disketlerden 
  2. Bir program yüklemek amacı ile kullandığınız CD’lerden.
  3. E-maillerden ve e-mail yolu ile alınmış dosyalardan.
  4. Çeşitli karşılıklı görüşme programları (Mirc, Icq) ve bunlar aracılığı ile alınan dosyalardan.
  5. Ağ komşularından bağlı olduğunuz virüslü bir bilgisayardan (ağ paylaşımı açık olduğu durumlarda)

 

Virüslerden Korunma yolları 

  • İyi bir antivirüs programı yüklenmesi ve bunun düzenli bir şekilde update edilmesi.
  • Kullandığımız bilgisayarlarda gelişigüzel her disketin kullanılmaması.
  • İşimize yaracağını kesin olarak bilmediğimiz, güvenilir olmayan kişilerden alınan cd’lerin kullanılmaması ve bunlardaki programların yüklenmemesi.
  • Tanımadığımız kişilerden gelen e-mailleri gerekirse hiç açmamak, özellikle sonu exe olan dosyalar karşı temkinli davranmak.
  • Ağ paylaşımlarına hiçbir zaman tam paylaşım vermemek, paylaşım verilmesi gerekiyorsa parolaya bağlı paylaşıma verilmesi. 

 

Notlar: 

  •  Virüsler kendiliğinden oluşmaz. Bir programcı tarafından yazılması gerekir.
  •  İyi niyetli virüslerde vardır.
  • Virüsler, bir disket yada program makinede çalıştırılmadığı sürece bulaşmaz.
  • Disketten bilgi okunması virüs bulaştırmaz.
  • Protect (koruma) yuvası kapalı olan disketin virüs bulaştırma olasılığı daha azdır.
  • Virüsler, veri (data) dosyalarına bulaşmazlar.

 HACKER’LIĞIN KISA TARİHÇESİ

1969 Öncesi. Önce bir telefon şirketi vardı: Bell Telephone. Ve zamane hacker’ları. Tabii, 1878’de onlara hacker denmiyordu henüz. Telefon santrallerine operatör olarak alınmış, onun telefonunu buna, bununkini ona bağlayan şakacı birkaç genç delikanlı.

Artık telefon santrallerinde neden bayan operatörler tercih edildiğini anlıyorsunuz!

Şimdi, 1960’larda ortaya çıkan gerçek bilgisayar hacker’larına gelelim. ABD’nin dahiler çıkaran ünlü üniversitesi MIT’de (Massachusetts Institute of Technology) bilgisayarlar kullanılmaya başlandığında, bazı öğrenci ve asistanlar, bu makinelerin nasıl çalıştığını çok merak ettiler, bu yeni teknoloji hakkında ne varsa öğrenmeye çalıştılar. O günlerde bilgisayarlar, ısı kontrollü cam odalarda kilitli olan devasa makinalardı.

Bu ağır metal yığınlarını çalıştırmak binlerce dolara mal oluyordu. Programcılar bu dinozorları pek de kolay kullanamıyordu. Bu yüzden, zeki olanlar, hesaplama işlemlerini daha çabuk yapabilmek için “hack” dedikleri programlama kısayolları yarattılar. Bazen bu kısayollar orijinal programdan daha iyi tasarlanmış oluyordu.

Belki de bütün zamanların en iyi hack’lerinden biri, 1969’da, Bell laboratuarlarındaki iki çalışanın, Dennis Ritchie ve Ken Thompson’un bilgisayarların artık açık kurallarla çalıştırılması gerektiğini düşünmesiyle yaratıldı. İkili, geliştirdikleri bu yeni standart işletim sistemine UNIX ismini verdiler.

l 1970-1979. 1970’lerde siber cephe alabildiğine açıldı. Bu işle ilgilenen herkes, kablolarla bağlanmış bir dünyanın nasıl çalıştığını araştırmaya ve bulmaya çalışıyordu. 1971’de, John Draper isimli bir Vietnam gazisi, Cap’n’Crunch (mısır gevreği markası) kutusundan çıkan promosyon düdüklerin 2600 MHz tonda ses çıkarttığını fark etti. Bedava telefon görüşmesi yapmak için düdüğü telefonun alıcısına üflemek yeterliydi.

O zamanın hacker’ları, “phreaking” adı verilen bu tür yöntemlerin kimseyi incitmediğini, telefon hizmetinin sınırsız bir kaynak olduğunu ileri sürüyorlardı. Hackerlar dünyasında tek eksik sanal bir kulüp binası idi. Dünyanın en iyi hacker’ları nasıl tanışacaklardı? 1978 de, Chicago’lu iki genç, Randy Seuss ve Ward Christiansen, ilk kişisel BBS’i (Bulletin Board System – İlan Tahtası Sistemi) kurdular. BBS’ler günümüzde halen çalışıyor.

l 1980-1986. Bildiğiniz gibi IBM firması, 1981’de bağımsız işlemcisi, yazılımı, belleği ve depolama birimleri olan yeni bir bilgisayarı duyurdu. Bu modele PC (Personal Computer-Kişisel bilgisayar) adını verdiler. Bu makinelerden biriyle istediğinizi yapabilirdiniz. Gençlerin Chevrolet’lerini bırakıp PC’lere, “Commie 64” (Commodore64) ve “Trash-80”lere (TRS80-Tandy) düştükleri zamanlardı bunlar.

1983 yılında çevrilen War Games (Savaş Oyunları) adlı film, hacker’lığı farklı bir cepheden ele aldı: Bu film izleyicileri hacker’ların her bilgisayar sistemine girebileceği konusunda uyarıyordu. Ama alttan alta, hacker’ların çevresinde hep güzel kızların olduğu mesajı da alınıyordu.

Her geçen gün daha fazla kişi online dünya ile tanışıyordu. Askeri amaçlarla kurulan, sonradan üniversiteler arasında bir ağ haline gelen ARPANET, artık Internet’e dönüşüyordu; BBS’lere karşı tam bir ilgi patlaması yaşanıyordu. Milwaukee’de kendilerine The 414’s diyen bir hacker grubu, Los Alamos Laboratuarlarından Manhattan’daki Sloan-Kettering Kanser Merkezi’ne kadar değişen pek çok kurumun sistemine girdiler. Artık polisin işe karışma zamanı gelmişti!

l Büyük Hacker Savaşı. 1984’e, kendine Lex Luthor adını veren bir kişi Legion Of Doom (LOD – Kıyamet Lejyonu) adlı hacker grubunu kurdu. Adını bir çizgi filmden alan LOD, en iyi hackerlara sahip siber-çete olarak ün saldı. Ta ki grubun en parlak üyelerinden Phiber Optik isimli gencin, grubun bir diğer üyesi Erik Bloodaxe ile kavga edip kulüpten atılmasına kadar. Phiber’in arkadaşları rakip bir grup kurdular: Masters Of Deception (MOD). 1990’den itibaren, LOD ve MOD, iki yıl boyunca online savaşlar sürdürdüler, telefon hatlarını kilitlediler, telefon görüşmelerini dinlediler, birbirlerinin özel bilgisayarlarına girdiler. Sonra Federaller (FBI) olaya el attı, Phiber ve arkadaşları tutuklandı. Bu olay, bir dönemin sonunun geldiğini haber veriyordu.

l Yasaklar (1986-1994). Devlet de online olunca, eğlence bitti. Kongre, ciddi olduklarını göstermek için, 1986’da Federal Computer Fraud and Abuse Act (Federal Bilgisayar Sahtekarlığı ve Kötüye Kullanma) adı altında bir yasa çıkardı. Bu boyutta hacker’lık ağır bir suç oldu!

1988’de Robert Morris Internet worm (Internet solucan’ı) adını verdiği bir hack yöntemi ile ortaya çıktı. Net’e bağlı 6000 bilgisayarı göçerterek, yeni yasayla yargılanan ilk kişi olma şerefine erişti. Sonuç: 10.000 dolar para cezası ve çok fazla saat toplum hizmeti.

Bir süre sonra, tutuklananları saymak için parmaklar yetmemeye başladı. Aynı yıl Condor takma adıyla tanınan ünlü hacker Kevin Mitnick, Digital Equipment Company şirketinin bilgisayar ağına girdi. Yakalandı ve 1 yıl hapis cezasına mahkum oldu. Sonra adaşı Kevin Poulsen telefon hatlarına girmekle suçlandı. Kevin hemen ortadan kaybolarak adaletin uzun kolundan 17 ay boyunca saklandı.

Sundevil Operasyonu, ABD hükümetinin ülkedeki tüm hacker’ları (LOD dahil) ele geçirmek için 1990’da başlattığı bir operasyondur. Bu girişim bir işe yaramadı; ancak bir yıl sonraki Credux operasyonun MOD’ın 4 üyesinin hapisle cezalandırılmasıyla sonuçlandı. Phiber Optik federal hapishanede bir yıl geçirdi.

l 1994’den Bugüne. 1994 yazında, Rus mafyasının eline düştüğü ileri sürülen Vladimir Levin adlı bir genç, Citibank’ın bilgisayarlarına girerek müşterilerin hesaplarından, bir söylentiye göre 10 milyon dolardan fazla parayı (resmi açıklamaya göre 2.5 milyon dolar) İsrail’deki banka hesaplarına transfer etti. Levin, 95 yılında Interpol tarafından Heatrow Havaalanında tutuklandı; Citibank yaklaşık 400.000 dolar haricinde tüm parasını geri aldı. Hackerların art arda tutuklanması siber ortamda ani bir dolandırıcılık azalmasına neden oldu.

Bazı insanlar önceki hatalarından ders almadılar tabii. 1995 Şubatında Kevin Mitnick tekrar tutuklandı. Bu sefer FBI onu 20 bin kredi kartı çalmakla suçladı. Daha sonra çalınmış cep telefonu numaralarını kullanması nedeniyle dava açıldı. Davası 1999 Ocak ayında görülecek olmasına karşın, mahkeme onu kefaletle serbest bırakmama kararı aldı ve hapisteyken lehine delil toplamak için olsa bile bilgisayar kullanmasını yasakladı. Kevin Mitnick serbest kaldığında bile büyük olasılıkla göz altında tutularak bilgisayarlara erişimi engellenecek.

Mitnick’in zincirlerle götürüldüğünü devlet televizyonunda görmek, online kanunsuzlarına karşı toplumun sempatisini azalttı. Net kullanıcıları “password sniffer” gibi araçlar kullanarak özel bilgilere sızan veya “spoofing” gibi bir makineyi kandırarak hacker’a giriş izni veren araçlar kullanan hacker’lardan dehşete kapıldılar.

Bunu ister anarşinin sonu, ister serbestliğin ölümü olarak adlandırın, artık hacker’lar romantik anti-kahramanlar, sadece bir şeyler öğrenmek isteyen farklı (tuhaf) insanlar olarak kabul edilmiyorlardı. Dünya piyasasını Net üzerinden yönetme vaadiyle filizlenen online ticaret, korunmaya ihtiyaç duyuyordu. Hacker’lar birden dolandırıcı niteliği kazandılar. Gerçi bazıları Mitnick’i kahraman ilan ettiler, yargılanmadan infaz edildiğini ileri sürerek serbest bırakılması için kampanyalar başlattılar (bkz. www.2600.com); ancak Mitnick dışında hiçbir hacker bu ölçüde benimsenmedi.

Peki şimdilerde neler oluyor? Internet dünyasında yasadışı yöntemlere sıkça başvuruluyor, ancak eskisi gibi efsaneleşmiş isimler çıkmıyor.

Yine de Aldous Huxley’in bir zamanlar söylediği gibi, olaylar görmezlikten gelinmekle yok olmazlar. Bilgisayar yer altı dünyasında hep söylenen şu sözü de unutmayın: İyi bir hacker’san, ismini herkes bilir. Ama büyük bir hacker’san kimse kim olduğunu bilmez.

Prolog – 2

Burada Herhangi_Biri, nefret_eder(ahmet, Herhangi_biri) alt hedefinin doğru olmadığı ispatlanmadan önce Herhangi_biri argümanı sever(esra, Herhangi_biri) alt hedefindeki Herhangi_biri argümanına atanmış olur. Dolayısıyla yukarıdaki kod tam olarak arzu edildiği gibi çalışır. Yukarıdaki kısa program

sever(ahmet, Herhangi_biri):-                 /* ‘Doğru çalışmaz’*/

not(nefret_eder(ahmet, Herhangi_biri),

sever(esra, Herhangi_biri).

şeklinde yazılacak olursa, ilk önce Not ile başlayan cümlecik çağrılmış olur. Not cümleciği içinde serbest değişken tanımlamak mümkün olmadığı için, Prolog hata mesajı vermiş olur. Çünkü not(nefret_eder(ahmet, Herhangi_Biri) cümleciğindeki Herhangi_biri argümanı serbest değişkendir ve hiçbir değeri yoktur. Programdaki Herhangi_biri yerine anonim değişken olan (_) kullanılsa bile, Prolog yine yanlış bir sonuç verecektir.

sever(ahmet, Herhangi_biri):-                 /*Doğru çalışmaz*/

not(nefret_eder(ahmet, _),

sever(esra, Herhangi_biri).

Çünkü yukarıdaki cümlelerden anlaşılan şudur: Eğer Ahmet’in nefret ettiği bir şey bilinmiyorsa ve eğer esra Herhangi_biri’ni seviyorsa, Ahmet Herhangi_biri’ni sever. Anlatılmak istenen şey ise şudur: Esra’nın sevdiği ve Ahmet’in de nefret etmediği Herhangi_biri varsa, Ahmet bu Herhangi_biri’ni sever.

Not yüklemini kullanırken çok dikkatli olmak gerekir. Yanlış kullanım, ya hata mesajı alınmasına ya da program içerisinde mantıksız bir yapıya neden olacaktır.

Örnek:

PREDICATES

Nondeterm alisveristen_hoslanir(symbol)

Nondeterm kredi_kartina_sahip(symbol, symbol)

kredisi_bitmis(symbol, symbol)

CLAUSES

alisveristen_hoslanir(Kim):-

kredi_kartina_sahip(Kim,Kredi_karti),not(kredisi_bitmis(Kim,Kredi_karti)),

write(Kim, Kredi_karti, “ile alışveriş yapabilir\n”).

kredi_kartina_sahip(yavuz, visa).

kredi_kartina_sahip(yavuz, diners).

kredi_kartina_sahip(ahmet, shell).

kredi_kartina_sahip(mehmet, masterkart).

kredi_kartina_sahip(asaf_bey, akbank).

kredisi_bitmis (yavuz, diners).

kredisi_bitmis (asaf_bey, masterkart).

kredisi_bitmis (yavuz, visa).

GOAL alisveristen_hoslanir(Kim).

 

Örnek:

DOMAINS

isim,cinsiyet,meslek,cisim,yardimci,madde = symbol

yas=integer

PREDICATES

nondeterm sahis(isim, yas, cinsiyet, meslek)

nondeterm iliskili(isim, isim)

ile_oldurdu(isim, cisim)

oldurdu(isim)

nondeterm katil(isim)

sebep(yardimci)

uzerinde_leke_var(isim, madde)

sahip(isim, cisim)

nondeterm birbirine_benzer(cisim, cisim)

nondeterm sahip_oldugu_cisim(isim, cisim)

nondeterm supheli(isim)

/* * * Katil hakkındaki gerçekler * * */

CLAUSES

sahis(huseyin,55,m,arastirma_gorevlisi).

sahis(yavuz,25,m,futbolcu).

sahis(yavuz,25,m,kasap).

sahis(ahmet,25,m,yankesici).

iliskili(fatma,ahmet).

iliskili(fatma,huseyin).

iliskili(deniz,ahmet).

ile_oldurdu(deniz,sopa).

oldurdu(deniz).

sebep(para).

sebep(kiskanclik).

sebep(durustluk).

uzerinde_leke_var(huseyin, kan).

uzerinde_leke_var(deniz, kan).

uzerinde_leke_var(yavuz, camur).

uzerinde_leke_var(ahmet, cikolata).

uzerinde_leke_var(fatma,cikolata).

sahip(huseyin,tahta_bacak).

sahip(ahmet,tabanca).

/* Temel Bilgiler */

birbirine_benzer(tahta_bacak, sopa).

birbirine_benzer(demir, sopa).

birbirine_benzer(makas, bicak).

birbirine_benzer(futbol_sopasi, sopa).

sahip_oldugu_cisim(X,futbol_sopasi):-sahis(X,_,_,futbolcu).

sahip_oldugu_cisim(X,makas):-sahis(X,_,_,kuafor).

sahip_oldugu_cisim(X,Cisim):-sahip(X,Cisim).

/* Susan’ın oldürüldüğü silaha sahip herkesi şüpheli kabul edilsin */

supheli(X):-

     ile_oldurdu(deniz,Silah) ,

     birbirine_benzer(Cisim,Silah) ,

     sahip_oldugu_cisim(X,Cisim).

/* Susan ile ilişkisi olan insanlar da şüpheliler listesine girmeli */

supheli(X):-

     sebep(kiskanclik),

     sahis(X,_,m,_),

     iliskili(deniz,X).

/* Susan’ın, ilişkilerinden haberdar olduğu bayanlar da şüpheli listemizde olmalı */

supheli(X):-

     sebep(kiskanclik),

     sahis(X,_,f,_),

     iliskili(X,Erkek),

     iliskili(deniz,Erkek).

/* Şüpheli, para için katil olan bir yankesici olabilir */

supheli(X):-

     sebep(para),

     sahis(X,_,_,yankesici).

katil(Katil):-

     sahis(Katil,_,_,_),

     oldurdu(Olduruldu),

     Olduruldu <> Katil, /* It is not a suicide */

     supheli(Katil),

     uzerinde_leke_var(Katil,Devam),

     uzerinde_leke_var(Olduruldu,Devam).

GOAL

     katil(Katil_Kim).

4.8. Prosedürel Açıdan Prolog

Prolog tanımsal yapıya sahip bir dildir. Program hazırlarken problem olgular(önceden bilinen gerçekler) ve kurallarla tanımlanır. Bunu takiben bilgisayardan çözüm bulması beklenir. Pascal, BASIC ve C gibi diller ise tamamen prosedürlere dayanırlar. Bilgisayarın belli bir probleme çözüm bulabilmesi için, programcının, yapılması gereken işlemleri alt programlar ve fonksiyonlar halinde adım adım tanımlaması gerekir.

4.8.1. Kurallar ve Olguların Prosedürlere Benzerliği

Prolog’daki bir kuralı diğer dillerdeki bir procedure olarak görmek mümkündür. Örneğin

sever(ahmet, Birsey):- sever(gul, Birsey).

şeklindeki bir kural ‘Ahmet’in bir şeyi sevdiğini ispatlamak için, Gül’ün de aynı şeyi sevdiğini ispat et’ anlamına gelir. Aynı şekilde

sever(Orhan, Baklava).

şeklindeki Prolog kuralı “Orhan’ın baklava sevdiğini ispat etmek için dur” anlamındaki bir procedure olarak düşünmek mümkündür. Burada sever(Kim, Ne) şeklinde bir sorgu gelirse, Kim ve Ne serbest değişkenleri sırasıyla Orhan ve Baklava değerlerini alırlar.

Case ifadesi, boolean testleri ve goto komutu diğer dillerde mevcut olan procedure örnekleridir. Benzer işlemleri, kuralları kullanarak yapabiliriz.

4.8.2. Bir Kuralın Case ifadesi Gibi Kullanılması

Prolog’daki Kural ile diğer dillerdeki Procedure arasındaki büyük farklardan biri, Prolog’un aynı procedure için birden fazla alternatif tanımlama imkanı vermesidir.

Pascal’daki CASE ifadesi kullanıyormuş gibi, her argüman değeri için farklı bir tanım yazarak çoklu tanım kullanabilirsiniz. Prolog kuralları peşpeşe kullanarak eşleşenleri bulur ve kuralın tanımladığı işlemi yapar.

Örnek:

PREDICATES

nondeterm basilan_tus(integer)

CLAUSES

basilan_tus(1):-

nl,

write(“1 Tuşuna Bastınız.”), nl.

basilan_tus(2):-

nl,

write(“2 Tuşuna Bastınız.”), nl.

basilan_tus(3):-

nl,

write(“3 Tuşuna Bastınız.”), nl.

basilan_tus(N):-

nl,

N<>1, N<>2, N<>3, write(“Hangi Tuşa Bastığınızı Bilmiyorum”), nl.

GOAL write(“1-3 arasında bir sayı yazınız: “), readint(Sayi), basilan_tus(Sayi).

Örnekte, 1, 2 veya 3 haricindeki rakamlar girildiğinde eşleşme olamaz ve çözüm bulunmaz.

4.8.3. Bir Kural İçinde Test Yapmak

Yukarıdaki örnekte geçen basilan_tus(N) cümleciğinde; verilecek herhangi bir değere otomatik olarak N’e atanacaktır. Burada verilen sayının sadece 1-3 aralığı dışında olması durumunda ‘Hangi Tuşa Bastığınızı Bilmiyorum’ mesajının görüntülenmesi gerekir. Bu N<>1, N<>2, N<>3 alt hedefleri ile gerçekleştirilmektedir. Prolog ilk önce yazılan değerin 1-3 arasında olup olmadığını doğrulamaya çalışır. Doğru olmadığını görünce geriye dönüş işlemi yapmaya çalışır. Fakat başka alternatif olmadığı için bu cümlenin geriye kalan kısmına geçiş yapamaz.

Basilan_tus ilişkisi atanacak olan seçeneklere dayanır. Eğer basilan_tus ilişkisi argümanı serbest olan bir değişken ile çağılırsa, GOAL bu cümlelerin hepsiyle eşleşir ve ilk üç kural alternatif çözümler olarak sunulur. Son cümle ise hataya neden olur. Çünkü bağımsız bir değişkeni bir sayı ile eşleştirmek mümkün değildir.

4.8.4. Cut Komutunun Goto Gibi Kullanılması

Yukarıdaki örnek vakit kaybına neden olur. Çünkü doğrulanan bir kural bulunsa bile, Prolog’un son kuralı da test edip başka alternatif araması gerekir. Prolog’a alternatif aramaktan vazgeçmesini söylemek için Cut komutu kullanılabilir. Bunun sonucu, bize zaman ve bellek tasarrufu sağlanır.

Yukarıdaki program, şimdi de Cut komutu ile yazılsın.

PREDICATES

nondeterm basilan_tus(integer)

CLAUSES

basilan_tus(1):- !,

nl,

write(“1 Tuşuna Bastınız.”), nl.

basilan_tus(2):- !,

nl,

write(“2 Tuşuna Bastınız.”), nl.

basilan_tus(3):- !,

nl,

write(“3 Tuşuna Bastınız.”), nl.

basilan_tus(_):- !, write(“Hangi Tuşa Bastığınızı Bilmiyorum”), nl.

GOAL write(“1-3 arasında bir sayı yazınız: “), readint(Sayi), basilan_tus(Sayi).

Cut komutunun işleme girebilmesi için Prolog’un içinde Cut bulunan bir kurala gitmesi ve Cut komutunun bulunduğu noktaya kadar gelmiş olması gerekir.

Cut komutu basilan_tus(X):- X>3, !, write(“Yazdığınız rakam çok yüksek”) gibi testlerden önce gelebilir. X>3 alt hedefi doğrulandığı anda Cut komutu önemli hale gelir. Burada kuralların sırası oldukça önemlidir. 13. örnekte kurallar; arzu edilen sıraya göre yazılabilir. Çünkü onlardan sadece biri girilen bir sayı ile eşleşir. Fakat Cut kullanılan yukarıdaki örnekte, bilgisayarın write(“Hangi Tuşa Bastığınızı Bilmiyorum”) kuralına diğer üç kuralı denemeden önce kesinlikle geçmediğinden emin olmak gerekir. Çünkü buradaki Cut komutları red_cut, yani olumsuz cut, görevi görürler ve programın mantığını değiştirirler.

Eğer yukarıdaki programda X<>1, X<>2 ve X<>3 şeklindeki karşılaştırma anahtarlarını tutup her cümleye sadece bir Cut komutu yerleştirilirse, buradaki Cut komutları Green Cut olarak görev yaparlar. Cut, diğer programlama dillerinde tıpkı GOTO komutu gibi görev görür. Cut komutunun kullanımı faydalıdır, fakat içinde Cut kullanılan programları anlamak bazen zor olabilir.

4.9. Hesaplanmış Değerleri Görüntüleme

Program akışında, ilk başta herhangi bir değeri olmayan argümanlar, daha sonra belirli değerle alırlar. Örneğin

sever(orhan, gulsah).

şeklindeki bir olgu

sever(orhan, Kim)

şeklindeki bir hedef cümlesindeki Kim argümanına ‘Gulsah’ değerini atamış olur. Yani

GOAL sever(orhan, Kim) hedef cümlesindeki Kim argümanı ilk önce serbest olmasına rağmen, sever(orhan, gulsah) olgusunu çağırdığı anda olgudaki Gulsah değeri Kim argümanına atanır ve Kim argümanı sınırlı hale gelir.

Örnek:

PREDICATES

nondeterm ekrana_yaz(integer, symbol)

CLAUSES

ekrana_yaz(0, sifir).

ekrana_yaz(Sayi, negatif):- Sayi<0.

ekrana_yaz(Sayi, pozitif):- Sayi>0.

GOAL ekrana_yaz(14, Sayinin_isareti).

‘ekrana_yaz’ ilişkisinin ilk argümanı daima sabit bir sayı ve bağlı bir değişken olmak zorundadır. İkinci argüman ise sınırlı veya sınırsız bir değişken olabilir. İlk değişkene bağlı olarak sıfır, negatif veya pozitif bir sayı olabilir.

Yukarıdaki GOAL cümleciğinin bulacağı cevap elbette yes olacaktır. Çünkü 14 sıfırdan büyük bir sayıdır ve pozitiftir. Burada sadece 3. cümlecik doğrudur.

GOAL ekrana_yaz(14, negatif).

Hedef cümlesiyle aynı prosedür takip edilir ve no cevabı alınır. Prolog’un sonuç alması incelenirse,

·        İlk önce ilk cümlecik incelenir. Belirle ilişkisindeki argümanlar, yani 14 ve negatif değerleri, 0 ve sifir değerleriyle eşleşmezler.

·        İkinci cümleciğe sıra geldiğinde, Sayi 14’e eşitlenir fakat sayi<0 testi doğrulanamaz.

·        Üçüncü argümana gelindiğinde bu kez ikinci argümanlar eşleşmez, yani pozitif kelimesi negatif ile eşleşemez.

Anlamlı bir cevap almak için örneğin GOAL belirle(14, Sayinin_Isareti) kullanılırsa,

Sayinin_Isareti=pozitif

1 Solution

cevabı alınır.

Yukarıdaki örneğin çalışması esnasında, işlemler aşağıdaki sıra ile yapılacaktır.

ekrana_yaz(14, Sayinin_Isareti) hedef cümlesi, ilk cümleciğin ekrana_yaz(0, sifir) kısmıyla eşleşmez. Bu yüzden ilk cümlecik kullanılamaz.

1.     ekrana_yaz(14, Sayinin_Isareti) hedef cümlesi ikinci cümleciğin baş kısmıyla eşleşir ve Sayi=14, Sayinin_Isareti=negatif olur. Fakat hemen sonraki Sayi<0 yanlış olduğundan Prolog bu cümlecikten geriye döner ve Sayi=14 değeri iptal edilir.

2.     ekrana_yaz(14, Sayinin_Isareti) hedef cümlesi üçüncü cümleciğin baş kısmıyla eşleşir ve Sayi=14, Sayinin_Isareti=pozitif olur. Sayi>0 eşitliği de sağlandığı için Prolog artık geriye iz sürme işlemini yapmaz ve sonucu görüntüler.


5. BASİT VE BİLEŞİK NESNELER

Şimdiye kadar Prolog’da kullanılan veri nesnelerinden number, symbol, string gibi birkaç tip incelenmiştir. Bu bölümde basit ve bileşik veri türlerinin tamamı incelenecektir. Standart tip olarak tanımlanabilen veriler, bazı bileşik veri yapılarını içermezler. Bu yüzden farklı veri yapılarına göz atarak, bunların domains ve predicates bölümlerinde nasıl tanımlanabileceği göreceğiz.

5.1. Basit veri nesneleri

Basit bir veri nesnesi, bir değişken veya bir sabitten oluşabilir. Sabit, constants bölümünde tanımlanan veri tipi değil; char, integer, symbol, string gibi değişmeyen bir nesnedir.

5.1.1 Veri Nesneleri Olan Değişkenler

VIP değişkenleri A-Z arasındaki büyük bir harf veya (_) ile başlamalıdır. (Değişken isimlerinde ç, İ, ö, ğ, ş vs. gibi Türkçe karakterler kesinlikle kullanılamaz) Yalnız başına kullanılan (_) değişkeninin anonim değişken olduğunu ve herhangi bir değerle eşleşebileceği bilinmektedir. Prolog’daki değişkenler global değil, lokaldir. Yani iki ayrı cümlecikte aynı isimle -örneğin X- gösterilen bir değişken farklıdır. Eşleşme sırasında birbiriyle eşleşebilir, fakat temelde birbiri üzerinde hiçbir etkisi yoktur.

5.1.2. Veri Nesneleri Olan Sabitler

Sabitler karakter, sayı veya atom biçiminde olabilirler.

5.1.3. Karakterler

Karakterler char kelimesi ile gösterilir ve 0-9, A-Z ve a-z, ASCII 127 karakter tablosundaki değerleri alabilirler. Fakat ASCII 32 (boşluk) ve daha küçük karakterler kontrol amacıyla kullanılırlar.

Tek karakterlik bir sabit şöyle yazılır:

‘a’ ‘3’       ‘*’       {       ‘W’      ‘A’      ‘\\’=\    ‘\’’=’    ‘\225’=b (ASCII 225)

Bunların dışında başka fonksiyonları olan karakterler de vardır.

‘\n’                       Yeni satıra geçiş komutu

‘\r’                        Satır sonu

‘\t’                        Yatay sekme (tab)

5.1.4. Sayılar

Sayılar tamsayı ve reel olabilirler. Reel sayılar 10-308-10+308arasında değişirler.

Örnek:

Tamsayılar                                   Reel Sayılar

10                                                3.

-77                                               34.96

32034                                          -32769

-10                                               4*10+27

5.1.5. Atomlar

Bir atom symbol veya string olabilir. İkisi arasındaki fark genelde Prolog’un çalıştırıldığı sisteme bağlıdır.

Prolog string ve symbol tipleri arasında otomatik dönüştürme yapabilir. Dolayısıyla symbol ve string tipindeki değişkenler birbirinin yerine kullanılabilirler. Fakat programcılıkta yaygın olan adet, çitf tırnak (“) içine alınması gereken sabitleri string, çitf tırnak gerektirmeyen sabitleri de symbol olarak kabul etmektir.

Symbol: küçük harfle başlayan ve sadece harf, rakam ve _ karakterlerini içerir.

String: Çift tırnak içine alınabilen ve string sonunu belirleyen 0 (Sıfır) hariç, herhangi bir karakteri içerebilir.

Symbol                 String

Yemek                             “Yavuz AYDIN”

Ahmetin_babasi   “ 12. Cadde”

A                          “a”

PdcProlog                        “Visual Prolog Development Center”

5.2. Bileşik Veri Nesneleri ve Fonksiyon Operatörleri

Bileşik veri nesneleri, birden fazla parçadan oluşan verileri tek bir parçaymış gibi kullanma imkanı tanır. Mesela 16 Mayıs 1998 tarihi gün, ay ve yıl olarak 3 parçadan oluşan bir bilgiyi temsil eder. Bu tür bir bilgiyi tek bir parçaymış gibi kullanmaya imkan tanıyan sabitler vardır.

Örnek:

Domains

Islem_tarihi= date(string, unsigned, unsigned)

şeklindeki bir tanımdan sonra D=date(“Mayıs”, 16, 1998) şeklinde yazılabilir. Burada D bir olgu değil, symbol veya sayı gibi kullanılabilecek bir veridir. Bu tür ifadeler genelde bir fonksiyon operatörü ve takip eden 3 argüman ile başlar. Operatörler herhangi bir hesaplama yapamazlar. Sadece bir tür bileşik veri nesnelerini tanımlar ve argümanların tek veriymiş gibi tutulmasına imkan tanır.

Bileşik veri nesnelerinin argümanları da bileşik olabilir. Örneğin

Dogum_Gunu

Kisi                                  date

“Ahmet”“SAGMEN”          “Mart” 15 1976

şeklinde gösterilen bir tarihi Prolog’da

dogum_tarihi(kisi(“Ahmet”,“SAGMEN”),date(“Mart”,15,1976)) şeklinde yazılabilir.

Bu örnekte dogum_tarihi bileşik nesnesinin iki bölümü vardır: kisi(“Ahmet”, “SAGMEN”) ve date(“Mart”, 15, 1976). Buradaki operatörler kisi ve date’dir.

5.3. Bileşik Nesnelerin Eşleştirilmesi

Bileşik bir nesne basit bir değişken veya kendisine uyan diğer bir bileşik nesne ile eşleşebilir. Örneğin date(“Nisan”, 18, 1983) şeklindeki bir clause tarih clause’una tam olarak eşleşir. Aynı şekilde date(“Nisan”, 18, 1983) date(Ay, Gun, Yil) cümleciğinde Ay=Nisan, Gun=18, Yil=1983 değerlerine atanır.

5.4. Bileşik Nesneleri Eşleştirmek İçin ‘=’ Sembolünün Kullanılması

VIP iki durumda eşleştirme işlemi yapar. İlki bir Goal veya çağrı fonksiyonunun bir cümleciğin baş kısmıyla eşleşmesi durumunda meydana gelir. İkincisi ise ‘=’ işaretinin argümanlar arasında kullanılması durumunda meydana gelir.

Prolog, eşitliğin her iki tarafındaki aynı işaretli nesneleri eşleştirmek için gerekli bağlantıları yapar. Aşağıdaki örnekte, soy isimleri aynı olan iki kişiyi bulup her ikisinin adreslerini eşitleyelim.

DOMAINS

sahis=sahis(isim, adres)

isim=isim(adi, soyadi)

adres=adres(cadde, sehir, ulke)

cadde=cadde(cadde_no, cadde_ismi)

sehir, ulke, cadde_ismi=string

adi, soyadi= string

cadde_no= integer

GOAL

P1 = sahis(isim(orhan, aydin), adres(cadde(5, “1. Cadde”), “Elazig”, “Turkiye”)),

P1= sahis(isim(_, aydin), Adres),

P2= sahis(isim(oktay, aydin), Adres),

write(“Birinci Sahis =”, P1), nl,

write(“İkinci Sahis =”, P2), nl.

5.5. Birden Fazla Nesneyi Tek Nesne Olarak Kullanmak

Prolog’da yazılmış programlarda bileşik nesneleri tek bir nesne gibi kullanmak kolaydır. Bu da programcılığı oldukça kolaylaştırır. Örneğin

sahiptir(fatih, kitap(“Visual Prolog İle Programlama”, “Prof.Dr. Asaf VAROL”)).

cümlesi ‘Fatihin Prof.Dr. Asaf Varol tarafından yazılan Visual Prolog ile Programlama adlı bir kitabı var’ anlamındadır. Benzer şekilde;

sahip(fatma, sevgili(can)).

cümlesi “Fatma’nın, ismi Can olan bir sevgilisi var” anlamına gelir. kitap(“Visual Prolog İle Programlama”, “Prof.Dr. Asaf VAROL”) ve sevgili(can) cümlelerdeki bileşik nesnelerdir.

Bileşik nesne kullanmanın önemli bir avantajı, birden fazla argümandan oluşan cümleleri sadece bir argüman olarak kullanabilmektir.

Örnek:

Basit bir telefon rehberi veritabanı programı

PREDICATES

Adres_listesi(symbol, symbol, symbol, symbol, integer, integer) /*(adi, soyadi, telefonu, ay, gun, yil)*/

clauses

adres_listesi(davut, yildirim, 3128456, ocak,6, 1978).

adres_listesi(maksut, hazneci, 3154878, nisan,14, 1969).

adres_listesi’ndeki 5 argümanı

sahis(Adi, Soyadi), dogum_tarihi(Ay,Gun,Yil).

şeklinde yazmak mümkündür. Yeni şekliyle program şöyle yazılabilir:

Domains

Adi= sahis(symbol, symbol)                                           /* (Adi, Soyadı)*/

Dogum_tarihi= d_tarihi(symbol, integer, integer)          /*(Ay, Gün, Yıl)*/

Telefon_no= symbol                                                       /* Telefon no*/

Predicates

adres_listesi(adi, telefon_no, d_tarihi)

clauses

adres_listesi(sahis(davut, yildirim), 3128456, d_tarihi(ocak,6, 1978)).

adres_listesi(sahis(maksut, hazneci), 3154878, d_tarihi(nisan,14, 1969)).

Şimdi yukarıdaki küçük programa birkaç kural daha ilave edip, doğum tarihleri bugünün tarihi ile uyuşanları bulmaya çalışalım. Programda standart yüklem olan date kullanılarak bugünün tarihi bilgisayardan alınacaktır.

DOMAINS

adi = sahis(symbol,symbol)                                            /* (Adı, Soyadı) */

dogum_gunu = d_gunu(symbol,integer,integer)                        /* (Ay, Gun, Yıl) */

tel_no = symbol                                                              /* Telefon Numarası */

PREDICATES

nondeterm tel_listesi(adi,symbol,dogum_gunu)

d_gunu_ayini_bul

ay_donustur(symbol,integer)

d_gunu_ayini_kontrol_et(integer,dogum_gunu)

sahsi_yaz(adi)

CLAUSES

d_gunu_ayini_bul:-

write(“====Bu ay doğanların listesi =======”),nl,

write(” Adı\t\t Soyadı\n”),

write(“==============================”),nl,

date(_, Bu_ay, _),                                   /* Tarihi bilgisayardan oku */

tel_listesi(Sahis, _, Date),

d_gunu_ayini_kontrol_et(Bu_ay, Date),

sahsi_yaz(Sahis),

fail.

d_gunu_ayini_bul:-

write(“\n\n Devam etmek için herhangi bir tuşa basın “),nl,

readchar(_).

sahsi_yaz(sahis(Adi,Soyadi)):-

write(” “,Adi,”\t\t “,Soyadi),nl.

d_gunu_ayini_kontrol_et(Yeni_ay,d_gunu(Ay,_,_)):-

ay_donustur(Ay,Ay1),

Yeni_ay = Ay1.

tel_listesi(sahis(paki, turgut), “267 78 41”, d_gunu(ocak, 3, 1965)).

tel_listesi(sahis(arif, gurel), “338 41 23”, d_gunu(subat, 5, 1972)).

tel_listesi(sahis(mehmet_can, hallac), “512 56 53”, d_gunu(mart, 3, 1965)).

tel_listesi(sahis(cuma, cetiner), “267 22 23”, d_gunu(nisan, 29, 1963)).

tel_listesi(sahis(omer, akgobek), “355 12 12”, d_gunu(mayis, 12, 1971)).

tel_listesi(sahis(fatih, dilekoglu), “438 63 42”, d_gunu(haziran, 17, 1970)).

tel_listesi(sahis(levent, aksun), “567 84 63”, d_gunu(haziran, 20, 1972)).

tel_listesi(sahis(cengiz, gok), “255 56 53”, d_gunu(temmuz, 16, 1973)).

tel_listesi(sahis(kasim, yenigun), “132 22 23”, d_gunu(agustos, 10, 1968)).

tel_listesi(sahis(husamettin, bulut), “412 48 34”, d_gunu(eylul, 25, 1967)).

tel_listesi(sahis(arif, demir), “315 24 21”, d_gunu(ekim, 20, 1992)).

tel_listesi(sahis(sezen, demir), “233 13 12”, d_gunu(kasim, 9, 1980)).

tel_listesi(sahis(nebahat, arslan), “337 22 23”, d_gunu(kasim, 15, 1987)).

tel_listesi(sahis(leyla, aydin), “145 41 50”, d_gunu(aralik, 24, 1940)).

ay_donustur(ocak, 1).

ay_donustur(subat, 2).

ay_donustur(mart, 3).

ay_donustur(nisan, 4).

ay_donustur(mayis, 5).

ay_donustur(haziran, 6).

ay_donustur(temmuz, 7).

ay_donustur(agustos, 8).

ay_donustur(eylul, 9).

ay_donustur(ekim, 10).

ay_donustur(kasim, 11).

ay_donustur(aralik, 12).

GOAL d_gunu_ayini_bul.

Yukarıdaki program kodu incelendiğinde, bileşik nesnelerin neden faydalı olduğu açıkça görülür. Dogum_tarihi_ayi yüklemi, en yoğun kullanılan cümle durumdadır.

1.     Program ilk önce sonuçları bir pencerede görüntüler.

2.     Sonra sonuçların yorumlanacağı bir başlık kısmı görüntülenir.

3.     Daha sonra hazır fonksiyonlardan biri olan date kullanılarak bilgisayarın saatinden bugünkü tarih okunur ve ay belirlenir.

4.     Bundan sonra yapılması gereken tek şey, satırlar halinde sıralanan veritabanından isim, telefon no, doğum tarihi okutmaktır. Burada doğum tarihi sistemden okunan ay ile karşılaştırılıp aynı olanlar bulunur. adres_listesi(Sahis,_, Date) çağrısı adı ve soyadını Sahis değişkenine atar ve sahis operatörü Sahis’a atanmış olur. Date değişkeni de ilgili şahsın doğum tarihini alır. Buradaki adres_listesi bileşik bir değişken olup, bir kişi hakkındaki bütün bilgileri saklar.

5.     Daha sonra aranan kişinin doğum tarihini Date değişkenine atar. Bir sonraki alt hedefte tamsayıyla gösterilen bugünkü ay ve kişinin doğum tarihi dogum_gununu_kontrol_et yüklemine iletilir.

6.     dogum_gununu_kontrol_et yüklemi iki değişkenle birlikte çağrılır. İlk değişken bir tamsayıya, ikincisi ise dogum_tarihi’ne bağlanır. dogum_gununu_kontrol_et kuralını tanımlayan kuralın baş kısmındaki Bu_ay Mon değişkenine atanır. İkinci argüman olan Date ise dogum_tarihi(Ay, _,_) cümleciğine atanır. Sadece bugünkü tarihten ay ile ilgilendiğimiz için, gün ve yıl için anonim değişkenler kullanılmıştır.

7.     dogum_gununu_kontrol_et yüklemi ayın sembolik değerini tam sayıya dönüştürür ve bu değeri sistemden okunan ay değeri ile karşılaştırır. Karşılaştırmanın başarılı olması durumunda bir sonraki alt hedefe geçer. Karşılaştırma başarısız olursa geriye iz sürme işlemi başlar.

8.     İşlenmesi gereken bir sonraki alt hedef adini_yaz’dır. İstenilen bilgi, doğum tarihi bu ay olan kişinin ismi olduğu için, ekrana bu kişinin adı ve soyadı yazılır. Bir sonraki cümle ‘fail’ olduğu için otomatik olarak geriye iz sürme işlemi başlar.

9.     Geriye iz sürme daima en son kullanılan non-deterministic yükleme geri gider. Bizim programımızda zaten non-deterministic bir yüklem bulunduğu için işlem hemen adres_listesi’ne gider. Program burada işleme konmak üzere başka bir isim aramak için veritabanına gider. Eğer veritabanında işleme konacak başka biri kişi yoksa işlemdeki cümle başarısız olur. Prolog, veritabanındaki diğer satırları inceler ve dogum_gununu_kontrol_et kuralını tanımlayan başka bir cümle bulur.

5.6. Bileşik Nesnelerin Tiplerini Tanımlamak

Bu bölümde bileşik nesne tiplerinin nasıl tanımlanacağı üzerinde duralım.

sahiptir(ahmet, kitap(“Pascal 7”, “Ömer AKGÖBEK”))

sahiptir(ahmet, at(firtina)).

şeklinde tanımlanan ilişkiler

GOAL sahiptir(ahmet, Ne)

sorgusuyla irdelenirse Ne değişkeni iki ayrı argüman ile eşleşebilir. Bunlardani biri kitap, diğeri ise at’tır. Sahiptir yüklemi artık sahiptir(symbol, symbol) şeklinde tanımlanamaz. İkinci argüman symbol tipindeki nesnelere işaret etmez. Bunun yerine

sahiptir(isim, esyalar)

şeklinde bir yüklem tanımlamak mümkündür. Tipleri tanımlarken

Domains

esyalar= kitap(kitap_adi, yazar); at(atin_adi)

kitap_adi, yazar, atin_adi            = symbol

yazılabilir.

Yukarıdaki ‘;’ işareti ‘veya’ anlamına gelir. Bu durumda iki alternatiften bahsetmek mümkündür. Bir kitap, kitabın adı ve yazarının adıyla, bir ‘at’ ise sadece ismiyle tanımlanabilir. Kitap_adi, yazar, atin_adi değişkenlerinin tamamı symbol tipindedir.

Tip tanımlanmasına daha fazla alternatif rahatlıkla ilave edilebilir.

Örnek

DOMAINS

esyalar= kitap(kitap_ismi, yazar); at(atin_adi); araba; banka_hesabi(nakit)

kitap_ismi, yazar, atin_adi=symbol

nakit         = real

isim=symbol

PREDICATES

nondeterm sahiptir(isim, esyalar)

CLAUSES

sahiptir(ahmet, kitap(“Pascal 7.0”, “Ömer AKGÖBEK”)).

sahiptir(ahmet, at(firtina)).

sahiptir(ahmet, araba).

sahiptir(ahmet, banka_hesabi(1000)).

GOAL sahiptir(Kim, Sahip_oldugu_esyalar).

Programı derlenip çalıştırıldığında

Sahip_oldugu_esyalar=kitap(“Pascal 7.0”, “Ömer AKGÖBEK”)).

Sahip_oldugu_esyalar=at(firtina)).

Sahip_oldugu_esyalar=araba

Sahip_oldugu_esyalar= banka_hesabi(1000)).

4 Solutions

cevabı görüntülenir.

5.7. Tip Tanımlamaları Üzerine Kısa Bir Özet

Bileşik nesnelerin tip tanımları genel bir şekilde gösterilecek olursa:

Domain= alternatif1(Tip, Tip, ……); alternatif2(Tip, Tip, …..)

Burada alternatif1 ve alternatif2 farklı operatörlerdir. (Tip, Tip, …) gösterimi standart veya başka yerde ayrıca tanımlanan symbol, integer, real vs. gibi tip isimlerdir.

Not:

1.     Alternatifler birbirinden daima ‘;’ ile ayrılırlar.

2.     Her alternatif bir operatör ve bu argümana ait tip tanımlarını içerir.

3.     Eğer operatörde herhangi bir argüman kullanılmazsa, bunu alternatifN veya alternatifN( ) biçiminde yazılabilir.

5.8. Çoklu-Düzey Bileşik Nesneler

Prolog’da, birden fazla dereceden oluşan bileşik nesne kullanmak mümkündür. Örneğin

kitap(“Atatürk: Bir Milletin Yeniden Doğuşu”, “Kinross”)

olgusundaki ‘Kinross’ soyismi yerine, yazarın adını ve soyadını ayrıntılı olarak gösteren bir yapı kullanmak mümkündür.

kitap(“Atatürk: Bir Milletin Yeniden Doğuşu”, yazar(“Lord”, “Kinross”))

Daha önceden yapılan tip tanımında

kitap(kitap_adi, yazar)

yazılıyordu. İkinci argüman olan yazar, operatör durumundadır. Fakat yazar=symbol sadece bir isimi kapsadığından, yetersiz kalır. Bu durumda yazar değişkeninin de bileşik nesne olarak tanımlanması gerekir. Bunu da:

yazar=yazar(isim, soyisim)

şeklinde tanımlamak mümkündür. Şimdi tip tanımlarına geçelim.

Domains

esyalar=kitap(kitap_adi, yazar);              /*İlk derece*/

yazar=yazar(adi, soyadi)                         /*ikinci derece*/

kitap_adi, isim, soyisim=symbol             /*Üçüncü derece*/

Birden fazla dereceden oluşan bileşik nesneler kullanırken, ağaç biçiminde bir yapı kullanmak büyük kolaylık sağlar.

Kitap

Kitap_adi             yazar

                               İsim,       soyisim

Tip tanımı yapılırken bir anda ağaç yapısının sadece bir derecesi kullanılabilir. Örneğin

kitap=kitap(kitap_adi, yazar(adi, soyadi))

Şeklindeki tip tanımı yanlıştır.

5.9. Çoklu-Tipli Argümanlar

Bir yüklemin farklı tiplerde bilgi verebilmesi için bir operatör tanımının yapılması yapmamız gerekir. Aşağıdaki örnekte sizin_yasiniz cümleciği yas argümanını kabul edilmektedir. Yas argümanı ise string, real veya integer olabilir.

DomaIns

yas=i(integer); r(real); s(string)

Predicates

siniz_yasiniz(yas)

CLAUSES

sizin_yasiniz(i(Yas)):-write(Yas).

sizin_yasiniz(r(Yas)):-write(Yas).

sizin_yasiniz(s(Yas)):-write(Yas).

5.10. Listeler

Öğretim üyelerinin verdikleri dersleri liste halinde saklamak istediğimizi kabul edelim. Bunun için aşağıdaki kodun yazılması yeterlidir.

PREDICATES

profesor(symbol, symbol,symbol) /*Adı, soyadı ve verdiği ders*/

CLAUSES

profesor(asaf, varol, bilgisayar).

profesor(ali, erdogan, betonarme).

profesor(ahmet, aydogan, fizik).

Bu tür bir programda, bütün hocaların isimlerini ve verdikleri dersleri tek tek sıralamak mümkündür. Her hoca için ayrı bir olguyu veritabanına ilave etmek gerekir. Kolay görünen bu işin yüzlerce öğretim üyesi olan bir üniversite için yapıldığında ne kadar zor olduğunu açıktır. Prolog’daki liste bir veya daha fazla değer alabilir ve benzer işlerde büyük kolaylıklar sağlar. Bir listedeki değişkenlerin aldıkları değerleri ‘[]’ arasında yazmak gerekir.

DOMAINS

dersler=symbol*

PREDICATES

profesor(symbol, symbol, dersler)

CLAUSES

profesor(asaf, varol, [bilgisayar, termodinamik, iklimlendirme]).

profesor(ali, erdogan, [betonarme, statik, malzeme]).

profesor(ahmet, aydogan, (fizik, matematik, kimya]).

Şeklindeki satırlarda dersler liste tipinde bir değişken olarak tanımlanmıştır. Buradaki ‘*’ sembolü dersler değişkeninin liste tipinde olacağını gösterir. Aynı biçimde, listenin tamsayılardan oluştuğu bir değişken tipi

Domains

tamsayilar_listesi=integer*

şeklinde tanımlanabilir.

Örnek:

DOMAINS

notlar=integer*

PREDICATES

nondeterm sinav_sonuclari(symbol, symbol, notlar)

CLAUSES

sinav_sonuclari(orhan, aydin, [78, 98, 100]).

sinav_sonuclari(kasim, yenigun, [45, 54, 60]).

sinav_sonuclari(husamettin, bulut, [80, 90, 95]).

sinav_sonuclari(huseyin, karasu, []).

GOAL sinav_sonuclari(orhan,_,Aldigi_Notlar).

Programı çalıştırıldığında Orhan’ın aldığı notlar görüntülenir.


6. TEKRARLAMA VE REKÜRSİYON

Prosedür ve veri yapılarında tekrarlama işlemleri Visual Prolog’da kolay bir şekilde yapılır. Bu bölümde önce tekrarlı işlemler (döngüler ve rekursif prosedürler), daha sonra ise rekursiv veri yapıları incelenecektir.

6.1. Tekrarlı İşlemler

Pascal, BASIC veya C gibi konvansiyonel programlama dilleriyle çalışanlar, Prologla çalışmaya başladıklarında FOR, WHILE, REPEAT gibi ifadeleri göremeyince şaşırabilirler. Çünkü Prologda iterasyonu anlatan direkt bir yol yoktur. Prolog sadece iki türlü tekrarlama-geriye dönüş imkanı tanır. Bu işlemlerde bir sorguya birden fazla çözüm bulmak ve bir prosedürün kendisini çağırdığı rekürsiyon işlemine imkan tanır.

6.2. Geriye İz Sürme

Bir prosedür, istenilen bir hedef için uygun bir çözüm yerine alternatif başka çözümler aramak için geriye döner. Bunun için geriye henüz denenmemiş bir alternatifi kalan en son alt hedefe gidileceğini, bu noktadan tekrar aşağıya doğru inileceği bilinmektedir. Geriye dönüşü iptal edip tekrarlı işlemler yaptırmak mümkündür.

Örnek:

PREDICATES

nondeterm ulke_adi(symbol)

ulke_adlarini_yaz

CLAUSES

ulke_adi(“Türkiye”).

ulke_adi(“Kazakistan”).

ulke_adi(“Azerbaycan”).

ulke_adi(“Amerika”).

ulke_adlarini_yaz:-

ulke_adi(Ulke), write(Ulke), nl, fail.

ulke_adlarini_yaz.

GOAL ulke_adi(Ulke).

Yukarıdaki ulke_adi yüklemi sadece ülke isimlerini sıralar. Dolayısıyla GOAL ulke_adi(Ulke) şeklindeki bir hedefin birden fazla sonucu vardır ve ulke_adlarini_yaz yuklemi bunların hepsini görüntüler.

ulke_adlarini_yaz :- ulke_adi(Ulke), write(Ulke), nl, fail.

satırıyla söylenmek istenen şey şudur: “Bütün ülke isimlerini yazmak için, önce ulke-adi(Ulke) cümlesine cevap bul, bunu yaz, yeni bir satıra geç ve işlemi yeniden başlat.”

‘fail’ komutunun programa yüklediği görev şöyle özetlenebilir: “GOAL cümlesine uygun bir çözüm bulunduğunda, geriye dönüş yap ve başka alternatiflere bak”.

‘fail’ yerine, sonucu daima yanlış olan ve bu yüzden geriye dönüşü zorlayan başka bir alt hedef kullanmak mümkündür. Örneğin, 10=5+6 satırı her zaman yanlış olacağı için, Prolog başka alternatifler bulmak için daima geriye dönüş yapar.

Örneğimizde ilk önce Ulke=Türkiye olur ve sonuç ekrana yazılır. ‘fail’ komutuna sıra geldiğinde program, bir alt hedefe geri döner. Fakat nl veya write(Ulke) satırları için kullanılabilecek herhangi bir veri olmadığı için, bilgisayar ulke_adi(Ulke) ilişkisi için başka çözümler arar.

Ulke_adi(Ulke) ilişkisi çalıştırıldığında, önceden boş değişken olan Ulke değişkeni ‘Türkiye’ değerini almıştı. Bu yüzden bu ilişkiyi yeniden kullanmadan önce Ulke değişkeni yeniden serbest hale getirilir. Daha sonra Ulke değişkeninin alabileceği başka bir olgu aranır. İkinci oluguda bu sağlanır ve ulke_adi yüklemindeki Ulke değişkeni ‘Kazakistan’ değerini alır. Bu işlem böylece devam eder ve sonuçta şu satırlar görüntülenir.

Türkiye

Kazakistan

Azerbaycan

Amerika

4 Solutions

Eğer ulke_adlarini_yaz yüklemi ‘fail’ komutundan sonra yazılmamış olsaydı, cevap yine aynı olurdu fakat ‘yes’ yerine ‘no’ satırı görüntülenirdi.

6.3. Önceki ve Sonraki Eylemler

Bir hedef için gerekli olan bütün çözümleri sağlayan bir program, çözüm yapmadan ve yaptıktan sonra başka şeyler de yapabilir. Örneğin

1.     Yaşanacak güzel yerler

2.     Ulke_adi(Ulke) yükleminin bütün sonuçlarını yaz.

3.     Başka yerler de olabilir…

Şeklinde bir mesaj yazarak bitirebilir.

Ulke_adlarini_yaz cümlesin ulke_adi(Ulke) yükleminin bütün sonuçlarını içerir ve sonunda bir bitiş mesajı yazar.

Örnekte geçen ilk ulke_adlarini_yaz cümlesi yukarıdaki adımlardan ikincisi içindir ve bütün çözümleri yazar. İkinci cümlesi ise üçüncü adıma tekabül eder ve sadece hedef cümlesini başarılı bir şekilde bitirmek içindir. Çünkü ilk cümle daima yanlıştır.

Programı başka şekilde yazmak gerekirse:

PREDICATES

nondeterm ulke_adi(symbol)

ulke_adlarini_yaz

CLAUSES

ulke_adi(“Türkiye”).

ulke_adi(“Kazakistan”).

ulke_adi(“Azerbaycan”).

ulke_adi(“Amerika”).

ulke_adlarini_yaz:-

write(“Yaşanacak bazı yerlerin listesi..”), nl, fail.

ulke_adlarini_yaz :-

ulke_adi(Ulke), write(Ulke), nl, fail.

ulke_adlarini_yaz:-

write(“Başka güzel yerler de vardır…”), nl.

GOAL ulke_adlarini_yaz.

İlk cümledeki ‘fail’ komutu çok önemlidir. Çünkü bu komut ilk cümle çalıştırıldıktan sonra programın ikinci cümleye geçişini sağlar. Buradaki write ve nl komutlarının başka bir iş yapmaması çok önemlidir. Son ‘fail’ komutundan sonra programın ikinci cümleciğe geçişi sağlanmalıdır.

6.4. Döngülü Geriye Dönüşün Uygulanması

Geriye dönüş işlemi bir hedefin bütün çözümlerinin bulunması açısından son derece önemlidir. Birden fazla çözüm sunamayan hedefler için yine de geriye dönüş işlemi yapılabilir. Bu da tekrarlama işlemini yapar. Örneğin:

tekrar.

tekrar:-tekrar.

gibi iki cümlecik sonsuz sayıda çözüm olduğunu göstermektedir.

Örnek:

PREDICATES

nondeterm tekrar

nondeterm karakteri_ekrana_yaz

CLAUSES

tekrar.

tekrar:-tekrar.

karakteri_ekrana_yaz:-

tekrar, readchar(Harf), /*Klavyeden girilen harfi oku ve C’ye ata*/

write(Harf),

Harf=’\r’, !. /* Satır sonu tuşuna (Enter/Return) basılmadıysa devam et*/

GOAL karakteri_ekrana_yaz, nl.Yukarıdaki örnekte tekrar işleminin nasıl yapılacağını görülebilir. Karakteri_ekrana_yaz:-… kuralı, ‘Enter/Return’ basılmadığı müddetçe, klavyeden girilen kararterleri kabul edip ekranda gösteren bir prosedür tanımlamaktadır.

Karakteri_ekrana_yaz kuralının çalışma mekanizması şöyle sıralanabilir:

1.     tekrar’ı çalıştır. (Hiçbir şey yapmaz)

2.     bir karakter oku (Harf)

3.     Harf karakterini yaz

4.     Harf’in satır sonu karakteri olup olmadığını kontrol et.

5.     Eğer satır sonu elemanı ise, işlemi bitir, değilse, geriye iz sürme işlemini yap ve alternatif ara. Buradaki write ve readchar kurallarının hiçbiri alternatif sağlayamaz. Dolayısıyla geriye dönüş hemen tekrar kuralına gider, bunun ise alternatif sunması tabiidir.

6.     İşlem devam eder. Bir karakter oku, onu ekrana yaz, satır sonu elemanı olup olmadığını kontrol et.

Harf’e değer atayan readchar(Harf) yükleminin öncesine geriye dönüş yapıldığı anda, Harf değişkeni serbest hale gelir. Değişken değerinin kaybolması geriye dönüş işlemi sayesinde alternatif çözümler elde etmek için çok önemlidir. Fakat geriye dönüş işlemi başka bir iş için kullanılamaz. Çünkü geriye dönüş işlemi alternatif ararken, işlemleri birçok kez tekrar edebilir. Fakat bu tekrarlar sırasında bir tekrardan diğerine geçişte hiçbir şey hatırlayamaz. Daha önce de söylediğimiz gibi, işlemlerden sonra değer ataması yapılan değişkenlerin tamamı, geriye dönüş işlemi sırasında bütün bu değerleri kaybederler. Böyle bir döngüde sayaç gibi bir şey kullanıp toplam, kayıt sayısı vs. gibi bir değeri tutmanın kolay bir yolu yoktur.

6.5. Rekursif Prosedürler

Tekrarlama işlemin yapmanın diğer bir yolu da rekursiyondur. Kendisini çağırabilen prosedüre rekursiv prosedür diyoruz. Rekursiv prosedürler çalışırken yaptıkları işlerin sayısını, toplamını veya işlemlerin ara sonuçlarını saklayabilir ve bunları bir döngüden diğerine rahatlıkla aktarabilirler.

Örnek:

N sayısının faktoriyelini hesaplamak için

1. Eğer N=1 ise, faktoriyel=1

2. Diğer durumlarda N-1’in faktoriyelini bul ve bunu N ile çarp

şeklindeki emirleri anlayıp uygulayan bir program yazalım. Örneğin 3 sayısının faktöriyelini bulmak için 2’nin faktöriyelini, 2’nin faktöriyelini bulmak için de 1’in faktöriyelini bulmamız gerekir. 1’in faktöryeli zaten bilindiğinden yapılması gereken tek şey 2 ve 1’in faktöriyellerini N sayısı olan 3 ile çarpmaktır. Görüldüğü gibi işlemler burada sonsuza kadar gitmemektedir. Şimdi bunları Prolog ile ifade etmeye çalışalım:

PREDICATES

faktoriyel(unsigned, real)

CLAUSES

faktoriyel (1, 1):-!.

faktoriyel (X, Faktoriyel_X):-

Y=X-1,

faktoriyel(Y, Faktoriyal_Y),

Faktoriyel_X=X*Faktoriyal_Y.

GOAL X=6, faktoriyel(X, Faktoriyel).

Programı 6 sayısının faktöriyelini bulur.

Burada ilginç bir durum vardır. Bilgisayar faktöriyel işleminin yarısında iken nasıl olur da faktöriyeli hesaplar? Faktöriyel kuralını X=6 olacak şekilde çağırılırsa, faktöriyel kendini X=5 için çağırılacaktır. Bu durumda X değeri 6 mı olacak 5 mi?

Cevap şudur: Bilgisayar faktöriyel prosedürünün bir kopyasını oluşturur ve bu kopyayı çağır. Kopyanın kendini faktoriyel prosedürünün aynısıymış gibi çalışır. Sadece argümanların ve değişkenlerin kopyalarına ihtiyaç duyulur.

Bu bilgi yığın olarak hafızada saklanır ve bir kural çağrıldığında her seferinde yeniden oluşturulur. Kural non-deterministic değil ise sona erdiği zaman bellek yığını sıfırlanır.

6.5.1. Rekursiyonun Avantajları

·       Başka türlü güvenli bir şekilde ifade edilemeyen algoritmaları daha açık bir şekilde ifade edebilir.

·       Mantıksal olarak iterasyondan çok daha basittir.

·       Listeleri işlemede çok yaygın olarak kullanılır.

Rekursiyon işlemi özellikle problem içerisinde dallanmaların mevcut olduğu, yani bir problemin çözümünün bir alt probleme bağlı olduğu durumlarda çok faydalıdır.

6.5.2. Sondan Rekursiyon Optimizasyonu

Rekursiyon işleminin en önemli dezavantajı, belleği fazlaca kullanmasıdır. Bir prosedür başka bir alt prosedürü çağırdığında, çağrıyı yapan prosedürün çağrıyı yaptığı anki çalışma durumu mutlaka kaydedilmelidir. Böylece çağrılan prosedürün yapması gereken işlem bittiği zaman, çağrıyı yapan prosedür kaldığı yerden işleme devam edebilir. Bunun dezavantajı şudur: Örneğin bir prosedür kendisini 100 defa çağırırsa, her seferki durum kaydedileceği için tam olarak 100 değişik durum hafızaya alınmış olur. Hafızaya alınan her duruma stack frame (yığın alanı) denir. 16 bitlik PC DOS sisteminde bu alan 64K ile sınırlı olup, ancak 3000-4000 yığın alacak kapasitedir. 32 Bit’lik sistemlerde teorik olarak bu alan GB düzeyine kadar çıkabilir, fakat bu kez de başka engeller ortaya çıkar. Yığın alanın azaltmak için ne yapılabilir?

Bir prosedürün, başka bir prosedürü kendisinin en son adımı olarak çağırdığını düşünelim. Çağrılan prosedür görevini yaptıktan sonra, çağrıyı yapan prosedürün yapması gereken başka şey kalmaz. Çağrıyı yapan prosedürün kendisin çalışma anını kaydetmesi gerekmez, çünkü o andaki bilgi artık gereksizdir. Çağrılan prosedür biter bitmez, program akışı normal biçimde devam eder.

Bu durum daha açık olarak aşağıdaki şekilde ifade edilebilir. A prosedürünün B prosedürünü, B prosedürünün ise C prosedürünü son adım olarak çağırdığını düşünelim. B prosedürü C’yi çağırdığında, B’nin başka bir şey yapması gerekmez. Yani C’nin o anki çalışma durumunu B olarak kaydetmek yerine, B’nin kaydedilen eski durumun C’ya aktarmak, depolanan bilgi içinde uygun değişiklik yapmak mümkündür. C bittiği zaman, doğrudan A prosedürü tarafından çağrılmış gibi olacaktır.

B prosedürünün C’yi çağırmak yerine, kendisini işlemin en son adımı olarak çağırdığını düşünelim. B prosedürü yine B’yi çağırdığı zaman, çağrıyı yapan B’nin yığın bilgisi, çağrılan B’nin yığın bilgisi ile yer değiştirilmelidir. Bu ise çok basit bir işlemden yani argümanların yeni değerleri almasından ibarettir. Daha sonra işlem, prosedürün baş kısmına gider. Prosedürel olarak bu olay bir döngüdeki kontrol değerlerinin yenilenmesine benzer.

Bu işlemlere sondan rekursiyon optimizasyonu veya son-çağrı optimizasyonu adı verilmektedir.

6.5.3. Sondan Rekursiyonun Kullanımı

Prologda bir prosedürün başka bir prosedürü ‘kendisinin en son adımı olarak çağırmasının’ ne anlama geldi konusu incelenecektir.

1.     Çağrı, cümlenin en son alt hedefidir.

2.     Bu cümlenin ilk kısımlarında geriye dönüş noktaları yoktur.

Aşağıdaki örnek bu iki şartı sağlamaktadır:

sayac(Sayi):-

write(Sayi), nl,

yeni_sayi=Sayi+1,

sayac(Yeni_sayi).

İşte bu prosedür sondan rekursif bir prosedürdür ve hafızada yeni bir yığına neden olmaksızın kendisini çağırır. Dolayısıyla hafızayı tüketmez. Bu programa GOAL sayac(0) değeri verilse, 0 ile başlayan tam sayılar yazılmaya başlanır ve işlem bitmez.

Örnek:

PREDICATES

sayac(ulong)

CLAUSES

sayac(Sayi):-

write(‘\r’,Sayi),

Yeni_sayi=Sayi+1,

sayac(Yeni_sayi).

GOAL nl, sayac(0).

Bu programa GOAL sayac(0) ile çalıştırılırsa, 0’dan başlamak üzere tam sayılar yazılmaya başlanır ve işlem bitmez.

6.5.3. Sondan Rekursiyonu Engelleme

1.     Eğer rekursiv çağrı en son adım değilse, prosedür sondan rekursiv değildir. Örneğin;

PREDICATES

rakam_yaz(ulong)

CLAUSES

rakam_yaz(Sayi):-

write(‘\r’, Sayi),

Yeni_sayi=Sayi+1,

rakam_yaz(Yeni_sayi), nl.

Goal nl, rakam_yaz(0).

Rakam_say prosedürü kendisini çağırdında, kontrolün yeniden rakam_say(Sayi) dönmesi için hafızada bir yığın kaydedilir. Çünkü son alt hedef ‘nl’dir ve bunun işleme girmesi gerekir. Dolayısıyla döngü bir süre sonra hata mesajı vererek durur.

2. Sondan rekursiyonu engellemenin bir diğer yolu da rekursiyonun yapıldığı anda, geriye henüz denenmemiş bir alternatifin kalmasıdır. Bu durumda prosedürün son durumunun kaydedilmesi gerekir. Çünkü rekürsiv çağrının başarısız olması durumunda çağrıyı yapan prosedürün geriye gidip denenmemiş bir alternatifi deneyebilmesi gerekir.

Örnek:

Clauses

rakam_yaz(Sayi):-

write(‘\r’, Sayi),

Yeni_sayi=Sayi+1,

rakam_yaz(Yeni_sayi).

rakam_yaz(Sayi):-

Sayi<0, write(“Sayi sıfırdan küçüktür.”).

GOAL rakam_yaz(0).

Burada rakam_yaz cümlesi, ikinci cümle denenmeden önce kendisini çağırır. Program yine bir süre sonra hafıza tükenmesinden dolayı durur.

1.     Denenmemiş alternatifin rekursiv prosedürün kendisi için ayrı bir cümle olması gerekmez. Rekürsiv prosedürün çağırdığı başka bir cümlede bir alternatif de olabilir. Örnek:

rakam_yaz(Sayi):-

write(‘\r’, Sayi),

Yeni_sayi=Sayi+1,

Kontrol_et(Yeni_sayi).

rakam_yaz(Yeni_sayi).

Kontrol_et (Z):-Z>=0.

Kontrol_et (Z):- Z<0.

Sayi değişkeninin değeri normalde pozitiftir. Bu durumda rakam_yaz her ne zaman kendisini çağırsa, kontrol_et yükleminin ilki doğrulanır, fakat ikinci kontrol_et yüklemin henüz doğrulanmamış durumdadır. Bu yüzden rakam_yaz yüklemi, geriye dönüş işlemi sırasında kontrol etmek üzere yığın bölgesine bir kopya almak zorundadır.

PREDICATES

yanlis_sayac1(long)

yanlis_sayac2(long)

yanlis_sayac3(long)

kontrol_et(long)

CLAUSES

/* Rakam_yaz: Rekursiv çağrı son adım değildir.*/

yanlis_sayac1(Sayi):-

write (‘\r’, Sayi),

Yeni_sayi=Sayi+1,

yanlis_sayac1(Yeni_sayi), nl.

/* Rakam_yaz2: Rekursiv çağrı yapıldığı anda henüz denenmemiş bir clause var.*/

yanlis_sayac2(Sayi):-

write (‘\r’, Sayi),

Yeni_sayi=Sayi+1,

yanlis_sayac2(Yeni_sayi).

yanlis_sayac2(Sayi):-

Sayi<0,

write (“Sayı negatiftir.”).

/* Rakam_yaz3: Rekursiv çağrıdan önce çağrılan yüklemde denenmemiş bir alternatif var.*/

yanlis_sayac3(Sayi):-

write (‘\r’, Sayi),

Yeni_sayi=Sayi+1,

kontrol_et(Yeni_sayi),

yanlis_sayac3(Yeni_sayi).

kontrol_et(Z):-

Z>=0.

kontrol_et(Z):-

Z<0.

GOAL yanlis_sayac1(1458).

6.6. Rekursiyonda Cut Kullanımı

Bir prosedürün sondan rekürsiyonlu olup olmadığından kesin olarak emin olunamayacağı düşünülebilir. Rekursiv olan çağrıyı, son cümleciğin en son alt hedefi yaparak, bu problemi çözmek mümkündür. Fakat yine de hedef cümlesinin çağıracağı diğer prosedürler arasında denenmemiş başka bir alternatif olmadığını nasıl garantiye alabiliriz?

Bunu garantiye almak gerekmez, çünkü ‘!’ yani Cut komutunu kullanarak bulunabilecek bütün alternatiflerin önünü kesmek mümkündür. Cut komutunun anlamı şöyleydi. Goal cümleciği ile belirlenen yükleme uygun çözüm ararken, gelinen nokta bizim aradığımız noktadır. Artık öteye gitmeye gerek bulunmamaktadır. Alternatifler de ortadan kalktığı için, artık hafızada yığın oluşturmaya gerek kalmaz.

Yukarıdaki örnekte görülen rakam_say cümlesini, şöyle düzeltmek mümkündür (İşlemdeki ismini değiştirelim):

Cut_sayaci3(Sayi):-

Write (‘\r’, Sayi),

Yeni_sayi=sayi+1,

Kontrol_et(Yeni_sayi), !, cut_sayaci3(Yeni_sayi).

Cut komutu yanlis_sayac2 cümleciğinde aynı şekilde etkili olur. Çünkü testi negatife düşürüp ikinci cümlecikten birinciye taşır.

Cut_sayaci2(Sayi):-

Sayi>=0, !,

Write (‘\r’, Sayi),

Yeni_sayi=Sayi+1,

cut_sayaci2(Yeni_sayi).

Cut_sayaci2(Sayi):- write (“Sayi negatiftir.”).

Cut komutunu non-deterministic olan, yani birden fazla çözüm sağlayan yüklemlerle çalışırken, alınan bilginin yeterli olduğuna inanıldığı anda rahatlıkla kullanılabilir.

Aynı şey yanlis_sayac3 için de geçerlidir. Kontrol_et yüklemi işaretine bağlı olarak Sayi üzerinde biraz daha işlem yapılmasını gerektiren bir durumu göstermektedir. Fakat kontrol_et kodu non-deterministic olduğu için Cut komutu iyi bir çözümdür. Kontrol_et yüklemi şöyle yazılabilir:

Kontrol_et(Z):- Z>=0, !, /* Z’yi kullanarak işlem yapmak*/

Kontrol_et(Z):-……

Cut komutu kullanıldığı zaman bilgisayar denenmemiş bir alternatifin kalmadığına karar verir ve bu yüzden de yığın oluşturma yoluna gitmez. Aşağıdaki programda yanlis_sayac2 ve yanlis_sayac3’ün düzeltilmiş hali vardır.

PREDICATES

cut_sayaci2(long)

cut_sayaci3(long)

nondeterm kontrol_et(long)

CLAUSES

/* Rekursiv çağrı yapıldığı anda henüz denenmemiş bir seçenek var*/

cut_sayaci2(Sayi):-

Sayi>=0, !,

write(‘\r’, Sayi),

Yeni_sayi=Sayi+1,

cut_sayaci2(Yeni_sayi).

cut_sayaci2(_):-

write(“Sayi negatiftir.”).

/* Rekursiv çağrıdan önceki cümlecikte henüz denenmemiş bir seçenek var*/

cut_sayaci3(Sayi):- write(‘\r’, Sayi),

Yeni_sayi=Sayi+1,

kontrol_et(Yeni_sayi), !, cut_sayaci3(Yeni_sayi).

kontrol_et(Z):-Z>=0.

kontrol_et(Z):-Z<0.

GOAL cut_sayaci3(214).

6.7. Argümanların Döngü Değişkeni Olarak Kullanımı

Rukursiyon bölümünde verilen bir sayının faktöriyelini hesaplayan bir program geliştirilmişti. Bu durum Pascal’da şöyle ifade edilebilir:

P:=1;

For I:=1 to N do P:= P*I;

FactN:=P;

N, faktöriyeli hesaplancak olan sayı, FactN, N sayısının faktöriyeli, I değeri 1’den N’e kadar değişen döngü değişkeni ve P ise ara sayıların değerlerinin toplandığı değişkendir.

Bu programı Prolog’a aktarırken yapılması gereken ilk şey, for komutu için daha basit bir döngü kurmak ve her adımda I değişkenine ne olduğunu daha açık şekilde göstermektir. Program while ile, aşağıdaki biçimde yazılır.

P:=1;                    /* P ve I değişkenlerine ilk değeri ata.*/

I:=1;

While I<= N do               /* Döngü kontrolü*/

Begin

P:=P*I;                 /*P ve I değişkenlerine yeni değerleri ata*/

I:=I+1;

End;

FactN:=P;            /* Sayının Faktöriyelini Yaz..*/

Aynı program Prolog ile aşağıdaki gibi yazılır.

PREDICATES

faktoriyel(unsigned, real)

carpanlarin_faktoriyeli(unsigned, long, unsigned, long)

CLAUSES

faktoriyel(Sayi, Sayinin_Faktoriyeli):-

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, 1, 1).

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I,P):-

I<=Sayi, !,

Yeni_P=P*I,

Yeni_I=I+1,

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, Yeni_I, Yeni_P).

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I, P):-

I>Sayi,

Sayinin_faktoriyeli=P.

GOAL faktoriyel(5, Sayinin_Faktoriyeli).

Programın ayrıntıları aşağıda verilmiştir.

Faktoriyel cümleciğinin Sayi ve Sayinin_Faktoriyeli olmak üzere iki değişkeni vardır. Bunlardan sayı, faktöriyeli bulunacak sayı, diğeri ise bu sayının faktöriyelidir. Rekursiyon işlemi aslında carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I, P) cümlesinden meydana gelir. Bu cümledeki 4 değişkenin bir adımdan diğerine aktarılması zorunludur. Bu yüzden faktoriyel sadece carpanlarin_faktoriyeli yüklemini harekete geçirir ve sayı, sayının faktöriyeli, I ve P’nin ilk değerlerini buraya aktarır. Böylece

faktoriyel(Sayi, Sayinin_Faktoriyeli):-

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, 1, 1).

sayesinde I ve P değişkenleri ilk değerlerini almış olurlar. Burada dikkat çeken şey, faktoriyel yükleminin hiçbir değeri olmayan Sayinin_faktoriyeli değerini carpanlarin_faktoriyeli yüklemindeki sayinin_faktoriyeli değişkenine aktarmasıdır. Prologun yaptığı tek şey, iki cümlede bulunan Sayinin_faktoriyeli değişkenlerini eşleştirmektir. Aynı şey carpanlarin_faktoriyel’i yüklemindeki sayinin_faktoriyeli değişkeninin rekursiv çağrı esnasında kendisine atanmasında da olur. Son aşamada ise Sayinin_faktoriyeli bir değer alacaktır. Bu değeri aldığı zaman daha önceki bütün sayinin_faktoriyeli değişkeni aynı değeri alır. Gerçekte ise sayinin_faktoriyeli değişkeninin bir değeri vardır. Çünkü Sayinin_faktoriyeli değişkeni, ikinci cümledeki carpanlarin_faktoriyeli cümlesinden önce hiçbir zaman gerçek anlamda kullanılmaz.

Şimdi carpanlarin_faktoriyeli yüklemine gelelim. Bu yüklem, döngünün devam şartı olan I sayısının Sayi’dan az veya eşit olup olmadığını kontrol eder. Daha sonra Yeni_I ve Yeni_P değerleriyle kendisini rekursiv olarak çağırır. Burada Prolog’un başka bir özelliği ortaya çıkmaktadır. Diğer dillerin çoğunda mevcut olan

P=P+1

şeklindeki bir ifade Prolog’da yanlıştır. Bu yüzden Prolog’da bir değişkenin değerini değiştirmek mümkün değildir. Bunun yerine

Yeni_P=P+1

şeklinde bir ifade kullanmak gerekir. Bu durumda ilk cümlecik

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, I,P):-

I<=Sayi, !,

Yeni_P=P*I,

Yeni_I=I+1,

carpanlarin_faktoriyeli(Sayi, Sayinin_Faktoriyeli, Yeni_I, Yeni_P).

şeklinde yazılabilir. Buradaki Cut komutu, cümlecik yüklemde en sonda olmasa da, son çağrı optimizasyonuna imkan tanır. Zamanla I değişkeninin değeri Sayi değişkeninin değerine geçer. Bu durumda işlem P’nin o anki değerini sayinin_faktoriyeli ile eşleştirir ve rekursiyonu bitirir. Bu nokta ikinci cümlede, yani birinci cümledeki I<=Sayi testinin yanlış çıktığı zaman meydana gelecektir.

carpanlarin_faktoriyeli(Sayi, Sayinin_faktoriyeli, I, P):- I>Sayi, sayinin_faktoriyeli=P.

haline dönüşür. Sayinin_faktoriyeli=P ifadesinin ayrı bir satırda olması gerekmez. Çünkü sayinin_faktoriyeli değişkeninin yerine P değişkenini yazarak değer ataması yapılabilir. Ayrıca I>Sayi testi de gereksizdir, çünkü bunun tersi zaten birinci cümlede denenmiş olmaktadır. Bunun son hali:

carpanlarin_faktoriyeli(_, Sayinin_faktoriyeli,_, Sayinin_Faktoriyeli) olur.

PREDICATES

faktoriyel(unsigned,real)

faktoriyel(unsigned,real,unsigned,real)

CLAUSES

faktoriyel(Sayi, Sayinin_faktoriyeli):-

faktoriyel(Sayi, Sayinin_faktoriyeli,1,1).

faktoriyel(Sayi, Sayinin_faktoriyeli, Sayi, Sayinin_faktoriyeli):-!.

faktoriyel(Sayi, Sayinin_faktoriyeli,I,P):-

Yeni_I = I+1,

Yeni_P = P*Yeni_I,

faktoriyel(Sayi, Sayinin_faktoriyeli, Yeni_I, Yeni_P).

GOAL faktoriyel(12, Sayinin_Faktoriyeli).

6.8. Rekursiv Veri Yapıları

Sadece kurallar değil, aynı zamanda veri yapıları da rekursiv olabilir. Prolog bu tür yapıların kullanılmasına imkan tanıyan yaygın kullanılan tek programlama dilidir. Bir veri türü, kendisi gibi yapıları içeren başka yapıların kullanımına izin veriyorsa, bu tür veri tiplerine rekursiv denir. En temel rekursiv veri türü listelerdir. Fakat ilk bakışta rekursiv yapıda oldukları belli olmaz.

Şimdi rekursiv olan bir veri türü tanımlayıp, bunu oldukça hızlı bir sıralama programında kullanılması gösterilecektir. Bu veri türünün yapısı aşağıda ağaç yapısında verilmiştir. Görüldüğü gibi Ali ve Ayşe ile gösterilen her bir dal kendi içinde ayrıca alt dallara ayrılmıştır. Bundan dolayı da bu tür bir yapı rekursiv olarak adlandırılır.

Şekil 6.1. Aile Fertlerinin Şecere Olarak Gösterilmesi

6.9. Ağaç Biçimindeki Veri Türleri

Rekursiv veri türleri, ALGOL60 dilinden Pascal dilini çıkaran Niklaus Wirth tarafından popüler hale getirilmiştir. Bu veri tiplerini Pascal’da kullanmamış, fakat faydalarına değinmiştir.

Visual Prolog, otomatik olarak oluşturulup, pointerlar içereren gerçek rekursiv tip tanımlara imkan tanır. Örneğin aşağıdaki biçimde bir ağaç yapısı tanımlamak mümkündür.

Domains

Agac_yapisi= agac(string, agac_yapisi, agac_yapisi)

Bu ifade agac isimli bir operatör tanımlandığını, bunun da biri string, ikisi ayrıca ağac yapısında, toplam üç değişkeninin olduğunu gösterir.

Ağaç yapısındaki hiçbir veri türü sonsuza kadar gidemeyeceği, rekursiyonu da bitirmek mümkün olmadığı için bu ifade tam olarak doğru değildir. Örneğin bazı hücrelerin diğer hücrelerle bağlantıları yoktur. Prolog’da ağaç yapısındaki bir veri yapısında iki tip operatör tanımlanır. Bunlar üç ayrı argümanı olan agac veya hiçbir argümanı olmayan bos operatörleridir.

Domains

Agac_yapisi= agac(string, agac_yapisi, agac_yapisi); bos

Yukarıdaki agac ve bos adındaki yüklemlerin Prolog’da önceden tanımlı bir anlamları yoktur ve programcı bunların yerine istediği başka isimleri kullanabilir. Şimdi Şekil 6.1’de gösterilen tablonun Prolog’da nasıl ifade edilebileceği incelenecektir.

agac(“Emine”, agac(“Ali”, agac(“Hasan”, bos, bos) agac(“Fatma”, bos, bos))

agac(“Ayşe”, agac(“Fuat”, bos, bos) agac(“Leyla”, bos, bos)))

6.9.1. Bir Ağaç Yapısında Tarama Yapma

Ağaç şeklindeki yapılarda yoğun olarak yapılan işlem, ya bütün hücreleri incelemek ve hücreleri bir şekilde işlemek veya belirli bir değeri aramak ve bütün değerleri toplamaktır. Buna bir ağacı taramak adı verilmektedir.

Bunun en temel algoritmalarından biri şudur:

2.     Eğer ağaç boş ise hiçbir şey yapma

3.     Eğer dolu ise, o anki noktayı incele, buradan soldaki alt dala geç ve daha sonra sağdaki alt dalı incele.

Algoritma da tıpkı ağaç yapısı gibi rekursivdir. Soldaki ve sağdaki ağaç yapılarını orijinal ağaç gibi inceler. Prolog bunu iki cümlecik ile ifade eder, biri boş diğeri de dolu ağaç içindir.

incele(bos)

incele(agac(A, B, C)):-

incele(A), incele(B), incele(C).

Aşağıdaki ağaç tarama algoritması aşağıya-doğru-arama olarak bilinir. Çünkü Prolog her dalda mümkün olduğu kadar derinlemesine gider, bu dalın sonuna ulaştığı anda geriye döner ve başka bir dalı incelemeye başlar. (Şekil 6.2).

Şekil 6.2. Şekil 6.1’deki ağaç yapısında Aşağıya-Doğru-Arama metodunun uygulanması.

Prologun yukarıdaki ağacı nasıl tarayacağı yukarıda belirtilmiştir. Aşağıdaki program, ağaç yapısını tarayarak ağacın her elemanını ekranda görüntülenir.

DOMAINS

agac_yapisi=agac(string, agac_yapisi, agac_yapisi); bos_dal

PREDICATES

agaci_tara(agac_yapisi)

CLAUSES

agaci_tara(bos_dal).

agaci_tara(agac(Isim, Sol, Sag)):-

write(Isim, ‘\n’),

agaci_tara(Sol), agaci_tara(Sag).

GOAL

agaci_tara(agac(“Emine”, agac(“Ali”, agac(“Hasan”, bos_dal, bos_dal),

agac(“Fatma”, bos_dal, bos_dal)), agac(“Ayşe”, agac(“Fuat”, bos_dal, bos_dal), agac(“Leyla”, bos_dal, bos_dal)))).

Programı yazıp çalıştırılırsa ekranda şunlar görülür.

Emine

Ali

Hasan

Fatma

Ayşe

Fuat

Leyla

yes

aşağıya-doğru-arama Prolog’un bir veri tabanını tararken kullandığı yönteme çok benzer. Bu tarama esnasında cümlecikler ağaç şeklinde düzenlenir ve her bir dal ayrı ayrı incelenerek sorgu başarısız oluncaya kadar işleme devam edilir.

6.10. Bir Ağaç Oluşturmak

Ağaç biçiminde bir yapı oluşturmanın bir yolu operatörlerden ve argümanlardan oluşan iç içe geçmeli bir yapı yazmaktır. Prolog, hesaplama yaparak elde ettiği değerlerden bir ağaç oluşturabilir. Her bir adımda, argümanların eşleştirilmesiyle boş alt dalın içine boş olmayan bir dal yerleştirilir. Basit verileri kullanarak bir hücreli bir ağaç oluşturmak çok basittir.

agac_olustur(Sayi, agac(Sayi, bos_dal, bos_dal)).

Yukarıdaki satır Prolog için “Eğer Sayi bir sayı ise, agac(Sayi, bos_dal, bos_dal) tek hücreli bir ağaç olup veri olarak bu sayıyı içerir” anlamına gelir. Ağaç yapısı oluşturmak da en az bu kadar basittir. Örneğin

sola_yerlestir(Sayi, agac(A, _, B), agac(A, Sayi, B)).

Prosedürü üç argümandan oluşmuştur. İlk ağacı, ikinci ağacın alt dalı olarak alır ve üçüncü ağacı da sonuç olarak verir. Yapılan tek şey ise, sadece argümanları bire bir eşleştirmektir. Örneğin agac(“Ali”, bos_dal, bos_dal) şeklindeki bir yapıyı agac(“Emine”, bos_dal, bos_dal) yapısının sol alt dalı olarak yerleştirilmek istenirse, yazılması gereken tek şey şu hedefi çalıştırmaktır.

sola_yerlestir(agac(“Ali”, bos_dal, bos_dal), agac(“Emine”, bos_dal, bos_dal), T).

T’nin değeri agac(“Emine”, agac(“Ali”, bos_dal, bos_dal), bos_dal)

olur. Aşağıdaki örnekte bu teknik gösterilmiştir.

DOMAINS

agac_yapisi = agac(string,agac_yapisi,agac_yapisi); bos_dal()

PREDICATES

agac_olustur(string,agac_yapisi)

sola_yerlestir(agac_yapisi,agac_yapisi,agac_yapisi)

saga_yerlestir(agac_yapisi, agac_yapisi, agac_yapisi)

basla

CLAUSES

agac_olustur(A,agac(A,bos_dal,bos_dal)).

sola_yerlestir(X,agac(A,_,B),agac(A,X,B)).

saga_yerlestir(X,agac(A,B,_),agac(A,B,X)).

basla:-      

%Tek daldan oluşan ağaçları oluşturalım

agac_olustur(“Hasan”,Ha),

agac_olustur(“Fatma”,Fa),

agac_olustur(“Ali”,Al),

agac_olustur(“Fuat”,Fu),

agac_olustur(“Leyla”,Le),

agac_olustur(“Ayse”,Ay),

agac_olustur(“Emine”,Em),

%dalları birleştirelim

sola_yerlestir(Ha, Al, Al2),

saga_yerlestir(Fa, Al2, Al3),

sola_yerlestir(Fu, Ay, Ay2),

saga_yerlestir(Le, Ay2, Ay3),

sola_yerlestir(Al3, Em, Em2),

saga_yerlestir(Ay3, Em2, Em3),

%sonucu göster

write(Em3,’\n’).

GOAL basla.

Program yazılıp çalıştırılınca ekranda şu sonuç görüntülenir.

agac(“Emine”,agac(“Ali”,agac(“Hasan”,bos_dal,bos_dal),agac(“Fatma”,bos_dal,bos_dal)),agac(“Ayse”,agac(“Fuat”,bos_dal,bos_dal),agac(“Leyla”,bos_dal,bos_dal)))

yes

Prolog’da bir değişken herhangi bir değeri aldıktan sonra, artık bu değeri değiştirmenin bir yolu yoktur. Bundan dolayı yukarıdaki örnekte çok sayıda değişken ismi kullanılmıştır. Her yeni değer oluştuğunda, yeni bir değişken tanımlamamız gerekir.

6.11. Binary Arama Ağacı

Şimdiye kadar ağaç yapısı, bir ağaç ve elemanları arasındaki ilişkileri göstermek için kullanıldı. Temel amaç bu olsaydı, bunun yerine cümleciklerle ifade edilen olgular kullanmak mümkün olurdu. Oysa ağaç yapısının başka kullanımları da vardır. Ağaç yapılarını kullanarak veri saklamak ve istenildiğinde bu değerleri bulmak çok kolaydır. Bu maksatla oluşturulan ağaç yapısına arama ağacı adı verilir. Programcı açısından buna liste veya array tipindeki verilere bir alternatif gözüyle bakılabilir. Basit bir ağaç yapısını tararken, öncelikle o an içinde bulunulan hücreye, daha sonra bu hücrenin solu ve sağına, belirli bir değeri ararken, bir ağaç yapısındaki bütün hücrelere bakılması gerekebilir.

İşte binary arama ağacı, herhangi bir hücreye bakarak aranan bir değerin hangi alt dalda bulunacağını tahmin edebilecek şekilde tasarlanır. Bunun için veri parçaları arasında ne tür sıralama olacağının (Örneğin alfabetik veya sayısal sıralama) tanımlanması gerekir. Sol taraftaki alt dalda bulunan veri, o an içinde bulunulan hücredeki veriden önce gelir ve sağ taraftan devam edilir. Aşağıdaki akış şemasını inceleyim.

Şekil 6.3. Binary tarama yapısı

Farklı sırada yerleştirilen aynı isimlerin farklı bir ağaç şeması oluşturur. Ayrıca, şemada 10 isim olmasına rağmen, bunlardan herhangi biri en fazla 5 adımda bulunabilir.

Binary bir tarama yapısında bir hücreye bakarken, geriye kalan hücrelerin yarısını elimine edilir. Bu yüzden tarama çok çabuk ilerler. Bir Binary Tarama Yapısındaki bir maddeyi bulmak için gereken zaman ortalama olarak log2N’dir.

Bir ağaç oluştururken, işe önce boş bir ağaç ile başlanır. Daha sonra diğer parçalar teker teker ilave edilir. Bir madde ilave etmek için gereken prosedür, bir maddeyi aramak için gereken ile tamamen aynıdır.

1.     Eğer içinde bulunulan nokta boş bir ağaç ise, buraya bir madde yerleştir.

2.     Değilse, buraya yerleştirilecek maddeyi, orada saklı olan madde ile karşılaştır. Karşılaştırmanın sonucuna göre, maddeyi sol veya sağ alt dala yerleştir.

Bunun için Prolog’a 3 cümle gerekir. İlk cümle:

yerlestir(Yeni_Madde, bos, agac(Yeni_madde, bos, bos):-!.

Bunu konuşma diline “Yeni_madde’yi bos olan yere yerleştirmenin sonucu agac(Yeni_madde, bos, bos) olur.” Buradaki Cut komutu, cümlenin uygun olması durumunda başka bir cümlenin denenmemesi içindir.

İkinci ve üçüncü cümleler boş yerlere yerleştirmek için kullanılır.

Yerlestir(Yeni_Madde, bos, agac(Eleman, Sol, Sag), agac(Eleman, Yeni_Sol, Sag):- Yeni_Madde<Eleman, !, yerlestir(Eleman, Sol, Yeni_Sol).

Yerlestir(Yeni_Madde, bos, agac(Eleman, Sol, Sag), agac(Eleman, Sol, Yeni_Sag):- yerlestir(Yeni_Madde, Sag, Yeni_Sag).

Eğer Yeni_Madde<Eleman olursa, değer sol alt dala yerleştirilir; aksi takdirde sağ alt dala yerleştirilir.

6.12. Ağaca Bağlı Sıralama

Ağaç yapısı oluşturulduktan sonra, bu yapı içerisindeki bütün maddeleri alfabetik olarak elde etmek çok kolaydır. Kullanılacak algoritma aşağıya-doğru-tarama yönteminin değişik bir şeklidir:

1.     Eğer ağaç boş ise hiçbir şey yapma.

2.     Değilse, sol tarafta olan bütün değerleri, daha sonra o anki elemanı, sonra da sağ taraftaki bütün elemanları al.

Prolog diliyle, aşağıdaki şekilde ifade edilir.

Hepsini_al(bos).

Hepsini_al(agac(Madde, Sol, Sag)):-

Hepsini_al(Sol), isleme_devam_et(Madde), hepsini_al(sag).

Örnek:

Aşağıdaki programda ekrandan yazılan karakterler, daha sonra alfabetik sırayla görüntülenmektedir. Karakterler kendi aralarında büyük veya küçük olmalarına göre de sıralanmaktadır. Programda kullanılan bazı yüklemler daha sonra incelenecektir.

DOMAINS

karakter_dizisi = agac(char, karakter_dizisi, karakter_dizisi); son

PREDICATES

nondeterm basla(karakter_dizisi)

eylem(char, karakter_dizisi, karakter_dizisi)

agac_olustur(karakter_dizisi, karakter_dizisi)

yerlestir(char, karakter_dizisi, karakter_dizisi)

agaci_yaz(karakter_dizisi)

nondeterm tekrar

CLAUSES

basla(Agac):-

tekrar,nl,

write(“***********************”),nl,

write(“Agaci guncelleme  :  1 \n”),

write(“Agaci incelemek   :  2 \n”),

write(“Programi bitirmek :  7 \n”),

write(“***********************”),nl,

write(“Tercihiniz > “),

readchar(X),nl,

eylem(X, Agac, Yeni_agac),

basla(Yeni_agac).

eylem(‘1’,Agac,Yeni_agac):-

write(“Istediginiz karakterleri yaziniz, bitirmek için # karakterini giriniz: “),nl,

agac_olustur(Agac, Yeni_agac).

eylem(‘2’,Agac,Agac):-

agaci_yaz(Agac),

write(“\nDevam etmek için bir tusa basiniz..”),

readchar(_),nl.

eylem(‘7’, _, son):-

exit.

agac_olustur(Agac, Yeni_agac):-

readchar(C),

C<>’#’,!,

write(C, ” “),

yerlestir(C, Agac, Gecici_agac),

agac_olustur(Gecici_agac, Yeni_agac).

agac_olustur(Agac, Agac).

yerlestir(Yeni,son,agac(Yeni,son,son)):-!.

yerlestir(Yeni,agac(Eleman,Sol,Sag),agac(Eleman,Yeni_sol,Sag)):-

Yeni<Eleman,!,

yerlestir(Yeni,Sol,Yeni_sol).

yerlestir(Yeni,agac(Eleman,Sol,Sag),agac(Eleman,Sol,Yeni_sag)):-

yerlestir(Yeni,Sag,Yeni_sag).

agaci_yaz(son).

agaci_yaz(agac(Madde,Sol,Sag)):-

agaci_yaz(Sol),

write(Madde, ” “),

agaci_yaz(Sag).

tekrar.

tekrar:-tekrar.

GOAL write(“Yazilan karakterleri siralama “),nl, basla(son).


7. LİSTELER VE REKÜRSİYON

Çok sayıda eleman içeren nesnelerle çalışmak, yani liste işlemek, Prolog’un güçlü yönlerinden biridir. Daha önce kısaca anlatılan bu konu, burada daha ayrıntılı olarak ele alınacaktır. Listelerin ne oldukları, nasıl tanımlandıkları ve uygulama programlarında nasıl kullanılabilecekleri hakkında bazı örnekler çözülecektir. Liste işleme metoduna rekursiv ve prosedürel yönlerden yaklaşırken, Prolog’un çok önemli yüklemlerinden olan member ve append üzerinde durulacaktır.

Daha sonra verilen dahili bir sorgu için mümkün olan bütün çözümleri bulan ve görüntüleyen findall standart yüklemini incelenecektir.

7.1. Listeler

Bir listenin, çok sayıda nesne içeren bir nesne olduğu bilinmektedir. Prolog’daki bir liste, diğer dillerdeki dizilere(array) karşılık gelir. Listelerin dizilerden en önemli farkı, bir diziyi kullanmadan önce bu dizide kaç tane eleman olacağını önceden belirtmenin gerekmemesidir. Eğer birleştirilecek nesnelerin sayısı önceden biliniyorsa, bunlar tek bir bileşik veri yapısının argümanı haline getirilebilir.

Elemanları a, b ve c olan bir liste

[a, b, c]

şeklinde ifade edilir. Burada a, b ve c birer elemandır ve bu elemanlar bir virgül ile ayrılarak […..] arasında yazılırlar.

Örnekler:

[araba, ev, televizyon]

[“Mahmut AKSOY”, “Sefer KAÇAR”, “Mahmut ÜSTÜNDAĞ”]

7.2.1. Liste Tanımlanması

Liste tanımları programların domains bölümlerinde yapılır. Tamsayılardan oluşan bir liste

Domains

tamsayilar_listesi = integer*

şeklinde tanımlanır. Burada * tamsayilar_listesi argümanının tamsayılardan oluşan bir liste olduğunu gösterir. Liste tanımlarken, listeye verilen ismin Prolog’da hiçbir önemi yoktur. Önemli olan şey * ile tanımlı kelimenin bir listeyi temsil ettiğinin belirtilmesidir.

Bir listenin elemanları herhangi bir şey olabileceği gibi, başka listeler de eleman olarak kullanılabilirler. Dikkat edilmesi gereken şey, bir listedeki elemanların tamamının aynı tipde olması, bu elemanların tipinin de ayrıca tanımlanmasıdır.

Örnek:

Domains

Benim_listem = elemanlarim*

elemanlarim= integer /*real, symbol vs. olabilir.*/

Fakat bir listede bulunan standart tiplerin karışık olarak kullanılması mümkün değildir. Örneğin

benim_listem = elemanlarim*

elemanlarim= integer; real; symbol

tanımlaması yanlıştır. Fakat integer, real ve symbol tiplerinden oluşan bir liste tanımlamak için farklı operatörler kullanılabilir:

benim_listem = elemanlarim*

elemanlarim= tamsayi(integer); reel_sayi(real); karakter(symbol)

7.2.2. Bir Listenin Parçaları: Baş ve Kuyruk

Bir liste iki kısımdan oluşur. Bunlar listenin ilk elemanının oluşturduğu baş ve geriye kalan elemanların oluşturduğu kuyruk kısmıdır. Yani bir listenin baş kısmı daima sadece tek eleman, kuyruk kısmı ise daima ayrı bir listeden ibarettir.

Örnek:

[a, b, c] listesinde a listenin başı; b ve c ise kuyruk kısmıdır.

[a] listesinde listenin başı a olur. [], yani boş bir liste de listenin kuyruk kısmıdır. Boş bir listeyi baş ve kuyruk olarak ayırmak mümkün değildir. Dolayısıyla bir listenin kuyruk kısmının her seferinde ilk elemanı alınırsa, sonuçta boş bir listeye ulaşılır. Bu yüzden listeleri bileşik nesneler gibi ağaç yapısında görmek mümkündür. Örneğin [a, b, c, d] listesine bu işlem aşağıdaki gibi uygulanır.

                              liste

                              /    \

                           a    liste

                                 /    \

                               b    liste

                                     /    \

                                   c    liste

                                         /    \

                                        d     [ ]

Burada [a] ile a birbirinin aynısı değildir. Çünkü a tek başına bir eleman iken [a] tam bir bileşik yapıdadır. Çünkü  [a]

         liste

         /    \

        a     [ ]

şeklinde ifade edilir.

7.2.3. Listelerin İşlenmesi

Prologda bir listenin elemanlarını virgüle ayırmak yerine, baş ve kuyruk kısımlarını daha belirgin olarak ifade etmek için sadece baş ve kuyruk kısımları dikey çizgi ile ‘|’ ayrılır.

Örneğin:

[a, b, c] yerine [a|[b, c]] veya benzer şekilde devam edersek [a|[b|[c]]] biçimi kullanılabilir. Burada [c] listesini de baş ve kuyruk olarak ayırırsak, [a|[b|[c|[]]]] olur.

Tablo 7.2. Listelerin baş ve kuyruk halinde gösterilmeleri

Liste

Baş

Kuyruk

[‘a’, ‘b’, ‘c’]

‘a’

[‘b’, ‘c’]

[ ‘a’ ]

‘a’

[] /* Boş liste*/

[ ]

Tanımsız

Tanımsız

[[1, 2, 3], [2, 3, 4], []]

[1, 2, 3]

[[2, 3, 4], []]

 

Bilgi Bankası /

Ses Kartları

 Ses Kartlari

İlk IBM uyumlu PC dizayn edildiginde bir is makinesi olarak dizayn edilmisti. Dolayisiyla içerisinde bir ses isleme mimarisi bulunmuyordu. Ve bilgisayarlar uzun süre ses olarak sadece uyari mesajlarini üretebildi. Macintosh beep ve klik seslerinden daha gerçekçi sesler üretebilen eklentilerini üretti, ama PC'ler hala entegre ses sistemlerine sahip degildi. Bu yüzden hala sonradan eklenen ses kartlari kullaniliyor...

Sesin Anatomisi
Iki veya daha fazla nesne etkilestiginde, enerjisi sürekli degisen bir dalga yayar. Bu dalga etrafinda hava basinci yaratir. Ve beyin bunu ses olarak algilar.

Ses bir mikrofondan kaydedildiginde, mikrofonun diyaframina uyguladigi basinç, o anki degisimlerine bagli olarak analog bir elektrik akimina dönüsür. Böylece ses dalgasi kaydedilmis olur.

Ses Kartinin Yapisi
Modern bir ses karti içerisinde sesi kaydedecek ve olusturacak birimler içerir. Ses olusturmada iki temel yol vardir:

·         FM synthesiser ile

·         Dijitallestirilmis ya da örneklenmis ses ile

Ses karti içerisinde 16 bitlik (ses kartina bagli) Dijital-Analog (DAC) ve Analog-Dijital (ADC) dönüstürücüleri ve bir programlanabilir örnek zamanlayici vardir. Bilgisayar bilgiyi dönüstürücülerden okur veya dönüstürücülere gönderir. Örnek zamanlayici da dönüstürücülerin PC tarafindan kontrolünü saglar. Bu sesin örnekleme frekansini belirler.

Çogu ses karti bir veya daha fazla direk bellek erisimi (DMA) kanali kullanarak ses donanimindan yazar ve ondan okur. DMA tabanli ses kartlari çalma ve kaydetme islemi için kanallari kullanirlar. Eger kart Full-Duplex ise çalma ve kaydetme için ayri birer kanal vardir. Eger Half-Duplex ise ayni kanali paylasirlar. Bu yüzden kayit yapilirken bir seyler çalinmasi mümkün degildir.

Frekans Modülatör. (FM)
1970'lerde Stanford Üniversitesinden Dr. John Chowning ses kartlarinda kullanilan ilk frekans modülasyon teknolojisini gelistirdi. FM synthesiser'lar tasiyici denen bir sinüs dalgasi olusturur ve onu modülatör denen ikinci bir dalga ile birlestirir. Iki dalganin da frekansi esitlendiginde ortaya kompleks bir dalga çikar. Tasiyici ve modülatör dalganin degisimleri ile enstrüman sesleri olusturulabilir.

WaveTable
WaveTable sesi yaratmak için tasiyici ya da modülatör kullanmaz, gerçek enstrüman ses örneklerini kullanir. Bu örnekler enstrümanin olusturdugu ses dalgasinin dijital canlandirmasidir. ISA tabanli ses kartlari üzerindeki ROM'da bunu tasirlar, daha yeni PCI ses kartlari ise bilgisayarin kendi RAM'ini kullanir. Bilgisayar açildiginda sürücü tarafindan örnekler RAM'e yüklenirler. Böylece örnekler yenilenebilir.

Örnekleme ve Kayit
Ses karti analog bir sesi kaydettiginde, ses dalgasi dijital bilgiye çevrilip kaydedilir. Kaydedileni duymak için ses karti dijital bilgiyi alip analoga çevirir ve çikisa verir.

Analogu dijitale çevirme islemine örnekleme denir. Ses dalgasi belli araliklarla parçalara bölünür. Ve analog degeri dijital degere çevirir. Ses ne kadar fazla parçaya bölünürse yani bölünme frekansi arttirilirsa ses daha gerçekçi hale gelir.

CD'de örnekler 16 bitlik dinamik siralarda 44.1 kHz örnekleme frekansi ile saklanirlar. Bu saniyede 44100 parçalik ve genligi 16 bitlik bir sayi olan dalgadir.

Çogu ses karti sesi 16 bitlik çözünürlükte 44.1 veya 48 kHz'de örnekler. Daha düsük degerlere de inebilir. Iyi bir ses karti düsük seviyeli parazit ve Dijital-Analog Analog-Dijital dönüstürücüleri ile dikkat çeker.

 

Anakartlar

ANAKARTLAR 

Bir mikrobilgisayarda, mikroişlemcinin, girdi/çıktı sinyallerini çevre birimlerine aktaran elektronik devrelerin, ve bellek çiplerinin bulunduğu karta, anakart denir. Anakartın üzerinde standart iğne bağlaçları olan taşıyıcılar bulunur. Daha sonra mikroişlemciler ve bellek çipleri bu taşıyıcıların üzerine yerleştirilir. Anakart bilgisayarın birbirinden ayırt edilmelerinde temel unsurlardan biridir. Bu kartın üzerine sonradan birçok kart eklenebilir. Bu tip mimariye sahip bilgisayarların mimarilerine açık mimariler denir. Açık olmayan mimariler de ise bilgisayar imalat esnasında hangi ünitelerde donatılmış ise, onlarla yetinmek zorunda kalırız. Bugün bazı cep bilgisayarları dışında kullandığımız tüm mikrobilgisayarlar açık mimarilere sahiptir.

Aslına bakarsanız anakartlar, hareket eden ya da çalıştığını hissettiren pek bir parçaya sahip olmadığı için, kullanıcılar açısından yalnızca sistemlerinin temelini oluşturan ve anlaşılması, ayarlanması zor bir parça olarak görülür. Bilgisayar dünyasında pek çok fark edilmeyen yanlışta olduğu gibi anakart seçiminde de hatalar yapılıyor. Arkadaş veya çevrenin “bu iyi bir kart”, “en hızlısı bu...”, gibi duyumlarla anakart alınıyor. Oysa anakart alınıp satılmasında pek çok kıstas olduğu gibi performans ve öngörüler, anakart seçiminde kullanılacak olan en son kıstaslar olmalıdır.

O halde anakart seçiminde kullanılması gereken kıstas, sizin kuracağınız bilgisayarı hangi amaç ve ne için kullanacağınız gerçeğinden başka bir şey değildir.

Türkiye’de işyerlerinden, son kullanıcılara, bir network içinde kullanılacak terminallerden, grafik iş istasyonlarına kadar pek çok farklı iş için kurulmuş sistemde aynı tip anakartlar kullanılıyor. Üstelik yüksek performansından söz edildiği için satılmakta olan pek çok anakart var. Hiç bir anakart arasında, farklı çipsetli olanlar ve özel tasarımlar hariç, %1’lik bir oranı geçerek performans farkı olmaz. BX tabanlı anakartlarda, 100 Mhz’lik veri yolu ve 450 Mhz’lik bir PII kullanırsak, bu anakartlardan en yavaşı (!) 32 bit uzunluğundaki segmentleri tampon bellekten kopyalama işleminde hafızaya saniyede 2270 MB aktarır. En hızlısı ise 2290 MB. Bu % 0.8‘lik bir performansı farkı demektir. Üstelik şalterlerini saniyede yüz milyonlarca kez açıp kapayan bir  sistemde bu farkı hissetmeniz imkansızdır. Anakartınızın performansını ve sisteminizin performansını en çok etkileyen unsur, disk ve veri yolu performansınızdır. Çok istisnai durumlar haricinde bu farka % 1.5’u geçmez. O halde dikkat edilmesi gereken şey ne olacaktır?

Öncelikle anakartlar farklı amaçlar için üretilmiş olabilirler. Örneğin Türkiye’de server olarak kullanılmak üzere çift işlemcili Celeron kullanan yerler bulunmaktadır. Oysa, ne Celeron ne de o zamanlar Celeron’ların kullanılmasını mümkün kılan LX çipsetli anakartlar iki adet işlemciyi bir arada çalıştırmak adına yapılmamıştı. Bir işlemcinin ön hafızasından diğerine bir bilgi giderken muhtemelen bir senkron bozukluğu, problemlere neden olacak ve sistem ya duracak ya da şans eseri bilgiler kaydedilip, sistem tekrar başlatılabilecektir.

Pek çok anakart hem güvenilirlik hem de kullanılacağı işler itibariyle farklı olarak dizayn edilip, test edilir. Örneğin Intel’in çift işlemciyle ve iş istasyonu olarak kullanılması için tasarladığı anakartlarda 5X kuralına uyulur. Yani sistemler %99,99999 (Virgülden sonra beş hane=5X) oranında güvenilir olmak zorundadır. Yani eğer paranız yetse ve 10,000,000  (10 milyon) adet anakart alsanız yalnızca biri çalışırken bir senkron hatası yapma ya da diske erişim konusunda sorunlar çıkarma olasılığına göz yumulabilir. Eğer bir web server kuracaksanız ve yine bu tür bir server anakartı aldığınız takdirde disk işlemleri ve hafıza konusunda bu rakamlar daha da hassas hale gelir.

Bazı sistem üreticisi firmalar kendi anakartlarını üretirler. Örneğin sistem üreticileri (HP, Compaq, vb. gibi) makinelerine o kadar çok güvenir ki kendi anakartından dolayı bir sorun olmayacağı savından yola çıkarak sistemlerine “reset” tuşunu koymaz.

Bu ürünü seçerken kullanabileceğiniz diğer bir kıstas da gelecekte neler olacağı ve hangi tip anakartların ortaya çıkacağı gerçeğidir. Ya nispetten ucuz bir kart almak için bilinçli bir seçim yaparsınız ya da biraz daha bekler ve yepyeni bir teknoloji için ne kadar verebileceğinizi hesaplarsınız. O zaman ucuz bir anakart seçtiyseniz, yakında gelecek olan anakart ailesinin özelliklerinden en fazlasını destekleyen ya da yakın özelliklere sahip anakart gözdeniz olur.

Anakartlar, kullanım amaçlarına ve ağırlıklı olarak kullanılacağı  görevlere göre seçmek ya da geleceği düşünmek bir anakart alırken en doğru kıstas olacaktır. Diğer önemli ve dikkat edile bilebilecek unsurlar, yanında verilebilecek yazılımlar, ne kadar fazla teknolojiye destek verdiği ve BIOS özellikleri diyebiliriz.

Doğru anakart seçimi doğru bir bakış açısına bağlıdır. Fakat, en önemli husus, performansın o kadar da önemli bir kıstas olmadığıdır. Güvenilirlik, teknolojilere verilen desteğin, paranızın karşılığında aldığınız yazılım ve ayar olanaklarının çeşitliliği bu tip bir ürün için en önemli satın alma kıstaslarıdır. 

 

ANAKARTLAR VE BİLMEDİĞİMİZ YÖNLERİ

Üzerinde binlerce küçük bakır yol bulunan bu dünya, pek çok detaylı işin yerine getirilmesinden sorumludur. Üzerinde bir saniye içinde milyarlarca elektrik sinyali bir yerden bir yere taşınır ve son derece karmaşık işler, son derece basit mekanizmaların defalarca çalıştırılmasıyla elde edilir.

Temelde anakartlar, bir çok çipten ve ASIC ‘ten (Application Spcific İntegradet Curcuit-Belli Bir İşlem İçin Özelleştirilmiş İşlemci) oluşur. Anakart üzerinde her sinyal gidip gelişinde bu ASIC ‘ler görev alır ve hafıza adreslerinden genişleme yuvalarının çalışma prensiplerine kadar pek çok şeyi düzenlerler. Fakat her farklı işlem için özelleştirilmiş olan bu işlemciler daha sonra birleştirilmiş ve birkaç adet temel işlemciye dönüşmüştür. İşte bu tarihten itibaren de birbirine sıkı sıkıya bağlı bu işlemci ailelerine “çipset” denmekte. Değişik çipsetlerle birlikte, kullanılabileceğimiz işlemci tipi, hafıza ve pek çok çevre birimi de değişebilir. Örneğin son zamanlarda üretilen BX tabanlı anakartlar artık Celeron işlemcilere destek vermiyor. Bir çevirici ile birlikte bile Celeron işlemcileri bu anakartlar da kullanamıyorsunuz.

Anakartlar da yer alan diğer bir bileşen de saat üretici çiptir. Çipsetin belli bir saat hızında çalışmasını sağlar ve oldukça önemli bir bileşendir. Bu çip, senkronizasyon işleminden, hafıza çiplerinden ve  genişletme yuvalarında gelen sinyallerin uygun sırayla işlemciye ulaştırılmalarını sağlar. Bunun tam tersi olarak da işlemciden gelen sinyalleri belli bir oran da parçalara bölme görevini üstlenir.

Üstelik anakartlar artık kendi veri yollarının üzerinde disk kontrolörleri de barındırıyorlar. Bu özel bir yazılım ve bu özel yazılım tutulduğu yine özel bir parçada gizlidir. Anakart denen bileşeni tanımlarken, unuttuğumuz kısmı aslında anakartın da bir yazılım tarafından yönetildiğidir. Yani anakart aslında bir donanım; donanıma bağlı bir yazılımdır. Pek çok açıdan anakartın kalitesini bu yazılım –ki bu yazılımın daha özel bir adı vardır : BIOS ve onun çipsetiyle kurduğu ilişki belirler. Çipsetin fonksiyonlarını doğru ve verimli bir şekilde kullanamayan bir BIOS, ya da hatalı kodlarla dolu bir BIOS, anakartın kullanıldığı sistemin performansını ve güvenirliğini etkiler. Yaşadığımız sistem çökmelerinin sebeplerinden bir kısmı, programların BIOS kurallarına uygun olmayan adresleme yapmaya çalışması ya da BIOS ‘da yer alan gerçek hatalı kodlardır. Şu halde üzerinde çalıştığı çipsetinin ona sunduğu özelliklere bağlı olarak bir BIOS tüm sistemin efendisi konumundadır. POST denilen ve sisteminizin açılmadan önce yapılan kontrol ve varolan donanımların belirlenmesi işleminde BIOS tüm sistemin bileşenlerini tanımlar, onları adreslendirir, nasıl çalışacaklarını saptar ve daha sonra kontrolü işlemciye geçirir. Bu sırada ise BIOS ‘un alt rutinleri halen çalışmakta ve kimi hafıza işlemlerinin nasıl yapılacağına karar vermektedir. BIOS ‘un değerini belirleyen diğer bir konuda onun ne kadar fazla ve detaylı ayara izin vermesidir. Örneğin; Intel gibi bazı anakart üreticileri karttaki ayarlarını son derece sade tutar ve son şekilde kullanıcıların yanlış ayar yapmasına izin vermez. Anakart pek çok ayarı uygun hale kendi ayarlar veya nasıl olması gerektiğine karar verebilir. Üstelik tüm bunlar olurken siz arkanızı oturur ve yalnızca o siyah ekranı seyredersiniz.

 

ANAKART  TEKNOLOJİLERİ

Çoğu zaman bir bilgisayar satın alırken işlemciler, RAM miktarı ve sabit disk kapasitesi göz önünde bulundurulur.  Oysa iş, kritik uygulamalarda anakartınızda önemli bir rol oynar. Örneğin küçük yerel ağ server’ları yada iş istasyonu olarak kullanılacak olan her tür sistemde, anakart kalitesi ve performansı size çok şey kazandırabileceği gibi bir son kullanıcı için ileriye dönük olan anakartları seçmekte oldukça önemlidir. Bir çok anakart özelliği zamanla önem kazanır.

Her anakart düşünüldüğü kadar iyi olmadığı gibi kimi görev kritik uygulamalarda oldukça önemli bir rol oynamaktadır. Performans, kullanışlılık, güvenirlilik ve uyum, anakart alırken göz önünde bulundurulması gereken önemli kıstaslardır.

                                                

BİR ANAKARTIN BİLEŞENLERİ

Bilgisayarınızın temelini oluşturan anakartlar bir çok çipten ve ASIC’ ten (application specific integrated circuit- uygulamaya özel işlemci) oluşan bir yapıya sahiptir. Anakartlar, işlemciler hafızanıza erişirken, genişletme yuvalarınızdaki kartlardan bilgileri taşıyan veri yollarını yönetirken ve donanımınızın kullanılabilmesi için gerekli adresleri ayarlarken büyük roller oynar. Bu sebeple anakartınızın her bileşeni önemli ve sağlıklı bir sistem için kritiktir. İşlemcilerinizin verileri aldığı yolları kontrol eden ve işlemcinizin bir anlamda efendisi olan kısım anakartınızın üzerindeki çipsettir. Bu çipsetler kullanabileceğiniz işlemci hızını ve anakartınızın performansını belirler. Güncel çipsetler olan BX, LX, EX ve SuperSoket7 tipi anakartların çipsetleri farklı işlemcilere destek verir. Bu kurala aykırı anakartlar var olmakla beraber, sisteminizin sağlıklı çalışması için muhakkak birbiriyle uyumlu işlemci ve çipsetini kullanmalısınız.

Bir anakart büyük ihtimalle bir bilgisayarı oluşturan en önemli parçadır. İşlemci, hafıza ve genişletme yuvalarındaki diğer kartların arasındaki tüm veri akışını sağlar. Üstelik günümüz anakartların bundan daha fazlasını yaparak, disk ve depolama bileşenlerini kontrol eden IDE ve SCSI ara birimlerini yöneten çipleride barındırıyorlar. Günümüzün hızlı donanımlarından anakartların performans farklılıkları çok fazla hissedilmese bile, özellikle server, grafik tabanlı iş uygulamaları, yüksek miktardaki  bilginin depo edilmesi ve yönetilmesini sağlayan veri tabanları için son derece önemli bir bileşendir. Bu bileşen için seçebileceğimiz bir çok marka ve model var. O halde yapacağınız şey, önce kendi ihtiyaçlarınızı belirlemek ve bu ihtiyaçlar doğrultusunda ürün seçmek. Günümüz anakartları öncelikle hız ve uyumluluk için tasarlanmakta. Fakat bazı anakartların farklı özellikler barındırdığı da görülmektedir. Örneğin, BX tipi anakartlar içinde Totem, üzerinde taşıdığı bir LET grubu ile anakartın çalışma statüsünü, o an yaptığı işlemleri ve hata mesajlarını simgeleyebiliyordu. Bu özelliği öncelikle güvenilirlik ve zamana ihtiyacı olan bir çok sistem yöneticisi için önemli bir destek olarak kullanılabilirdi. Yine Asus PB2 ve Abit  BH6 gibi kartlardaki çok yüksek hızlarda çalışan işlemcilere verilen  desteğin, geleceğe dönük yatırım  yapan kullanıcılar için vazgeçilmez özellikler olacağını söyleyebiliriz. Aynı kartlardan Abit BH6, AGP veri yolu saat hızıyla aynı hızda çalışarak inanılmaz bir grafik performansı elde edebileceği fark edildi. Aynı durum kimi görüntü kartları için stabil olmayan bir windows oluşturduğu için bu özelliğin bir grafik sanatçısı için seçilebilir, fakat bir son kullanıcı için yeterince güvenilir olmayacaktı. Acorp`un anakartı ise size elektrik kesilmelerinden sonra sistemi tekrar reboot edip etmemesini sağlayan bir araya sahipti. Her anakart farklı bir mimari ve farklı özellikler sunduğu için genel geçer anlamda kullanıcıya gerekli olan özellikleri göz önünde bulundurulmalıdır. Bu sebepten dolayı farklı çipsetlerinde Kendinize bir anakart seçeceğiniz zaman, yüzeysel manada performans değerleri yerine bu kategorilerde boy göstermiş anakartların sizlere neler sunabileceğini araştırmalısınız. Bu konuda anakartları Türkiye`ye getiren distribütör firmalara ve satıcılara önemli görevler düştüğünü hatırlatmak isteriz. İster bir server için ister bir iş istasyonu olarak kullanılmak üzere,  ister yalnızca oyun oynamak amacıyla alınmış olsun, bir anakarta verilen destek  ve size sunduğu dokümantasyon hayati öneme sahiptir. Bu sebeple bir anakart seçerken satıcıların ve distribütörlerin başını ağrıtmanızı size ait bir hak olduğunu bilmelisiniz. Alacağınız anakartın Web `de iyi bir sitesi olduğundan emin olunuz ve bunu Türkiye distribütöründen öğreniniz. Zira bu, anakartınızın gerek BIOS, gerekse çipset driver`larını güncel olarak alabileceğiniz tek yerdir.

                         

ANAKART SÜRÜCÜLERİ VE BİRLİKTE VERİLEN YAZILIMLAR

  Anakartlardaki tüm transfer işlerini ve disk yönetimlerini kontrol eden çipsetlerin, yazılımınız tarafından etkin bir şekilde kullanılabilmesi için gerekli olan şey, o çipsete ait olan güncel sürücülerin birlikte verilmiş olmasıdır. Bu yazılımlar öncelikle  günümüz çipsetlerinde iki grupta yoğunlaşıyor. Birincisi veri yollarının problemsiz ve etkin bir şekilde çalışmasını sağlayan sürücü yazılımları, diğer grup ise çipsetlerinin disk erişimi sırasında kullanacağı sürücü yazılımlarından oluşur. İşletim sisteminiz her halükarda temel bir çipset sürücüsünü anakartınız için kullanacak olsa  bile, anakart üreticinizin size sağlayacağı sürücüler çok daha verimli ve güvenli çalışır. Anakart kutunuzun içinden çıkacak bir disket grubu yada bir CD ile size gelecek olan bu sürücüler kimi zaman, distribütör firmaların stoklarında çok uzun zaman beklemiş olan anakartlar sebebiyle güncelliğini yitirmiş olabilir. Bu sebepten dolayı anakart üreticinizin Internet üzerindeki ve distribütör firmanızın size vereceği destek son derece önemlidir. Yapabileceğiniz diğer bir güncelleme ise  BIOS `u güncellemesidir. Sisteminizin donanımlarını kullanır hale getiren ve onların  işletim sistemi tarafından hatasız olarak kullanılmasını sağlayan BIOS yazılımı anakartınızın üzerindeki bir tür kalıcı hafızada bulunur. Eğer sizin anakartınızda  bulunan BIOS `ta , FLASHBIOS tipinde çiplerde saklanıyor ise BIOS`unuzu güncellemeniz ve önemli  hız artışları sağlamanız mümkündür. BIOS güncellemek için o anakart markasına ve kullandığınız modele ait olan BIOS dosyası ve bunu BIOS`unuzu tutan hafıza çiplerine yazacak bir programa ihtiyacınız vardır. Bu dosyalar ve programlar, anakart üreticisinin Web sitesinden elde edebilirsiniz. Güncelleme sırasında ise azami dikkati göstermeniz gereken noktalar vardır. Öncelikle sisteminizin içinde HIMEM.SYS, EMM386.EXE gibi hafıza yöneten programlar bulunmamalıdır. Bu programlar, sistem disketinizin başlangıç dosyalarında yer almamalı. Ayrıca bu sistem disketiyle bilgisayarınız açmadan önce BIOS ayarlarından bazılarını kapatmalısınız. Bu ayarlar BIOS’un, video hafızanızın sisteminizdeki hafızaya kopyalanarak daha hızlı çalışmasını sağlayan ayarlardır. Bu ayarlara SHADOWING (gölgeleme) denir. Bu ayarlar kapatıldıktan sonra bilgisayarınız açılmalıdır. Eski BIOS’un bir kopyası muhafaza edilmeli ve çalışan programa yeni BIOS dosyası tanıtıldıktan sonra sistem yeniden başlatılmalıdır. Anakartınız ile verilecek diğer bir yazılım ise yardımcı programlardır. Bunlar, sisteminizin donanım kısmının ne kadar sağlıklı çalıştığından tutun da bir network yönetim yazılımına kadar her şey olabilir. Bu yazılımlarda özellikle sisteminizi gözlemleyen ve virüslere karşı koruyanları tercih edin.

 
ANAKART YENİLEME

                Şu ana kadar bilgisayarınızın içinde kart, sabit disk floppy disket gibi  parçaları değiştirmemiş iseniz, işe Anakart ile başlamak doğru bir tercih olmayabilir. Anakart değiştirmek, dikkat ve hassas çalışmayı gerektirir; bunu yaparken kişinin sakin olması gerekir. Oysa ilk kez bilgisayarının iç organları ile karşı karşıya kalan ve nereden gelip nereye gittiğini bilmediği telleri, kabloları tek tek sökmeye başlayan kişinin sakin olması oldukça zordur.

            Fakat bir kez bilgisayarınızın içinde çalışmaya, parçalarını söküp yeniden takmaya “alışırsanız,” bunun  bir herhangi bir hobi projesinden farklı olmadığını fark ederseniz, ve en önemlisi dikkatinizi dağıtmadığınız zaman 25-30 parçalık bir aygıtı dağıtır ve birleştirirken  hata yapmanızın kolay olmadığını görürseniz, işin gerektirdiği rahatlığa kavuşmuş olursunuz. Gerisi ise, 25-30 şeyi söküp, yeniden takmaktan ibarettir.

            Unutmayın, bir televizyon alıcısının içinde 12 binden fazla parça vardır; ve hepsi sökülüp, takılır!

 

ANAKARTI DEĞİŞTİRMEDEN ÖNCE

  Anakartı yenilemek, mevcut hafıza çiplerini ve güç birimini çöpe atmak anlamına gelebilir; Anakartla birlikte CPU’ yu da yenilemek zorunda kalabilirsiniz. Bu konularda karar vermeden önce, bilgisayarınızın kasasına ne tür Anakart ve güç birimi sığabileceğini belirlemelisiniz.

  Günümüzde İntel veya uyumlu çiplerle çalışan anakartlar AT ve ATX diye iki ebatta imal ediliyor. LX ve BX gibi bir ad verilen çipset donanımı farklı anakartlar genellikle ATX ölçüsünde olur. AT masaüstü ve mini – tower(küçük kule) denilen kasalara yerleştirilirken, ATX tipi kartlar ve ATX ölçüsündeki diğer kartlar mid – tower veya full – tower boyundaki kasaları gerektirir. Anakartların ve dolayısıyla kasaların ebatları alabilecekleri disk, disket ve kart sayısını da belirlediği için ihtiyaç duydukları güç ve soğutma yeteneği de farklıdır. Bilgisayarın anakartı ve kasası ne kadar büyürse, ihtiyacı olan güç biriminin Watt’ ı ve soğutma gücüde o kadar artar.

  Bazı çipsetler AGP denen ve sadece ekran kartı alabilen yuvaya sahip olurlar. Bu yuva eski kasalarda, arka pencerelerden birine dek gelmeyebilir. Bu durumda kasanın arkasında, metal kısmın kesilmesi gerekebilir ki bunu tavsiye etmekte denemekte imkansız olabilir. Yine bazı çipsetlerin sağladığı USB ve SCSI kapıları, kartın kenarında sabit fişler olarak imal edilmiştir. Bu fişlerin karşılığı olan pencerelerin kasada bulunması gerekir. Fakat eski AT kasalarında bu pencereler yoktur.

  Dolayısıyla Anakart tipini belirlerken, önce mevcut kasayı göz önünde tutmak zorundasınız. “Kasayı da değiştirebilirim!” diyorsanız, büyük bir ihtimalle mevcut güç birimi yeni kasaya uymayacak ve değiştirilmesi gerekecektir.

 

YENİ ANAKART NASIL TAKILIR

            Anakart, adı üstünde, her şeyin temeli olduğuna, yani yeni anakart eskisinin yerini alacağına ve bilgisayardaki hemen her şey anakarta takılı olduğuna göre, her şeyi sökmeniz ve mevcut anakartı yerinden çıkartmanız gerekir. Sonra yeni kartı yerine oturtup; çıkarttığınız kablo ve parçaları yeni karta takarsınız.

            Anakart değişikliği, işi bilgisayar birleştirmek olan usta bir kişi için 10 dakikadan fazla zaman almaz. Önce sabit diski yedekleyin. Önemli veri dosyalarını disketlere, Zip diske veya teybe kaydedin ve şöyle devam edin:

1.)     Bilgisayarı kapatın ve kasayı çıkartın.

2.)     Bilgisayardaki kabloları sökün; vücudunuzdaki statik elektriği boşaltın ve kartları çıkartın. Çıkarttığınız kartları birbirinin üzerine yığmayın; metal bir zemine koymayın.

3.)     Güç birimlerinden anakarta giren çok telli iki büyük fişi çıkartın. 

4.)     Vücudunuzdaki statik elektriği yeniden boşaltın ve yeni anakartı kutusundan çıkartın. Hafıza çiplerini takın.

5.)     Mevcut anakartı yerinden çıkartın. Anakartı yerine bağlayan vidaları sökün.

6.)     Yeni kartın plastik ayaklarını takın. Kartın iyice yerleşmesini sağlayın. Anakart iyice yerine oturunca, vidaları takarak, sabitleştirin. Plastik ayakların oturup oturmamasına dikkat edin.

7.)     Işıklı gösterge, anahtar ve diğer telleri anakarttaki yerlerine takın. Anakartın elektrik fişlerini yanlış takarsanız, anakartı yakarsınız.

8.)     Çıkarttığınız kartları yerlerine takın; yeni anakartınızda 8 ve 16 bit ve PCI yuvalarının sayısı ve yerleri farklı olabilir.

9.)     Sabit disk ve floppy disket kablolarını yerlerine bağlayın. Eski anakartta I / O kartına bağlı olan sabit diskler ve disketler şimdi doğruca anakart üzerindeki IDE ve floppy yuvalarına bağlanabilirler.

10.) Ekran, klavye ve mouse’ u bağlayın. Elektrik kablosunu takın ve bilgisayarı açın. BIOS test sonuçlarını ve diğer mesajları görürsünüz. Her şey  yolunda ise, bilgisayarın kasasını kapatabilirsiniz.

 

Yeni bir işlemci veya daha fazla RAM’i kabul etmeyecek kadar çok kısıtlamalara sahip bir anakartı olanların önlerinde tek bir seçenek bulunuyor: PC’nin temeli anakart da yeni bir modelle değiştirilmelidir artık.

 

ANAKART TERFİSİ NE ZAMAN MANTIKLIDIR?

Anakart terfisine karar vermeden önce makul bir terfi bütçesini  aşmamak için bu iş için harcayacağınız parayı da hesaplayın (tüm yeni anakartlar SDRAM’e ihtiyaç duyarlar). Çok eski bir 1.2 Gbyte sabit disk veya S3 Virge ekran kartıyla Athlon veya PIII işlemcisine işkence etmek bir işe yaramaz: Komple bir bilgisayar almak daha iyi bir seçim olacaktır bu durumda.

Ayrıca montaj işlemleri de bir hayli uzun sürecektir: Her şey tekrar sorunsuz olarak çalışana kadar tüm bir gününüz heba olacaktır. Boş vaktiniz çoksa ne ala, yok eğer saat ücretli olarak çalışıyor ve sizin için her dakika önemliyse komple bir sistem almanın daha mantıklı olacağını göreceksiniz -tabii eğer bir saat içinde komple bir sistem toplayacak kadar tecrübeli bir kullanıcıysanız o zaman durum değişiyor.

 

ANAKARTI SÖKERKEN DİKKATLİ OLUN

CD- AUDIO KABLOSUNU UNUTMAYIN

Bilgisayar kasasını vidaladıktan sonra en sık unutulan kablo CD/DVD sürücüsünden ses kartına bağlanan ses kablosudur.

PC’niz birdenbire müzik CD’lerini çalmamaya başlarsa, CD-Audio kablosunu bağlamayı unutmuşsunuzdur, kasayı açıp kabloyu bağlayın. En kolay çözümlenecek problemlerden biridir bu.

WINDOWS’U YENİDEN KURMAK DAHA İYİ

BIOS, açılışta CPU ve RAM’i doğru olarak gösteriyorsa BIOS’ tan sabit diski tanıtabilir ve işletim sisteminizin bu köklü değişikliklere nasıl tepki göstereceğini kontrol edebilirsiniz. Windows98 çoğunlukla sistem kaynaklarını baştan yeniden bulacak ve birçok defa yeniden başladıktan sonra çalışabilir durumda olacaktır.

Emin olmak ve işinizi sağlama almak istiyorsanız veya sisteminiz kısmen de olsa sorunsuz çalışmıyorsa tüm sistemi komple yeniden kurmalısınız.

Bilgi Bankası /

Internet Adres Sınıfları ve Alt Adresler:   

     Internet’e bağlı her sistemin kendisine ait özel bir adresi vardır.Bunlar IP adresi olarak adlandırılır ve bilgisayarlar  arasında iletişim yapılırken veri paketlerinin adreslenmesinde kullanılırlar.Bir adres 32 bitlik bir sayıdır; dolayısıyla ağ üzerinde ,teorik olarak 2 üssü 32 tane,

Yani yaklaşık 4 milyar tane bilgisayar bağlanabilir. 32  bitlik IP adresleri gösterimi ve yazımı kolay olsun diye,aynı zamanda ağ yönetimi için sağladığı kolaylıklardan dolayı her biri noktalarla ayrılan 8 bitlik dört parçaya bölünmüştür; parçalar 162.72.155.27, 144.122.65.0 gibi birbirinden noktalar ile ayrılmıştır.Adreslemede hiyerarşik yapı kullanılmaktadır.

     Yaklaşık 4 milyar tane IP adresi,ağa 4 milyar tane bilgisayar bağlanabileceğini gösterir; pratikte bu sayının çok altında olacağı düşünülse de,aslında ağa bağlanabilecek bilgisayarların sayısı çok daha fazla olacaktır.

     İlk bakışta Internet’e bağlanacak bilgisayarların 4 milyarın altında olacağı düşünülü.

Çünkü IP adresleri yalnızca bilgisayarlara değil ağ içinde aktif görevi olan cihazlara da verilir.

Buna ek olarak üzerinde birden fazla arayüz bulunduran  bir bilgisayar birden fazla IP adresine sahip olabilir.Örneğin iki LAN arasında bağlantı aygıtı görevini gören bir bilgisayarın iki tane arayüzü olur;iki tane de IP adresi olur.Sonuçta toplam IP adresi sayısı ağa bağlanacak toplam bilgisayar sayısını göstermez.Üstelik bir kısmının atıl durumda kaldığı (bir çok yer kendisine gerekenden fazla IP adresi alıp boş  tutmaktadır),bir kısmının da ilerisi için saklı tutulduğu düşünülürse ,bu sayı 4 milyarın çok altında olacaktır.

     Ancak Internet’e bağlanan bilgisayarların sayısı 4 milyarın çok çok üstünde olabilir.Çünkü bir servis sağlayıcı üzerinde dial-up bağlantı kullanan bilgisayara sabit bir IP adresi verilmez;verilen IP adresi dinamiktir ve oturum kurulması anında belirlenir.Oturum sonlandığında o IP adresi bir başkasına verilir.Böylece sınırlı sayıdaki IP adresi bir çok bilgisayar tarafından kullanılır.

 Simgesel Adresler 

     Kullanıcı düzeyinde,sayısal IP adresleriyle uğraşmak,onları akılda tutmak,yani gerektiği zamanlar kolayca hatırlamak güç olur.Bu nedenle, IP adreslerine simgesel isimler verme yoluna gidilmiştir.Örneğin 179.23.45.0 adresine simgesel olarak ‘istanbul.edu.tr’ verilirse ,

ikincisini anımsamak her zaman daha kolay olacaktır.Dolayısıyla bir IP adresi iki farklı şekilde verilebilir; biri sayısal olarak diğeri simgesel olarak;gerçekte her ikisi de  aynı yeri

adresler.

 Adres Sınıflaması 

     Internet’e bağlı büyüklü küçüklü binlerce ağ vardır ve bu ağlar için gerekli IP adresleri sayısı birbirinden oldukça farklı olabilmektedir.Adres dağıtımını ve ağlara atanan adreslerin ağ aygıtlarına yerleştirimini kolaylaştırmak amacıyla IP adres alanı alt kümelere bölünmüştür;

yani sınıflanmıştır.Beş temel sınıflama vardır ve bunlar A,B,C,D ve E sınıfı adresler olarak adlandırılır.Bunların hangisinin gerektiğini, doğrudan, bu adreslerin kullanılacağı ağın büyüklüğü belirler.

     IP adresleri 32 bit uzunluğundadır ve bu adresler temelde 2 parçaya ayrılır; parçanın biri ağı (network ID) ,diğeri ağ içindeki sistemleri (hosts,network devices) temsil eder.Adresin kaç bitinin ağı ,kaç bitinin sistemleri göstereceği üzerinde bir sınırlama yoktur.Ancak tanımlanan 5 tür sınıflama için bu bitlerin sayısı bellidir.Dolayısıyla bu sınıflar içinde en fazla kaç tane ağ ve sistem olacağı önceden belirlenmiştir.

 A Sınıfı  Adres (Class A) 

     A sınıfı adres alanı içinde ağlar(netID) 7 bit, ağ içindeki bilgisayarlar (hostID) ise 24 bit ile temsil edilir.Bu tür adres alanı çok büyük ağlar için kullanılır.Örneğin ARPANET,NSFNET gibi ağlar A sınıfı adres alnına sahiptir.

 

0

(a)  

 netID 7 bit

(b)

(c)

hostID 24 bit

(d)

 

     Yukarıda bu tür adres alnının formatı görülmektedir;ilk biti 0 dır.A sınıfı adresleme ,her biri 16 777 214 tane bilgisayar içerebilen 126 tane altağa (subnet) izin verir.16 777 214 sayısı (2üssü24 -2 )’den hesaplanır; 2 adres özel amaçlı kullanılır:hostid’nin tüm bitleri 1 olan adresler yayın(broadcast) ve 0 olanlar ise ağ adresi olarak kullanılır.126 sayısı ise(2üssü7-2) den hesaplanır;görüldüğü gibi toplam sayıdan 2 çıkarılmıştır.Çünkü 0.0.0.0 ve 127.0.0.0 adresleri özel amaçlı kullanılmaktadır:0.0.0.0 adresi default yönlendirme, 127.0.0.0 adresi ise yerel çevrim için kullanılır.a.b.c.d biçimindeki adresin a parçası ağı,b.c.d kısmı sistemleri adresler.

 B Sınıfı Adres (Class B) 

     Bu tür adres alanı içinde ağlar 14 bit ,ağ içindeki bilgisayarlar ise 16 bit ile temsil edilir;adres alanı her biri 65 534 bilgisayar içeren 16 384 tane alt ağa izin verir.Adres formatının ilk biti 1 0 şeklindedir.Bu tür adres alanı büyük veya orta büyüklükteki ağlar için kullanılır.Bir çok büyük üniversiteler ve ISP ler bu tür adres alanına sahiptir.

 

1 0

(a)  

 netID

(b)

14 bit

(c)

hostID

(d)

16 bit

 

a.b.c.d  biçimindeki adresin a.b kısmı ağı,c.d kısmı sistemleri adresler.İlk parçası (a) 128 ile 191 arasında olan IP adresleri B sınıfındandır.

 C Sınıfı Adres(Class C) 

     C sınıfı adres alanı içinde ağlar 21 bit, ağ içindeki bilgisayarlar 8 bit ile temsil edilir.

Dolayısıyla bu tür adres alanı her biri 254 tane bilgisayar içerebilen 2 097 152 alt ağa izin verir.

 

1 1 0

(a)  

 

(b)

hostID

(c)

21 bit

(d)

hostID 8 bit

 

 a.b.c.d biçimindeki ağın a.b.c kısmı ağı c kısmı sistemleri adresler.Günümüzde kurumlara daha çok C sınıfı adres verilmektedir.Dolayısıyla yerel ağında az sayıda sistem bulunan kurumlarda bir çok IP adresi boşa gitmektedir!

 D ve E sınıfı Adres (Class D and Class E) 

     D sınıfı adreslerin ilk 4 biti 1110 şeklindedir.Bu adres sınıfı tek bir datagram’ın  bir çok sisteme dağıtılması (multicast) için kullanılır.

 

1 1 1 0

Multicast

28 bit

 

1 1 1 1

Saklı tutulmuş

28 bit

     E sınıfı adreslerin ilk 4 biti ise 1111 dir.Bu adresler Internet’in ilerideki uygulamalarına olanak vermek amacıyla saklı tutulmuştur.

 

     Bir adresin ilk parçası onun hangi sınıfa ait olduğunu gösterir.Aşağıda bütün adres sınıfları için ilk parçanın (a) alabileceği değerler gösterilmektedir.

 

Adres sınıfı

İlk parçanın alabileceği değer

A

1-126

B

128-191

C

192-223

D

224-239

E

240-247

 

*127 adresi ağ içi test ve sistemin kendi prosesleri arasında iletişim için kullanılır,dolayısıyla geçerli bir ağ adresi değildir.

 Altağlar (Subnets) 

     Ağ tasarımında, IP adresleri sistemlere dağıtılırken ağ daha küçük birimlere parçalanarak altağlar (subnets) oluşturulur.Bu Internet’in hiyerarşik adresleme yapısına uygun olduğu gibi,

yönlendirme  işleminin sağlanması için gerekli yapının kurulmasını da kolaylaştırır.Örneğin büyük bir üniversiteye B sınıfı bir adres alındığında ,bu adreslerin bölümlerdeki bilgisayarlara

altağlar oluşturmadan gelişigüzel verilmesi bir çok sorunu da beraberinde getirir.Halbuki, verilen B sınıfı adres alanı daha küçük alanlardan oluşan alt alanlara bölünse ve bu alt alanların her biri bölümlerdeki LAN‘lara atansa bir çok kolaylık ta beraberinde gelecektir; adres yerleştirimleri kolay olacak ,hiyerarşik yapı korunacak ,adrese bakılarak ilgili sistemin hangi altağda olduğu anlaşılacak vs gibi getirileri olacaktır.Bu hiyerarşik adresleme yapısı

yerleşim alanlarının adreslenmesine benzer;önce mahallelere ayrılır,ardından caddelere ve sonra da sokaklara…Tam bir hiyerarşik yapı vardır;taksim.istiklal caddesi.sinema sokak gibi.

     Bir adres alanı alt ağlara bölünürken o adres sınıfının uç sistemlere ayrılan bitleri kullanılır

Örneğin alınana B sınıfı adresten 254 tane altağ oluşturulacaksa ,sistemler için ayrılan 16 bitin

8 biti altağı ,diğer 8 biti de sistemleri adreslemek için kullanılır.

 

                                    Ağ kısmı                                              Sistem Kısmı

1 0

netID

(14 bit)

hostID

(16 bit)

 

                                                                                                                                             Burası alt ağları                              Ağa bağlı olan    

                                                                                                                                              Adreslemek                            Sistemleri adreslemek

                                                                                                                                                için kullanılır                                için kullanılır

     

Altağ adresinde 000… ve 111… adresleri kullanılmaz.Bu durumda altağ sayısı ,adresin ağ kısmı n bit ise 2üssün -2 olur.

 Altağ Maskesi (Subnet Mask)

     Altağ için kullanılacak bit sayısında bir sınırlama yoktur.Ağ yöneticisi kendi sorumlu olduğu ağın adreslemesini istediği gibi düzenleyebilir.Altağın kaç bit kullanılarak temsil edildiğini belirlemek için altağ maskesi(subnet mask) kullanılır.Altağ maskesi (kısaca ağ maskesi), genel olarak, bir IP adresinin ağ ve sistem için kullanılan bitlerini bulmak ve dolayısıyla ağ adresini belirlemek için kullanılır.Örneğin 192.120.55.129 adresinin kaç bitinin

ağı ,kaç bitinin uç sistemleri gösterdiğini belirlemek için ağ maskesine gerek vardır:ağ maskesi 255.255.255.0 ise 192.120.55.129 adresinin altağ parçası 192.120.55.0, uç sistemi

adresi 129 olur; aynı adres için altağ maskesi 255.255.255.128 ise ,bu sefer, altağ parçası 192.120.55.1 ve uç sistem adresi 1 olur.

     Eğer adresin bulunduğu sınıf altağlara ayrılmamışsa ,bu C sınıfı bir adres olduğundan ilk 24 biti ağı,kalan 8 biti de sistemleri destekler. Fakat, altağlara ayrılmışsa ağ maskesi olmadan bulmak mümkün değildir.

  

   Aslında bütün sınıflar tüm adres alanı içinde altağları  gösterir.Ağ maskesi, ağı gösteren bitler 1,sistemi gösteren bitler 0 yapılarak bulunabilir.

 

Adres sınıfı               Ağ maskesi                            Maskelerin bitleri

A                                255.0.0.0                                 11111111-00000000-00000000-00000000

B                                255.255.0.0                             11111111-11111111-00000000-00000000

C                                255.255.255.0                         11111111-11111111-11111111-00000000

 

Örneğin B sınıfı adreste ilk 16 bit 1,kalan 16 bitte 0 yapılırsa ,B sınıfı adresin maskesi 255.255.0.0 olur.Buna ek olarak B sınıfı adres kendi içinde yukarıdaki şekilde olduğu gibi 8 biti altağ ,8 biti de uç sistemler için olacak şekilde altağlara bölünürse ,yeni altağların maskeleri 255.255.255.0 olur.Böylelikle B sınıfı adres alanı içinde 28 tane C sınıfı altağ elde edilmiş olur

 

 Yayın Adresi

     Yayın adresi ,ağ adresi dışında kalan bitlerin 1 yapılmasıyla elde edilir.Amacı altağ içerisindeki tüm sistemleri aynı anda adresleyebilmektir.Bir paketin  alıcı adres kısmında yayın adresi bulunuyorsa,altağ içindeki tüm sistemler ilgili paketi alır ve işler.

     Örneğin 137.36.12.3 adresinin altağ maskesi 255.255.0.0(B sınıfı) ise ilgili altağ için  yayın adresi 137.36.255.255 olur.

 

 

BİLİŞİM SUÇLARI:

Bilgisayar ve İletişim Teknolojilerindeki gelişmeler, eğitimden ticarete, devlet sektöründen özel sektöre, eğlenceden alış-verişe kadar bir çok alanda klasikleşmiş anlayışı değiştirmiş ve hayatımıza yeni bir yaşam tarzı getirmiştir. Teknolojinin efektif olarak kullanmaya başlandığı günümüzde artık bilgi teknolojilerinin ortaya çıkaracağı yenilik ve değişimlere kendimizi hazırlamamız dolaylı yoldan şart haline gelmiştir.
Hazırlanmamız gereken en önemli konulardan bir de; suçların teknoloji kullanarak işleniyor olmasıdır. Demeki buna ek olarak şunu da belirtmemiz gerekir ki Teknolojinin hayatımıza getirmiş olduğu yeni yaşam tarzına ek olarak yeni bir suç işleme şekli kazandırmıştır. Düz mantık şu; Suç işleme şekilleri, teknolojiye paralel olarak gelişmektedir.
Bilişim Suçlarıyla ilgili olarak karşımıza bir çok tanım çıkmaktadır; Bilgisayar suçları, dijital suçlar, internet suçları, siber suçlar, ileri teknoloji suçları v.b. Diğer ülkelerde ise; Computer Crimes, IT Crimes (İnformation Technologies), Cyber Crimes, Crimes of Network v.b. Aslında her bir tanım bize bir açıklık getirmektedir. Çünkü bu uç türleri bir bilgisayar vasıtasıyla yapılabileceği gibi bir network veya İnternet üzerinde de olabilmekte, yada bir ufak elektrik devresi veya kredi kartı da kullanıla bilinmektedir. Bilişim kelimesi ise Bilgisayar ve bilgisayar teknolojileri ile iletişim teknolojilerini kapsadığından “Bilişim Suçları” adı altında toplanmıştır. Dolayısıyla bilişim suçları terimi kullanıldığında bahsedilen bu teknolojileri kullanarak işlenen bir suç unsuru olduğu unutulmamalıdır.

Bilişim Suçlarının Sınıflandırılması
Bilişim Suçları tanımına uyan konuların sınıflandırılması ve tanımlanmasının yapılması yapılacak olan çalışmalara hazırlık teşkil edecek ve her bir suç tipi daha rahat anlaşılmış olacaktır. Burada suç türleri arasında farkı oluşturacak olan ana etken “suçun işleniş amacı” olmalıdır. Bu tür suçlar hangi yöntemle işlenmiş olursa olsun, hangi amaca hizmet ettiğine bakmak gerektiği kanısındayım. Örneğin bir bilgisayara girmenin çeşitli yolları mevcuttur, virüs,trojan,bug kullanarak gibi, ama asıl önemli nokta “suçun amacı”. Yani bu örnekte olduğu gibi “sisteme girme” eylemi. Kullanılan metodlar ise ancak suçun ağırlaştırıcı sebeplerini oluşturabilir. Mesela bir sisteme girmek için önce bir başka sisteme girmek veya ön hazırlık yapmak maksadıyla bir yazılım oluşturmak (trojan). Suç tiplerine bakacak olursak;

1.Bilgisayar Sistemlerine ve Servislerine Yetkisiz erişim.
Anayasamızda da belirtilen “Özel Hayatın Gizliliği”maddesine aykırı olarak teknolojik dinlemelerin yapıldığı güncel olarak karşılaşmaktayız. Daha modern bir yapıya ulaşan iletişim kavramı artık bilgisayar vasıtasıyla yapılmakta ve çoğu insan artık önemli bilgilerini (banka,kişisel v.s. gibi bilgiler) bilgisayarlarda saklamaktadırlar. Bunlara ek olarak birde Bankaların, Hastanelerin, bir çok özel şirketlerin hatta ve hatta güvenlik ve istihbarat birimleri bile hizmete özel bilgilerini bu ortamda muhafaza etmektedirler. Bu denli bilgilere ulaşmak yine bilgisayar teknolojilerini kullanarak yapılmaktadır.

2.Bilgisayar Sabotajı.
Bu suç türü iki şekilde karşımıza çıkmaktadır.
1. Bilgisayar teknolojisi kullanarak sistemine sızılan bilgisayardaki bilgilerin silinmesi, yok edilmesi ve değiştirilmesi.
2. Hedef alınan sisteme uzaktan erişerek değil de bilakis fiziksel zarar vererek yada sistem başında bulunarak bilgisayardaki bilgileri silmek,yok etmek veya değiştirerek zarar verilmesi.
2.sinde önemli olan mala verilen zarar değil de içindeki bilgilerdir, çünkü bilgi her zaman için çok değerlidir hele ki telafisi mümkün değilse.
3.Bilgisayar Yoluyla dolandırıcılık.
Klasik olarak bildiğimiz ve karşılaştığımız dolandırıcılık suçunun bilgisayar ve iletişim ortamları üzerinden yapılıyor olmasıdır. “Bilgisayar yoluyla dolandırıcılık” en çok kredi kartlarının suiistimaliyle yapılmaktadır. En basiti bu işlem için geliştirilmiş birçok “Card Generator” bulunmaktadır. İstenilen kredi kartı şirketi için mantıksal olarak olası kredi kartı bilgileri üretilmekte ve bu olaydan kredi kartı sahibinin haberi bile olmamaktadır. Bununla birlikte birde finans bilgileri bulunan sistemler üzerinde değişiklikler gerçekleştirilerek hesap transferleri yapıla bilinmektedir.

3.Bilgisayar yoluyla sahtecilik.
Bilinen klasik sahtecilik suçunun, ileri teknoloji ürünlerini kullanarak yapılmasıdır. Bilgisayar suçlarının tanımı içerisinde bu suçlarla bakıldığında diğer sahtecilik suçlarından ayırt edebilmek için “Bilgisayar Yoluyla Sahteciliği” ayrı olarak ele almak gerekir. Çünkü; Bilgisayar kullanarak üretilmiş sahte para, kimlik, kıymetli evrak v.b. suçunda, yapılacak incelemede teknik olarak işleyişi incelemek gerekir. Yani kısacası klasik sahtecilikle teknolojik suç arasında ince nokta yakalamak gerekebilir.

4.Kanunla Korunmuş bir yazılımın İzinsiz kullanılması.
Fikir ve Sanat Eserleri Kanununda eser olarak kabul edilen bilgisayar yazılımlarının lisans haklarına aykırı olarak kullanılmasıdır. Bilgisayar yazılımları satın alınırken üzerinde gelen lisans sözleşmesine göre bir yazılımın bir adet kopyası ancak satın alan kişi tarafından yapılacağı ve bu yazılımın başka bir kişi tarafından kopyalanamayacağı ve kiralanamayacağı belirtilmektedir. Bir çok yazılım şirketinin yazılım korsanlığına karşı hukuki mücadelesini yürüten “BSA”’nın (Business Software Alliance) verdiği rakamlara göre ülkemizde lisanssız yazılım kullanımın %80 üzerinde olduğu belirtilmektedir.

5.Yasadışı Yayınlar.
Yasadışı yayınlar karşımıza 3 şekilde çıkmaktadır.
1. Vatanın Bölünmez bütünlüğüne aykırı olarak hazırlanmış terör içerikli internet sayfalarıdır. Özellikle Terör Örgütleri tarafından hazırlanan bu sayfalarda Türkiye içerisinde yayınlayamadıkları bölücü fikirlerini internet ortamında çok rahat teşhir edebilmektedirler.
2. Halkın ar ve haya duygularını incitecek şekilde genel ahlaka aykırı pornografik görüntüler içeren internet sayfalarıda yayınlanabilmektedir. Yurtdışında genel itibariyle çocuk pornografisi üzerine yoğunlaşmıştır. Ülkemizde ise böle bir ayrım yoktur. Gerek çocuk pornografisi gerek Büyük pornografi ülke çapında yasaktır.
3. Kişi ve kurumlara karşı işlenen hakaret ve sövme içerikli sayfalar mevcuttur. Bunlar genelde şahsi olaylar sonucunda ortaya çıkmaktadır veya eleştiri boyutunu yalan yanlış bilgilerle abartma durumudur.

6.Diğer Suç tipleri.
6. maddeye kadar bahsetmiş olduğum suç tip veya türleri genel itibariyle hepimizin bildiği ve en yaygın olan türlerdir. Bunlara ek olarak bir çok suç türü daha maddelenebilinir.

TEMEL AĞ  KAVRAMLARI

Node:
Bir bilgisayar ağına adapte olmuş herbir uç elemana denir. Bu kavram ile bir bilgisayar, ya da özelleşmiş elektronik cihazlar kastedilebilir.

Paket:
Herhangi bir protokol tarafından işlenmiş olan ve kendi içinde bütünlüğü olan en küçük veri parçasına, o protokole ait bir paket denir.

Protokol:
Birbirleriyle haberleşen sistemlerde, bu haberleşmenin yöntemlerini belirleyen kurallar bütününe protokol denir.

Switching(Anahtarlama):
Bir ağ içerisinde, bir paketin ulaşması gereken hedefe ulaştırılması için o paket üzerinde yapılan işleme switching(anahtarlama) denir. Bu işlem, switch adı verilen cihazlar tarafından gerçekleştirilir.

Routing(Yönlendirme):
İki ağ arasında, bir paketin ulaşması gereken hedef ağa ulaştırılması için o paket üzerinde yapılan ağlar arası transfer işlemine routing(yönlendirme) denir. Bu işlem, router adı verilen cihazlar tarafından gerçekleştirilir. 

Connection(Bağlantı):
İki node arasında, asıl bilgi transferinin dışında, iletişimin ayrıntılı özelliklerini belirleyerek ve senkronizasyon kurmaya dayalı olarak yapılan anlaşmaya connection(bağlantı) denir. 
 

Connection-oriented Communication(Bağlantılı İletişim):
İki node arasında, güvenli bir iletişim maksadıyla kurulan bağlantı tabanlı iletişim yöntemleridir. Bağlantı'nın gereklerini yerine getirmek uzun bir zaman aralığı istediği için performansı daha düşüktür. 

Connectionless Communication(Bağlantısız İletişim):
İki node arasında, bağlantı tabanlı olmayan iletişim yöntemleridir. Bağlantı'nın gereklerini yerine getirmek durumunda olmadığı için performansı daha yüksektir. 

  

 Transmission Control Protocol / Internet Protocol
İletim Kontrol Protokolü / İnternet Protokolü 

İnternetin temel protokol paketidir. Protokol kelimesinin tanımı için bilgisayar ağları başlığı altına bakabilirsiniz. Internet üzerinde verilerin akışını kontrol eden TCP/IP bir çok protokolün bir araya gelmesiyle oluşturulmuş olduğu için ona protokol paketi diyoruz. TCP bu protokol paketinin "Noktalar arası veri transferinde dikkat edilecek hususlar" kısmını yürütürken, IP ise "Verilerin taşınacağı yolu nasıl belirlesek!" kısmıyla ilgilenir. TCP/IP sisteminin 7 katmanlı OSI yapısına uymadığı bunu tartışan kitaplarda belirtilir. Bunun ne gibi bir soruna yol açtığını ise pek bilemiyoruz. (Aslında bilebiliriz de; uzun mesele. Boşverin gitsin)TCP/IP' yi anlatan kitapları karıştırdığımızda onun tarihi ile ilgili bazı bilgiler verilir. Ben de hatırımda kaldığı kadarıyla bunları derleyeyim. ABD' de DARPA adında askeri bir kurum bir nükleer savaş esnasında bile ayakta kalabilecek bir bilgisayar iletişim yapısı kurulması için çalışmalar başlatır. Bu projenin temel amacı, herhangi iki nokta arasındaki iletişimin kopması durumunda bile başka yollar üzerinden noktalar arası iletişimi devam ettirebilen bir sistem meydana getirebilmekti. Bu dokümanda işin tarihi ya da edebi yanından çok bu noktası açıklanacak. Yani sistem bunu nasıl olabiliyor da yapabiliyor? Neyse bir kaç noktaya daha değinip bu faslı kapatalım. Daha sonra ABD çapında üniversite öğrencileri ya da akademisyenlerden oluşan bir yazılım grubunun uzunca bir çalışması sonucunda TCP/IP yapısı oluşturuluyor. 

 TCP/IP adreslemesi ve LAN' lardaki analizi 

O zaman öncelikle TCP/IP' nin yerel ağımızdaki iletişimi nasıl sağladığıyla başlayalım konuya. Bilgisayar Ağları kısmında da anlatıldığı gibi yerel alan ağı, 5-10 makine kadar bir bilgisayar topluluğunun ethernet vb. protokollerle bağlanmasıyla ortaya çıkıyordu. Netbios gibi bir protokolü ele aldığımızda bu protokolün her makineye verilen bir isim ile bu iletişimi sağladığını görüyoruz. Sisteminiz, ağ üzerinde şöyle bir tarama yapar ve size Netbios protokolünü kullanan diğer makinelerin isimlerini bir liste halinde getirir. Sonra da verilerinizi transfer edersiniz.Fakat TCP/IP global bir sistem olduğu ve öyle sadece 10 makinayı birbirine bağlamakla yetinemeyeceği için daha global bir adresleme sistemi kullanmaktadır. TCP/IP' nin adresleri , notasyonal bazda birbirinden "." larla ayrılmış 4 er adet 8 bitlik (oktet) rakamdan oluşmaktadır. Bu adresleme sistemine bir örnek olarak 193.255.88.197 adresini verebiliriz. 8 bitlik parçalardan oluşmasından dolayı iki nokta arasında kalan sayılar 0-255 arasında değişen değerler alırlar. Rakam kullanmak, çok geniş bir adresleme aralığı sağlamasının yanında, bilgisayar programlamayla uğraşanların hemen yorumlayabileceği gibi, yönlendirme işlemleri için algoritmik tasarım esnekliğini de sunar. Yerel alanda zorluk gibi gelen bu numaraların kullanılması, internet alanında bir zorunluluktur. Sistemi tasarlayan kişiler de bu numaraları hafızada tutmanın zor olduğunu bildiklerinden, DNS adını taşıyan ve www.erciyes.edu.tr gibi hafızada tutulması kolay (insan hafıza yapısına uygun) olan domain isimlerini, bunlara karşılık gelen IP adreslerine eşleyebilen bir sistem geliştirmişlerdir. Bu sayede bizim ezberlememiz ya da öğrenmemiz gereken IP numaralarının sayısı (kendi makinemizin ayarlarını buna katmazsak) sadece 1' e indirilmiş oluyor. Dolayısıyla bu numaralardan kaynaklanan zorluğu da aşmış bulunuyoruz.

 ARP  (Address Resolution Protocol - Adres Çözümleme Protokolü) 

Adres Çözümlemesi' nden kasıt, karşı bilgisayarın IP adresini sisteme vermemize karşılık ethernet katmanından karşı makinanın ethernet adaptörüne ait olan MAC adresini elde etmektir. Biliyorsunuz ethernet katmanında yazılımsal protokollerin (TCP/IP, Netbios gibi) adreslerinin hiç bir önemi yoktur. Bu adresler ethernet gibi daha alt seviyedeki protokoller tarafından, herhangi bir veriden farksız biçimde işlem görürler. Dolayısıyla LAN' ımızda yaptığımız her türlü iletişim için karşı bilgisayarın ethernet kartının donanımsal adresini bilmemiz gerekiyor. (Bu arada sürekli olarak ethernet üzerinden örnekler veriyorum. Çünkü TCP/IP nin token-ring veya FDDI gibi protokoller üzerindeki uygulamaları hakkında bir bilgiye sahip değilim. Ama önemli olan şu ki TCP/IP açısından değişen bir şey yok.) İşte bu karşı IP adresine sahip olan makinanin ethernet adaptörünün MAC adresini öğrenme işine ARP adı verilmektedir. Yapısal olarak son derece basittir. Yaptığımız iş bütün bilgisayarlara aranan IP adresinin o makineye ait olup olmadığını sormak ve eğer ait ise MAC adresinin geri gönderilmesini istemektir. Peki burada neden DNS' e benzer bir sistemle bu adresleri öğrenerek, sistemin performansını artırmıyoruz? Çünkü LAN' larımız çoğunlukla basit amaçlarla kurulmuş ucuz sistemlerdir ve fazla bir performansa ihtiyaç duymamaktadırlar. Ve her LAN için bu tür bir sistem son derece maliyetlidir. Daha yüksek performansa ihtiyacı olan LAN' larda kullanlılan bridge vb. aktif cihazlar bu işin bir benzerini yapmaktadırlar. 

 Routing - Yönlendirme 

Yukarıda da bahsedildiği üzere IP adreslerini LAN'ımızdaki makineleri birbirlerinden ayırmak için kullanıyoruz. "E o zaman tek oktetli bir adres kullansaydık. Bu kadar uzununa ne gerek var?" diyenleriniz olabilir. Tahmin edilebileceği üzere oktetlerin sadece bir kısmı LAN' ımızdaki uç makineleri (node) tarif eder. Geri kalan kısmı internet üzerindeki paket yönlendirme işlemlerinde işe yarar. Eğer 193.255.88.197 gibi bir adresin 197 olarak gördüğümüz dördüncü okteti nodelarımızı tarif etmekte kullanılacaksa, geri kalan 193.255.88' lik kısım, yerel alan ağımızı tarif etmekte kullanılır. Fakat biz değişken olarak seçtiğimiz 197' nin yerine sıfır koyarız. "193.255.88.0 ağı" diyerek ağımızı adlandırırız. Tek oktetin değişken olarak seçildiği bu tür ağ IP adreslerine C sınıfı IP adresleri denilir. 0, ağ adresini 255 de broadcast(yayınlama - paketin bütün nodelara gönderilmesi durumu) adresi olduğu için C sınıfı ağlarda 254 tane uç eleman tanımlanabilir. Eğer iki oktet kullanılırsa B sınıfı olur. 65534 uç eleman olur. Üç oktet kullanılması durumunda ise A sınıfı ve yaklaşık 16 milyon adet uç IP olur. 1' den başlayıp 120 gibi bir rakama kadar giden (şu anda bunun kaç olduğunu hatırlayamıyorum. Çok da önemli değil zaten. İhtiyaç anında öğrenilebilir) numaralarla başlayan IP adresleri A sınıfı olarak tanımlanmışlardır ve internet üzerinde bu makinelerin düzgün çalışabilmesi için A sınıfı olduklarını belirten bir subnet mask ayarlaması yapmalıdırlar. (Subnet Mask' a birazdan değineceğim.) 192' ye kadar olanlar B sınıfı, 192' den 255' e kadar olanlar da C sınıfı... İstisnalar haricinde bu olay böyle.Eğer bizim göndereceğimiz paketin sahibi bizim ağımızda değil de internet üzerinde başka bir ağda ise bu paket için ARP işlemi yapmayız. Paketimizi, makinemizde tanımlaması daha önceden yapılmış olan Çıkış Noktası (Gateway)' na göndeririz. Çıkış Noktası IP' sine sahip olan cihaz bir bilgisayar olabileceği gibi router dediğimiz özel tasarlanmış cihazlar da olabilir. Yaptığı işe routing(yönlendirme) denir. Bu cihazin birden fazla arayüzü vardır. Her arayüzü farklı bir ağa bakar ve her arayüz baktığı ağa ulaşabilmek için o ağdan bir IP adresi alır. Üzerinde çalışan algoritmaya bakarak, bir arayüzünden aldığı paketi hangi arayüzünden göndereceğine karar verir. Göndereceği paketin hedefi, paketin gerçek sahibi olabileceği gibi, yol üzerindeki başka bir router da olabilir. Paketin gittiği yolda, üzerinden geçtiği her bir router bir "hop" tur. Router' ların üzerindeki algoritmalar tarafından her interface için hedef ağa varmak amacıyla kaç hop' tan geçmek gerektiği bulunur ve paketin yollanacağı yöne bu hop sayılarına bakarak karar verilebilir. Bu yöntemlerden sadece biridir. Diğer başka bir yöntem ise her bir yöndeki ağ yoğunluğunun bulunmasıdır. Yoğunluğu daha az olan interface üzerinden gönderilir. Bir başka mesele de makinamıza kendi ağ adresini ve göndereceği paketlerin hedef IP' lerinin ağ adreslerini bulmasını öğretmektir. Hedef ağların tam ve net olarak bulunması pek önemli değilse de en azından makinemizin hedef IP' nin kendi LAN' ında olup olmadığını fark edebilmesi önemlidir. Bunun için kullandığımız yönteme maskeleme diyoruz ve IP adresine benzer bir 4 okteti daha bu işe ayırıyoruz. Bu 4 oktetlik rakamlar zincirine Subnet Mask denir. C class IP' ler için standart subnet mask 255.255.255.0' dır. Bu olayı en iyi şekilde bir örnekle açıklayabiliriz. Uygulama katmanımızdan TCP/IP katmanlarına 193.255.100.1 adresine gönderilmek üzere bir paket geldiğini düşünelim. Bizim IP adresimiz ise 193.255.88.1 olsun. Subnet mask ise C class olduğu için 255.255.255.0 . 255' li kısımlar ayırt edici kısımlar, yani ağ tanımlayıcısını belirleyen kısımlar olduğu için hedef ağ 193.255.100.0 olarak bulunur. Kendi IP' miz için de aynı işlem uygulandığında 193.255.88.0 ağı olduğu görülür. İki ağın aynı olmadığı anlaşıldığı için paket gateway' e yollanır. Fakat Subnet Mask eğer 255.255.0.0 seçilseydi, ağ tanımlayıcıları 193.255.0.0 olarak bulunacağından gateway' e gidilmeyecek, LAN protokolü üzerinden direkt olarak ulaşılmaya çalışılacaktı. Şimdi bu 255' li kısımların ayırt edici olma meselesine bir göz atalım. Burası lojikle alakalı bir mesele olduğu için dileyen burayı atlayabilir. Önceki örneğe bağlı kalarak, 193.255.100.1 adresi bitler seviyesinde açılır. 11000001.11111111.01011000.00000001 olduğu görülür. 11111111.11111111.11111111.00000000 (Subnet Mask da bitler seviyesinde açılır) Yukarıdaki gibi olduğu görülür. Alt alta gelen sayılar lojik AND işlemine tabi tutulur. Bu işlem sonucunda 255' li kısımların kopya almakta, 0' lı kısımların ise yutmakta olduğu açıkça görülmektedir. Öyleyse hangi oktet Subnet Mask'ta 0' lardan oluşmakta ise, adres kısmındaki o oktet, ağ adresi bulunurken yutulacağı için ayırt edici olma özelliğini yitirecektir.

Ayrıca Subnet Mask'ta daha çok biti 1'olarak ayırırsak ne olur bir de ona bakalım. Subnet Mask'ımız
11111111.11111111.11111111.11111100 olsun. Eski örneğe bağlı kalarak 193.255.88.0'ın bir ağ, 193.255.88.4'ün bir ağ, .8'in bir ağ, 12'nin bir ağ ... şeklinde ağ sayısının arttığını görmekteyiz. Ağ sayıları artmış fakat node sayıları azalmıştır. Demek ki C class bir IP'miz varsa ve biz onu sıkarak suyunu çıkarmak istiyorsak, böyle bir yöntem kullanmalıymışız. Pratik bir hesaplama yöntemiyle; 2 üzeri 1'li bit adedi kadar (bu örnekte 2 üzeri 6 = 64) ağa parçalamak mümkün. Her parçada da 2 üzeri 0'lı bit adedi - 2 (yazıyla: iki üzeri sıfırlı bit adedi eksi iki) adet nodeumuz oluyor. Yine bir adresin ağ tanımlayıcısına, diğerinin de broadcast' e gittiğini unutmayalım; niye - 2 oluyor diye sormayalım.

 

 OSI Modeli' ne bir bakış 

 

OSI, ismini standartlaşma konusunda sıkça duymuş olduğunuz ISO (9001, 9002 vs.) International Standards Organization'in bilgisayar ağlarına bir standart getirmek için ortaya atmış olduğu bir standartlar yapısıdır. Open Systems and Interconnections kelimelerinin kısaltılmasından oluşuyor OSI ifadesi. Şimdi bu standartlaşma işini biraz açmakta fayda var. Dünya üzerinde bir çok bilgisayar sistemi vardır ki; birinde kullanabildiğiniz disketi diğerinde doğrudan kullanamazsınız. Dosya sistemleri farklıdır vs. yani kısacası biz bu sistemlere "birbirleriyle uyumsuz sistemler" deriz. Eğer bu sistemler arasındaki bilgisayar ağı yeterince esnek dizayn edilmezse, sistemler birbirleriyle ağ üzerinden haberleşemez hale gelirler. Varın internetin halini siz düşünün artık... Her ne kadar sistemler birbirleriyle uyumsuz olsa da her sistemin dizaynı esnasında göz önünde bulundurulan Bilgisayar Mimarisi, İşletim Sistemleri gibi bilimler vardır. Sistemler bu bilimlere uygun dizayn edildiklerinden ötürü bir sistemin yaptığı bir işe karşı öbür sistemde de aynı ya da benzeri işi yapan bir birim vardır. Ve eğer siz iki bilgisayarın haberleşmesi sırasında yapılan işleri tam ve net olarak tarif edebilirseniz, her sistemde bu yapılan işlere denk gelen bölümleri birbirlerinden bağımsız olarak düşünebilirsiniz. Sistemlerin birbirleriyle uyumsuz oldukları noktalarda, her sistem için o sisteme özgü modüller oluşturur, transfer edilmesi istenen veriyi diğer sistemle uyumlu olacağı noktaya kadar o modüller ile işler ve karşı tarafla uyumlu olacağı bir noktaya kadar getirirsiniz. Daha sonra bu sistemler birbileriyle uyumlu oldukları bir kıvama geldiklerinde iki sistem arasında bir ortak dil/arayüz bulunmuş olur ve bu noktada veriyi transfer edebiliriz. Sonra karşı tarafa ulaşan veri bu sefer ters işlemlere tabi tutulur ve karşı tarafa özgü olan modüllerle işlenir. Ve işlenme bittiğinde o verinin karşı sistemdeki tam karşılığı elde edilmiş olur. Bir örnekle bu konuya yaklaşalım: Eski zamanda iki ülke hükümdarından birinin diğerine bir mektup yollamak istediğini hayal edelim. Bu noktada, iyi bildiğimizi düşündüğümüzden dolayı fazlaca önem vermediğimiz bazı ayrıntıları vurgulamak istiyorum. Bir hükümdar, hiçbir zaman yazacağı mesaja muhattap olarak, kendinden daha alt seviyede bir insanı almaz. Bu ne demektir? Yani hükümdarın muhattabı ancak diğer ülkenin hükümdarıdır. Söylemek istediği şeyleri hükümdarlar arasında alışılagelmiş bir ortak üsluba dikkat ederek söyler. Yani birbirlerinin ne demek istediklerini gayet iyi anlamaktadırlar. Buraya kadar olan yer mektubun içeriği meselesiydi. Peki mektubun iletilmesi problemini hükümdar nasıl çözecek? İşini gücünü bırakıp atına binerek dört nala sürecek mi? Yoldan geçen herhangi bir atlıya rica mı edecek? Ya da bütün yolculuk organizasyonunu kendisi mi yapacak? Hayır, bunların hiçbiri değil. Evet; cevabı siz de tahmin etmiş olmalısınız. Tabii ki en güvendiği bir vezirini çağırıp; "Şu mektubun icabına bak!" diyecektir. Bu şekilde bütün işinin gücünün arasında, herhangi bir mektuba mesaisini ayırmaktan kurtulmuş olur. Hesap sormak istediğinde de yalnız bir tek kişiyle muhattap olur. Peki vezir ne yapar? Onun da işi başından aşkın. Tabii ki, o da kendinden bir alt kademedeki memuruna bu işi havale eder. Ta ki atlı elçiye mektubun teslim edilme noktasına kadar.İşte bu şekilde işlerimizin daima tıkırında işlemesine vesile olan ve adına bürokrasi(!) denen kavramı hep birlikte icad ederek tarih sahnesine sunmuş olduk. Şaka bir yana yukarıda tarif etiğimiz yöntemle her birim bir altındaki birime bir görev havale ediyor ve o görevin nasıl yapılması gerektiğini, hassasiyetlerini, inceliklerini vb. ayrıntıları en iyi şekilde biliyor ve kendinden bir üstteki birime karşı da göreviyle alakalı sorumluluk duyuyor. Ve tabii gerektiğinde hesabını da oraya veriyor. İşte buraya kadar anlatmış olduğumuz bu hikaye, bilgisayar ağlarının haberleşme algoritmasına karşılık benim uydurduğum bir yaklaşımdır. Hikayede adı geçen birimler, haberleşmede tarif edilen katmanlara karşılık gelir. En alt birim olan atlı-elçi, fiziksel katman adı verilmiş olan ve bilgisayarlarımız arasına döşenen kablolar ile içlerinden akan sinyaller olarak düşünülebilir. Hem nasıl bir atlının yolu üzerinde başına bir iş gelse veya atı hastalanıp ölse, o problemini kendi uzmanlık alanı olduğu şekliyle çözerek aldığı görevi yerine getirir ve hükümdarın da bundan haberi bile olmaz; haberleşen sistemlerde de üstteki katman alttaki katmana yapması gereken işi söyler ve yapılıp yapılmadığını kontrol eder, ama oranın kendi iç problemlerinin ne olduğuyla ilgilenmez. Çünkü üst katmanın asıl işi kendisine ait olan problemleri çözmektir. Yapılan işlemleri birbirlerinden ayrı düşünmenin bir faydası da bunları modül modül ele alarak kazanmış olduğumuz esneklik avantajıdır. Tasarımcılar her seviye üzerine ayrı ayrı konsantre de olabilirler. Bir bilgisayar sisteminde kullanıcıya yakın olan seviye üst seviye, elektroniğe yakın olan seviye ise alt seviye olarak bilinir. Seviyeler bu bakış açısıyla belirlenir. İşlevleri tam olarak tarif edilmiş olan bu seviyelere katman(layer) adı verilmiştir. ISO uzmanları oturmuşlar bunları tarif ederek bir standarda bağlamışlardır. Katmanlar 1 den 7' ye kadardır ve şöyle tarif edilmişlerdir.Application, Presentation, Session, Transport, Network, Data-Link, PhysicalNet olarak ne iş yaptıklarıyla alakalı bir miktar bilgi staj notlarında olacak. Oradan bakabilirsiniz. Zaten ulaşılması da son derece kolay bir bilgidir. Biz biraz yorumuna bakalım isterseniz.Şimdi bu katmanlar bir seviyeye kadar donanımsal, ondan sonra ise yazılımsal bazda işliyorlar. Donanımsal sistemler son derece hızlı fakat yeterince esnek değillerdir. Yazılımsal sistemler ise son derece esnektir fakat donanımsal sistemler kadar hızlı değillerdir. Dolayısıyla işlerimizi olabildiğince donanım üzerinden yapmaya çalışıyoruz. Yapamadığımız yerde ise yazılımsal sistemlerin esnekliğinden istifade ediyoruz.Genel itibariyle Data-Link ve Physical katmanları donanımsaldır ve çoğunlukla ethernet kartları gibi LAN adaptör kartları gibi donanımlar ile uygulanırlar.

Network ve daha yukarı katmanlar ise yazılımsaldır. Fakat eğer bu işler için özellikle yapılmış bir donanım üzerinden akan bir veriden söz ediyorsak, bu donanım için donanımsal işler daha üst katmanlara kadar çıkabilir.Bir sistemin herhangi bir katmanı üzerinde çalışan bir protokol, ancak karşı sistemin aynı katmanında çalışan aynı protokol ile haberleşebilir.

Böylece sistemler arasında bir uyumsuzluk olma ihtimali tamamen ortadan kaldırılmış olur. (Macintosh üzerinde çalışan TCP/IP ile IBM mimarisi bir PC'nin üzerinde çalışan TCP/IP'nin haberleşebilmesi gibi)OSI modeli katmanlarının Physical ve Data-Link katmanlarında LAN protokolleri olarak bildiğimiz Ethernet, Token-Ring ve FDDI çalışır. Bu protokoller genelde bilgisayarlarımıza taktığımız bir takım adaptör kartları tarafından uygulamaya geçirilirler. Katmanlı yapının temel özelliği olarak daha önce de anlattığımız gibi, adaptör kartı tarafından kablo üzerinden çekilen bilgi, işlenmek üzere yukarı katman protokolünün emrine verilir. Network Layer kısmında genelde yazılımsal adresleme işleriyle uğraşırız. Bizim kendi yaılımsal adresimiz ve karşıdaki makinanın adresi gibi...

Transport'ta ise verilerin parçalara bölünmesi ve bu parçaların gönderiliş-alış esnasında karışmaması gibi meseleler halledilir. TCP/IP nin TCP ve UDP' si, Netbios, IPX gibi protokollerin bu katmanlarda çalıştıklarını söyleyebiliriz.

TCP/IP; bazen data-link'ten sonrasını bütünüyle ele alması (örnek: telnet) gibi özelliklerinden dolayı OSI modeline uymaz. Bu şekilde işlene işlene gelen bilgi masanızın üzerinde bazen bir chat sürecindeki bir satır bilgi olur, bazen de bir html dokümanı olarak web browserınız tarafından işlenir. OSI modeli Tannenbaum'un Computer Networks kitabında da ayrıntısıyla kritik edildiği gibi pratik hayatta pek de uyulmayan bir standartlar bütünüdür. Fakat ağ sistemlerinin çalışma prensiplerini kavrayabilmek açısından çok faydalı olduğundan, ağları anlatan kitaplarda başköşelerdeki yerini daha uzun süreler koruyacağa benziyor.En önemli dört katmanın da görevlerinden az da olsa bahsettiğimize göre bu bahsi burada noktalayabiliriz.

 

 Aktif Network Cihazları 

 

Ethernet'ten bahsederken collision denen bir hadiseden bahsetmiştik.

Hakikaten ethernet'in en büyük baş belası bu collision denen hadise olsa gerek. En basitinden şöyle bir örnek verelim: Geçen bir arkadaşla ağ üzerinden oyun oynuyorduk. Başka bir kullanıcı da aynı ağ üzerinden internet bağlantısı alıyordu. Daha sonra bu internet kullanıcısı yok yere makinasını mı denemek için yaptı artık orasını bilmiyoruz, 14 tane IExplorer penceresi açtı arka arkaya. Herhelde açılan her pencere de ağ üzerinden bir sorgulama mı yapıyor onu da bilmiyoruz, oyunumuzun kesilmesine sebep oldu. Eğer siz de oyun oynamak gibi, ağ üzerinden zaman-kritik işler yapıyorsanız; beklenmedik bir anda, bilinmeyen bir sebeple gelen bir veri dalgası işinizin aksamasına, daha da kötüsü kesilmesine sebep olabilir.(Ağ üzeinde oynanan oyunlarda zaman senkronizasyonu çok önemlidir. Çünkü her oyuncunun aynı anda, aynı ortamda bulunduğu duygusu verilmelidir.)  Genelde LAN'ınızdaki makine sayısı 10'un üzerine çıktığında ve ağ üzerinde yoğun sayılabilecek veri trafiği varsa bu collision meselesi problem olmaya başlıyor. (Burada, normal ev kullanıcısı olarak bilinen ve hataya tolerans gösterebilen bir kullanıcı üzerine yapılan pratik bir yorum sözkonusu. Ağ ile taşınan verinin kritikliğine göre ve hata tahammülüne göre bu yorum değişebilir.) Ama tabii profesyonel uygulamalarda buna bile bakılmayıp birden fazla cihazın aynı collision domain'de bulunması zararlı görülerek, pahalı cihazlar kullanılmak kaydıyla bu problem aşılmaya çalışılıyor.Şimdi, nedir bu cihazlar? Ne iş görürler onu inceleyelim. Aktif bir cihaz olmamasına rağmen önce hub'dan başlamak, konu bütünlüğü açısından daha doğru olacak...

Hub

Göbek/dingil manasına gelen bu kelime, elektronik sinyalleri çoğaltarak, bütün ayaklarına ulaştıran basit yapıdaki bir cihaz için kullanılmaktadır. Üzerinde hafıza üniteleri olmadığından ve akıllı bir sistem olmadığı için aktif cihaz sınıfına girmez.Bilindiği gibi ethernet'de sinyallerin bütün uç elemanlara ulaştırılması esastır. Biz de uç elemanımızı bu cihaza bağlayarak, ağda dolaşan sinyallerin bizim makinamıza da uğramasını sağlamış oluruz yani ağa adapte oluruz.Bir kablo üzerine birden çok uç elemanın bağlanmasıyla ethernet oluşturulabiliyorken, daha çok kablo kullanması gereği aşikar olan böyle bir sisteme niçin geçilme ihtiyacı duyulmuştur?Çünkü, bu sayede fiziksel bağlantıların herhangi birinde bir sorun olduğunda, sadece o fiziksel bağlantının sahibi olan bilgisayarın ağ ile olan bağlantısı kesilir. Ağın faaliyeti ise normal olarak işlemeye devam eder. Sorunsuzluk; ufak maliyet artışlarından çok daha önemli bir tasarım kriteridir.

Bridge

Bridge(Köprü) adı verilen cihazlar, gerçek bir köprüde de olduğu gibi iki ayağa sahiptirler. Şöyle bir örnek verirsek:
Bir şirkette, muhasebe ve bilgi işlem departmanlarının bilgisayarları aynı ağda olsunlar. Burada sizin de tahmin edebileceğiniz gibi, bu grupların kendi içlerindeki veri trafiğinin gayet yoğun, birbirleri arasındaki veri trafiğinin ise çok seyrek olarak yaşanması beklenir. Peki böyle bir durumda bir önlem alınmalı mıdır?
Evet. Çünkü ethernet sisteminin yukarıda da bahsettiğimiz Multiple Access özelliğinden dolayı, bir ağa attığımız bilgi bütün uç elemanlara ulaşır. Eğer bir uç elemana, kendisini ilgilendirmeyen verilerin gelme olasılığı, kendisini ilgilendiren verilere oranla çok fazlaysa; bu olay hem o uç elemanı gereksiz yere meşgul edecektir, hem de collision olayının gerçekleşme ihtimalini artıracaktır.Öyleyse, bu iki bilgisayar grubunun arasına, mesajları süzerek filtre eden bir cihaz konulursa, her grubun mesajını kendi bölgesinde tutmuş olur ve yukarıda saydığımız zararları ortadan kaldırır.Bu cihazın mantığı, her bir ayağına bağlı olan ethernet adaptörlerinin  MAC adreslerini öğrenerek bunları hafızasında tutuyor olmasıdır. Bir ayağına, diğer ayağındaki makinelere ulaştırılması gereken bir paket geldiğinde, onu diğer ayağından ağa gönderir. Diğer bacağını ilgilendirmeyen bir paket geldiğinde ise hiçbir işlem yapmayarak filtre işlemini gerçekleştirmiş olur. Bir bilgisayardan ağa gönderilen bir paket, muhattabına ulaşmasının hemen ardından gereken cevap da postalandığından; bridge cihazı, bir haberleşmede iki adet bilgisayarın hangi bacaklarında bulunduğunu öğrenmiş olur.Switchİkiden fazla sayıda ayağı olan bridge'lere switch adı verilir. Pratik hayatta bridge'lerden ziyade switch'lerle karşılaşmamız muhtemeldir. Çünkü profesyonel ağ tasarımları gitgide daha çok yaygınlaşıyor ve sorunsuz sistemler isteyen tasarımcılar ve ağ yöneticileri gitgide bu cihazlara doğru yöneliyor.Switch'lerin yaptıkları iş olan anahtarlama, bu cihazların en önemli bir performans kriteri olarak bilinir. Bu kabiliyetleri ne kadar fazlaysa, o kadar yoğun bir ağ yükünün altına girebilirler. En kabiliyetli olan switch'ler, o ağın tasarımının en merkezine ya da göbeğine yerleştirilirler. Daha az kabiliyetli switchler ya da kritiklik durumu daha az olan bölgelerde ise hub'lar, merkezdeki switch'e(core switch) uç eleman olarak bağlanırlarsa; mantık olarak düşünüldüğünde de, pratikteki uygulamalarında da, ağımız bir ağaç yapısı içerisinde büyüyerek genişleyebilir.Standart olarak en sıklıkla karşılaştığımız switch'ler 24 port olanlarıdır. Merkeze konan büyük switch'ler ise genelde modüler yapıda olup, ihtiyaca göre modüller eklenerek kapasiteleri artırılabilmektedir.Ethernet'ten çok farklı olan ATM vb. sistemlerde de switch adı verilen cihazlar bulunmakta, yaptıkları iş ise paket süzmekten ziyade, gerçek manada paket anahtarlaması yapmaktır. Bu tür sistemlerde switch'lerin daha akıllı görevleri, sistem yönetim yazılımlarını üzerlerinde barındırmaya varıncaya kadar, oldukça geniş bir yelpazededir. Ayrıca bu tür sistemlerde switch, bir paketin noktadan noktaya hangi yollardan geçerek gitmesi gerektiğini bilebilmekte ya da buna karar verebilmektedir.

 

 Ethernet 

 

Ethernet, aynı kablo üzerine bağlanmış birden fazla makinenin oluşturduğu donanımsal bazlı bir protokoldür. Bu protokolde makinelere taktığımız ethernet adaptör kartları, ağa elektronik sinyaller gönderme ve başkaları tarafından gönderilmiş olan sinyalleri algılama özelliğine sahiptir. Herhangi bir protokol tarafından işlenmiş olan ve kendi içinde bütünlüğü olan en küçük veri parçasına, o protokole ait bir paket diyoruz.

Ethernet için bu paketlerin IEEE 802.3 standardında da belirtilmiş olan büyüklükleri vardır. (IEEE LAN sistemlerini standardize etmiş ve onlara 802 ile başlayan kod numaraları verilmiş. Ethernet'in payına ise 802.3 düşmüş.) Bütün adaptör kartları tek bir kablo üzerinden veri alışverişi yaptığı için hangi verinin kimden kime gönderildiğini anlayabilmek gerekir. Bunu belirleyebilmek için, her ethernet adaptör kartının dünya üzerinde diğer kartlardan farklı bir sabit adresi olması öngörülmüştür. İşte bu sabit adrese Media Access Control (MAC) adresi adı verilir. Her ethernet paketinin üzerinde paketi gönderenin ve alıcısının MAC adreslerini gösteren bölgeler vardır. Ethernet kartı bu bölgelerden mesajın kendisine gelip gelmediğini ya da kimden geldiğini anlayabilir. Eğer mesaj kendisine gelmiş ise veriyi üst katman protokollerine gönderir. Eğer paket kendisine ait değilse paketi atar.Ethernet sistemi, en basit şekliyle CDMA/CD denen bir yöntem ile haberleşmeyi düzenler. Bu kısaltmanın açılımı Carrier Sense (Hattı dinlemek), Multiple Access (Çoklu erişim), Collision Detection (Çarpışmanın fark edilmesi) şeklindedir. Bu kelimeleri yorumlarsak ethernetin çalışma
prensibini anlamış oluruz. Üst katmanlar tarafından ethernet katmanına indirilmiş olan paketler ethernet içinde uygun paketler haline dönüştürüldükten sonra kablo üzerinden ağa gönderilmek üzere iken, ağ üzerinde hareket eden başka verinin olup olmadığını anlamak maksadıyla hat dinlenir.(CS) Eğer hat doluysa hat boşalıncaya kadar beklenir. Bir kablo medyasına aynı anda birden çok ethernet kartı erişebilirler.(MA) Fakat hattın boş olduğunun görülmesiyle hatta aynı anda gönderilen birden fazla adaptör kartına ait veriler, çarpışma (collision) denilen verilerin bozulması olayına maruz kalırlar. Hattı dinleyen diğer bağlı makineler çarpışmanın varlığını anlayabilirler. (/CD) Paketlerinin böyle bir duruma maruz kaldığını algılayan adaptör kartları, paketlerini yeniden göndermek üzere rasgele bir süre beklerler. 
İşte ethernet sisteminin çalışma mantığı bundan ibarettir ve gayet basittir. 

ANSI ASCII OSI TANIMLARI

ANSI                                   

Ansi olarak okunur.Amerikan Uluslararası standartlar enstitüsü standart geliştiren iş ve endüstri gruplarından oluşan bir enstitüdür . PC dünyasına bakıldığı zaman ANSI ,SCSI arabirimleri ve ANSI .SYS aygıt sürücüleri  olduğu gibi , C programlama dili içinde öneriler getirmiştir .Ancak bu sadece öneride kalmıştır.                                                    

 ASCII                       

Aski olarak okunur . Türkçe çevrimi ise ''Bilgi Alış-Verişi İçin Standart Amerikan Kodları '' dır . Farklı bilgisayar ve çevre birimleri arasında uyumluluk sağlamak için harflere , sayılara , noktalama işaretlerine ve kontrol karakterlerine sayısal değerler atayan bir standart kodlama yöntemidir .                        ASCII ' de her karakter ayrı bir sayıya karşılık gelir . 0...31 arasında ki değerler basılmayan kontrol kodları için kullanılır . 32...127 aralığı , alfabetik harfleri ve yaygın noktalama işaretlerini temsil etmekte kullanılır . 0....127 aralığı standart ASCII karakter seti olarak bilinir.           

OSİ                       

Ağ içerisindeki cihazların haberleşmesinde bir standart oluşturmak amacıyla ISO tarafından OSI açık sistem arabağı geliştirilmiştir. OSI ağ protokollerinin bağlandığı ve organize edildiği yeri sağlamaktadır

OSI’nin katmanları:

Veri iletim katmanı;                       

 Bu katman aynı ağ üzerindeki cihazlar arasındaki veri iletimiyle ilgilidir. Bu seviyede bir takım hata kontrol ve yakalama özellikleride tanımlanır. FDDI gibi LAN teknolojileri bu teknolojiyle çalışırlar.

Fiziksel Katman;                       

Fiziksel seviye OSI modelinin en alt tarafında ve cihazların haberleşmesinde kullanılır.Sinyallerin iletimini tanımlayan seviyedir. Repeater bu sistemi tekrarlayan bir cihaz olarak  örnek gösterilebilinir. 

Ağ katmanı;                       

Bu katman diğer iki katmandan farklı olarak farklı ağlar arasındaki veri iletimi ile ilgilenen genel paketler üzerinde değişiklik yaparak farklı ağlar arasında taşınabilmesi için taşıma adresleri yapısı kurar.Bu sayede  routerlar çalışmaktadır.

BİOS                          

Bilgisayarın DOS bölümü reboot sırasında donanımla doğrudan doğruya bağlantı kuramaz ve bunu bios  sayesinde yapar. PC nin uyumluluk durumunu bios belirler .Yani bios bir bilgisayar için oldukça önemlidir. Bilgisayarla ilgili birçok konuda olduğu gibi Bios da uyumluluk standardının bir numaralı ismi IBM dir.               

CPU                       

Cpu sistemin çalıştırabileceği yazılım çeşitlerini, adresleyebildiği bellek boyutunu ve bu yazılımların çalışacakları hızları belirleyen ana bir parçadır. İşlemci hızı olarak  MHz kullanılır . MHz saniyede yapılabilecek işlem sayısı belirtir. CPU saatleri genellikle saniyede bir milyon kezden daha fazla atar. Saniyede tam bir milyon kez atan saatin hızına  ; bilgisayar dilinde 1 MHz denir. Cpu konusunda İNTEL modelleri : Celeron , MMX , 486 , Pentium Pro ve Pentium modelleri; rakipleri ise AMD, CYRX’tir.            

RAM                       

Ram ler bir devredirler , üzerinde çipler olan , küçük devre kartlarıdırlar . PC lerinde bütün bilgisayarlar gibi bir ana belleği olması gereklidir. Random Access Memory adı pek kullanışlı olmadığı için türk uzmanlar tarafından ana bellek adı verilen RAM, PC lerin çalıştıkları yazılımları tuttukları alandır. Ram uçucu bir bellektir. Sabit diskten daha hızlı ve daha ucuzdur. Ram çeşitleri ; SRAM,DRAM,SDRAM,EDORAM dir.  

ROM                       

Bu bellek tipi (genellikle bilgisayar üreticisi tarafından) bir kere yüklenen bir bellek türüdür. PROM BLASTER , EPROM vb. Adı yanlızca okunabilen bellek olmasına rağmen kullanıcı olarak Rom a bilgi girişi yapabiliriz. Rom da diğer parçalar gibi bir yazılım bulunur. Bu yazılımın amacı, bilgisayarda ki konfigurasyonu  görmek , belirlemek ve kullanıcıya iletmektir.