Derleyiciler

06 Kasım 2007

DERLEYİCİLER

1.1Giriş

Bir programlama dilinde yazılmış olan bir programı -ki buna kaynak dil de denmektedir- , yine başka bir dilde ona karşılık olan programa çeviren programa Derleyici denir. Genellikle kaynak dil Fortran, Pascal veya C gibi programlardır. Hedef dilde hdef makinede kullanılan makine dilidir. Derleyici genellikle derlenen kaynak program hakkında hata ve tanımlamalarla ilgili mesajları da içinde barındırır.

1.1.1 Makine Koduna Çevrime Olan İhtiyaç

İlk kuşak bilgisayarlar çok basit ve kavramsal olarak çok küçüktü. Örneğin Manchester Mark1 1948 yılında yedi tane işlem kodu ve 64 byte’lık ana bellekle doğdu. Böyle bir bilgisayarda program yazarken işlem kodlarını program yazarken bu kodları klavyeden binary kodlar halinde sıralanmış olarak girmek hiçte zor değildi. Bununla beraber programı önceden hazırlarken bu kodları binary olarak değil de kısaltmalar veya simgeler şeklinde yazmak daha uygundu. Tablo 1.1 de bu bilgisayar için kullanılan işlem kodlarının kısaltmalarından birkaç örnek verilmiştir.

Daha karmaşık bilgisayarlar ve daha uzun programlar ortaya çıktıkça bu kısaltmaları programcının binary koda çevirmesi oldukça yorucu ve içinden çıkılmaz bir hale geldi. 1940’ların sonunda bu çevirme işinin pekala bilgisayarın kendisi tarafından yapılabileceği konusuna işaret edildi ve bu yönde çalışmalar başlatıldı. Bu işi yapmak üzere “assembler” olarak tanıdığımız program ortaya çıktı. Bu programın kodlarından oluşan dil de “assembly dili” olarak adlandırıldı.

Programlar karmaşıklaştıkça, assembly dilinin makine koduna çevirmedeki birebir çevirme yöntemi oldukça sıradan ve yavaş bir hal almaya başladı. Karmaşık diller (otomatik kodlar) programları daha kısa şekilde tanımlıyorlardı. Bu programlarda yazılan bütün bir kod assembly dilinde birden fazla işlem yapılarak gerçekleştirilebiliyordu. İşte yüksek seviyeli diller olarak adlandırılan bu dillerde yazılan programları makine koduna çevirmek için derleyici ( compiler ) adını verdiğimiz programlar ortaya çıktı.

1950’lerde yüksek seviyeli diller karşılaşılan problemleri herhangi bir makineye özgü dilden bağımsız olarak çözmeye başladılar. Fortran bu ilk kuşak dillere örnektir. 1958 yılında piyasaya çıkan Algol 60 yüksek seviyeli dillere yeni bir yaklaşım getirdi. Makine koduna çevrimde şu ana kadar kullanılan yöntemler hakkında sorular ve problemin nasıl çözüleceği konularındaki düşüncelerden ortaya çıkmıştır. Mesela yerel değişken tanımlamalarına ve tekrarlanan rutin yapısına izin veriyordu. Peki ama bütün bunlar sadece bir adres boşluğu ve alt rutinler konusunda sadece bir işlem koduna sahip makinelerde nasıl makine koduna çevrilecekti? Pascal, Ada, C++ gibi daha modern programlar işte bu kısıtlamadan kurtulup hedef makinenin mimarisinden bağımsız olmaya çalışmışlardır.

Artık derleme işleminden geçen programlar hatasız çalışıyordu. Bu yönde avantajları vardı. Programcıların yapımlarını düzeltiyor, mantıksal hataları azaltmak için biçimsel kısıtlamalar yapıyor ve debug işlemini kolaylaştırıyorlardı. Dezavantajları ise hem derleyicinin hem de derlenmiş programın daha çok yer kaplaması ve daha yavaş çalışmasıydı. Derleyici teorisi dilleri de etkilemişti. Daha kolay derlenen diller oluşturma yolunda çalışmalar başlamıştı. İşlemlerin çoğunu otomatikleştirmek için çeşitli araçlar geliştirildi. İlk Fortran derleyicisini yapmak insanlığın 18 yılını aldı, oysa şimdi bu konuda eğitim alan bir öğrenci için bu bir dönemde bitirebilen bir iş…

Yüksek seviyeli bir dilde yazılmış bir programı çalıştırmak için iki yol vardı. Birisi programı makine kodunda kendisine denk olan bir programa çevirmek ki buna derleme olayı demiş ve bahsetmiştik. Diğeri de yüksek seviyeli dilde yazılan programda kullanılan ifadeleri sırayla yorumlayabilen bir program yazmaktır. Bu programlara da “interpreters” ( yorumlayıcı ) denir.

Derlemenin avantajı zaman harcayan bir işlem olduğu halde programı sadece bir kere analiz etmesi ve çevirme işlemini yapmasıdır. Daha sonra da derlenmiş programı çalıştırabiliriz. Dezavantajı ise makine koduna çevrilmiş programda eğer bir hatayla karşılaşırsak bu hatayı programı yazdığımız dile dönüp orada düzeltmek zorunda kalmamızdır.

Yorumlama karşılaşılan ifadenin her defasında tekrar bütün dil yapısı içinden bulunup analiz edilmesi gerektiğinden dolayı derlemeden çok daha yavaştır. Bununla birlikte eğer bir hatayla karşılaşırsak daha kaynak program üzerinde çalışıyor olmamızdan dolayı hatanın yerini kolayca tespit edebiliriz. Bu da program geliştirme de çok büyük bir yardımdır.

Bunlar iki ayrı uçta bulunan yaklaşımlardır. Ama çoğu programlarda her ikisinden de biraz vardır.

Esas yaklaşım ise programı doğrudan doğruya hedef makinenin koduna çevirmek değil daha orta seviyede bir koda dönüştürerek orada yorumlanmasını sağlamaktır. Bu bahsettiğimiz orta seviyeli dil hem makine koduna hem de yüksek seviyeli dile yakındır. Bunun en güzel örneği yorumlanması için PCODE adlı orta seviyeli bir kod üreten UCSD Pascal derleyicisidir.

Derleyici veya yorumlayıcı arasında seçim yapmayı kullanılan çevre birimleri ve yüksek seviyeli dilin yapısı etkiler. Fortran diğerlerine nazaran makine koduna çevrilmeye yatkın, oldukça basit yapılı ve hızlıdır ve bu yüzden büyük sistemlerde karşılaşılan çok büyük sayısal problemleri çözmek için kullanılır. Kesinlikle derleme yöntemini kullanır.

Diğer taraftan Basic ise daha çok PC’lerde , işlem gücünün eksik olduğu , belleğin yavaş çalıştığı yerlerde kullanılır ve yorumlama yöntemiyle çalıştırılır. LISP programı ise hem derleme hem de yorumlama kullanan bir programdır. Programlar zaman alan derleme işinden kaçmak ve programı daha yazarken yorumlama yapılmasından dolayı yorumlanmayı kullanırlar.

1.1.2 Derleyicilerin Daha Yaygın Kullanımı

Bilinen en temel derleme teknikleri yüksek seviyeli dillerin makine koduna çevrilmesi esasına dayanır. Bununla birlikte yazılım mühendisliği ile de ilgilidir. Uygulama yazılımı derleme tekniklerinin esas olduğu komut dilleri arabirimini kullanır. Aynı teknikler modern sistemlerin kullandığı karmaşık konfigürasyon dosyaları için de gereklidir. Bunun en iyi örnekleri Windows’un .ini dosyalarıdır. Diğer bir taraftan kaynak programların dilleri TeX gibi kelime işlem programları veya İngilizce gibi doğal diller de olabilir ve hedef programların aynı şekilde dilleri değişik türlerden olabilir. Son olarak bilgisayar dillerinin kapsamları ve bu dilleri diğer dillere çevirmek oldukça önemli bir olaydır.

1.1.3 Derleyici Yapısı

Bir programlama dilinin tercüme edilmesinin elbette ki birkaç mantıksal evresi vardır. Bu evreler eşzamanlı ve ardışık zamanlı olarak çalışabilirler. İlk adım olarak bir derleyiciyi kaynak metinin anlamını ve yapısını analiz etmekten sorumlu bir ön-bölüm ve hedef programın kodlarını oluşturan bir son-bölüm şeklinde ikiye ayırmak mümkündür.

Bu bölümler yine kendi içlerinde mantıksal bloklara ayrılırlar. Ön bölüm dediğimiz bölüm lexical analiz, syntax analiz ve semantic analizden oluşur. Lexical analize “scanner” da denir. Derlemenin ilk evresidir ve tek başına metin içerisinde anlamı olmayan karakterleri mantıksal olarak grup yapar. Örneğin ‘W’, ‘H’, ‘I’, ‘L’ ve ‘E’ harflerinin “WHILE” kelimesini oluşturabileceği açıktır.

Syntax analiz bütün programı analiz eder ve lexical analiz de yapılanın bir üst evresini yapar yani scanner’ın oluşturduğu küçük grupları -ki bunlar kelimeler diyebiliriz- daha büyük gruplara dönüştürür. Mesela ifadeler , döngüler, altprogramlar gibi…bunlar ana programı oluşturur. Bilgisayar programlarının yapısını belirlemek için İngilizce metin yapısını anlamamız gerekmektedir. Zira İngilizce dilbilgisi yapısından alıntılar vardır.

Şu ana kadar programın yapısını analiz ettik şimdi anlamsal olarak analize başlayabiliriz demektir.(semantic analyse)Yani hangi değişkenler integer sayıyı tutar hangi değişkenler büyük numerik sayıları tutar , gibi olayları belirleyebiliriz.

Bu bölümde kaynak dili hedef dile dönüştürme konusuna değineceğiz. Şu ana kadar orijinal programdaki birçok bilgiyi işledik, burada programı basit bir yolla ifade etmeye çalışacağız.

Derleyicinin son bölümü dediğimiz bölüm kaynak programın yapısal ve anlamsal özelliklerini alarak bunu hedef dile çevirir. Bu işlem hedef dile çevrimin etkili olması için çoğunlukla birden fazla adımda yapılır.

“Intermediate Code Optimizer” adı verilen program kaynak kodu daha etkili olan ama kendisine karşılık gelen koda dönüştürür. Sonra “Code Generator” gelir ve bu kodlarla hedef makine için aynı işi yapan programın kodlarını oluşturur daha sonra da hedef makinedeki bu kodlar optimize edilerek kullanılır.

Kodları düzenleme işini iyi yapan programlar çok zaman harcarlar. Bu aslında kod düzenleme programlarının program geliştirilirken kullanılamayacakları anlamına gelmez. Bu işlemlerin bitmesi derleme işleminin bittiğini göstermez. Çünkü derlenen programı destekleyecek çalışan bir sistem gereklidir. Bazı yüksek seviyeli dil yapıları temelde karmaşıktır. (giriş,çıkış ve kesme istemleri gibi….) Dolayısıyla bu dillerden derlenen programlarda birden fazla kullanılan alt programların her karşılaşıldığında derlenmesi gerekirse oldukça geniş bir alan kapladıkları görülmüştür. Bu alt programlar yürütme süresince kütüphanede bulunurlar. Sistemde bazı extra kodlar vardır bunlar sistemin açılışını sağlayan bazı kodlar ve derlenmiş program çalıştıktan sonra onu tekrar geri gönderen bazı kodlardır bunlar.

1.1.4 Derleyiciler Hangi Dilde Yazılır ?

Derleyiciler çok fazla program bilgisi ve tekniği gerektiren oldukça geniş programlardır. Ama ideal olan en az yer kaplamaları ve az zaman almalarıdır. Derleyicinin ilk kısmı çoğunluk bilgisayarlarda değişmez ama son kısım olarak adlandırdığımız kısım değişiklik gösterir.

En iyi derleyiciyi yazmak için hangi dili kullanmalıyız? Makine kodunun her zaman uygun olmasından dolayı avantajları vardır. İlk kuşak bilgisayarlar için de değişmez bir dildir makine kodu. Fakat eğer yaptığımız derleyici sadece bir makinede çalışabilecekse bu en az istenen bir olaydır. Ama makine koduyla büyük bir derleyici yazmak da çok zor olduğu için pek istenmeyen bir olaydır.

Bir alternatifte bu şu an uygun olan yüksek seviyeli bir dilde uygulamaya koymaktır. .Böylece derleyicimiz hem bu dilin yüklü olduğu tüm makinelere yüklenebilecek hem de bu yüksek seviyeli dilin programlama gücünden yararlanabilecektir.

Bu bize en geniş programlama imkanlarını vermez. Bu yüzden dünyanın en o zamanlar en çok kullanılan dilleri olan Fortran ve Cobol’un ideal derleyici yazabilmek için uygun olmadıkları anlaşılmıştır. Bu dezavantajlardan yola çıkarak Unix altında çalışan C programlama dilinde yazılan derleyiciler en geniş kullanıma ulaştı. Bu yaklaşımın yaygınlaşmasındaki en büyük pay C programlama dilinin programcıya derleme yazarken çok fazla esneklik sağlamasıdır.

Bir uzlaşma yaklaşımı olarak da derleyiciyi geleneksel “assembly” yi kullanarak yazmak oldu. Yalnız assembler konusundaki geleneksellik kavramı yani her tarafta aynı olma olayı pek uygulanmıyordu , dolayısıyla assembler’da yazdığımız derleyici de yine hedef makinenin kullandığı biçime çevirme zorunluluğu doğuyordu. Bu yaklaşımın en iyi örneklerinden birisi bir metin işlemci dil olan SNOBOL4 için yazılan derleyici Macro-SPITBOL’ dur. Bu derleyici gelenekselleştirilmiş bir assembler olan MINIMAL assembly dilinde yazılmıştır.

Bir diğer derleyici yazma tekniği de -ki bu çok büyük esneklik sağlar- derleyiciyi kendi kaynak dilinde yazmaktır. Mesela standart BCPL derleyicisi BCPL dilinde yazılmıştır, bunun gibi Unix altında çalışan C derleyicisi yine C de yazılmıştır. Bu yaklaşımla derleyicilerde istenen taşınabilirlik sağlanmış oldu ve bu yaklaşım “cross-compilation” adını aldı.

Bu bölümde derleyicinin tanımı tarihsel ilişkileriyle birlikte açıklığa kavuşturulmuştur.

Bir bilgisayar programcısının program yazarken çok çeşitli seçenekleri vardır. Çok çeşitli program yazma dilleri vardır. Ama bu diller doğrudan bilgisayarlarla iletişim kuramazlar. Makinenin yapılan programı çalıştırabilmesi için arada köprü vazifesi gören bir yazılımın olması gerekir. İşte bu yazılım derleyicidir. Derleyici sihirli bir şey yapmaz. Pascal, C vb., dillerde yazılır ve yazılan programı işlenecek veri olarak algılar ve bu verilerin yazıldığı dilin kurallara uyup uymadığını kontrol ederek hataları ortaya çıkarır ve son olarak da bu verileri genellikle yazıldığı dilden daha alt seviyede olan başka bir dildeki karşılık gelen ifadelere dönüştürür. Yani bir anlamda tercümanlık yapar.

Bir tercümanın işi bir dildeki ifadeleri başka bir dildeki aynı anlamı veren kelimelere dönüştürmek olduğuna göre derleyici de bir tercümandır. Yalnız derleme işini doğal dilleri tercüme etmekten farklıdır. Bilgisayar programlama dillerindeki tercüme işlemi doğal dilleri tercümeden iki temel etkenden dolayı daha basittir. Bu etkenlerin birincisi şudur : Derleme işleminde her iki dil de (kaynak dil ve amaç dil ) özel olarak bazı kurallarla dizayn edilmiştir ve bu dillerde eşanlamlı kelime olayı yoktur ve doğru olan program sadece bir şeyi ifade eder, yanlış olan ise kabul edilmez ve işlem yapılmaz. İkinci etken ise kaynak dil yani derlenecek olan dil amaç dilden daha karmaşık bir yapıya sahiptir ve daha üst seviyededir. Bu seviye makine daha kolay anlayabileceği kodlardan insanın daha kolay anlayabileceği dillere doğru artmaktadır. Yani bir bakıma derleme bir analiz, bir ayrışmadır.

Makinenin anlayabileceği kodlar ikilik düzende kodlanmış sayılardır. Bir üst seviye ise bu ikilik kodların düzenlenmesiyle oluşan assembly dilidir. Ve bundan itibaren insanların anlayabileceği ifadelere doğru bir seviye ilişkisi vardır. Assembler assembly kodlarını bir haritalama işlemiyle makineye anlatmaktır. Birebir eşleştirme yapılır. Birebir eşleştirmeden kasıt bir assembly komutunun bir işlem yaptırmasıdır. Daha üst seviyeli dillerde ise bir komut birden fazla işlem yaptırabilmekte ve bir komut içinde birden fazla ifade olabilmektedir.

Derleme teorisi makinelerin daha fazla sayıda dille iletişim kurabilmesi ve bu dillerde yazılan programları daha doğru bir şekilde işletmesi fikrinden doğmuştur. Boş bir bilgisayar sadece ikilik düzende kodlanmış verileri işleyebilir, oysa çeşitli derleyiciler yüklü olan bir bilgisayar çok çeşitli işler yapabilmekte ve kullanıcının donanıma hükmetmesine olanak verebilmektedir.

Yazılımlar çok geniş bir yelpazeye sahip olan değişik dillerde yazılır. Geleneksel diller; COBOL, FORTRAN, Pascal veya C gibi, Nesne yönelimli diller; C++, Smalltalk veya Java , Fonksiyonel ve Mantıksal diller; LISP veya Prolog gibi, 4.kuşak diller ve görsel diller ; Visual Basic veya Delphi gibi olabilir…

Derleyicinin görevi bu kullanıcıya yakın olan yazılımların çalışmaları için makinenin anlayacağı biçime dönüştürmektir. Derleyiciler için metin işlemciler denebilir Yani kullanıcının elle yazdığı veya 4.kuşak dillerde olduğu gibi yarı otomatik yazılan kodları ince düşünülmüş bir şekilde düzene sokan ve makinenin anlayacağı dile çeviren kelime işlemciler demek de mümkündür.

Derleme işlemi aşağıda gösterildiği gibi iki aşamada yapılır.

1.Verilen metinin analiz edildiği Analiz Evresi

2.Makinenin anlayabileceği şekle dönüştürüldüğü Sentez Evresi

Analiz evresine gelen metine genelde kaynak kod , sentez evresinden çıkan metine de amaç kod denir. Ve bu dönüştürme derleyici tarafından yapılır ve buna derleme işlemi denir. Bir dil derleyicisi genellikle o dilin yüyürlüğe konmasıdır. Derleyicinin meydana getirdiği amaç programın kodları genellikle makine kodu olur veya daha sonra makine koduna çevrilen assembly kodu veya uygun bir ara kod olur. Burada kullanılan ara kod makine koduna çoğunlukla yorumlayıcılar tarafından çevrilir.

Derleyici teknolojileri ilk bilgisayarlar çıktığından bu yana oldukça gelişmişlerdir .Artık derleyicileri otomatik kod üreteçleri yardımıyla yazabilmekteyiz. İlerleyen kısımlarda Lex ve YACC isimli otomatik analizcilerden bahsedilecektir. Lex ve YACC yardımıyla compiler yazarken C mantığı kullanılır.

Derleme işleminin aşağıdaki adımlarla ifade etmek mümkündür :

·Kullanıcı tarafından oluşturulan kaynak programı okuma işlemi,

·Programın kullanılan dilin kurallarına göre doğruluğunu kontrol etmek,

·Eğer yanlışlar varsa kullanıcıyı haberdar etmek,

·Programa karşılık gelen alt seviye bir program kodu ortaya çıkarmak.

Bu işlemlerin yapılmasının ardından oluşturulan program çalışabilmekte ve kullanıcının istekleri cevaplandırılmaktadır.

Derleyicinin dizaynı ve yapısı diğer yazılımlardan farklı değildir. Derleyicileri 4 aşamada tanımlamak mümkündür:

·Çözümüm istenen problemin belirlenmesi ve analiz edilmesi,

·Çözümün tasarlanması,

·Tasarlanan yapıya uygun olarak çözümün inşa edilmesi,

·Bitmiş olan ürünün test edilmesi ve onaylanması.

1.2Basit Bir Dil Ve Program

Bu bölümde Pascal üzerinde uygulanan basit bir derleyici aracılığıyla derleyicilerin yapısı hakkında temel bazı kavramların anlaşılması amaç edinilmiştir.

1.2.1 P Programlama Dili

Pascal’ da uygulanan ve programları işlemek için yazılmış olan derleyici P kodda yazılmıştır. Bu derleyici M makinesi diye adlandırılan bir bilgisayara kod üretmektedir. Syntax ve semantic yapısıyla P kodu ve derleyici için gerekli bilgileri ve şartları bulunduran M makinesi birlikte derleyici yapısını oluştururlar. Aşağıda eğitim amaçlı oluşturulmuş bir P dili ( dilbilgisi anlambilgisi ile birlikte) , bir M komut kümesi ve derlenmiş haliyle örnek bir program yeralmaktadır.

Şekil 1.1 Sıfır olmayan integer tipli sayıları okuyan ve çıkışta bunların sayısını veren kümede sıfır yoksa ortalamalarını alan fakat sıfıra rastlarsa programı bitiren basit bir Pascal procedür’ü…

VAR S,N,T ;

BEGIN

S := 0 ;

N := 0 ;

T := READ;

WHILE T <> 0 DO

BEGIN

S := S + T ;

N := N + 1 ;

T := READ ;

END ;

WRITE (N) ;

WRITE (S) ;

IF N <> 0 THEN

WRITE (S/N) ;

END.

Şekil 1.1 P dilinde küçük bir program.

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image002.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image003.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image004.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image005.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image006.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image007.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image008.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image009.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image010.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image011.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image012.gif[/IMG] blok

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image013.gif[/IMG] İfade

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image014.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image015.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image016.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image017.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image018.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image012.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image019.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image020.gif[/IMG] blok

Tanım listesi

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image021.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image022.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image023.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image024.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image025.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image026.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image027.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image028.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image029.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image030.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image031.gif[/IMG]

tanımlayıcı

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image032.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image033.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image034.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image035.gif[/IMG]

sabit

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image021.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image036.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image037.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image018.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image038.gif[/IMG]

İfade

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image039.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image040.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image041.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image042.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image043.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image044.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image045.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image046.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image047.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image048.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image049.gif[/IMG]

Şekil 1.2 P dilinin syntax (sözdizimi) yapısı.

1.2.2 Alt Seviyeli M Komut Kümesi

Varsayılan bir M makinesi tasarlandı. Bu bilgisayarın çok basit bir komut kümesi var. M komut kümesinde bir fonksiyon bölümü, bir işlenen bölümü ve bir de adres bölümü olsun. Fonksiyon ve işlenen tipleri Şekil 1.3 de gösterilmiştir.M bilgisayarının hesaplamalrın yapıldığı ve hareketlerin gerçekleştiği sadece bir akümülatör register’ı(acc) , 4 adet veri tipi:

·Constant : Sabit değer,

·Variable : Adres tutmak için kullanılır,

·Special : Yığın için kullanılır,

·Label : Ofset değerler içindir.

Fonksiyon Fonksiyonun Anlamı

acc= akümülatörü yükle

acc=> akümülatörü sakla

>acc= akümülatörü yığına at ve yükle

acc+ acc := acc + işlenen

acc- acc := acc – işlenen

-acc acc := işlenen – acc

acc* acc := acc * işlenen

acc/ acc := acc / işlenen

/acc acc := işlenen / acc

accom akümülatör ve işleneni karşılaştır

Yukarıda verilen komutlarla kullanılan işlenenler sabitler, değişkenler ve özel tipli verilerdir.

br etiket değere dal

breq acc = işlenen ise etiket değere dal

brne acc <> işlenen ise etiket değere dal

brlt acc < işlenen ise etiket değere dal

brle acc <= işlenen ise etiket değere dal

brge acc >= işlenen ise etiket değere dal

brgt acc > işlenen ise etiket değere dal

call etiket ismindeki prosedürü çağır

Yukarıda verilen komutlarla kullanılan işlenenler etiket tipli verilerdir.

stop programın çalışmasını durdur

İşlenen Tipi Ayrıntılar

constant integer sabitin değeri

variable data alanında integer değişkenin değeri

special yığına atılan veya yığından çekilen değer

label prosedür çağırma veya dallanma

komutlarının adresleri

Şekil 1.3 M bilgisayarında kullanılan fonksiyonlar ve işlenen değer tipleri.

1.2.3 Örnek M Programı

Şimdi de Şekil 1.1 de verilen P programının karşılığı M programını inceleyeceğiz.

Bu program örnek olarak verilmiştir ve ilerde bahsedilecek olan P derleyicisinin yaptığı işi göstermektedir. Daha P kodunda verilen program işte bizim hayali makinemiz için kod üretseydi aşağıda Şekil 1.4 de gösterilen programı ortaya çıkaracaktı.

0: acc= constant 0

1: acc=> variable 1(S)

2: acc= constant 0

3: acc=> variable 2(T)

4: call read

5: acc=> variable 3(T)

6: acc= variable 3(T)

7: accom constant 0

8: breq 18

9: acc= variable 1(S)

10: acc+ variable 3(T)

11: acc=> variable 1(S)

12: acc= variable 2(N)

13: acc+ constant 1

14: acc=> variable 2(N)

15: call read

16: acc=> variable 3(T)

17: br 6

18: acc= variable 2(N)

19: acc=> stack

20: call write

21: acc= variable 1(S)

22: acc=> stack,

23: call write

24: acc= variable 2(N)

25: accom constant 0

26: breq 31

27: acc= variable 1(S)

28: acc/ variable 2(N)

29: acc=> stack

30: call write

31: stop

( En sol sütundaki numaralar komut adresini göstermektedir. İlk komut belleği sıfır(0) a konumlamaktadır. P programdaki ifadelerin başlangıcını gösteren komutların adresleri italik yazılmıştır.)

Şekil 1.4 Programın M koddaki karşılığı.

1.3Derleyici Düzeni

Bu konuda derleme işleminin ilkeleri ve işlemin nasıl parçalara ayrılarak analiz edildiği anlatılacaktır.

Pascal veya P dilinde yazılan bir program çalışmadan önce bağlantı-yükleme (link-loading) ve derleme işlemlerine ihtiyaç duyar. Derleme yapılırken kaynak metin amaç metine dönüştürülür. Link- Load yapılırken de bu amaç kod matematiksel fonksiyonlar vb. gibi kod için gerekli diğer parçalarla birleştirilir ve birbirlerine bağlanır. Çalışma zamanında da elimizdeki kaynak metinin eşdeğeri olan ikilik kodlar çalışır, bilgi okurlar, sonuçları yazarlar vs……Şekil 1.5 de derleme, link-load, ve çalışma zamanlarıyla ilgili bir akış şeması vardır. Burada bir programın derlenirken bir programda aslında çalışmaktadır. Yani bizim hazırladığımız kaynak metin derlenirken derleyici de çalışma zamanı içindedir.

Derlenme esnasında yapılan işlemler parçalara ayrılabilir. İlk önce belirli bir yapısı olmayan bu kaynak metin anlamsal olarak bazı şeyler ifade eden kelimelere ve sembollere dönüşür. Bu safhaya Lexical analiz denir. İkinci olarak bu anlamlı fakat rasgele durmakta olan semboller belirli bir yapıya kavuşturulur. Bu işlem daha önce verilmiş dilbilgisi yapısıyla kaynak metinin dilbilgisi yapısı karşılaştırılarak yerine getirilir. Ardında da amaç programa dönüştürülecek olan programın anlamının oluşturulması ve onaylanması, test edilmesi için Semantic Analiz safhası uygulanır.

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image050.gif[/IMG] P DEN M YE DERLEYİCİ

Kullanıcının Hata mesajları

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image051.gif[/IMG]programı [IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image052.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image053.gif[/IMG] M amaç kod programı

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image054.gif[/IMG]

Diğer M

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image055.gif[/IMG]Modülleri

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image056.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image057.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image058.gif[/IMG]Kullanıcının

verileri

Şekil 1.5 Derleme işleminde bilgi akışı.

1.3.1Lexical Analiz

İlk safha Lexical Analiz’dir. Bu aşamanın işleyeceği veriler kullanıcının yazmış olduğu programdaki şu an için bir anlam ifade etmeyen karakter topluluğudur. Bu safha Tarama (Scanning) adıyla da anılır. Bu aşamada programda yer alan açıklamalar, gereksiz boşluklar ve satırlar atılır.Geride kalan ve derleyicinin işine yarayacak olan karakterler sayılar, isimler, anahtar kelimeler, komutlar ve noktalama işaretleri gibi gruplara ayrılırlar. Bu gruplamalar yapılırken aslında isimler, numaralar tek tek karakter olarak algılanırlar aradaki boşluğun kontrol edilmesiyle kelime oluşur.

Lexical analiz için programda bulunan açıklamaları, boşlukları ve gereksiz satırları egale ederek geride kalan kelimeleri analiz edip gruplayan adım demek mümkündür. Bu arada lexical analiz’in bir diğer özellik de grubun başlangıç karakterinin biçiminden bir sonraki karakter için olasılıklar üretmesidir. Mesela eğer ilk karakter alfabetik ise o ifade ya bir anahtar kelime ya da tanımlayıcı olabilir şeklinde varsayımlar yapar. Mesela bir komut, eğer o harfle başlayan başka komut yoksa hemen zaten komut ortaya çıkmıştır. Diğer karakterleri de karşılaştırarak doğruluğunu kontrol etmiş olur. Bu konuda bir sonraki karakteri çağırma işlemi basitçe Şekil 1.6 de gösterilmiştir. Bu algoritma P kod veya Pascal içindir.

PROCEDURE getlexeme ;

BEGIN

WHILE NOT useful input character DO

skip character;

CASE input character OF

Digit :recognise numreic lexeme;

Alphabetic :recognise identifier or keyword lexeme;

“’” :recognise string lexeme;

other :recognise operator or punctutaion lexeme;

END;

return lexeme;

END;

Şekil 1.6 Karakter çağırma procedür’ü

Bu bölümde yapılan bir diğer işlem de hata mesajı verme işlemidir. Eğer bir hat ortaya çıkarsa o hataya ilişkin mesaj ekrana gelecektir. Hatanın hangi satırda olduğu da mesajda belirtilir. Genellikle derleyiciler kaynak metini analiz ederken işlenen satırın bir kopyasını bir tampona atarak herhangi bir hata anında oradan çağırırlar. Daha karmaşık derleyicilerde ise programın hepsinin bu tampona atılması ve daha sonraki aşamalarda meydana gelen hatalar için de buradan gerekirse programın hepsinin ekrana getirilmesi sözkonusu olmaktadır.

Bir lexical analiz için basit bir yaklaşımın nasıl yapılandırıldığını gördük. Daha karmaşık yapılarda lexical analiz aşamasını yapılandırmak için bazı yardımcı yazılımlar kullanılmaktadır. Mesela UNIX ortamında bir analizci yaratmak için LEX isimli bir yazılım kullanılmaktadır. Bunun gibi daha pek çok yazılımlar mevcuttur.

1.3.2Syntax Analiz

Bu bölüm lexical analizin incelediği cümleleri giriş verisi olarak kabul eder ve bu cümlelerin kaynak dilin kurallarına uyup uymadığını test eder. Syntax analiz “Parsing” olarak da adlandırılır. Zaten kullanılan dilin sözdizimi yapısı önceden belirlenmiştir ve bu belirlenmiş yapıya göre karşılaştırma yapılır. Bu arada parser programın yapısını tanımaya çalışır. Örneğin hangi tip veriler sunulmuş, kaç tane vs. gibi …Bu yapısal bilgiler derleyicinin geri kalan bölümünde lazım olmaktadır. Bu şekilde program incelendikçe ortaya bir veri yapısı çıkar. Buna “parse tree” denir. Örneğin A : = B + C * D ifadesi aşağıdaki şekilde görülen ağaç yapısı ile ifade edilebilir.

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image059.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image060.gif[/IMG] ifade

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image061.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image062.gif[/IMG] tanımlayıcı toplama işlemi

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image063.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image064.gif[/IMG] B tanımlayıcısı çarpma işlemi

C tanımlayıcısı D tanımlayıcısı

Şekil 1.7 İşlem yapısının gösterilmesi

Eğer kaynak yapı sözdizimi açısından doğru değilse parser bir hata belirleyecektir. Mesela aşağıdaki ifade P kodun sözdizimi yapısına göre hatalıdır.

A := B + C := D + E

Ve bu satırda parser’ın vereceği hata işlemden sonra “:=” ifadesinin kullanılamacağı şeklinde olacaktır. Doğru ifade belki aşağıdaki satır gibi olabilir :

A := B ; C : = D + E

Burada parser ile ilgili önemli bir problem ortaya çıkıyor. Demek ki parser bir hataya rastladığında burada kullanıcının neyi kastettiği tanımlanamayabiliyor ve hatanın nerden kaynaklandığı kesin bilinmiyor sadece hataya neden olan ilk ifade gösteriliyor.

1.3.3 Semantic Analiz

Semantic analiz parser’ ın anlamlı kıldığı ifadeleri dilbilgisi olarak düzgün bir şekilde yapılandırarak kaynak programın statik analizini yapar. Mesela Pascal’ daki ifadelerin sözdizimi yapısında tanımlayıcıların eğer bunalr değişkense declare edilmesi gerekmeyebilir. İşte bu inceleme işi semantic analizci tarafından yapılır. Kısaca semantic analizde deklarasyonlar işlenir ve özellik bilgisi olarak tanımlanan bilgi oluştutulur. Bu bilgiler de özellik listesinde saklanır ve bu liste lexical analizde oluşturulan sembol tablosuyla ilişkilendirilir. Ve herhangi bir hata anında bu listeden faydalanılır.

İfadeleri anlamlandırmak için çalışan tüm yapılarda işlenmekte olan aşama bir sonraki aşamanın kullanması için işlem bilgilerini yapısal bilgiye eklerler.Örneğin Pascal’daki ‘+’ işlemi integer, real tipli sayılar için kullanılır diyelim. Bu doğru olan işlemdir. P koddaki değişkenler de bu doğru olan işleme göre bu işareti sadece bu amaç için kullanabilirler gibi…

Sözdizimi yapısından farklı olarak programlama dilinin semantic yapısı kesin olarak belirlenemez. Ve genellikle geçici olarak veya eksik olarak belirlenir. Bundan dolayı da bu aşamada derlemeye yardımcı olacak etkenler azdır.

1.3.4Kod Oluşturma ( Code Generation )

Programın bir kısmının veya tamamının analiz aşaması bittiğinde sentez aşaması başlar. Bu evre kendine işlenecek veri olarak syntax analizin oluşturduğu ve semantic analiz analizin daha kolay anlaşılır hale getirdiği yapıyı alır ve amaç kodda karşılıklarını oluşturur.

İfadeler ve atamalar için derlenmiş olan kod yığını olabildiğince çok kullanacaktır. Genel bir eğilim eğer derleyici bir değişken veya sabite rastlarsa onun hemen yığına atılması yönündedir. Bu stilde kod kullanmayan bir M makinesinde bu genellikle iki tür bilgi gerektirir. Biri akümülatörü (acc) yüklemek için diğeri de içeriğini yığına atmak için.. Buna rağmen yaygın kullanım akümülatörün yığının birinci elemanı olarak düşünülmesidir. Bunu yaparsak derleyici kodu önce akümülatöre yükler, eğer akümülatör kullanımdaysa yığını kullanır. Derleyici toplama(addop) veya çapma(mulop) işlemi görürse işlemi değerlendirmek için akümülatörü kullanacak, işleneni yığına atacak ve sonuçla birlikte tekrar akümülatöre dönecektir. Buna örnek olarak aşağıdaki işlem verilmiştir:

M dilinde oluşturulan bilgi ;

A:= B + C ;

‘:=’ ile oluşan ifade ;

acc=B

‘+’ ile oluşan ifade ;

>acc= C {akümülatörü yığına at ve C ile birlikte yükle}

‘+’ ile oluşan ifade ;

acc+ unstack

‘A:= ifade’ genel sonuç yapısı ;

acc=> A

Bu işlem sıralamanın avantajı çok kolay oluşturulmasıdır. Dezavantajı ise ; M makinesi için uygun bir yöntem olmayışı , hangi bellek bölgelerinin işlenene ayrıldığının gösterilmesi konusunda bir elemanın olmamasıdır.

Yığının kullanılması konusunda küçük bir karışıklık vardır. Çıkarma ve bölme işlemleri yanlış değerleri çekmektedirler. Burada ters işlem yapma zorunluluğu vardır.

1.3.5 Kod Optimizasyonu

Genel olarak kod oluşturma algoritmaları en iyi kod düzenini oluşturmazlar. Bu yüzden uzun bir zaman tekrar tekrar çalıştırılacak olan bu kodları düzenlemek için biraz çaba harcamak yerinde olacaktır. Bu da derleyiciye bir veya daha fazla kod optimizasyon evresi eklemekle mümkün olacaktır. Bu olay çalışma zamanından kar etmek konusunda derlemeye eklediği zamandan dolayı her zaman faydalı değildir. Çünkü bir programın yapılış amaçlarından birisi de programın diğer eşdeğerlerinden daha hızlı çalışmasıdır.

Kod optimizasyonu bütün programa uygulanabildiği ( Global Optimisation ) gibi sadece birkaç yapı veya ifade üzerine de uygulanabilmektedir.(Peephole Optimisation-Kısmi Optimizasyon) Kod optimizasyonları makineye göre yani fonksiyonların, kodların ve register’ların en iyi şekilde kullanılması yoluyla olabildiği gibi ,makineden bağımsız olarak yani ifadeleri tekrar düzenleme, birden fazla kullanılan ifadeleri belirleme ve bunları geçici değişkenler de saklama yoluyla da olabilmektedir.

Kısmi optimizasyona bir örnek vermek gerekirse aşağıdaki ifadenin derlenişini göz önüne getirebiliriz:

A := B * C ;

E := A / F ;

Bu ifade aşağıdaki gibi derlenecektir :

acc= B

acc* C

acc=> A

acc= A

acc/ F

acc=> E

Burada dördüncü ifade yani akümülatörün A’nın içeriğiyle yüklendiği satır fazladır ve ihmal edilebilir.

Global optimizasyon çalışamaz kodların silinmesi ve tekrarlanan alt ifadelerin elenmesi yoluyla olmaktadır. Tekrar çalışan döngülerin optimizasyonu çok zaman kazandırmaktadır. Mesela döngü her çalıştığında aynı değeri döndüren değişmeyen ifadelerin kaldırılması buna bir örnektir. Çoğu global optimizasyonlar kod oluşturma evresinden önce syntax analiz esnasında oluşturulur. Oysa kısmi optimizasyonlar kod oluşturulduktan sonra yapılır.

1.3.6 Evreler ve Geçişler

Bundan önceki bölümlerde bir derleyicinin Şekil 1.8’ de gösterilen birbirinden farklı bölümleri üzerinde durduk. Bu gösterilen yolların doğru olduğunu söylemek veya sadece bu şekilde derlemenin mümkün olacağını söylemek yanlış olacaktır. Fakat bu evrelerin de içerdiği gibi derleme yapmak için dilbilgisinin bilinmesi ve derlenecek metinin iyi anlaşılmasının önemli olduğu gerçeklerini bilmekte yarar vardır. Farklı bir analizi, Algol 68’de olduğu gibi işin çoğunu semantic analiz kısmında gerçekleştirerek değişken tiplerini ve ifadeleri uzatılmış bir syntax evresinde test edebiliriz. Alternatif bir analiz de kodların test edilmesinin lexical ve syntax analiz arasında dağıtılarak bu evrelerin içiçe yapılmasını sağlamakla yapılabilir. Fakat derleyicinin yapısal olarak kolay anlaşılması için bu evreleri içiçe gerçekleştirmek yanlış olacaktır. Genellikle tüm derleyiciler bölümlere, evrelere ayrılmışlardır. Bu yüzden bu şekilde bölümleme sistematik derleyici yapısını bozacaktır.

Özetlemek gerekirse, Şekil 1.8’de gösterilen derleme evreleri kendinden önceki evrenin işlediğini kendinden sonraki evreye işleyerek verirler. Bu tip derleyicilere “Single Pass Compiler” denmektedir. Dildeki kurallardan dolayı, bilgisayarın kapasitesinden dolayı, optimizasyonların önceden yapılmış olmasından dolayı veya derleyicinin diğer evreleri için yardım oluşturma araçlarının kullanımından dolayı derleyiciler “Multiple passes compiler” olarak anılır. Yani evreler arası geçişler tek yönlü olmayabilir.

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image065.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image066.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image067.gif[/IMG]

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image068.gif[/IMG]

Şekil 1.8 Derleme evreleri.

2 P DERLEYİCİSİ

Bu bölümde örnek bir P derleyicisi verilmiştir. Ve gerekli yerlerde açıklamalarla desteklenerek anlam kazanması sağlanmıştır.

Derleyicilerin dizayn aşamalarını daha önceki konuda incelemiştik. Burada da yine bu aşamalara göre derleyici parçalara ayrılmıştır. Aslında verilen bütün örnek programlar bir bütündür.

2.1 Lexical Analiz

Lexical analizci programın genel formu Şekil 2.1’de verilmiştir. Bu program düzensiz metin dizilerini okuyarak onlara düzenli kelimelere ayrıştırır ve bu arada gereksiz karakterleri de safdışı bırakır.Şekil 2.2’de bu aşamada kullnılan tanımlamalar verilmiştir.

Program lex ( input,output) ;

{Şekil 2.2’deki lexical deklarasyonlar vardır}

procedure error (n:integer); {Şekil 2.5}

procedure getlexeme; {Şekil 2.3}

function nextch ; {Şekil 2.4}

function getch ; {Şekil 2.4}

procedure init ; {Şekil 2.6}

begin

init;

while not(eof) do begin

getlexeme;

write (ord(lexeme));

if lexeme in [constant,identifier,addop,mulop,relop] then case lexeme of

constant : writeln (lexemeval.constval);

identifier: writeln (lexemeval.idval);

addop : writeln (ord(lexemeval.addval));

mulop : writeln (ord(lexemeval.mulval));

relop : writeln (ord(lexemeval.relval));

end;

else

writeln;

end;

end.

Şekil 2.1 Lexical analiz aşamasının genel formu.

Labek 999;

Const

linewidth = 256;

namechars = 6 ;

Type

lexemetype = (dot, constant, identifier, comma, assign, semicolon, lbracket, rbracket, addop, mulop, relop, beginlexeme, readlexeme, writelexeme, iflexeme, thenlexeme, whilelexeme, dolexeme, varlexeme, endlexeme, unknown );

addvaltype = (add, sub);

mulvaltype = (mul, div);

relvaltype = (eq, ne, gt, lt, ge, le);

nametype = packed array [1..namechars] of char;

lexemevaltype = record

case lexemetype of

constant : (constval :integer);

identifier : (idval : char);

addop : (addval : addvaltype);

mulop : (mulval : mulvaltype);

relop : (relval : relvaltype);

end;

var

linesize : 0..linewidth ; {bir satırdaki karakter sayısı}

linepos :integer;{sonraki satırdaki karakterin pozisyonu}

line : array[1..linewidth] of char;

lexeme, firstlexeme, lastlexeme : lexemetype ;

lexemeval : lexemevaltype ;

errors : boolean ;

lexemes : array[lexemetype] of nametype ;

Şekil 2.2 Lexical analiz aşamasında kullanılan tanımlamalar.

Getlexeme prosedürü lexical analiz aşamasının en önemli parçasıdır. Burada önce boşluklar ve açıklama kısımları safdışı bırakılır. Daha sonra karakterleri tek tek tarayarak onları sınıflandırır.

Procedure getlexeme ;

var ch : char;

name : nametype;

charno : integer ;

begin { getlexeme }

{boşlukları ve açıklamaları egale etme aşaması}

while nextch in [‘ ‘,’{‘] do begin

ch := getch;

if cd = ‘{‘ then

repeat

until getch =’}’;

end;

ch :=getch;

if ch in [‘0’..’9’] then begin {sabitlerin bulunması}

lexeme := constant ;

lexemeval.constval := ord(ch) – ord(‘0’);

end

else if ch in [‘A’..’Z’] then

{tanımlayıcıların ve anahtar kelimelerin bulunması}

if not (nextch in [‘A’..’Z’]) then begin

lexeme := identifier;

lexemeval.idval := ch;

end

else begin

{read,write,if, then, var, begin veya end sözcüklerinin aranması}

for charno := 2 to namechars do

name[charno] := ‘ ‘ ;

charno := 2;

name[1] := ch;

while nextch in [‘A’..’Z’] do

if charno <= namechars then begin

name[charno] : getch;

charno := charno + 1;

end

else

ch := getch;

lexeme := beginlexeme;

while (lexem<=endlexeme and (name <> lexemes[lexeme]) do

lexeme := succ (lexeme);

if exeme > endlexeme then begin

lexeme := unknown ;

error(6) ; {bilinmeyen isim}

end;

end

else begin { : – , ; := ( ) + – * / <=> sembollerinin incelenmesi}

if ch in [‘,’, ‘;’, ‘:’, ‘(‘, ‘)’, ‘+’, ‘-‘, ‘*’, ‘/’, ‘<’, ‘=’, ‘>’, ‘.’] then

case ch of

‘.’ :lexeme := dot ;

‘,’ :lexeme := comma;

‘;’ :lexeme := semicolon;

‘:’ :if nextch = ‘=’ then begin

ch := getch;

lexeme := assign;

end

else begin

error(5); { : den sonra = gelmezse}

lexeme := unknown;

end;

‘(‘ :lexeme := lbracket ;

‘)’ :lexeme := rbracket ;

‘+’ :begin lexeme := addop ; lexemeval.addval :=add end;

‘-‘ :begin lexeme := addop ; lexemeval.addval :=sub end;

‘*’ :begin lexeme := mulop ; lexemeval.mulval :=mul end;

‘/’ :begin lexeme :=mulop ; lexemeval.mulval :=divd end;

‘<’ :begin

lexeme := relop;

ch := nextch ;

if ch = ‘=’ then begin

ch := getch ;

lexemeval.relval := le;

end

else if ch = ‘>’ then begin

ch := getch ;

lexemeval.relval := ne;

end

else

lexemeval.relval := lt ;

end;

‘=’ :begin lexeme := relop;lexemeval.relval:=eq end;

‘>’ :begin

lexeme := relop;

ch := nextch ;

if ch = ‘=’ then begin

ch := getch ;

lexemeval.relval := ge;

end

else

lexemeval.relval := gt ;

end;

end

else begin

lexeme := unknown ;

error(4) ; {bilinmeyen karakter}

end;

end;

end; {getlexeme}

Şekil 2.3 Getlexeme prosedürü.

Getlexeme prosedürü iki yardımcı fonksiyon kullanır. Bunlar nextch ve getch fonksiyonlarıdır. Nextch fonksiyonu sıradaki karakteri döndürür ama işlem sayacını ilerletmez. Getch ise mevcut karakteri döndürür.

Function nextch : cahr ;

begin

if linepos>linesize then

if eof then begin

error(1) ; {dosya sonu}

goto 999 ; {önemli hata}

end

else begin

linesize :=1;

while (not eoln) and (linesize<linewidth] do

begin

read(line[linesize]);

write(line[linesize]);

linesize := linesize +1;

end ;

writeln;

if eoln then begin

line[linesize] := ‘ ‘;

readln ;

end

else begin

line[linesize] := linesize – 1;

error(2); {satır çok uzun}

end;

linepos := 1;

end;

nextch := line[linepos];

end;

function getch :char ;

begin

getch := nextch ;

linepos := linepos + 1

end;

Şekil 2.4 Nextch ve Getch fonksiyonları.

Lexical analizin bir diğer önemli prosedürü de hata tespiti yapan modüldür. Bu kısım hataya rastlandığında hatanın koduna göre uygun bir mesaj gönderir.

Procedure error ( n: integer) ;

begin

write (‘*’:linepos – 1);

case n of

1 : writeln (‘Dosya sonu’);

2 : writeln (‘satır çok uzun,max uz.=’,linewidth’);

3 : {beklenmedik sembol};

4 : writeln (‘tanımlanamayan karakter’);

5 : writeln (‘ : den sonra = olması gerekir.’);

6 : writeln (‘tanımlanamayan madde’);

7 : writeln (‘hatalı kelime yapısı’);

8 : writeln (‘değişken daha önce tanımlandı.’);

9 : writeln (‘değişken tanımlı değil’);

10 : writeln (‘çok fazla kod’);

end;

errors := true;

end;

Şekil 2.5 Hata raporlama.

Init prosedürü ilk değer atama prosedürüdür.

Procedure init;

begin ;

linesize := 0;

linepos := 1;

errors := false;

firstlexeme := dot;

lexemes[dot] := ‘. ‘;

lexemes[constant] := ‘rakam ‘;

lexemes[identifier] := ‘isim ‘;

lexemes[comma] := ‘, ‘;

lexemes[assign] := ‘:= ‘;

lexemes[semicolon] := ‘; ‘;

lexemes[lbracket] := ‘( ‘;

lexemes[rbracket] := ‘) ‘;

lexemes[addop] := ‘+ veya –‘;

lexemes[mulop] := ‘* veya /’;

lexemes[relop] := ‘< = > ‘;

lexemes[beginlexeme] := ‘BEGIN ‘;

lexemes[readlexeme] := ‘READ ‘;

lexemes[writelexeme] := ‘WRITE ‘;

lexemes[iflexeme] := ‘IF ‘;

lexemes[thenlexeme] := ‘THEN ‘;

lexemes[whilelexeme] := ‘WHILE ‘;

lexemes[dolexeme] := ‘DO ‘;

lexemes[varlexeme] := ‘VAR ‘;

lexemes[endlexeme] := ‘END ‘;

lexemes[unknown] := ‘? ‘;

lastlexeme := unknown ;

end ;

Şekil 2.6 İlk değer atama prosedürü.

2.2 Syntax Analiz

Bu aşamanın sonunda kesin ve açık bir çıktı alınmaz. Çünkü derleme işleminin geri kalan bölümleri syntax analiz aşaması ile birleştirilir ve uygulanır.Bu bölümde kullanılan tek y ardımcı fonksiyon ‘checkorskip’ mantıksal fonksiyonudur.

Procedure expression;

begin

term(stopset + [addop]);

while lexeme = addop do begin

getlexeme;

term(stopset + [addop]);

end;

end;

Function checkorskip (okset, stopset : lexemetype):boolean;

var alexeme : lexemetype;

orflag : boolean;

begin

if lexeme in okset then

checkorskip := true;

else begin

checkorskip := false;

error(3);

orflag := false;

for alexeme := firstlexeme to lastlexeme do

if alexeme in okset then begin

if orflag yhen

write(‘ veya ‘);

orflag := true;

write(lexemes[alexeme]);

end;

writeln(‘ expected ‘);

if stopset <> [] then

while not ( lexeme in stopset) do begin

error(7);

getlexeme;

end;

end;

end;

Şekil 2.7 İlk değer atama.

Syntax analizin genel formu genelde aşağıda görüldüğü gibi oluşturulur.

Program syntax (input,output);

{Daha önce tanımlanan; prosedürleri,fonksiyon hatalarını, karakter çağırmayı, kelimeleri birleştirmeyi ve sıradaki karakteri belirlemeyi içeren lexical tanımlamalar bu programı tamamlamak

için de kullanılır.}

type lexemesettype = set of lexemetype;

var startexp, startblock : lexemesettype;

procedure idlist (stopset: lexemesettype);

var ignore, finish : boolean;

begin

repeat

if checkorskip([identifier], stopset + [semicolon, comma]) then

begin

{semantic analiz evresindeli ‘declid’ prosedürü çağrılır.}

getlexeme;

end;

ignore := checkorskip([semicolon, comma]), stopset + [comma, identifier]);

finish := not ( lexeme in [comma, identifier]);

if lexeme = comma then

getlexeme;

until finish;

if lexeme = semicolon then

getlexeme;

end;

procedure expression (stopset : lexemesettype) ; forward;

procedure factor (stopset : lexemesettype);

begin

if checkorskip(startexp, stopset) yhen

if lexeme = identifier then begin

{semantic analizdeki ‘checkid’ prosedürü çağrılır.}

getlexeme;

end

else if lexeme = constant then begin

getlexeme;

end

else if lexeme = lbracket then begin

getlexeme;

expression(stopset + [rbracket]);

if checkorskip([rbracket], stopset) then

getlexeme;

end

else if lexeme = readlexeme then begin

getlexeme;

end;

end;

procedure term (stopset : lexemesettype);

begin

factor(stopset + [mulop]);

while lexeme = mulop do begin

getlexeme;

factor(stopset + [mulop]);

end;

end;

procedure expression ;

begin

term(stopset + [addop]);

while lexeme = addop do begin

getlexeme;

term(stopset + [addop9);

end;

end;

procedure block (stopset : lexemesettype); forward;

procedure comparison (stopset :lexemesettype);

begin

expression(stopset + [relop]);

if checkorskip 8[relop], stopset + startexp) then begin

getlexeme;

end;

expression(stopset + startblock – [identifier]);

end;

procedure statement (stopset :lexemesettype);

begin

if checkorskip(stopset+ startblock, stopset) then

if lexeme = identifier then begin

{semantic analizdeki ‘checkid’ prosedürü çağrılır.}

getlexeme;

if checkorskip([assign],stopset + startexp) then

getlexeme;

expresiion(stopset);

end

else if lexeme = iflexeme then begin

getlexeme;

comparison(stopset + [thenlexeme]+ startblock – [identifier]);

if checkorskip([thenlexeme], stopset + startblock) then

getlexeme;

block(stopset);

end

else if lexeme = whilelexeme then begin

getlexeme;

comparison(stopset + [dolexeme] + startblock – [identifier]);

if checkorskip([dolexeme],stopset+startblock) then

getlexeme;

block(stopset);

end

else if lexeme = writelexeme then begin

getlexeme;

if checkorskip(

Calisan Bir Exe’nin Silinmesi

06 Kasım 2007

Calisan bir exe’nin silinmesi

{Bu islem icin windows’un tekrar baslatilmasi gereklidir}

usesRegistry;

procedureDeleteNextTime(constFileName:string);

begin

withTRegistry.Createdo

begin

RootKey:=HKEY_LOCAL_MACHINE;

LazyWrite:=False;

OpenKey(‘Software\Microsoft\Windows\CurrentVersion \RunOnce’,False);

WriteString(‘Delete Me!’,'command.com /c del ‘+FileName);

CloseKey;

free;

end;

end;

Radioactivity And Half-life Demonstration

06 Kasım 2007

Radioactivity and half-life demonstration

Materials

• Shoebox with lid

• 200 pennies (or any coins of the same denomination)

• Graph paper

• Notebook paper

• Pen or pencil

Procedure

Each student or pair of students should have the materials listed above.

1. Put the 200 coins in the shoebox tails up. Do not overlap them.

2. Place the lid on the box.

3. Hold the box with your thumbs placed on top of the lid.

4. Shake the box with one quick up-and-down motion.

5. Set the box down. Take off the lid and remove all the coins that face heads up.

6. Record the number of coins remaining in the box in the chart below.

7. Repeat steps 2 through 6 until no coins remain in the box.

8. Prepare a graph of your data. Let the x-axis represent the number of trials. Let the y-axis represent the number of coins remaining in the box. Be prepared to interpret the graph and discuss your results. Click here to view a sample chart and graph.

Trial Coins remaining

0

1

2

3

4

5

6

7

8

9

10

11

12

Background

This demonstration simulates radioactive decay. A sample of a radioactive element consists of a vast number of radioactive nuclei that do not all decay at the same time. As unstable atoms are transformed, the radioactivity of a substance decreases. The time required for this activity to decrease by half is called half-life. Half-life is a characteristic of each radioactive isotope. Depending on the isotope, it may range from a few fractions of a second to several billion years, as shown in the following chart:

Isotope Half-life

Polonium-214 0.164 second

Oxygen-15 2 minutes

Bismuth-212 60.5 minutes

Sodium-24 15 hours

Iodine-131 8 days

Phosphorus-32 14.3 days

Cobalt-60 5.3 years

Carbon-14 5,730 years

Plutonium-239 24,110 years

Uranium-238 4.5 billion years

As radioactive elements decay, they change into other elements. Decay continues until a nonradioactive nucleus is formed. This process is called the decay series. There are 3 types of radioactive decay

• Alpha decay: The nucleus releases an alpha particle. This decreases the mass number by 4 and the atomic number by 2. Uranium-238 undergoes alpha decay.

• Beta decay: The nucleus releases a beta particle. This does not decrease the mass number, but does decrease the atomic number by one. Carbon-14 undergoes beta decay.

• Gamma decay: The nucleus releases a gamma ray. Gamma decay almost always accompanies alpha and beta decay. The nucleus does not change. It makes a transition to a lower energy state.

The radioactivity of a substance is measured by the number of decays that occur during a given period of time. Here are 2 common units of measurement for radioactivity

• The curie (Ci)

1 Ci = 3.7 x 1010 decays/s

• The becquerel (Bq), an SI unit

1 Bq = 1 decay/s

These units do not accurately measure how dangerous a given amount of radiation might be for humans. For medical purposes, other units of measurement reflecting this aspect are more appropriate.

A brief chronology of radioactivity research

1896

Henri Becquerel experiments with uranium and discovers X rays and other types of radiation.

1898

Marie Curie and her husband Pierre discover the radioactive elements polonium and radium.

1928

Hans Geiger designs the Geiger counter, an instrument that detects and measures radioactivity.

1930s

Enrico Fermi and his coworkers discover that neutrons penetrate the nucleus of an atom more easily than a charged particle does.

1938

Otto Hahn and Fritz Strassman discover nuclear fission by bombarding uranium-235 with a neutron.

1989

B. Stanley Pons and Martin Fleishmann announce what they presume to be the discovery of cold fusion.

Going further

Challenge your students to learn more about nuclear chemistry through research projects, posters, or presentations on any of the following topics:

• Pioneers in nuclear science and technology

• Medical applications of radioisotopes

• Dating fossils with radioisotopes

• Design and operation of nuclear plants

• Cold fusion

Dos Programini Calistirip, İnput Ve Output’unu Yonlendirmek Ve Bitene Kadar Beklemek

06 Kasım 2007

Dos Programini calistirip, input ve output’unu yonlendirmek ve bitene kadar beklemek

{InputFile ” ise Dos programi klavyeden okuma yapar}

functionCreateDOSProcessRedirected(constCommandLine,InputFile,OutputFile,

ErrMsg:string):boolean;

const

ROUTINE_ID=’[function: CreateDOSProcessRedirected]‘;

var

OldCursor:TCursor;

pCommandLine:array[0..MAX_PATH]ofchar;

pInputFile,

pOutPutFile:array[0..MAX_PATH]ofchar;

StartupInfo:TStartupInfo;

ProcessInfo:TProcessInformation;

SecAtrrs:TSecurityAttributes;

hAppProcess,

hAppThread,

hInputFile,

hOutputFile:THandle;

begin

Result:=FALSE;

if(InputFile<>”)and(notFileExists(InputFile))then

raiseException.CreateFmt(ROUTINE_ID+#10#10+

‘* %s *’+#10+’does not exist’+#10#10+

ErrMsg,[InputFile]);

hAppProcess:=0;

hAppThread:=0;

hInputFile:=0;

hOutputFile:=0;

OldCursor:=Screen.Cursor;

Screen.Cursor:=crHourglass;

try

StrPCopy(pCommandLine,CommandLine);

StrPCopy(pInputFile,InputFile);

StrPCopy(pOutPutFile,OutputFile);

FillChar(SecAtrrs,SizeOf(SecAtrrs),#0);

SecAtrrs.nLength:=SizeOf(SecAtrrs);

SecAtrrs.lpSecurityDescriptor:=nil;

SecAtrrs.bInheritHandle:=TRUE;

ifInputFile<>”then

begin

hInputFile:=CreateFile(

pInputFile,

GENERIC_READorGENERIC_WRITE,

FILE_SHARE_READorFILE_SHARE_WRITE,

@SecAtrrs,

OPEN_ALWAYS,

FILE_ATTRIBUTE_NORMAL

orFILE_FLAG_WRITE_THROUGH,

0);

ifhInputFile=INVALID_HANDLE_VALUEthen

raiseException.CreateFmt(ROUTINE_ID+#10+#10+

‘WinApi function returned an invalid handle value’+

#10+’for the input file * %s *’+#10+#10+

ErrMsg,[InputFile]);

endelse

hInputFile:=0;

hOutputFile:=CreateFile(

pOutPutFile,

GENERIC_READorGENERIC_WRITE,

FILE_SHARE_READorFILE_SHARE_WRITE,

@SecAtrrs,

CREATE_ALWAYS,

FILE_ATTRIBUTE_NORMAL

orFILE_FLAG_WRITE_THROUGH,

0);

ifhOutputFile=INVALID_HANDLE_VALUEthen

raiseException.CreateFmt(ROUTINE_ID+#10+#10+

‘WinApi function returned an invalid handle value’

+#10+’for the output file * %s *’+

#10+#10+ErrMsg,[OutputFile]);

FillChar(StartupInfo,SizeOf(StartupInfo),#0);

StartupInfo.cb:=SizeOf(StartupInfo);

StartupInfo.dwFlags:=STARTF_USESHOWWINDOWor

STARTF_USESTDHANDLES;

StartupInfo.wShowWindow:=SW_HIDE;

StartupInfo.hStdOutput:=hOutputFile;

StartupInfo.hStdInput:=hInputFile;

Result:=CreateProcess(

nil,

pCommandLine,

nil,

nil,

TRUE,

HIGH_PRIORITY_CLASS,

nil,

nil,

StartupInfo,

ProcessInfo);

ifResultthen

begin

WaitforSingleObject(ProcessInfo.hProcess,INFINITE);

hAppProcess:=ProcessInfo.hProcess;

hAppThread:=ProcessInfo.hThread;

endelse

raiseException.Create(ROUTINE_ID+#10+#10+

‘Function failure’+#10+#10+ErrMsg);

finally

ifhOutputFile<>0then

CloseHandle(hOutputFile);

ifhInputFile<>0then

CloseHandle(hInputFile);

ifhAppThread<>0then

CloseHandle(hAppThread);

ifhAppProcess<>0then

CloseHandle(hAppProcess);

Screen.Cursor:=OldCursor;

end;

end;

// Kullanimi:

procedureTForm1.Button2Click(Sender:TObject);

begin

CreateDOSProcessRedirected(‘chkdsk c:\’,”,’C:\sil.txt’,”);

Memo1.Lines.LoadFromFile(‘C:\sil.txt’);

end;

Radioactivity

06 Kasım 2007

Radioactivity

Except for H all nuclei have more than 1 p+. Since like charges repel, how can any nucleus be stable? The electrostatic +ve forces are not the only one’s present in a nucleus. p+ in fact do repel each other but also at work in the nucleus is a "strong force" which acts to overcome the electrostatic force of repulsion within the nucleus, and it binds nucleons into a package. This "strong force" has some of its own peculiar characteristics. It decreases far more rapidly with distance than an electrostatic force. The strong force exerted by one nucleon on another nucleon falls to zero within the nucleus. The strong force between two adjacent nucleons, therefore, does not contribute anything to the binding of the nucleons on the other side of the nucleus. The electrostatic force of repulsion of p+ in the nucleus does not fall off to zero. p+ in one nuclear region repel p+ in all other regions. Such repulsions are toned down by the intervening no because they help separate the p+.

When nuclei carry large numbers of p+ without enough intermingled neutrons to dilute the electrostatic repulsions, the result is an unstable nucleus. Fission is a possible consequence of this instability only in U-235 and other fissile material. Other mechanisms used by all isotopes, including U-235, include ejection of small nuclear fragments and high-energy electromagnetic radiation in order to achieve stability.

Definitions

radionuclides – isotopes whose nuclei emit particles or energy

radioactivity – the emission itself

radioactive – materials that have the ability to be radionuclides

Types of Radioactivity

Alpha radiation, symbol ”

Alpha radiation is actually a particle of 42He striped of it’s electrons which gives it a very strong charge of +2. Alpha particles are very massive in comparison with the other types of radioactive particles below. It may reach up to 1/10 of light speed in a particle accelerator. Within a few centimetres of travelling through the air the alpha particle will collide with the air molecules, lose kinetic energy in the collisions, pick up electrons and become a neutral stable helium atom.

Alpha particles cannot penetrate skin, although enough exposure will cause a severe skin burn.

eg. of decay

22286Rn ——> 42He + 21884Po + radiation

When an alpha particle is ejected the mass number drops by 4, the atomic number drops by 2. The particle also emits gamma radiation which sheds excess energy leaving a more stable isotope.

Beta radiation, symbol ”

Beta radiation is actually a high speed electron, 0-1e. Beta particles arise from the decay of a neutron. A neutron first decays into a p+ and an e- and then the e- is ejected. This e- did not come from the e- configuration cloud. It did not exist before decay occurred. In addition to the e- (), a small massless, electrically neutral "antineutrino" is also ejected. Think of the antineutrino as a holder which held the e- in place on the p+ so that a no is formed.

eg. of decay

10no —-> 11p+ + o-1e- + antineutrino + radiation

Each isotope gives off its own unique characteristic beta energy. ie; speed varies from zero to a fixed limit. Since an e- has only 1/7000th the mass of an alpha, the is less likely to collide with the molecules of the substance through which it travels. (ie. air)

The fastest particle travel at 300 cm/sec in dry air. Only the highest energy can penetrate skin. However, an antineutrino can travel 3000 light years in water before striking a p+ in the water molecule. Since most of our radiation detectors depend on collisions between radiation particles and a gas, antineutrinos where only isolated very recently.

examples of Decay

13153I —-> 0-1e- + antineutrino + radiation + 13154Xe

31H —-> 0-1e- + antineutrino + radiation + 32He

When a particle is ejected the atomic number increase by 1 but the mass number remains constant.

Gamma radiation, symbol ”

Gamma radiation is high energy photons of the electromagnetic spectrum and usually accompanies and . The emission of an or can leave the nucleus in an excited state. The emission of a photon strips energy from the nucleus relaxing it into a more stable state. radiation is very penetrating but it can be blocked with lead and concrete. In dry air radiation penetrates 400 metres, or 50 cm of tissue or 30 mm of lead.

The energy units most often used to describe the energy for radiation is the electron volt (eV). One eV is the energy 1 e- receives when accelerated by a charge of 1 V. A simple device used to determine this energy is two plates with a charge. You then measure the amount of electricity needed to hold an e- in place against gravity.

1 eV = 1.602 x 10-19 J

1 KeV = 103 eV

1 MeV = 106 eV

1 GeV = 109 eV

Gamma Therapeutic Radiations

The Co-60 radiation machine used in the treatment of cancers produces radiation in the range of 1.173-1.332 MeV. An standard X-ray machine used in diagnostic medicine has energies of about 100 KeV or less. X-rays are also high-energy electromagnetic radiation but are of less energy than rays.

X-rays – are made deliberately in a X-ray Cathode tube. They are made by directing a high energy e- beam, just like the electron gun at the back of your TV, at a metal target. This e- beam knocks e- out of the metal’s atomic orbitals.

Diagram of an X-Ray Tube and Target Atom.

In the metal target holes are created in the orbitals. If the e- knocked out comes from a lower energy level then a higher energy e- drops down to fill in the hole. This cascade of e- transitions from a higher to a lower level cause the release of electromagnetic energy in the X-ray range of emissions. X-rays come from e- level transition in the orbitals and radiation comes from transitions between nuclear energy levels.

Penetrating Ability

Radiation Disintegration Series

Often a radionuclide decays not to a stable isotope but to another radioactive isotope. The process will continue through a series until a stable isotope forms. There are four well charted disintegration series, the Thorium, Neptunium, Uranium and Actinium Series. Your teacher will provide copies of these series for inclusion in your databooks.

Other Radiations

The first three radiations occur naturally. Since the advent of nuclear fission reactors and particle accelerators some very unnatural radioisotopes have been created, identified and studied. Because these unnatural radioisotopes are very unstable they exhibit several types of special emission.

Positron particle, symbol 0+1e+

Think of this emission as a positive electron. It has the same mass as an electron but with a positive charge. It is formed when a p+ decays into a neutron. The positive charge holder is another massless particle called the neutrino.

eg. of positron emission

11p+ —-> 10n0 + 0+1e+ + neutrino

5427Co —> 5426Fe + 0+1e+ + neutrino

116C —-> 115B + 0+1e+ + neutrino

When the positron moves out through the outer orbital e- there is of course an attraction. When the 0+1e- (positron) and the 0-1e- (electron) collide they annihilate each other. Their masses change into 2 photons of radiation of what is called "annihilation radiation photons" each with an energy of 511 KeV. The positron is called "antimatter" because it destroys a particle of ordinary matter. To be called antimatter a particle must have a counterpart of ordinary matter and they must collide to complete annihilation. The neutrino, being uncharged and massless, plays no part in this annihilation.

Neutron Emission

When the number of neutrons in an isotope are to high the isotope can eject neutrons in order to stabilize the nucleus. This reaction simply lowers the mass of the isotope without changing it to a new element.

eg. 8736Kr —-> 8636Kr + no

Electron Capture or K-Capture

This event is very rare among natural isotopes but is quite common in the synthetic isotopes.

eg. 5023V + 0-1e- —–> 5022Ti + X-rays

Below is a diagram showing how a K shell electron gets captured and pulled into the nucleus. A high energy level electron falls to fill the hole left. As the e- falls from the higher to a lower orbital it must release energy, most of which is dispersed as X-rays.

An orbital K shell e- is drawn into the nucleus where it neutralizes a p+, therefore the atomic number drops by 1. A hole is left in the K shell and the atom emits X-rays as the outer orbital e- falls in to fill the hole. Normally the rate of decay is independent of the oxidation state, pressure, temperature, or combination with other elements. This appears to be true for and decay. When the decay is by e- capture however, very small differences have been noted.

eg. Be-7 decays faster as a metal than it does as an oxide.

The e- density next to the beryllium nucleus is higher than the density on the BeO, therefore it takes longer to pull in stray K shell electrons.

Cd Sürücünün Kapagini Acmak Ve Kapatmak

06 Kasım 2007

CD Sürücünün kapagini acmak ve kapatmak

usesMMSystem;

// Ac

procedureOpenDoor;

begin

mciSendString(‘Set cdaudio door open’,nil,0,0);

end;

// Kapat

procedureCloseDoor;

begin

mciSendString(‘Set cdaudio door closed’,nil,0,0);

end;

//Kullanimi:

procedureTForm1.Button1Click(Sender:TObject);

begin

OpenDoor;

end;

procedureTForm1.Button2Click(Sender:TObject);

begin

Closedoor;

end;

Network’e Baglanmis Sürücü Listesinin Alinmasi

06 Kasım 2007

Network’e baglanmis sürücü listesinin alinmasi

functionGetNetworkDriveMappings(SList:TStrings):Integer;

var

I:Char;

ThePath:string;

MaxNetPathLenWord;

begin

SList.Clear;

MaxNetPathLen:=MAX_PATH;

SetLength(ThePath,MAX_PATH);

forI:=’A'to’Z'do

ifWNetGetConnection(

PChar(”+I+’:'),PChar(ThePath),

MaxNetPathLen)=NO_ERRORthen

SList.Add(I+’: ‘+ThePath);

Result:=SList.Count;

end;

// Kullanimi:

procedureTForm1.Button1Click(Sender:TObject);

begin

GetNetworkDriveMappings(Form1.ListBox1.Items);

end;

Radyoaktif Maddelerin Özellikleri Ve Çevreye Zararlari

06 Kasım 2007

Radyoaktif maddelerin özellikleri ve çevreye zararlari

RADYOAKTIVITE Radyoaktif denilen bazi cisimlerin kendiliklerinden bir parçalanma sonucu fotograf plaklarina etki eden, gazlari iyonlastirip elektrige karsi iletken kilan ve daha bazi olaylara sebep olan çesitli radyasyonlar yayabilme özelliigidir. Bir radyoaktif çekirdegin kendiliginden bir baska çekirdege degismesi olayina dezentegrasyon , yapma olarak bir çekirdekten bir baska çekirdegin elde edilmesi olayina da transmütasyon denir. Fizikokimya bilimleri alaninda modern kesiflerin en önemlisi radyoaktifligin kesfi olmustur. Zira bu kesif; bizzat bu olayin kesfi yaninda, kimyasal element hakkindaki düsüncelerimizi de temelinden degistirmistir. Öte yandan, atomun yapisi hakkindaki simdiki teorilerle izotopluk kavramini ve bazi atomlarin çekirdeklerinin büyük birer enerji kaynagi teskil ettiklerini ve bunlardan ilk faydalanmayi hep bu keske borçluyuz. Radyoaktiflik, henri becquerel tarafindan, 24 subat 1896’da X isinlarinin kesfinden iki ay sonra kesfedilmistir. Bir crookes tüpünden husule gelen katod, pozitif ve röntgen isinlarinin özelliklerinden biri de, flüoresan maddelerin flüoresansina sebep olmalaridir. Iste bu olayin incelenmesidir ki radyoaktifligin kesfine yol açmistir. Ilk röntgen tüpleri antikatotsuzdu. X isinlarinin kaynagi katod isinlarinin gelip çarpmasiyla flüoresan kilinmis olan tüpün çeperinde bulunuyordu. O halde, Röntgen tüpünün cami gibi flüoresan olan, yani sebebi her ne olursa olsun bir dis etkiyle isik verebilen baska cisimlerinde röntgen isinlarini verip vermeyecegi hakli olarak sorulabilirdi. Söhretli Fransiz matematikçisi Henri Poicare, 20 Ocak 1896’da, Fransiz Fen akademisine röntgen tarafindan elde edilen bir klise göstermis ve fluoresan kilinmis bazi cisimlerin X isinlari verip vermediklerinin arastirmasinin enteresan olacagi ifade etmistir. Bunun üzerine bir çok fizikokimyaci durumu incelemege baslamistir. Çinko sülfür, Kalsium sülfür üzerinde yapilan denemeler olumsuz sonuç vermistir. H. Becquerel benzer denemeleri bazilari fluoresan olan uranyum tuzlari üzerine yapmistir. Siyah kagida sarili fotograf caminin siyahladigini görmüstür. Becquerel, sonraki denemelerinde gözlenen olayin fluoresansa bagli olmadigini, tuzun önceden aydinlatilmasina lüzum olmadigi gibi, urainumun fluoresan olan ve olmayan bütün tuzlarinin ayni sekilde etkide bulunduklarini ve metalik uranyumun en fazla aktif oldugunu bulmustur. Becquerel, daha sonra, tam karanlikta bulundurulan Uranyum bileskelerinin siyah kagit arasindan uzun fotograf plaklarina etkide bulunan bazi isinlar yayinladik süre bulmustur. Bu isinlara uranik isinlar denmistir. Bu isinlar, Rötgen ve lenard isinlari gibi ince metalik levhalardan geçer ve gazlari iyonlastirirlar; olay, uranium dahil oldugu bilesige tabi degildir; siddeti, uraniumun mutlak miktariyla orantili olup aydinlatma, isitma gibi dis etkilere de tabi degildir. O halde radyoaktiflik maddenin atomik bir özelliginden ileri gelir. Bequerel’in kesfinden sonra baska cisimlerin de uranium gibi uranik isinlar yayip yaymadiklari arastirilmistir. Fransa’da Pierre ve Marie Sklodowska Curie ve Almanya’da G. Schmidt tarafindan ayni zamanda yapilan arastirmalar sayesinde thoruim tuzlarinin da, uranium tuzlari gibi uranik isinlar verdiklerini bulmuslar. Bu isinlara Becquerel isinlar da denmistir. Becquerel yahut uranik isinlar veren cisimlere radyoaktif cisim; bu isinlar yardimiyla meydana konulan maddenin bu özelligine radyoaktiflik denir. Bu özellige malik olan elementlere radyo element; radyo element; radyoaktiflik özelligi ile ilgili olaylar, metodlar ve araçlari bir arada inceleyen bilim dalina da radyoaktivite adi verilmistir. Bu gün kirktan fazla dogal element bilinmektedir. Bunlarin çogu periyodik sistemin son periyotlarinda yer alan agir elementlerdir. Ileride görülecegi gibi, yapma olarak bir çok radyo element elde edilmistir. RADYOAKTIF MADDELERIN ÖZELLIKLERI Atom çekirdeklerinin bir dis etki olmaksizin kendiliklerinden isima yapmalarina ve bu tür isima yapan atomlara da radyoaktif atom adi verilir. Radyoaktif atomlarin çekirdekleri kararsizdir. Atom çekirdeklerinin kararligi nötron ve proton sayisina baglidir. He, C, N ve O gibi hafif atom çekirdeklerinde nötron sayisi, proton sayisina esittir. Nötron sayisinin proton sayisina orani 1’dir. Bu çekirdekler karalidir. Proton sayisi 2040Ca atomundan fazla olan atomlardan; nötron sayisi proton sayisina esit olan kararli atom çekirdegi yoktur. Bu atom çekirdeklerinde Coulomb itme kuvvetleri, çekirdegin kararliliginin azalmasina sebep olur. Agir elementlere dogu nötron sayisinin proton sayisina orani git gide artar. Kararli olan 80200Hg izotop atomunda n/p orani 1,5’tur. N/p orani 1,5’tan büyük olan çekirdeklerin kararliliklari kaybolur, en son kararli çekirdek 83209Bi’tur. 83209Bi’tan proton sayisi büyük olan atom çekirdekleri kararsizdir. Çekirdekleri kararsiz olan atomlar radyoaktiftirler ve radyoaktif bozunmalar ile karali hale ulasmak isterler. Bu bilgiler isiginda bir atom çekirdeginin radyoaktif özellik göstermesi için uymasi gereken sartlari su sekilde sirayalabiliriz: Çekirdekte bulunan nötron sayisinin proton sayisina oraninin 1,5’tan büyük olmasi, Atom numarasinin 83’ten büyük olmasi. Bununla birlikte atom numaralari küçük olan bütün izotoplarin çekirdekleri kararlidir. Mesela, 6 proton ve 6 nötrona sahip olan 612C izotopu karali olmasina karsin 6 proton 8 nötrona sahip olan 614C izotopu kararsiz yani radyoaktiftir. Görüldügü gibi, radyoaktiflik çekirdek yapisi ile yani çekirdekteki proton ve nötron sayilari ile diger bir deyisle çekirdegin cinsi ile ilgilidir. Yapilan deneyler radyoaktif bir elementin bu özelligini bilesiklerinde de gösterdigi ortaya koymustur. Bir elementin radyoaktif özelligi o elementin kimyasal durumuna bagli degildir. Sicaklik ve basinç gibi dis etkiler de radyoaktif özelligi degistirmez. Bunlara ek olarak radyoaktif özellik maddenin kati, sivi veya gaz halinde bulunmasiyla da ilgili degildir. Kursundan bir kröze içinde bir miktar radyum koyup bir magnetik alana tabi tutulursa radyasyonlar üç gruba ayrilir. Bir kismi hafifçe sola sapar, pozitif yüklüdürler, bunlar iki elementer yüke malik olan helyum çekirdekleridir, bunlara alfa isinlari denir; bir kismi fazlaca saga sapar, negatif elektronlar olup bunlara beta isinlari denir; bir kismi hiç sapmaz, bunlar çok kisa dalga boylu elektromagnetik dalgalar olup bunlara gama isini denir. Radyoaktif maddelerden yayilan alfa beta ve gama isinlari çesitli olaylara sebep olurlar. Mesela; kari, sivi ve gaz halindeki maddeleri iyonlastirirlar. Cam, porselen, fayans gibi maddeler radyoaktif isin temasinda renklenirler. Renklenme isinlarin yollarina karsilik gelen bölgede olur. Radyoaktif isinlar canli hücrelerine etki ederler. Basta kanser olmak üzere birçok hastaliga sebep olurlar. Nesiller boyu kalitsal bozukluklar meydana getirebilir. Simdi bu bozunma türlerini sirasiyla inceleyelim. Alfa Isinlari: Alfa isinlari iki defa pozitif yüklü helium çekirdekleridir. Gerçekten alfa partiküllerinin spetik yükleri bu partikülleri veren radyoaktif cisim ne olursa olsun, daima hidrojeninkinin yarisina esittir. Bu sonuç, ancak alfa taneciklerinin atom agirliginin ikiye esit oldugu yahut, Rutherford’un ilk anda ileriye sürdügü gibi, bunlarin kütlesi 4 olan ve herbiri 2 e yüküne malik atomlardan ibaret oldugu seklinde izah edilebilir. Ramsay 1904’te, Rutherford’un ileri görüsünün tamamiyle yerinde oldugunu genel olarak ispat etmistir. Gayet ince çeperli fakat gazlari geçirmeyen bir cam ampul içerisine radon konmustur; bu ampul de daha büyük, havasi, bosaltilmis ve iki elektrot ihtiva eden bir baska ampul içerisine alinmistir. Bir müddet sonra dis ampulde husule getirilen bie desarjin helium spektrumunu verdigi görülmüstür. Deneme sartlarina göre, bu helium ancak ince kenarli birinci ampulün çeperinden alfa partiküllerinden ileri gelebilirdi. Radonun bozunmasi söyle olmustur. 86Rn 222è84Ra218+ 2He4 Böylece süpheye mahal kalmaksizin alfa partiküllerinin helium çekirdeklerinden ibaret olduklari meydana konulmustur. Alfa isinlari radyoaktif atomdan, bu atoma tabi olarak çok büyük bir hizla yayinlanirlar. Örnegin RaC ‘nin verdigi partiküllerinin hizlari 19220 Km/s’dir. Bir radyoelementin verdigi alfa isinlari genellikle ayni enerjiye maliktirler, yani bunlar monokinetikler veya ayni enerjiyi haiz gruplar olarak kendini gösterirler. Bir isinin husule geldigi andan itibaren durduruldugunda ana kadar bir ortamda aldigi yola, bu isinin ortamdaki yolu denir. Radyoaktif cisimlerin elektrik, isi kimyasal olaylari,esas itibariyle alfa isinlarindan gelir. Bir radyoaktif cismin verdigi alfa partiküllerini saymak suratiyle Avogadro sayisi bulunabilir. Bunun için bir taraftan bir radyoaktif cismin belli bir kütlesinin belli bir zamanda verdigi helium hacmi ölçülür ve buradan 11,2 litredeki helium sayisi hesaplanir. Alfa isinlarinin havadaki yollari ilk hizlarinin küpü ile orantilidir. Bu kanunun geçerli oldugu sinirlar içinde alfa partiküllerinin iyonlastirma gücü, partikülün hizi ile ters orantilidir ve bir alfa partikülünün husule getirdigi iyon sayisi R2/3’le orantilidir; R partikülün yoludur. Radyoaktif cisimlerin elektrik, isi ve kimyasal olaylari, esas itibariyle, alfa isinlarindan gelir. Bir radyoaktif cismin verdigi alfa partiküllerini saymak suretiyle avogadro sayisi bulunabilir. Beta Isinlari: Beta isinlari negatif elektronlardan ibarettirler. Hizlari isik hizina yaklasir, yollari alfa isinlarininkinden daha uzundur. Beta isinlari da iyonlastirici isinlardir. Beta isinlarini primer ve sekonder olmak üzere iki gruba ayirmak mümkündür. Primer beta isinlari çekirdekten gelen isinlardir. Örnegin 83Bi10 beta dezentegrayonu ile 84Po10’a dönüsür: 83Bi210è84Po10+B- Bu dönüsüme çekirdekte bir nötronun bir protona dönüsmesi sonucunda meydana gelir : nèp + B- . Bir radyoelementin verdigi beta isinlari izokinetik degildir. Bunlarin enerjileri en küçük degerden en büyügüne kadar degerler alabilir. Kaba olarak maksimum, maksimal enerjinin üçte birine tekabül eder. Bu sekilde enerjileri kesiksiz bir enerji dagilimi gösteren beta isinlari, primer beta isinlarini teskil eder ve yalniz bunlar çekirdek dezentegrasyonundan gelenlerdir. Bazi atomlarda bunlarin yaninda ayni enerjiye sahip beta isinlari gruplari da yer alir ki bunlara sekonder beta isinlari denir. Beta isinlari çok gericidir, yani yollari çok uzundur. Çogu radyoaktif cisim alfa, beta ve gama isinlarini filtre etmek gerekir. Ama bugün kuvvetli ari beta kaynagi olarak yapma yolla elde edilen Stronsium – 90’dan faydalanilir. Alfa parçaciklarina oranla kütlelerinin çok az, hizlarinin ise çok yüksek olusundan daha fazla nüfuz etme özelligine sahiptirler. 2-3 mm kalinligindaki alüminyum levhadan geçebilirler. Beta parçaciklari elektrik ve manyetik alanda, alfa parçaciklarina göre zit yönde ve kütlesinin çok küçük olmasi nedeniyle daha fazla sapmaya ugrarlar. Beta bozunmasina ugrayan bir atom, çekirdeginden bir elektron firlatir. Firlatilan bu elektron ise çekirdekteki bir nötronun bir protona dönüsmesi sonucunda olusur. Netice itibariyle beta bozunmasina ugrayan elementin atom numarasi 1 artar, kütle numarasi ise degismez. Gama Isinlari: Gama isinlari kisa dalga boylu elektromagnetik radyasyonlardir. Bir çekirdekte alfa yahut beta isinlari meydana geldikten sonra çogu zaman çekirdek uyartilmis hale geçer. Uyartilmis haldeki çekirdegin bir enerji asirisi vardir. Uyartilmis çekirdek normal haline dönüsünde kaybettigi bu enerj, asirisi çekirdekten bir tanecigin firlatilmasi seklinde olmazsa buna bir izomerik geçis denir ve bu sirada gama radyasyonu yayinlanir. Uyartilmishalde uzun süre kalan çekirdek ile normal haldeki çekirdegeler denir.Enerjileri yüksek olan gama isinlari birkaç santimetre kursundan geçer. Örenegin ThC” nün verdigi gama isinlarinin yarilanma kalinligi yani radyasyonlarin siddetinin yariya düsmesi için lüzumlu kalinlik 1,5 cm kursundur Gama isinlari dogrudan dogruya iyonlastirici degildirler, ama meydana getirdikleri elektronlarla bunu yaparlar. Gama isinlarinin etki gücü çok yüksektir. Beta isinlarina göre 100 kat daha fazla nüfuz etme özelligine sahiptirler. Gama isinlari birkaç santimetre kalinligindaki kursundan geçebilir. Gama isinlarini ancak kalin kursun levhalar 2-3 metrelik beton bloklar durdurabilir. Gama isinlari yüksüz olduklarindan elektrik ve manyetik alanda sapma göstermezler. Gama isinlari iyonlastirici degillerdir. Gama parçaciklarinin kütlesi ve yükü sifir kabul edilir. Dolayisiyla gama bozunmasina ugrayan bir elementin atom ve kütle numarasi degismez. Gama isinlari çok yüksek enerjili, elektromanyetik dalgalardir. Genele olarak gama isinlari tek basina meydana gelmez. Bir takim radyoaktif bozunma veya çekirdek tepkimelerinin ardindan meydana gelir. Örnegin alfa ve beta parçaciklari olusturan bazi radyoaktif bozunma tepkimeleri sonucunda çekirdek enerjili halde kalir. Bu yüksek enerjili çekirdek gama isini yayarak daha düsük enerjili çekirdege dönüsür. Sekonder Beta Isinlari: Bazi izomerik geçislerde bazi uyartilmis çekirdekler gama isinlari vermezler, ama enerji asirilari atomun çekirdek disindaki ve çogunlukla K tabakasindan elektron koparip firlatmaya harcanir. Buna iç dönüsüm denir. Çekirdek disi elektronlar belli enerji seviyeli elektronlar oldugundan, bu sekonder beta isinlarinin enerjileride bellidir. Genellikle, izomerik geçis enerjisinin ancak bir kismi iç dönüsüm elektronlari verir. Bir iç dönüsüm elektronun firlatilmasindan sonra bosalan yere üst tabakalardan elektron siçramasi sonucu ya enerji elektronun çiktigi ve geldigi seviyedeki enerji farkina esit enerjili ve elementin karakteristigi olan X isinlari fotonu meydana gelir, ya da bu enerji üst tabakalardaki bir elektronun firlatilmasina harcanir. Böylece isimasiz bir iç dönüsüm olur. Bu sekilde meydana gelen elektronlara auger elektronlari denir. Bunlarin da enerjileri bellidir. Yukaridaki izahlardan anlasilacagi üzere, beta isinlarinin dagilimi çok karisiktir. Kesiksiz bir enerji dagilimi gösteren primer beta isinlari yaninda belli enerjili dönüsüm ve auger elektronlari da bulunur. Pozitron Isimasi: Pozitron isimasinda çekirdekteki bir proton bir nötrona dönüsür. Bu esnada özellikleri elektrona benzeyen fakat pozitif yüklü bir tanecik olusur. Bu tanecigin çekirdekten disari firlatilmasi pozitron isimasidir. Pozitron parçacigi B+ veya +1e0 seklinde sembolize edilir. Pozitron isimasi yapan bir çekirdegin atom numarasi 1 azalir, kütle numarasi ise degismez. RADYASYONUN GENETIK ETKILERI Düsük seviyeli radyasyonun tek belirgin sagliksal etkisi sonraki kusaklarda görülen genetik sakatliklara sebep olmasidir. Genellikle genetik bozukluklar olarak adlandirilan bu sakatliklar, renk körlügünden, mongolizm gibi ciddi hastaliklara kadar çesitlilik gösterir. Bazi kisiler, radyasyonun iki basli çocuklarin dogmasina; insan alti ya da insan üstü canavarlarin ortaya çimasina neden olacagina inanirlar. Durum kesinlikle bu degildir; çünkü insanlik daima dogal radyasyona maruz kalmis olmasina karsin, hiçbir zaman bu tür vakalar görülmemistir. Bazi kisiler de radyasyon kaynakli genetik etkilerin insan soyunu yok edecegine inanirlar. Ancak bu da yanlistir. Yani radyasyonun yol açacagi herhangi bir kötü özellik, sonuçta yok olacaktir. Nükleer endüstrinin genetik etkileri, ancak insanin dogal kaynaklardan aldigi radyasyondan sadece yüzde bir kadar daha fazla radyasyon etkilenimine yol açtigi hatirlandiginda en iyi sekilde anlasilabilir. Dogal radyasyonun da, normal olarak karsilasilan genetik bozuklarin sadece %3’ünden sorumlu oldugu düsünülmektedir. Nükleer gücün genetik etkilerini anlamanin muhtemelen daha kolay bir yolu, geç yasta çocuk sahibi olma durumudur. Geç annelik yasinin Down sendromu, Turner sendromu ve birkaç diger kromozomal düzensizlige yakalanma riskini artirdigi bilinirken, geç babalik yasinin da akondroplazia ve binlerce diger otozomal, baskin hastalik riskini hizla artirdigi bilinmektedir. Sonuçlara, fareler üzerinde yapilan çalismalar ile varilmis olmasi ilginçtir, çünkü insanlar üzerinde genetik bozukluga yol açan, radyasyonla ilgili gerçek bir kanit yoktur. Böyle bir kanit bulabilmek için en iyi yol, atom bombasindan sonra Japonya’da hayatta kalan insanlari gözlemektir, ancak dikkatli olarak yapilan birkaç çalismada, bu insanlarin ilk kusak çocuklarinda asiri miktarda genetik bozukluk görülmemistir. Genetik bozukluga sahip bir çocugu olmasi riskini merak edebilir; bu gebelikten önce maruz kalinan her mrem radyasyon için 40 milyonda bir olasiliktir. Hava kirliliginin ve birçok kimyasal maddenin de genetik bozukluga yol açtigini ifade etmek uygun olacaktir. Kükürt dioksit suda çözündügünde ortaya çikan bisülfatlar ve nitrojen oksitlerde elde edilen nitrosamin ve nitrus asiti de içeren 3500 kimyasal madde hakkinda kesin olamayan bilgi mevcuttur. Kafein ve alkolün genetik bozukluklara yol açtigi bilinir. Bir çalismaya göre 28.35 gram alkol, genetik etki bakimindan 140 mrem’lik radyasyona esittir. Bir fincan kahve de 2.4 mrem’lik doza esittir. Genetik bozukluklara yol açan belki de en önemli insan etkinligi, erkeklerin pantolon giyme gelenegidir. Bu, cinsiyet hücrelerinin isinmasina yol açar ve böylece kendiliginden ortaya çikan mutasyonlarin, yani genetik hastaliklarin baslica kaynaginin olasiligini arttirir. Kaba taslak olarak yapilmis mevcut hesaplamalar, bir miliremlik radyasyonun genetik etkilerinin, bes saat pantolon giymekle ayni oldugunu göstermektedir. Nükleer gücün genetik etkileri ile ilgili can sikici bir nokta da, biz üretilen enerjinin karindan yararlanirken, bedelini gelecek kusaklarin ödeyecegi seklindeki zihniyettir. Bununla birlikte, bu kusagin ve teknolojisinin gelecegi olumsuz yönde etkiledigi daha baska ve çok daha önemli durumlarin varligini da hatirlamaliyiz. Nükleer sanayi ve onun sonraki kusaklara yapacagi genetik etkiler konusunda yapilacak anlamli bir degerlendirmede, gelecek kusaklar için, onlarca milyar dolara, onbinlerce yillik çabaya mal olmus ucuz ve bol bulunur, sonsuz bir enerji kaynagi karsisinda söz konusu olan birkaç genetik bozukluk vakasi ile bunlarla mücadele etmek için bizden onlara kalacak ucuz ve etkin araçlarin karsilastirilmasi, dengeyi saglayacaktir. CANLILARIN RADYOAKTIVITEYE KARSI KORUNMA YÖNTEMLERI Henri Becquerel radyoaktiviteyi bulan kisi olarak ünlüdür. Kendisinin ayri zamanda,radyoaktif maddelerin canlilar için tehlikeli oldugunu da kesfettigini bilen çok azdir. Becquerel, içinde radyum örnegi tasidigi cebinin altinda,dersinin yandigina dikkat etmis. O zamandan beri, radyumun zararli isimalar meydana getirdiginden haberimiz vardir ve hiç kimse cebinde radyum tasimayi aklina getirmez. Isinimlarin tehlikesi çok büyüktür,çünkü etkisi,zarar meydana geldikten bir süre(birkaç yil bile olabilir)sonraya kadar hissedilmez. Atom isimalari nedir?Bu terim parçalanan atomlardan firlatilan hizli taneciklerden olusmus demetler ve enerji dalgalari için kullanilmaktadir. Her atom parçalandigi zaman çekirdeginin bir kismini disari firlatmaktadir. Bir atom ortasindaki,çekirdek adi verilen bir göbekten belirli uzaklikta, bu göbegin çevresinde dönen ve elektron adi verilen küçük taneciklerden yapilmistir. Her elektron negatif elektrik yükü tasimaktadir. Çekirdek, proton ve nötron adi verilen iki cins tanecikten yapilmistir. Protonlar pozitif elektrikle yüklüdür, nötronlar yüksüzdür. Bir radyoaktif atomun çekirdegi hiçbir sebep olmadan parçalanma egilimi gösterir. Parçalandigi zaman proton ve nötron firlatacagini söyleyebiliriz. Gerçekten böyle olur, ama çogunlukla, firlatilan tanecikler alfa ve beta tanecikleridir. Alfa tanecigi iki proton ve iki nötrondan olusmus bir gruptur; içinde proton oldugu için pozitif elektrikle yüklüdür. Beta tanecigi elektronla aynidir. Negatif elektrik yükü tasimaktadir. Çekirdegin çevresinde dönen elektronlardan gelmektedir, ama nötronlardan birinin, bir proton ve elektron haline gelmesini saglayan bir dönüsüm sonunda çekirdekten firlatilmaktadir. Taneciklerin hizi bunlarin enerjisini ve giderek, cisimlere geçme yetenegini belirtir. Alfa ve beta tanecikleri hemen hemen isik hizina yakin bir hizla hareket ederler. Enerji dalgalarina gama isinlari denir ve elektrik yükü tasimazlar. Bütün bu isinlarda ve hareket eden taneciklerde, önemli bir ortak özelik, yollari üzerine rastlayan atomlarin elektronlarini koparma egilimidir. Dönmekte olan elektronlarindan bazilarini kaybedince, bu atomlar, elektrikle yüklü hale gelirler ve ilk hallerindeki atomlardan çok daha fazla ve degisik sekilde kimyasal reaksiyon meydana getirme özelligi kazanir. Belki atom, isimalarina gösterilen canli dokularin harap olmasi bu yüzdendir. Herhangi bir isinimin cisimlere ne kadar geçebilecegi bunun enerjisine baglidir. Çünkü, isinim her bir atoma çarpisinda, bu atomlardan elektron koparmakla enerjisinin bir kismini kaybeder. Alfa tanecikleri havada birkaç santimetre ilerleyince havadaki gaz atomlarindan elektron koparmak yoluyla bütün enerjisini kaybeder. Madenlerde yaklasik olarak milimetrenin binde birkaçindan ve canli dokulardaysa yaklasik olarak yüzde birinden fazla bir derinlige giremez. Bir tek alfa tanecigi milyonlarca atomlardan elektron koparabilir. Beta isinlarinin geçme yetenegi alfa isinlarindan daha fazladir, ama canli dokular içerisinde fazla ileri gidemez. Alfa ve beta isinlari verev cisimler deride isinim verev cisimler deride isinim yaniklarina sebep olabilir. Kazara nefes alma yoluyla yada yutularak vücuda girerlerse, özellikle tehlikeli olurlar, çünkü bu isinimlarin geçme yetenegi küçük olmakla beraber, uzun bir süre boyunca akcigerlerin ve midenin çeperlerinde meydana getirdigi etki çok önemlidir. Gama isinlari alfa ve beta isinlarindan çok daha öldürücüdür; hizli nötronlar da öyledir. Bunun sebebi, menzillerinin hemen hemen sinirsiz olmasidir. Bu isinlar, örnegin , insan vücudunun bir tarafindan öte tarafina yada yüksek enerjili gama isinlari halinde yirmi santimetre kalinliginda kursundan geçebilir. Acaba isinim, hayvan olsun, bitki olsun, canlilara neden zarar verir? Bütün canlilar , canli hücrelerden yapilmistir. Büyüme ve eskiyen hücreleri yenileme her bir hücrenin kendisinin bütünüyle ayni olan iki hücreye bölünme yetenegiyle mümkün olmaktadir. Bu bölünme , hücrenin çekirdegi ve belki bu çekirdekte meydana gelen bir kimyasal ürünle dezoksiribonükleik asit(DNA)meydana gelmektedir. Hücreye hayat veren seyin ne oldugunu daha kimse tam olarak bilmemektedir, ama bunun, hücrenin çekirdegini meydana getiren çok atomlu karmasik moleküllerdeki atomlarin, anlasilmasi güç bir düzenlenmesiyle ilgili oldugu sanilmaktadir. Bölünmenin meydana gelmesi için hücrede normal miktarda DNA bulunmalidir ki yeni hücrelerin her birine normal miktarda DNA gidebilsin. Elektrikle yüklü bir tanecik siradan bir moleküle çarparsa, bunun yapisini altüst eder, çünkü atomlarin bir araya gelmesi elektrikle yüklü taneciklerin çesitli atomlarda ortaklasa bulunmasi ve atomlar arasinda degis tokus edilmesiyle mümkün olmaktadir. Isinimin elektrikle yüklü taneciklerinin, canli hücrenin çekirdegi atomlarin çok karmasik ve çok dengeli olan düzenine ve su gibi olan dis kismina gelisi, nasil oldugu daha tam olarak bilinmemekle beraber, hücrenin hayatini ve yapisini zedeleyen yeni bir düzenlemeye sebep olur. Isinlarin etkiledigi bir hücre hemen ölür, yada isinlarin dozu çok büyük ve etkiledigi süre çok uzun degilse, kendini iyi edebilir. Tek bir hücrenin, yeri doldurulur. Ama, bir hayvanin bölünebilen bütün aktif hücrelerinin çekirdegi,bunlarin bölünmesini engelleyecek kadar zarar görürse, o zaman, yeni hücreler meydana gelemez ve biraz gecikirse de, eninde sonunda hayvanin ölümü gelir. Çok yüksek dereceli isinim bir canliyi hemen öldürebilir, çünkü, hücrelerin kimyasal düzenini bozmakla can alici organlari öylesine kötü bir sekilde zedeler ki, bu organlar görevlerini yapamaz hale gelir bu da ani ölüm demektir. Insan vücudundaki can alici organlarin korunmasi derine geçebilen gama isinlarindan ve nötron isinimlarindan bile kurtulma sansi artirabilir, çünkü ana organlar zarar görmezse vücut fonksiyonlarini yapmaya devam edebilir. Alyuvarlarin üretiminde artmaya sebep olarak vücudun dayanikliligini arttiran dalak özellikle önemli bir organdir. Biraz tuhaf gelir ama, vücuttaki en büyük kemiklerin korunmasi da önemlidir, çünkü vücuttaki hasarlari onaracak olan yeni kan hücreleri bunlarin ilik kisminda meydana gelir. Eger, örnegin sadece bir kalça kemigi korunursa, bu bir tek fabrikanin kan hücreleri üretmeye devam etmesi iyilesme ve yasama sansini önemli derecede artirir. Hücrelerin isimalarin etkisine ugramasiyla ilgili birçok arastirlamalar yapilabilmektedir; ama hala, birçok sey iyice anlasilmis degildir. Eger, hücre olgun bir hücreyse, bunun iyilesme ve bölünerek çogalabilme sansi çok fazladir. Bölünmenin ilk basamaklarinda olan daha genç hücreler isinlara karsi çok duygundur ve ancak hafif dozlardan zarar görmeden kurtulabilir. Çesitli isinlarin etki olanlari hakkinda bildiklerimizle, halki, radyoaktivitenin tehlikelerinden koruyacak güvenlik tedbirlerini bulmak mümkündür. Hiçbir radyoaktif maddenin çiplak elle tutulamayacagi apaçiktir. Cisim, sadece, alfa ve beta isinlari veriyorsa, bunlarla çalisan kimse eldiven giyerek bunlari elleyebilir. Ama gene de radyoaktif tozlarin solunum yoluyla vücuda girmesi tehlikesi vardir. Bunu önlemek için, cisim, üzerinde içini görmek için bir pencere ve kenarlarindaki deliklerde bir çift eldiven bulunan ve eldivenli kutu adi verilen bir kutunun içinde ele alinir. Çalisan kimse, kutunun disindan içeriye erismek için ellerini eldivenlere sokar. Bu sekilde kutu hava sizdirmaz ve radyoaktif madde çalisan kimsenin hiçbir yerine degmeden kullanilabilir. Gama isini veren cisimlerin kursun ve betondan kalin duvarlarin arkasinda saklanmasi gerekir. Bunlarla ancak uzaktan kumandayla çalisabilir. Radyoaktif cisimlerle çalisanlarin koruyucu elbise, eldiven ve ayakkabi giymeleri ve bazen maske takmalari, laboratuardan ayrilirken de bunlari çikartmalari sarttir. Koruyucu elbisenin bir sekli, üzerinde toplanmasi mümkün olan kirleri çikarmak için firçalanabilir sisirilmis, su geçirmez elbisedir. Bu tedbirler kazara çalisan kimsenin üzerine konan radyoaktif tozlarin laboratuarda yemek içmek, makyaj tazelemek yada sigara içmek, tehlikelidir. Isçiler ve laboratuarlar, isinim miktarini düzenle kaybeden ölçü aletleriyle kontrol edilir. Bu kontrol düzenlerinin en basiti, madalya gibi cep üzerine asilan madensel bir kilif içerisindeki bir fotograf filmidir. Film her hafta yikanir ve filmin kararma miktarina bakarak etkisi altinda kaldigi isinim miktari ölçülür. Eger maksimum bir doz bulunursa isçi bir süre isinimlardan uzak durur. Isinimlara karsi korunma, özellikle nükleer reaktörlerin yakininda önemlidir, çünkü buradaki isinim isteyerek meydana getirilmistir ve laboratuvarlardakinden çok daha siddetlidir. Reaktörler kursunla kaplanmis tek parça bir beton duvarla çevrilmistir. Bu biyolojik kalkan en hizli nötronlar ve gama isinlarini bile durduracak sekilde tasarlanmistir. Tabii kontrol çubuklari ve nükleer yakit, ancak uzaktan kumandayla yönetilir. Bu biyolojik kalkandan disariya biraz isinim sizarsa, otomatik monitörler hemen alarm isareti verir. Atmosferi kirletebilecek tozlardan temizlenmesi için, nükleer elektrik santrallerini havalandirma gelen hava süzgeçlerden geçirilir. Günümüzde radyoaktif maddelerden ve radyoaktif hale gelen gereçlerden kurtulma, önemli bir problemdir. Kaynaklar: Prof.Dr Ali Riza Berkem, Çekirdek Kimyasi Istanbul Üniversitesi Yayinlari 1974 Necdet Çelik, Kimya I-Sürat Yayinlari 1997 Bernard I. Cohen, Çok Geç Olmadan 1994 Sir Lowrence Bragg-Sir James Dhadwik Norman Fisher-Sir Harry Melville-Prof.J.Z Young, Bilim Dünyasi-Arkin Kitapevi Hazirlayan: Begüm SAGOCAK, Özel GAYE Lisesi, 10-A sinifi, Mayis 2000

Her Hangibir Disk’in Program İcerisinden Formatlanmasi

06 Kasım 2007

Her hangibir Disk’in program icerisinden formatlanmasi

// Kullanilabilecek Sabitler

const

SHFMT_OPT_FULL=$0001;

SHFMT_ERROR=$FFFFFFFF;

SHFMT_CANCEL=$FFFFFFFE;

SHFMT_ID_DEFAULT=$FFFF;

SHFMT_OPT_QUICKFORMAT=$0000;

SHFMT_OPT_SYSONLY=$0002;

functionSHFormatDrive(hWnd:HWND;Drive,fmtID,Options:Word):

Longint;stdcall;

external’Shell32.dll’name’SHFormatDrive’

functionFormatDrive(Drive:Char):Integer;

varDriveNo:Word;

begin

ifDrivein['a'..'z']thenDec(Drive,$20);

DriveNo:=Ord(Drive)-$41;

try

Result:=ShFormatDrive(Application.Handle,DriveNo,

SHFMT_ID_DEFAULT,

SHFMT_OPT_FULL);

except

Result:=-1;

end;

end;

// Kullanimi:

procedureTForm1.Button1Click(Sender:TObject);

varResult:Integer;

begin

Result:=FormatDrive(‘A’);

ifResult<0then

ShowMessage(‘Formatlama islemi basarisiz’)

else

ShowMessage(‘Formatlama islemi basarili’);

end;

Desktop, Quick Launch veya Start Menu’de kisa yol yaratmak

{

uses bolumune asagidaki unit’leri ekleyin:

ShlObj, ComObj, ActiveX, registry

}

type

TShortCutLocation=(slDesktop,slStartMenu,slQuickLaunch);

TShortCutLocations=setofTShortCutLocation;

procedureCreateShortCut(Description,ApplicationPath,StartFolder:string;

Locations:TShortCutLocations);

var

MyObject:IUnknown;

MySLink:IShellLink;

MyPFile:IPersistFile;

Directory:string;

WFileName:WideString;

MyReg:TRegIniFile;

begin

MyObject:=CreateComObject(CLSID_ShellLink);

MySLink:=MyObjectasIShellLink;

MyPFile:=MyObjectasIPersistFile;

withMySLinkdobegin

{ Parametreler icin kullanilabilir:

SetArguments(PChar(ApplicationPath));

}

MySLink.SetPath(PChar(ApplicationPath));

SetRelativePath(PChar(StartFolder),0);

SetWorkingDirectory(PChar(StartFolder));

SetDescription(PChar(Description));

SetIconLocation(PChar(ApplicationPath),0);

end;

MyReg:=TRegIniFile.Create(‘Software\MicroSoft\Windows\Cur rentVersion\Explorer’);

// Desktop’a kisa yol olusturmak icin }

ifslDesktopinLocationsthen

begin

Directory:=MyReg.ReadString(‘Shell Folders’,'Desktop’,”);

WFileName:=Directory+’\'+Description+’.lnk’;

MyPFile.Save(PWChar(WFileName),False);

end;

//Start Menu icin

ifslStartMenuinLocationsthen

begin

Directory:=MyReg.ReadString(‘Shell Folders’,'Programs’,”);

{ Alt Klasörde olusturmak icin:

Directory = Directory + ‘\KlasorAdi’;

CreateDir(Directory);

}

WFileName:=Directory+’\'+Description+’.lnk’;

MyPFile.Save(PWChar(WFileName),False);

end;

// QuickLaunch icin

ifslQuickLaunchinLocationsthen

begin

Directory:=MyReg.ReadString(‘Shell Folders’,'Appdata’,”);

WFileName:=Directory+

‘\Microsoft\Internet Explorer\Quick Launch\’+

Description+’.lnk’;

MyPFile.Save(PWChar(WFileName),False);

end;

MyReg.Free;

end;

// Kullanimi:

procedureTForm1.Button1Click(Sender:TObject);

begin

// Desktop, Start Menu ve Quick Launch’da olustur

CreateShortCut(‘Not defteri’,'c:\windows\notepad.exe’,'c:\windows\’,

[slDesktop,slStartMenu,slQuickLaunch]);

// Sadece Desktop ve Quick Launch’da olustur

CreateShortCut(‘Not defteri’,'c:\windows\notepad.exe’,'c:\windows\’,

[slDesktop,slQuickLaunch]);

end;

Programlama Dilinde Dosyalama İşlemleri

06 Kasım 2007

PROGRAMLAMA DİLİNDE DOSYALAMA İŞLEMLERİ

İnsanlar çeşitli bilgileri saklamak ve sonra istenildiği zaman tekrar kullanmak isterler. Zaten bilgisayar kullanımının en önemli sebeplerinden biri de insanlar için çok önemli olan bilgileri uzun süre saklayabilmek ve sonra istenildiğinde bu bilgilere tekrar ulaşabilmektir. Bilgisayarın bu fonksiyonu sayesinde çok büyük miktarlardaki bilgiler güvenli bir şekilde saklanabilmektedir.

Bilgisayar, ana belleği üzerindeki bilgileri elektrik akımı mevcut olduğu sürece saklar. Herhangi bir nedenden dolayı elektrik akımının kesilmesi halinde bilgisayarın tüm faaliyetleri duracaktır. Bunun sonucu olarak ta bilgisayar ana belleğinde tutulan tüm bilgiler kaybolacaktır. Oysa bilgisayar kullanımındaki en önemli amaçlardan biri de bilgisayar aracılığı ile çeşitli bilgileri istenildiği kadar uzun süre saklamak ve istenildiği zaman bu bilgilere tekrar bilgisayar aracılığı ile ulaşabilmek olduğuna göre bilgilerin bu tür durumlardan etkilenmeyecekleri ortamlarda saklanmaları gerekmektedir.

Örneğin alınmış olan bir film CD’ si bilgisayarda istenildiği zaman tekrar izlenilebilmektedir. Yani bilgisayarın kapanması, elektrik akımının kesilmesi vb. olaylar CD içindeki bilgileri etkilememektedir. İşte programcılıkta da çeşitli verilerin sürekli olarak saklanması istenildiğinde dosyalar kullanılır.

Dosya genel olarak aynı yapıda kayıtların oluşturduğu bir bütündür şeklinde tanımlanabilir. Sürekli olarak saklanması istenilen bilgiler ya program içerisinde ya da dosyalarda saklanır. Programcılıkta amaç basit ve etkin programlar geliştirmek olduğunu göre, böyle sürekli saklanması istenilen bilgiler için dosyaların kullanılması kaçınılmaz olmaktadır. Böylelikle kayıtlar üzerinde eklemeler, silmeler, güncellemeler gibi birçok işlem rahatlıkla yapılabilmektedir. C dilinde dosyalama işlemlerinin ayrıntılarına inilmeden önce bir kavram kargaşası yaşanmaması için bazı terimlerin açıklamaları yapılacaktır.

Genel olarak veri, tek başına anlamı olmayan ifadeler olarak tanımlanır. Bilgi ise verilerin anlam kazanmış halidir. Tutanak, verilerin birleşip bir nitelik yada nicelik tanımlaması halidir. Dosya ise aynı görünümlü tutanaklar topluluğudur. Dosya içinde anlamlı veri parçalarının oluşturduğu her bir sütun bilgilerine alan denir. Dosya yapısını oluşturan her alanın iki özelliği vardır. Bu özellikler bu alan içinde kalacak verinin kapladığı alan ve tipidir. Dosya yapısının tasarım mantığı içerisinde birim olarak kabul edilen bir veya birbiriyle ilişkili birkaç alandan meydana gelen gruplara kayıt denir. İşletim sistemi yardımı ile yan bellekte ardışık olarak saklanan kayıtlar topluluğuna kütük denir. Kütüğü oluşturan kayıt ve alanların satır ve sütun mantığı ile düzenlenmiş biçimine ise dosya denir. Dosyanın başlangıç adresi işletim sistemi yardımı ile kullanıcının bu yapıya verdiği isimle saklanır. Verilen dosya ismi işletim sistemi için belirlenen dosya isimlendirme kuralları ile uyumlu olmalıdır(Kara ve Kızıltuğ, 1995). C dosyalama sistemi kullanıcıya farklı donanım elemanları ile çalışma olanağı sağlamaktadır. Bu donanım elemanları klavye, disket, ekran veya herhangi bir port olabilir. C dilinde dosyalama işlemlerinin nasıl yapılacağına ve üstünlüklerine geçmeden önce akış kavramı açıklanacaktır.

1.AKIŞ:

C programlama dilinde dosya giriş/çıkış işlemlerinin temelini, bilgisayarı oluşturan aygıtlar içim mantıksal bir arabirim görevi yapan, akış adı verilen bir kavram oluşturur. Genel olarak akış, bir dosyaya ulaşmak için kullanabileceğimiz mantıksal arabirimdir. C programlama dilinde dosya ifadesi, diske kaydedilen bir dosyayı ifade etmekle birlikte, ekran, klavye gibi donanım elemanlarının birini de ifade edebilir. İşte bu sayede yani donanım elemanlarının dosya olarak kabul edilmesi sayesinde, C programlama dilinde donanıma hükmetmek kolaylaşmaktadır. Dosyaların yapıları veya kapasiteleri farklı olabilir, ancak akışların tamamı aynıdır. Bu özellik sayesinde donanım elemanları benzer şekilde tanımlanabilir. Yani ANSI C dosya sistemi farklı donanım elemanlarını, akış vasıtası ile benzer elemanlar gibi kullanabilir. Böylece disk üzerinde bir dosyaya yazı yazmak için kullandığımız fonksiyonları aynı zamanda ekrana ve yazıcıya yazı yazmak için de kullanabiliriz(Ekinci, 1996).

Akış, stdio.h başlık dosyası içinde tanımlı FILE adlı yapı veri türünden bildirimi yapılan bir pointer değişkeni ile kullanılan bir dosya ya da fiziksel bir cihazdır.

Bir akışın dosya ile bağlantısını sağlamak için dosya açma işlemi, akışın dosyadan bağlantısının kesmek için dosya kapama işlemi uygulanır. Dosya açıldıktan sonra dosyadan programa bilgi aktarılabilir veya dosya içeriği değiştirilebilir(Ekinci, 1996).

İki tür akış vardır:

2.1.Metin Akışı:

Metin akışı, herhangi bir metin editörü ile oluşturulan DOS metin dosyaları ile kullanılır. Yani metin akışı ASCII karakterlerle birlikte kullanılır(Çölkesen, 1999). Sayısal değerler yan belleğe aynen görüldükleri gibi aktarılırlar. String değerlerde aynen görüldükleri gibi aktarılırlar. Ayrıca satır sonu işareti olan LF(‘\n’=0x0A), CR+LF (‘\r’=0x0D, ‘\n’=0x0A) karakter çiftine dönüştürülerek kaydedilir. Dosyanın en sonunda dosya sonu işareti bulunur(Kara ve Kızıltuğ, 1995).

Yani metin akışında diskten dosya okurken yeni satır ve satır başı karakterleri tek bir yeni satır karakterine çevrilir. Diske bu dosyayı kaydederken ise tek bir yeni satır karakteri, yeni satır ve satır başı karakterlerine çevrilir. Bu nedenle metin akışına gönderilen ifadelerle dosyaya yazılan ifadeler birbirinin aynısı olmayabilir.

2.2.İkili Sistem Akışı:

İkili sistem akışında, metin akışında olduğu gibi herhangi bir dönüşüm yapılmaz. Yani diske dosya kaydetme ve diskten akışa dosya aktarırken dosya karakterlerinde herhangi bir dönüşüm yapılmaz. Bundan dolayı ikili sistem akışına gönderilen ifadelerle dosyaya gönderilen ifadeler arasında herhangi bir farklılık olmaz. Satır sonu işareti yoktur. Veriler için bellekte eşit yer ayrılmıştır. ‘\0’ karakterinden sonraki alanların bir önemi olmadığı için boş bırakılmıştır(Kara ve Kızıltuğ, 1995).

2.3.Aktif Konum:

Aktif konum dosyaya yapılacak girişin konumudur. Örneğin 100 byte uzunluğunda bir dosyaya erişip, 40 byte bilgi okuduktan sonra, dosyaya tekrar erişilmek istenildiğinde, erişim 41. byte üzerinde olur. Bu durumda 41. byte aktif konum olarak isimlendirilir. Dosya kapatılıp açıldığında ise ilk kayıt üzerine konumlanılacağından aktif konum ilk kayıt olacaktır(Ekinci, 1996).

2.4.Standart Akışlar:

Bir program çalıştırıldığı zaman aşağıda gösterilen standart akışlar otomatik olarak açılır. Bu akışlar vasıtasıyla bilgisayara bağlı aygıtlara tıpkı bir dosya gibi erişilebilir.

·stdin : Klavyeden veri okur.

·stdout : Verileri ekrana yollar.

·stderr : Verileri ekrana yollar.

·stdaux : Seri porttan veri alış verişi yapar.

·stdprn : Verileri yazıcıya yollar.

Bu standart akışlar FILE pointer’ larıdır. Bu nedenle FILE * değişkenlerini kullanan bütün fonksiyonlarla birlikte kullanılabilirler(Ekinci, 1996).

Not: Akışlara ilişkin çeşitli örnek Programlara EKLER kısmında yer verilmiştir.

3.DOSYA TÜRLERİ:

C programlama dilinde iki tür dosya vardır.

·Text (metin) dosyaları.

·Binary (ikili) dosyalar.

Text dosyalar herhangi bir metin editörü ile okunabilen ve değiştirilebilen dosyalardır. Binary dosyalar ise ikili sisteme göre saklanmış dosyalardır.

3.1.Text Dosyalar ile Binary Dosyalar Arasındaki Farklılıklar:

a.Text dosyalara girilen sayısal veriler girildikleri gibi kaydedilirler. Binary dosyalarda ise sayısal veriler ikilik sisteme çevrilerek kaydedilirler.

b.Text dosyalarda string bilgilerin sonunda yer alan ‘\n’ karakteri, ‘\r’+ ‘\n’ karakter çiftine dönüştürülerek kaydedilir. Binary dosyalarda ise, string ifadelerin sonunda yer alan ‘\n’ karakteri aynen kaydedilir. İstenirse kullanılmayabilir.

c.Text dosyalarda kayıtlara erişim sıralı, Binary dosyalarda ise erişim rastgele olup herhangi bir anahtar alan vasıtasıyla yapılır. Text dosyalarda kayıt yazma işlemi sıra ile olur. Yazılan en son kayıttan sonra dosya sonu işareti konur. Binary dosyalarda ise kayıt yazma işlemi anahtar alan vasıtasıyla boş bir kayda konumlanılarak yapılır.

d.Text dosyalarda okuma işlemi ilk kayıttan aranılan kayda kadar sıra ile okunarak yapılır. Binary dosyalarda ise, anahtar alan vasıtasıyla rasgele yani direkt olarak yapılır.

e.Text dosyalarda kayıt silme işleminden sonra diğer kayıtlar otomatik olarak yeniden sıralanırlar. Binary dosyalarda ise, kayıt silme anahtar alan ile olur ve silinen kaydın yeri yeni kayıt ile dolduruluncaya kadar boş kalır.

f.Text dosyalarda girilen bilgiler yan bellekte uzunlukları kadar yer kaplarlar. Binary dosyalarda ise girilen bilgiler yan bellekte verilerin tiplerinin uzunluğu kadar yer kaplarlar ve anahtar alan vasıtasıyla boş yere kaydedilirler(Kara ve Kızıltuğ, 1995).

3.2.Dosya Organizasyonları:

C dilinde kullanılan dosyalar, diğer programlama dillerinde olduğu gibi sırasal, random ya da indeksli gibi gruplara ayrılmazlar. Her şeyden önce Turbo C dilinde standart kütüphane rutinleri tarafından desteklenen, indeksli bir dosya organizasyonu yoktur. Standart kütüphane fonksiyonları ile kullanılabilecek dosyalar daima rasgele erişimli organizasyona sahiptir. Ancak rasgele erişimli dosyalar üzerinde sırasal operasyonlar düzenlemek mümkündür. Diğer uygulamalarda olduğu gibi dosya uygulamalarında da birçok standart fonksiyondan faydalanılabilir. Ancak kontrol ve sorumluluğun büyük bir kısmı kullanıcıya aittir. Kullanıcının konuyu ve ne yapmak istediğini çok iyi bilmesi gerekmektedir. C dilinde iki türlü dosya mekanizması kullanılmaktadır. Bunlar Buffer’lı dosya mekanizması ve Buffer’sız dosya mekanizmasıdır(Kara ve Kızıltuğ, 1995). İlk olarak Buffer’lı dosya mekanizmasına göre yapılan işlemler anlatılacak, ardından alt düzey dosya yapısı konusu içerisinde Buffer’sız yapıya değinilecektir.

Veri Dosyalarını Açma Modları:

Veri dosyaları (hem text, hem binary) bilgi yazma, bilgi okuma ve bilgi ekleme modlarında açılabilirler. Aşağıda veri dosyalarının açma modları görülmektedir.

·w : Text dosyasını yazma modunda oluşturur.

·r : Text dosyasını okuma modunda açar.

·a : Text dosyasını ekleme modunda açar.

·w+ : Text dosyasını yazma/okuma modunda oluşturur.

·r+ : Text dosyasını okuma/yazma modunda açar.

·a+ : Text dosyasını okuma/ekleme modunda açar.

·wb : Binary dosyasını yazma modunda oluşturur.

·rb : Binary dosyasını okuma modunda açar.

·ab : Binary dosyasını ekleme modunda açar.

·w+b: Binary dosyasını yazma/okuma modunda oluşturur.

·r+b : Binary dosyasını okuma/yazma modunda açar.

·a+b : Binary dosyasını okuma/ekleme modunda açar.

Eğer dosya açma modu belirtilmez ise dosya text olarak kabul edilir ve ona göre açılır. Yani default değer text’ tir.

3.3.Dosya Açma Modları Arasındaki Farklılıklar:

Dosya açma modlarından “w” ile text dosyası “wb” ile binary dosya oluşturulur. Bu mod ile açılan dosyalara yalnızca yazma işlemi yapılabilir. Aktif konum sıfırıncı kayıt olur. Yani kayıt işaretçisi dosya başına konumlanır. Eğer daha önce var olan bir dosya bu mod kullanılarak açılırsa yazıcı kafa dosyanın en başına konumlanacağından dosyada yer alan tüm bilgiler silinir.

Text dosyalar için “w+”, binary dosyalar için “w+b” dosya açma modu ile dosyalar yazma/ okuma modunda oluşturulur. Yani bu mod ile oluşturulan dosyadan okuma işlemi de yapılabilir. Varolan bir dosya bu modlar kullanılarak açılmak istenirse aktif konum sıfırıncı kayıt olacağından dosyadaki tüm bilgiler silinir.

Text dosyalar için “r”, binary dosyalar için “rb” modu varolan dosyayı okuma modunda açar. Eğer olmayan bir dosya bu modlar kullanılarak açılmak istenirse fopen() fonksiyonu geriye NULL değeri döndürür. Bu modlar ile sadece dosyadan bilgi okunabilir. Dosya bu modlar ile açıldığında aktif konum sıfırıncı kayıt olur.

Text dosyalar için “r+”, binary dosyalar için “r+b” modu ile varolan dosya okuma/yazma modunda açılır. Varolmayan bir dosya bu modlar kullanılarak açılmak istenirse fopen() fonksiyonu geriye NULL döndürür. Dosya ilk açıldığında aktif konum sıfırıncı kayıt olur. Fakat kayıt ekleme işlemi yapılması işlemi dosyadaki kayıtların silinmesine neden olmaz. Ekleme yapılmak istenildiğinde kayıt işaretçisi dosya sonuna konumlanır.

Text dosyalar için “a”, binary dosyalar için “ab” modu ile dosyalar ekleme modunda açılır. Bu modlar ile açılan dosyalarda veri okuma işlemi yapılamaz. Dosya açıldığında aktif konum dosya sonunu gösterir. Varolmayan bir dosya bu modlar kullanılarak açılmak istenirse dosya yeniden oluşturulur.

Text dosyalar için “a+”, binary dosyalar için “a+b” modu ile dosyalar ekleme/okuma açılırlar. Bu modlar ile açılan dosyalarda ekleme ve okuma işlemi yapılabilir. Dosya açıldığında aktif konum dosya sonu olacaktır. Varolmayan bir dosya bu modlar kullanılarak açılmak istenirse dosya yeniden oluşturulur.

3.4.Dosyaların Açılması:

Dosya açma fonksiyonu fopen( ) dir.

fopen( ) fonksiyonu prototipi: FILE * fopen (char * dosya_adi, char * mod);

dosya_adi = açılacak olan dosyanın diskteki adı.

mod = dosyanın açılış biçimi.

fopen() fonksiyonu stdio.h başlık dosyasını kullanır. fopen() fonksiyonu argümanlarından biri olan “dosya_adi” ifadesi işletim sisteminde kullanılan geçerli bir dosya adı olmalıdır. fopen() fonksiyonunun ikinci argümanı olan mod ifadesi ise dosyanın açılış modlarını, yani dosyanın ne şekilde açılacağını belirler(Ekinci, 1996). Yani DOS için en fazla 8 karakterlik bir dosya adı ve en fazla 3 karakterlik bir uzantı verilebilir. Uzantı verme işlemi kullanıcının isteğine bırakılmıştır. Yani istenirse dosyaya uzantı verilmeyebilir.

FILE veri tipi temel bir veri tipi değildir. Bu veri tipi “stdio.h” başlık dosyasında bildirilmiş bir topluluktur. Bu topluluk (structure) üyelerinde dosya ile ilgili; dosyanın açılış modu, tampon belleğin boyu, tampon belleğin başlangıç adresi gibi çeşitli bilgiler tutulur(Çölkesen, 1999).

Dosya açma fonksiyonu olan fopen() kendini çağırana bir adres gönderir. Eğer dosya açma işlemi başarısız olmuş ise fopen() fonksiyonu kendisini çağırana NULL değer döndürür.

Bir dosya açıldığında dosya göstericisi otomatik olarak dosyanın başına alınmaktadır. (0. offset) fopen() fonksiyonunun geri dönüş değeri olan göstericinin, açılan dosyanın bilgilerinden oluşan bir yapıyı gösterir. Ancak bu göstericiyle dosya tablosunda tutulan ve dosyanın hangi byte değeri üzerinde işlem yapılacağını gösteren dosya göstericisi birbirine karıştırılmamalıdır(Aslan, 1999).

Dosya açma işlemi başarılı olmuş ise fopen() fonksiyonu kendini çağırana dosya bilgilerinin saklandığı topluluğun başlangıç adresini gönderir. Program geliştirilirken dosyanın açılıp açılmadığı, fopen() fonksiyonunun geri döndürdüğü değerin kontrolü ile anlaşılabilir(Çölkesen, 1999).

Eğer fopen() fonksiyonu ile dosya oluşturma işlemi başarılı bir biçimde tamamlanırsa, fopen() fonksiyonu geriye dosya bilgilerinin saklandığı topluluğun başlangıç adresini döndürür. Bu dosya açma işleminin başarılı bir biçimde yapıldığı anlamına gelir. Yukarıdaki programda dosya açıldıktan sonra bir tuşa basılana kadar beklenip dosya kapatılmaktadır.

Örnek:

dosya=fopen(“personel.dat”, “w”);

Açıklama:

Yukarıdaki programda “personel.dat” adlı bir dosya text modunda ve yazma modunda oluşturulmuştur.

3.5.Dosyaların Kapatılması:

Dosya kapatma komutu fclose() dur.

fclose() fonksiyonu prototipi: int fclose(FILE *p);

p: fopen() fonksiyonu ile kullanılan dosya pointer’ i.

fclose() fonksiyonu p ile bağlantılı dosyayı kapatır ve dosyanın akış ile olan bağlantısını keser.

Sistemin etkinliğini artırmak için dosya sistem uygulamalarının çoğu veriyi diske her defasında bir sektör olmak üzere yazarlar. Bu durumda bir sektör değere erişene dek, veri tampon belleğe aktarılır ve daha sonra diske yazılır. fclose() fonksiyonu tam dolmamış tampon bellek içeriğini otomatik olarak diske yazar. Bu işleme tampon bellek boşaltma işlemi adı verilir(Ekinci, 1996).

Dosyayı kapatmak için sadece tek bir argüman olarak dosya işaretçisi kullanılır. fclose() fonksiyonunun uygun olmayan argümanlarla çağrılması dosya sistemine zarar verebilir ve tekrar elde edilmesi mümkün olmayan veri kayıpları meydana gelebilir.

Dosya fclose() fonksiyonu ile hatasız olarak kapatılmışsa fclose() fonksiyonu geriye “0” değerini döndürür. Dosya kapama işleminde hata olması halinde fclose() fonksiyonu geriye EOF değerini döndürür. Normal olarak açılmış bir dosyanın kapatılmaması söz konusu olmadığından fclose() fonksiyonunun başarısının test edilmesine gerek duyulmaz(Aslan, 1999).

Örnek:

fclose(dosya);

Açıklama:

Yukarıdaki program “dosya” ile işaret edilen dosyanın kapatılmasını sağlar.

Not: Yukarıdaki işlemlere ilişkin çeşitli örnek Programlara EKLER kısmında yar verilmiştir.

4.TEXT DOSYALAR:

Bu dosya tipinde sayısal bilgiler yan belleğe, aynen göründükleri gibi aktarırlar. String değerlerde aynen göründükleri gibi aktarılırlar. Ayrıca satır sonu işareti olan LF (‘\n’=0x0A), CR+LF (‘\r’=0x0D, ‘\n’=0x0A) karakter çiftine dönüştürülerek kaydedilir. Dosyanın en sonunda dosya sonu işareti bulunur.

Örnek:

MURAT ÇİFTCİ 90 95 100

GÜLSEREN ÇİFTCİ 80 85 75

Şeklinde bir kayıt girildiğini varsayalım. Bu kayıtlar bir text dosyada aşağıdaki gibi saklanacaktır.

141

120

‘M’‘U’‘R’‘A’‘T’ 0X0D 0X0A ‘Ç’‘İ’‘F’‘T’‘C’‘İ’ 0X0D 0X0A ‘9’‘0’‘9’‘5’ ‘1’‘0’‘0’

142

165

‘G’‘Ü’‘L’‘S’‘E’‘R’‘E’‘N’ 0X0D 0X0A ‘Ç’‘İ’‘F’‘T’‘C’‘İ’ 0X0D 0X0A ‘8’‘0’‘8’‘5’‘7’‘5’

Görüldüğü gibi her iki kayıtta ekrandan girildiği biçimde yan belleğe kaydedilmiştir. String bilgilerin sonuna satır sonu karakteri, 0x0D+0x0A birleşimine dönüştürülmüştür.

Bu tipte kaydedilen veriler ulaşım yöntemi sıralıdır. Çünkü her kaydın uzunluğu birbirinden farklı olduğu için, bu kayıtlara doğrudan erişilmesi mümkün değildir. Sıralı erişim sisteminde kayıt yazma işlemleri sıradan yapılır. En son kayıttan sonra dosya sonu işareti konur. Kayıt okuma işlemleri ise birinci kayıttan itibaren dosya sonu işaretine kadar yapılır. Yani istenen kayıt bulununcaya kadar bütün kayıtlar tek tek okunur(Kara ve Kızıltuğ, 1995).

4.1.Text Dosyalarda Kullanılan Fonksiyonlar:

4.1.1.access() Fonksiyonu:

int access(const char *dosya, int amode)

io.h kütüphanesinde yer alır. adı belirtilen dosyanın diskte varolup varolmadığını kontrol eder. Yapılacak kontrole göre amode alanına 0,2,4,6 sayılarından birisi getirilir. Dosyanın diskte var olup olmadığını görmek için amode alanına 0 değeri yazılmalıdır. Hata durumunda geriye –1 değerini döndürür.

Örnek:

access(giris,0);

Açıklama:

Yukarıdaki fonksiyon ile bir dosyanın diskte olup olmadığı anlaşılır. Dosya varsa geriye 0 döndürür. Aksi halde –1 döndürür.

4.1.2.eof() Fonksiyonu:

int eof(FILE *dosya)

io.h kütüphanesi içerisinde yer alır ve dosya sonu olup olmadığını kontrol eder. Dosya sonu ise geriye 1, dosya sonu değilse geriye 0, hata durumunda geriye –1 değerlerini döndürür.

Örnek:

eof(dosya);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile belirtilen dosyanın sonuna ulaşılıp ulaşılmadığını kontrol eder. Dosya sonu ise geriye 1, dosya sonu değilse geriye 0 değerini döndürür.

4.1.3.fclose() Fonksiyonu:

Açık dosyayı kapatmak için kullanılan bir fonksiyondur.

int fclose(FILE *p);

p: fopen() fonksiyonu ile kullanılan dosya pointer’ i.

4.1.4.fcloseall() Fonksiyonu:

int fcloseall(void)

stdio.h başlık dosyası içerisinde yer alır. O an açık olarak bulunan bütün dosyaların hepsini birlikte kapatmak amacıyla kullanılır.

Örnek:

fcloseall();

Açıklama:

Yukarıdaki fonksiyon diskte o an açık bulunan bütün dosyaları kapatır. İşlem sonucu başarılı ise geriye 0 değerini aksi halde sıfırdan farklı bir değer döndürür.

4.1.5.feof() Fonksiyonu:

int feof(FILE *dosya).

Dosya: FILE tipinde tanımlanmış dosya göstericisi.

Belirtilen dosyada dosya sonu işaretine rastlanırsa dosya sonu göstergesi sıfırdan farklı bir değer alır. Dosya sonuna rastlanmazsa sıfır değerini gösterir. stdio.h kütüphanesi içinde tanımlı bir fonksiyondur(Çubukçu, 1990).

Örnek:

feof(dosya);

Açıklama:

Yukarıdaki fonksiyon ile dosya sonu kontrolü yapılmaktadır. Eğer dosya sonuna ulaşılmış ise fonksiyon geriye sıfırdan farklı bir değer gönderir. Eğer dosya sonu değilse fonksiyon geriye sıfır değerini gönderecektir.

4.1.6.ferror() Fonksiyonu:

int ferror(FILE *dosya)

Dosya: FILE tipinde tanımlı dosya göstericisi.

Bu fonksiyon dosyaya yapılan en son erişimde bir hata oluşmuşsa sıfırdan farklı aksi takdirde sıfır değeri döndürür(Çölkesen, 1999).

Örnek:

ferror(dosya);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile erişilen dosyada yapılan en son erişimde herhangi bir hata oluşmuş ise sıfırdan farklı bir değer, hat oluşmamış ise sıfır döndürür. Böylece hata kontrolü yapmaya imkan verir.

4.1.7.fflush() Fonksiyonu:

int fflush(FILE *dosya)

belirtilen dosyaya ait tampon bellekte bulunan verileri, dosya yazma modunda açılmışsa ivedi olarak diske aktarır ve tampon belleği temizler. Okuma modunda açılmışsa yalnızca tampon belleği temizler. Kullanım yerlerinden biri, standart girişten veri okuyan fonksiyonlar, eğer tamponda daha önceden kalma veri varsa klavyeye basılmasını beklemeden onları okur, öncekilerin değil de yeni girilenlerin okunması istenirse standart giriş temizlenmelidir. Bu işi yapan fonksiyon ise fflush() fonksiyonudur(Çölkesen, 1999).

Örnek:

fflush(dosya);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile işaret edilen dosyanın kullandığı buffer’ı boşaltır.

4.1.8.fflushall() Fonksiyonu:

int fflushall(void)

stdio.h kütüphanesi içerisinde yer alır. Dolu olan bütün buffer’ ları temizler(Kara ve Kızıltuğ, 1995).

Örnek:

fflushall();

Açıklama:

Bu fonksiyon bütün buffer’ları boşaltmak maksadıyla kullanılır. Eğer herhangi bir hata ile karşılaşılmazsa geriye EOF döndürür.

4.1.9.fgetc() Fonksiyonu:

int fgetc(FILE *dosya)

dosya: FILE tipinde tanımlı dosya göstericisi.

Belirtilen dosyadan 1 adet karakter okumak amacıyla kullanılır. hata durumunda EOF döndürür(Çubukçu, 1990).

Örnek:

fgetch(dosya);

Açıklama: Yukarıdaki fonksiyon dosyada kayıt işaretçisinin bulunduğu konumdan itibaren 1 karakter okur. Herhangi bir hata durumunda EOF döndürür. Dosyaya karakter düzeyinde erişim yapmak maksadıyla kullanılır.

4.1.10.fgets() Fonksiyonu:

fgets(char *str, int uzunluk, FILE *dosya)

Str: Dosyadan okunacak olan bilginin aktarılacağı karakter katarının göstericisi.

Uzunluk: Dosyadan okunacak olan karakter katarını uzunluğu.

Dosya: FILE tipinde tanımlı dosya göstericisi.

Dosyadan belirtilen sayı kadar karakter alarak belirtilen katara koyar. Bu fonksiyon ‘\n’ karakterini okumaz. Bu katara ‘\0’ karakteri ilave edilir. Dosya sonu olunca NULL değeri döndürür.

Genellikle fputs() fonksiyonu ile birlikte kullanılır. Sadece bir değişken okumak amacıyla kullanılır. okuduğu karakterin sonuna NULL değeri atar. bundan dolayı dosyadan okunacak karakter katarının uzunluğundan, bu katarı tutacak alanın uzunluğu 1 karakter fazla olmalıdır(Kara ve Kızıltuğ, 1995).

Örnek:

fgets(s,22,dosya);

Açıklama:

Yukarıdaki fonksiyon ile “dosya” ile belirtilen dosyadan “s” ile belirtilen değişkene maksimum 22 adet karakter uzunluğunda karakter katarı okunmaktadır.

4.1.11.filelenght() Fonksiyonu:

long filelenght(FILE *dosya)

io.h kütüphanesi içerisinde yer alan bir fonksiyon olup dosya göstericisi tarafından gösterilen dosyanın byte cinsinden değerini geri döndürür. Hata durumunda geriye –1 değerini döndürür(Aslan, 1999).

Örnek:

filelenght(fileno(giris));

Açıklama:

Yukarıdaki fonksiyon fileno() ile dosya numarası bulunan dosyanın byte cinsinden uzunluğunu verir. Hata durumunda geriye –1 değerini döndürür.

4.1.12.fileno() fonksiyonu:

int fileno(FILE *dosya)

dosya: FILE tipinde tanımlı dosya işaretçisi.

Stdio.h kütüphanesi içerisindedir. Açılan dosyanın numarasını verir.

Örnek:

fileno(giris);

Açıklama:

Yukarıdaki fonksiyon açılmış olan bir dosyanın numarasını verir.

4.1.13.fopen() Fonksiyonu:

Dosya açma fonksiyonudur.

FILE * fopen (char * dosya_adi, char * mod);

dosya_adi = açılacak olan dosyanın diskteki adı.

mod = dosyanın açılış biçimi.

4.1.14.fputc() Fonksiyonu:

int fputc(int kr, FILE *dosya)

kr: belirtilen yere yazılacak olan karakteri gösterir.

dosya: FILE tipinde tanımlı dosya göstericisi.

Kayıt işaretçisinin konumlandığı yere bir karakter yazmak için kullanılır. hata durumunda geriye EOF değerini döndürür(Çubukçu, 1990).

Örnek:

fputc(s,dosya);

Açıklama: “s” ile belirtilen değişkendeki değeri “dosya” ile belirtilen dosyada o an kayıt işaretçisinin bulunduğu yere yazar. Hata durumunda geriye EOF döndürür. Dosyaya karakter düzeyinde veri eklemede kullanılır.

4.1.15.fputs() Fonksiyonu:

int fputs(const char *s, FILE *str)

S: Dosyaya yazılması istenen katarın göstericisi.

Str: FILE tipinde tanımlı dosya göstericisi.

S ile belirtilen karakter katarını dosyaya yazar. Bu katara ‘\0’ ilave edilmez. Katar boş ise kayıt yok anlamında olan 0 döndürür. EOF hatayı belirtir. stdio.h kütüphanesi içinde yer alan bir fonksiyondur(Çölkesen, 1999).

Örnek:

fputs(s,dosya);

Açıklama:

Yukarıdaki fonksiyon ile “dosya” ile belirtilen dosyaya “s” ile belirtilen değişkene atanmış olan karakter katarı formatsız olarak yazdırılmaktadır.

4.1.16.fprintf() Fonksiyonu:

FILE türünden tanımlanan formatlı bilgi kaydeder. Hata durumunda EOF gönderir.

int fprintf (FILE *stream, const char *format[,argümanlar....])

stream: FILE tipinde tanımlı dosya göstericisi.

format: char tipinde tanımlı ve kayıtlara ne şekilde ulaşılacağını gösteren pointer.

Argümanlar: dosyadaki sahalar listesi.

stdio.h kütüphanesi içerisinde yer alan bir fonksiyondur(Çubukçu, 1990).

Örnek:

fprintf(dosya, “%s %s %s\n”, isim,soyad,tel);

Açıklama:

Yukarıdaki program “dosya” ile işaret edilen text dosyaya çeşitli değişkenlere okutulmuş olan değerleri kayıt işaretçisinin bulunduğu yerden itibaren yazar. Tabi ki bu işlemin yapılabilmesi için önceden dosyanın açık olması gerekir.

4.1.17.freopen() Fonksiyonu:

FILE *freopen (const char *dosya_adı, const char *mod, FILE *dosya)

Bu fonksiyon dosya ile belirtilen dosya veya standart çıkışı kapatır. Ardından belirtilen ad ve moddaki dosya adını dosya değişkenine aktarır. Yani dosya diye açılan dosya işaretçisi olur. Bu fonksiyon daha çok standart giriş(stdin), standart çıkış(stdout) ve standart hata çıkışını(stderr) disk dosyalarına yöneltmek amacıyla kullanılır(Çölkesen, 1999).

Örnek:

freopen(“isimler.dat”, “w”, stdprn);

Açıklama:

Bu fonksiyon “isimler.dat” adı ile belirtilen dosyayı kapattıktan sonra o dosya içindeki verilerin standart çıkış olan yazıcıya yönlendirilmesini sağlar.

4.1.18.fscanf() Fonksiyonu:

FILE türünden tanımlı dosyadan formatlı bilgi okur.

int fscanf (FILE *stream, const char *format[,argümanlar....])

stream: FILE tipinde tanımlı dosya göstericisi.

format: char tipinde tanımlı ve kayıtlara ne şekilde ulaşılacağını gösteren pointer.

Argümanlar: dosyadaki sahalar listesi.

Dosyadan bilgi okuma sırasında hata oluşursa EOF değeri döndürür(Kara ve Kızıltuğ, 1995).

stdio.h kütüphanesi içerisinde yer alan bir fonksiyondur.

Örnek:

fscanf(dosya, “%s %s %s”, isim,soyad,telno)

Açıklama:

Yukarıdaki program “dosya” ile işaret edilen text dosyadan kayıt işaretçisinin bulunduğu yerden itibaren çeşitli değişkenlere kayıt okur. Tabi ki bu işlemin yapılabilmesi için önceden dosyanın açık olması gerekir.

4.1.19.getc() Fonksiyonu:

int getc(FILE *dosya);

stdio.h kütüphanesi içerisinde yer alıp dosya ile belirtilen dosya içerisinden sıradaki bir karakteri okur.

Örnek:

getc(dosya);

Açıklama:

Yukarıdaki fonksiyon dosyadan kayıt işiretçisinin bulunduğu yerden itibaren 1 karakter okur. Dosya sonuna gelindi ise veya hat durumu söz konusu ise geri EOF döndürür.

4.1.20.putc() Fonksiyonu:

int putc(int c, FILE *dosya)

stdio.h kütüphanesi içerisinde yer alır ve c ile gösterilen karakteri dosya ile gösterilen dosyanın sonuna yazar.

Örnek:

putc(c,dosya);

Açıklama:

Yukarıdaki fonksiyon dosyadan kayıt işaretçisinin bulunduğu yerden itibaren “c” adlı değişken içeriğini “dosya” ile belirtilen dosyaya yazar. Hata durumunda EOF döndürür.

4.1.21.rename() Fonksiyonu:

int rename(const char *eski_ad, const char *yeni_ad)

stdio.h kütüphanesinde yer alır ve dosya isimlerini değiştirmek amacıyla kullanılır(Çölkesen, 1999).

Örnek:

rename(“yedek.dat”,“isci.dat”);

Açıklama:

Yukarıdaki fonksiyon adı “yedek.dat” olan dosyanın ismini “isci.dat” olarak değiştirir. Hata durumunda –1 değerini döndürür. Hata söz konusu değilse 0 değerini geri döndürür.

4.1.22.remove() Fonksiyonu:

int remove(const char *dosya)

stdio.h kütüphanesi içerisinde yer alır. unlink() ile aynı işi yapar. Yani dosya adı ile belirtilen dosyayı fiziksel olarak diskten atar(Çölkesen, 1999).

Örnek:

remove(“isci.dat”);

Açıklama:

Bu fonksiyon diskteki “isci.dat” adlı dosyayı diskten siler. Hata durumunda –1 değerini geri döndürür. Hata söz konusu değilse geriye 0 değerini döndürür.

4.1.23.setbuf() Fonksiyonu:

void setbuf(FILE *dosya, char *buf)

stdio.h kütüphanesi içerisinde yer alır ve buffer’ların kullanıcı tarafından kontrol altında tutulmasını sağlar(Kara ve Kızıltuğ, 1995).

4.1.24.setvbuf() Fonksiyonu:

void setvbuf(FILE *dosya, char *buf, int tip, unsigned uzunluk)

stdio.h kütüphanesi içerisinde yer alır. Dosya ile ilgili giriş çıkış işlemlerinin daha önce belirtilen buffer yerine kullanıcının belirlemiş olduğu bir buffer’a yönlendirilmesini sağlar.

Dosya ismi ile belirtilen dosyanın açık olması gerekir. Buffer’in uzunluğu 0-32767arasında olabilir. *buf buffer’in başlangıç adresini temsil eder. Tip olarak belirtilen standart değişkenler ise _IOFBF, _IOLBF, _IONBF değişkenleridir. Bu değişkenler kullanılarak buffer’siz dosya buffer’li, buffer’li dosya buffer’siz hale getirilebilir(Kara ve Kızıltuğ, 1995).

4.1.25.unlink() Fonksiyonu:

int unlink(const char *dosya)

dos.h, io.h, stdio.h kütüphaneleri içerisinde yer alır. Dosya değişkeni ile belirtilen dosyayı fiziksel olarak dosyadan atar(Çölkesen, 1999).

Örnek:

unlink(“isci.dat”);

Açıklama:

Bu fonksiyon diskteki “isci.dat” adlı dosyayı diskten siler. Hata durumunda –1 değerini geri döndürür.

4.2.Text Dosyalara Bilgi Girişi:

Giriş Ünitesi à Ana Bellek à Yan Bellek (Disk veya disket)

Kayıt girişi amacıyla kullanılan bir dosya mekanizmasının giriş ünitelerinden girilen bir bilgiyi diske kaydedilebilmesi için 3 aşama mevcuttur. Bunlar dosya açma, dosya fonksiyonlarını kullanma ve dosyayı kapatma işlemleridir.

Kayıt girişi işlemlerinde programcılar tarafında sıkça kullanılan fonksiyonlar; fopen(), fflush(), flushall(), setbuf(), setvbuf(), fprintf(), fputs(), fclose() ve fcloseall(), fputc(), putc()’dir(Kara ve Kızıltuğ, 1995).

Text dosyalarda verilerin sırasal olarak kaydedildiğine daha önce değinilmişti. Dosya sonuna ise bir dosya sonu işareti olan EOF konulmaktadır. Yeni bir text dosya oluşturulduğu zaman (“w” ya da “w+” modu ile) yazıcı kafa dosyanın başına konumlanır ve girilen kayıtlar sıra ile dosyaya yazılır. eğer daha önceden varolan bir dosya “w” ya da “w+” modları ile açılırsa dosya içerisindeki bütün kayıtlar silinecektir. Dosyaya kayıt girişi yapılabilmesi için “w”, “w+”, “r+”, “a”, “a+” modlarından biri ile açılmak zorundadır(Kara ve Kızıltuğ, 1995). Bunlar dışında ki modlar kullanılarak açılırsa dosyaya bilgi girişi yapılamaz. “r+” modu ile açılan dosyada da okuyucu/yazıcı kafa sıfırıncı kayda konumlanır. Yani aktif konum 0 olur. Ancak bu durum dosyaya veri girişi sırasında değişir ve okuyucu/yazıcı kafa dosya sonuna konumlanır. Bu durumda herhangi bir silinmenin önüne geçilmiş olur. “a” ve “a+” modlarında ise zaten yazıcı/okuyucu kafa dosya sonunda olduğundan herhangi bir problemin ortaya çıkması da söz konusu olamaz. Kayıt girişi sırasında ilgili yere konumlanıldıktan sonra o kayıt ilgili fonksiyon kullanılarak dosyaya yazılır.

4.3.Text Dosyalarda Kayıt Arama:

Yan Bellek à Ana Bellek à Çıkış

Dosya üzerinde işlem yapılırken yukarıda belirtilen sıra takip edilir. Önce dosya açılır sonra komutlar kullanılır ve işlem bitince dosya kapatılır

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fgets(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda arama işlemi yapabilmek için mutlaka dosyanın açılması sırasında okumaya izin veren bir modda açılması gerekir. Aksi taktirde arama işlemi yapılamaz. Arama işlemi yapılabilmesi için dosyanın “r”, “r+”, “a”, “a+” veya “w+” modlarından biri ile açılmış olması ve açılan dosyada kayıt bulunması gerekmektedir(Ekinci, 1996). Aksi taktirde dosya üzerinde arama işlemi yapılamaz. Ayrıca text dosyalarda kayıtlar sıra ile kaydedildiğinden dolayı kayıtlara direkt erişim mümkün değildir. Bundan dolayı sıralı erişim kullanılması zorunludur. Yani arama işlemi yaparken dosyanın ilk kaydından itibaren son kayıtta dahil olmak üzere EOF(dosya sonu işareti) görünene kadar dosya baştan sona kontrol edilmelidir. Her okunan kayıt getirilip istenen kayıt olup olmadığı kontrol edilmelidir. Çünkü text dosyalarda kayıtlara direkt erişme şansımız yoktur.

4.4.Text Dosyalarda Kayıt Listeleme:

Yan Bellek à Ana Bellek à Çıkış

Dosya üzerinde işlem yapılırken yukarıda belirtilen sıra takip edilir. Önce dosya açılır sonra komutlar kullanılır ve işlem bitince dosya kapatılır

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fgets(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda kayıt listeleme işlemi kayıt arama işlemine çok benzer. Listeleme işleminde de aramada olduğu gibi dosya “r”, “r+”, “a”, “a+” veya “w+” modlarından biri ile açılmış olmak zorundadır. Kayıtlara sıra ile erişerek istenen şarta uyan kayıtlar üzerinde gerekli işlemler yapılır(Aslan, 1999).

4.5.Text Dosyalarda Kayıt Düzeltme:

Yan Bellek à Ana Bellek à Çıkış

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fprintf(),fgets(), fputs(), getc(), putc(), rename(), remove(), unlink(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda kayıt düzeltme işlemleri yapabilmek için genellikle iki farklı dosya kullanılır. Bu dosyalardan biri gerçek dosya diğeri ise geçici olarak açılan bir dosya olup düzeltme işlemi tamamlandıktan sonra gerçek dosya silinip, geçici dosyanın adı gerçek dosyanın adı ile değiştirilmelidir. Bu amaçla gerçek dosyanın okuma modunda açılması, geçici dosyanın ise yazma modunda oluşturulması önerilir. İşlem bittikten sonrada gerçek dosya silinmeli ve geçici dosyanın adı gerçek dosyanın adı ile değiştirilmelidir(Kara ve Kızıltuğ, 1995).

4.6 Text Dosyalarda Kayıt Silme:

Yan Bellek à Ana Bellek à Çıkış

Program yazımı sırasında programcılar tarafından sıkça kullanılan fonksiyonlar; fopen(), fscanf(), fprintf(),fgets(), fputs(), getc(), putc(), rename(), remove(), unlink(), feof(), ferror(), clearerr(), fclose() ve fcloseall()’ dur(Kara ve Kızıltuğ, 1995).

Text dosyalarda kayıt silme mantığı kayıt düzeltme mantığı ile aynıdır. C programlama dili dosya sisteminde dosyadan direkt olarak kayıt silen bir komut ya da fonksiyon tanımlanmamıştır. Text dosyalarda kayıtlar dosyaya sıralı olarak kaydedildiklerinden dolayı bu dosyalara rasgele erişim ile ulaşmak mümkün değildir. Mutlaka dosya başından sonuna kadar bir döngü kurularak kayıtlar taranmalıdır. Silme işleminde de düzeltme işleminde olduğu gibi iki adet dosya kullanılır. İlk dosya bizim asıl dosyamızdır. İkinci dosya ise tampon dosya olarak kullanılacaktır. Dosya başından sonuna kadar kurulan döngü içerisinde silinecek olan kayıtlar yedek dosyaya aktarılmaz. Silinmeyecek olanlar ise yedek dosyaya aktarılır. İşlem tamamlandıktan sonra asıl dosya silinir ve yedek dosyanın adı asıl dosya adı ile değiştirilir. Böylece istenen kayıtlar silinmiş olur. Silme işleminde asıl dosyanın okum modunda açılması, yedek dosyanın ise yazma modunda oluşturulması gerekir.

4.7.Text Dosyalarda Sıralama:

Text dosyalarda kayıtlara sıralı erişim metodu ile erişildiğinden direkt dosya üzerinde sıralama yapmak oldukça zahmetli ve güç bir iştir. Bunun yerine text dosyadan kayıtlar sıra ile okunup, dizilere aktarılmakta ve dizide sıralandıktan sonra ilgili dosya yazma modunda yeniden oluşturulmaktadır. Böylelikle üzerindeki bilgiler silinmekte ve dizideki bilgiler dosyaya yeniden yazılmaktadır. Böylelikle de dosya içerisindeki kayıtların sıralanması sağlanmaktadır. Yalnız dosya ilk olarak açılırken okuma modunda açılmalı ve tüm kayıtlar okunup dizilere atıldıktan sonra kapatılmalı ve tekrar bu sefer “w” ya da “w+” modları ile açılmalıdır. Böylece dosyada varolan kayıtların silinmesi sağlanmalıdır. Dizilere aktarma işlemi tamamlandıktan sonra dizileri sıralamak için herhangi bir sıralama tekniği(seçme sıralama, kabarcık sıralama vb.) kullanılarak diziler sıralanabilir.

Not: Text dosyalarda kullanılan fonksiyonlar ve yapılan işlemlere ilişkin çeşitli örnek Programlara EKLER kısmında yar verilmiştir.

5.BINARY DOSYALAR:

Binary dosyalarda sayısal veriler ikilik düzende kaydedilirler. Satır sonu işareti yoktur. Şayet string ifadelerde satır sonu işareti kullanılırsa, bu karakter dosyaya aynen kaydedilir. Ayrıca dosya sonu işareti de kullanılmaz. Veriler tiplerine göre bellekte yer kaplarlar.

120 130 140 141 142

‘M’‘U’‘R’‘A’‘T’‘\0’

‘Ç’‘İ’‘F’‘T’‘C’‘İ’‘\0’

‘Z’

‘-’

‘d’

143153 163 164 165

‘G’‘U’‘L’‘S’‘E’‘R’‘E’‘N’‘\0’

‘Ç’‘İ’‘F’‘T’‘C’‘İ’‘\0’

‘Q’

‘U’

‘K’

Yukarıda görüldüğü gibi, veriler için yan bellekte eşit miktarlarda yer ayrılmış olup her bir kayıt alanının uzunluğu aynıdır. ‘\0’ karakterinden sonraki alanların herhangi bir önemi olmadığı için boş bırakılmıştır. Not değişkenleri binary olarak kaydedildiğinden sahip oldukları veri direkt olarak dosyadaki karakterlerin ASCII koduna eşittir(Kara ve Kızıltuğ, 1995).

Örneğin bir dosyada 50 öğrenciye ait kayıtların tutulduğu ve her bir kaydın uzunluğunun 23 byte olduğu varsayılsın. Eğer kullanıcı ulaşmak istediği kaydın kaçıncı sırada olduğunu bilirse dosyadaki diğer kayıtlara bakmadan direkt o kayda ulaşabilir. Yani 20. Kayda ulaşmak isteyen bir kullanıcı dosyanın 19*23=437 ile 437+23=460 byte’ları arasını okuması yeterli olacaktır.

Dosyanın istenilen pozisyonuna bütün kayıtları okumadan direkt olarak ulaşmaya rasgele erişim denir. Binary dosyalarda kayıt ve okuma ve yazma işlemleri rasgele erişim kullanılarak yapılır(Kara ve Kızıltuğ, 1995).

5.1. Binary Dosyalarda Kullanılan Fonksiyonlar:

5.1.1.fgetpos() Fonksiyonu:

int fgetpos(FILE *dosya, fpos_t *durum)

dosya: FILE tipinde tanımlı dosya göstericisi.

durum: konum işaretçisinin saklanacağı adres.

stdio.h kütüphanesinde yer alır.

ilgili dosyanın işaretçisini durum ile işaret edilen yere saklar. Başarılı olursa sıfır, başarısız olursa sıfırdan farklı bir değer döndürür. Bu fonksiyon, kayıt işaretçisini değiştirecek bazı işlemler yaptıktan sonra eski durumunu oluşturmak için kullanılır. Bu amaçla da fsetpos() kullanılır. bundan dolayı bu iki fonksiyon birlikte kullanılırlar(Çölkesen, 1999).

Örnek:

fgetpos(dosya, p);

Açıklama:

“dosya” ile belirtilen dosyanın kayıt işaretçisini p pointerinin gösrterdiği adrese saklar. Hata durumunda sıfırdan farklı bir değer, hata yoksa 0 döndürür.

5.1.2.fread() Fonksiyonu:

size_t fread(void *tampon, size_t s, size_t n, FILE *dosya)

tampon: okunacak olan bilgiyi tutacak değişkenin adresi.

s: okunacak olan bilginin byte cinsinden uzunluğu.

n: her seferde okunacak bilgi sayısı.

dosya: FILE tipinde tanımlı dosya göstericisi(Ekinci, 1996).

stdio.h kütüphanesinde yer alır.

Dosya göstericisinin gösterdiği yerden ikinci ve üçüncü parametresinin çarpımı kadar bilgiyi tampon adresinden başlayarak belleğe okur. İkinci parametresi okunacak bilginin uzunluğunu, üçüncü parametresi ise kaç tane okunacağını göstermektedir. fread() okuyabildiği kadar bilgiyi okur ve okuyabildiği n sayısına geri döner(Aslan, 1999).

fread() fonksiyonu bir hata oluşması durumunda geriye EOF döndürür. Bundan dolayı feof() veya ferror() ile birlikte kullanılabilir(Çubukçu, 1990).

Örnek:

fread(&birey, filesize(birey),1,dosya);

Açıklama:

Yukarıdaki fonksiyon “birey” ile belirtilen yapısal veri tipine, birey yapısal veri tipinin uzunluğu kadar bilgiyi, 1 defa “dosya” ile belirtilen dosyadan okuyarak aktarır. Hata durumunda geriye EOF döndürür.

5.1.3.fseek() Fonksiyonu:

int fseek(FILE *dosya, long öteleme, int taban)

dosya: FILE tipinde tanımlı dosya göstericisi.

öteleme: taban ifadesinin gösterdiği değerin tanımladığı dosya konumundan, işlem yapılmak istenen yerin byte olarak uzaklığı.

taban: dosyada işleme başlanılacak yer. 3 adet makrosu vardır ve bunlardan biri kullanılmak zorundadır.

SEEK_SET (0) à Dosya başından başla

SEEK_CUR (1) à Aktif konumdan başla

SEEK_END (2) à Dosya sonundan başla

Stdio.h kütüphanesinde yer alır(Ekinci, 1996).

İşlem başarılı olursa sıfır aksi takdirde sıfırdan farklı bir değer döndürür(Çölkesen, 1999).

Örnek:

fseek(dosya,filesize(birey)*(no-1),SEEK_SET);

Açıklama:

Yukarıdaki fonksiyon “dosya” ile belirtilen dosyada kayıt işaretçisinin dosya sonuna konumlanmasını sağlar.

5.1.4.fsetpos() Fonksiyonu:

int fsetpos(FILE *dosya, const fpos_t *durum)

dosya: FILE tipinde tanımlı dosya göstericisi.

durum: konum işaretçisinin saklandığı adres.

stdio.h kütüphanesinde yer alır. Kayıt işaretçisini dosya başına göre, durum ile işaret edilen yerdeki değer kadar ileri konumlandırır. Genelde fgetpos() ile birlikte kullanılır. Hata oluşursa sıfırdan farklı bir değer, hata oluşmazsa geriye sıfır değerini döndürür(Çölkesen, 1999).

Örnek:

fsetpos(dosya,p);

Açıklama:

“dosya” ile belirtilen dosyanın kayıt işaretçisini p pointerinin gösterdiği adresten alır ve ilgili yere konumlanmasını sağlar. Hat yoksa geriye 0, varsa sıfırdan farklı bir değer döndürür.

5.1.5.ftell() Fonksiyonu:

long ftell(FILE *dosya)

dosya: FILE tipinde tanımlı dosya göstericisi.

stdio.h kütüphanesi içerisinde yer alır. Aktif konumu belirtir. Yani kayıt işaretçisinin dosya başına göre byte cinsinden uzaklığını verir. Hata durumunda geriye –1 döndürür(Çölkesen, 1999).

Örnek:

ftell(dosya);

Açıklama:

“dosya” ile belirtilen dosyada kayıt işaretçisinin konumunu byte cinsinden verir. Yani aktif konumu belirler. Hata durumunda geriye –1 döndürür.

5.1.6.fwrite() Fonksiyonu:

size_t fwrite(const void *tampon, size_t s, size_t n, FILE *dosya)

stdio.h kütüphanesi içerisinde yer alır.

tampon: yapısal bir tip olup dosyadaki alanları tutar.

s: dosyadaki alanları tutan yapısal veri tipinin byte cinsinden uzunluğu.

n: bir yazma işleminde yapısal kaydın dosyaya toplam yazım miktarı.

dosya: FILE tipinde tanımlı dosya göstericisi(Çubukçu, 1990).

Dosyaya belirtilen kayıt numarasından itibaren uzunluğu bilinen kaydı yazmak amacıyla kullanılır.

Bu fonksiyonla bir dizinin ilk n elemanı tek bir fonksiyon çağrısıyla dosyaya yazılabilir. Her bir elemanın s sekizli uzunlukta olan ve tampon ile işaret edilen bir dizinin ilk n tane elemanını, dosya ile belirtilen dosyaya yazar. İşlem başarı ile tamamlanırsa, yazılan eleman sayısı olan n’ yi; aksi takdirde n’ den küçük bir tamsayı döndürür(Çölkesen, 1999).

Dosya üzerinde yapılan işlemler çok text dosyalara göre çok daha hızlıdır. Dosyaya yazılan bilgi öğelerinin ardından kütük pozisyonu bir artırılır(Çubukçu, 1990).

Örnek:

fwrite(sayi, sizeof(sayi), 1, fp);

Açıklama:

Yukarıdaki fonksiyon sayi adlı yapısal veri tipinde tutulan verileri, sayi veri tipinin byte cinsinden büyüklüğü kadar bir alana, 1 defa “fp” ile belirtilen dosyaya yazar. Başarılı olursa yazılan verinin byte cinsinden uzunluğunu, başarısız olursa daha küçük bir sayı geri döndürür.

5.1.7.rewind() Fonksiyonu:

void rewind(FILE *dosya)

dosya: FILE tipinde tanımlı bir dosya göstericisi.

stdio.h kütüphanesi içerisinde yer alır.

Aktif konumu sıfır yapar. Yani konum işaretçisinin dosya başına konumlanmasını sağlar(Kara ve Kızıltuğ, 1995).

Örnek:

rewind(dosya);

Açıklama:

“dosya” ile belirtilen dosyada kayıt işaretçisini dosya başına getirir. Yani aktif konumu sıfır yapar.

5.1.8.tmpfile() Fonksiyonu:

FILE *tmpfile(void)

Stdio.h kütüphanesi içerisinde yer alır.

Geçici olarak disk dosyası oluşturup onu güncelleme modunda açar ve dosya işaretçisini çağırana gönderir. Hata olursa NULL gönderir. Dosya kapatıldığında diskten atılır(Çölkesen, 1999).

Not: fopen(), fclose(), fcloseall(), feof(), eof(), ferror(), fflush(), flushall(), freopen(), fileno(), filelenght(), unlink(), remove(), rename(), access() fonksiyonlarının kullanımları text dosyalar ile aynıdır. Bundan dolayı bu fonksiyonların kullanımları yeniden açıklanmamıştır. Text Dosyalarda Kullanılan Fonksiyonlar başlığı altına bu fonksiyonların kullanımları ayrıntılı bir biçimde açıklanmıştır.

5.2.Binary Dosyalara Bilgi Girişi:

Kayıt girişi için düzenlenen bir dosyada girilen kayıtlar aşağıda verilen sırayı takip ederek yan belleğe kaydedilirler.

Giriş Ünitesi à Ana Bellek à Yan Bellek (disk veya disket)

Bu dosya tipinde işlemlerin yapılabilmesi için kayıt uzunluğunun ve okuyucu kafanın nerede olduğu bilinmelidir. Ayrıca kayıtlar okuma ve yazma işlemlerinde bir anahtar alan vasıtası ile kontrol edilmelidir(Kara ve Kızıltuğ, 1995).

Kayıt girişi amacıyla kullanılan bir dosya mekanizmasının giriş ünitelerinden girilen bir bilgiyi diske kaydedilebilmesi için 3 aşama mevcuttur. Bunlar dosya açma, dosya fonksiyonlarını kullanma ve dosyayı kapatma işlemleridir.

Binary dosyalarda kayıt girişi yapabilmek için dosyanın “ab”, “a+b”, “wb”, “w+b”, “r+b” modlarından biri ile açılmış olması gerekmektedir.

Kayıt girişi yapabilmek için öncelikle kaydın nereye yazılacağı bilinmeli ve oraya konumlanılmalıdır. Konumlanma işlemi tamamlandıktan sonra yazma fonksiyonları kullanılarak kayıt dosyaya rahatlıkla yazılabilir.

5.3.Binary Dosyalarda Kayıt Arama:

Arama amacıyla kullanılan dosya mekanizması şu sırayı takip ederek veriyi arar ve bulur.

Yan Bellek à Ana Bellek à Çıkış Ünitesi

Dosyada aranılan kaydı bulmak için ya kayıt numarası girilir ya da dosya başından sonuna kadar bir döngü kurularak her kayda sıra ile bakılır ve ilgili kaydın olup olmamasına göre gerekli işlemler yapılır(Kara ve Kızıltuğ, 1995).

5.4.Binary Dosyalarda Kayıt Listeleme:

Yan Bellek à Ana Bellek à Çıkış

Dosya üzerinde işlem yapılırken yukarıda belirtilen sıra takip edilir. Önce dosya açılır sonra komutlar kullanılır ve işlem bitince dosya kapatılır(Kara ve Kızıltuğ, 1995).

Diğer dosya işlemlerinde yapıldığı gibi listelemede bir şarta bağlı olarak ya da bağlı olmaksızın iki şekilde örneklerle açıklanacaktır. Dosyanın başından sonuna kadar bir döngü kurularak sıra ile kayıtlar okunur ve istenilen şartı sağlayan kayıtlara ilişkin veriler ekrana ya da herhangi bir çıkış aygıtına yazılır.

5.5.Binary Dosyalarda Kayıt Düzeltme:

Yan Bellek à Ana Bellek à Çıkış

Binary dosyaların en büyük avantajı dosyaya rasgele erişim yapılabilmesidir. Hatırlanırsa text dosyalarda düzeltme işlemi için iki dosya kullanılması açıklanırken dosyaya rasgele erişim yapılamaması sebep gösterilmişti. Binary dosyalarda rasgele erişim imkanı olduğundan dolayı düzeltme işlemlerini tek dosya ile rahatlıkla yapmak mümkündür(Kara ve Kızıltuğ, 1995). Öncelikle düzeltilecek kayıt dosyada aranır ve bulunursa o kayda ilişkin bilgiler kullanıcıya iletilir. Daha sonra yeni, veriler girildikten sonra o kaydın bulunduğu alana konumlanılarak, eski kaydın üzerine düzeltilmiş bilgiler yazılır. Böylece text dosyalarda olduğu gibi ikinci bir dosya kullanmadan düzeltme işlemi gerçekleştirilmiş olur.

5.6.Binary Dosyalarda Kayıt Silme:

Yan Bellek à Ana Bellek à Çıkış

Binary dosyalarda kayıt silme işlemi sırasında yine text dosyalarda olduğu gibi iki farklı dosya kullanma zorunluluğumuz vardır. Ancak işlemler text dosyalara göre daha kısalmıştır. Binary dosyalarda silme işlemlerinin avantajı diğer tüm işlemlerde olduğu gibi kayıtlara rasgele erişim ile ulaşılabilmesidir(Kara ve Kızıltuğ, 1995). Ancak kullanıcının kaydın dosyada kaçıncı sırada kayıtlı olduğunu bilmediği durumlarda yine dosya başından sonuna kadar bir döngü kurulması gerekecektir. İki tür silmeden bahsedilebilir. Bunlardan ilki mantıksal silme işlemidir. Bu silme işleminde kayıt dosyadan atılmamakta sadece kaydın dolu olduğunu gösteren işreti değişmektedir. Böylelikle program kaydı silinmiş olarak görmektedir. Bu tür silmenin en büyük avantajı kayıt kurtarmaya olanak sağlamasıdır. Ancak büyük dosyalarda dosyanın gereksiz yere şişmesine sebebiyet verirler. Bunun önlemleri alınmalıdır. Yani kayıt girişi sırasında önce işareti değiştirilen kayıtlar aranmalı ve eğer varsa bunların üzerine yazılmalıdır. Bu tür silme işlemi ileride yeniden ihtiyaç duyulabilecek kayıtlara uygulanabilir.

İkinci tür silme işlemi ise kaydın dosyadan fiziksel olarak atıldığı fiziksel silme işlemidir. İki dosya kullanılarak gerçekleştirilir. Fiziksel olarak silinen bir kaydın kurtarılma olanağı yoktur. Kesinlikle ileride işe yaramayacağına karar verilen kayıtlara bu tür silme tekniği uygulanabilir.

5.7.Binary Dosyalarda Sıralama:

Binary dosyalarda rasgele erişim imkanı olmasından dolayı bu dosyalarda sıralama yaparken bu dosyaları bir dizi gibi kullanılabilir. Yani text dosyalarda yapıldığı gibi kayıtları dizilere aktarmadan işlemlerimizi rahatlıkla dosya üzerinde yapabiliriz. Bu dosyalarda sıralama işlemlerinde herhangi bir sıralama metodu kullanılabilir.

Not: Binary dosyalarda kullanılan fonksiyonlar ve yapılan işlemlere ilişkin çeşitli örnek Programlara EKLER kısmında yar verilmiştir.

6.YAZICI KULLANIMI:

C programlama dili dosya sisteminde, hem text hem de binary dosyalarda yazıcıyı aktif hale getirip kullanabilmek için FILE tipinde tanımlı dosya değişkeni yerine fprintf() fonksiyonu içerisinde “stdprn” ifadesi kullanılmalıdır(Çölkesen, 1999). Okunan ifadenin yazıcıya aktarılması konusunda text ve binary dosyalarda herhangi bir fark yoktur. Çünkü C çevre birimleri de birer dosya olarak kabul etmektedir. Bundan dolayı kayıtları yazıcıya aktarma işleminde dosya türü önem taşımamaktadır.

Örnek:

fprintf(stdprn, “%s %d %li”, kayit.isim, kayit.sicil_no, kayit.maas);

Açıklama:

Yukarıdaki program herhangi bir dosyadan okunmuş olan isim sicil numarası ve maaş bilgilerini yazıcıya aktarmaktadır.

Not: Yazıcı kullanımına ilişkin örnek programa EKLER kısmında yer verilmiştir.

7.ALT DÜZEY DOSYA YAPISI:

UNIX ve benzeri işletim sistemleri programcının bir kütüphane fonksiyonu gibi kullanabileceği bir takım hizmet alt programlarına sahiptir. Sistemde hizmetler bu alt programların çağrılmasıyla verilir. Bu alt bölümde aslında ANSI C’ nin standardı olmayan, sistem çağrısıyla kotarılan dosya yöntemi anlatılacaktır. Bu yöntem ANSI C standardında olmamasına karşın, çoğu C derleyicisinde standartmış gibi desteklenmektedir. UNIX ve benzerlerinin dışındaki işletim sistemleri (DOS,…) altında çalışan derleyicilerde, sistem çağrısıyla kotarılamadığından bu yöntem için kütüphane fonksiyonları hazırlanmıştır.

Alt düzey dosya yöntemi kullanıldığında dosya oluşturmak ve erişmek sistem çağrılarıyla gerçeklendiği için, kodu daha kısa ve hızlı olmaktadır. (Çölkesen, 1999)

Bu yöntemde programcının kendisi bir ara bellek(buffer, tampon) bildirmelidir. Dosyaya erişim ara belleğin yazılması veya okunması düzeyinde gerçeklenir. Üst düzey dosya yönteminden farklı olarak karakter düzeyinde erişim, formatlı erişim ve toplu erişim yoktur. Sadece katar düzeyinde erişim söz konusudur(Çölkesen, 1999).

Alt düzey dosya yapısı içerisinde kullanılan komutlar <io.h>, <fcnt.h>, <sys\stat.h> kütüphaneleri içerisinde tanımlanmıştır. Bu argümanların şartlı ön bildirileri için <sys\types.h> adlı kütüphane include edilmelidir. Düşük seviyeli fonksiyonları kullanan programların, farklı karakteristiklere sahip makinelerde çalışabilmesi için tekrar derlenmesi zorunludur.

7.1. Yöntem İçin Kullanılan Bazı Sistem Çağrıları:

·open(): Dosyayı değişik modlarla açmak için

·creat(): Dosyayı yeniden oluşturmak için

·close(): Dosyayı kapatmak için

·write(): Ara belleğin dosyaya yazılması için

·read(): Dosyadan okuyup ara belleğe yerleştirmek için

·lseek(): Verilere rastgele erişim için.

7.2.UNIX’te Dosya Paylaşım İzinleri:

UNIX’te dosyaya ilişlin 3 tür kullanıcı vardır. İlki dosyanın sahibi yani owner, ikincisi dosyayı oluşturanın dahil olduğu grup yani group ve son olarak ta bunların dışında kalanlar yani others. Bu 3 farklı çalışma grubunda bulunanlara dosya oluşturulurken değişik izinler verilir. Buna göre de o çalışma gruplarında bulunanlar dosyaya erişebilirler ya da erişemezler. Toplam 3 tür izin mevcuttur(Çölkesen, 1999). Dosya oluşturulurken ilk 3 izin dosya sahibine, ikinci 3 izin gruba, üçüncü 3 izin ise diğerlerine verilecek ya da verilmeyecek şekilde bir sınıflama yapılmıştır. Yani dosya izinleri aşağıdaki gibidir.

[IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image001.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image002.gif[/IMG][IMG]file:///C:/DOCUME%7E1/SA%28%5e_%5e%7E1/LOCALS%7E1/Temp/msohtml1/01/clip_image003.gif[/IMG]- – – – – – – – -

owner group others

Bu izinler 3 çeşittir. İlki r ile gösterilen okuma izni, ikincisi w ile gösterilen yazma izni, üçüncüsü x ile gösterilen çalıştırma iznidir.

Dosya Erişim İzinleri:

Sembolik İkili Tabanda Sekizli Tabanda Anlamı

r– 100 4 Sadece okunabilir

-w- 010 2 Sadece yazılabilir

–x 001 1 Sadece çalıştırılabilir

rw- 110 6 Okunabilir, yazılabilir

r-x 101 5 Okunabilir, Çalıştırılabilir

-wx 011 3 Yazılabilir, Çalıştırılabilir

rwx 111 7 Her şey yapılabilir

— 000 0 Hiçbir şey yapılamaz

Örnekler:

Sembolik Sekizli Tabanda Anlamı

rwx—— 0700 Kendisi her şey yapar, diğerleri hiçbir şey yapamaz

rw-r–r– 0644 Kendisi okur ve yazar diğerleri sadece okur

rwxrwxrwx 0777 Herkes her şey yapar

r–r–r– 0444 Herkes sadece okuyabilir

7.3. Dosyanın Açılması:

Bu yöntemde dosyanın açılması için open() veya creat() fonksiyonları kullanılır. Dosya ilk kez oluşturuluyorsa creat() veya uygun parametre verilerek open ile(); daha önce oluşturulmuş ise yalnız open() ile açılmalıdır(Çölkesen, 1999).

open(const char*yol, int erişim,[unsigned yetki]);

yol: dosyanın bulunduğu dizini ve ismini belirler

erişim: dosyanın kullanımı ile ilgili bir parametre

Buradaki erişim parametresinin Turbo C’ de tanımlanmış değerleri şu şekilde sınıflandırılabilir.

a.)Dosya Oluşturma Parametreleri:

— O_CREAT : Dosya mevcut değilse oluşturur, mevcut ise siler ve yeniden oluşturur.

— O_EXCL : O_CREAT ile kullanılır. Bu parametre ile kullanıldığında dosya mevcutsa fonksiyonun (-1) göndermesine sebep olur. –1 hatayı temsil eder.

— O_TRUNC : UNIX için anlamlıdır. DOS’ da dosya mevcut değilse O_CREAT etkisi yapar(Kara ve Kızıltuğ, 1995).

b.)Giriş/Çıkış Modu Parametreleri:

— O_RDONLY : dosyayı yalnızca okumak için açar.

— O_WRONLY : Dosyayı yalnızca yazmak amacıyla açar.

— O_APPEND : Dosyayı kayıt eklemek için açar.

— O_RDWR : Dosyayı hem okumak hem yazmak için açar.

— O_NDELAY : UNIX ve benzeri işletim sistemlerinde kullanılır. Eğer seçilmeze okuma için açılmak istenen dosyanın eşleniği olan dosya yazma modunda açılmamışsa, açılana kadar ilgili ,işlem askıya alınır. Seçilirse dosya açıldıktan sonra open() fonksiyonundan ivedi olarak dönülür; ilgili işlem askıya alınmaz.(Çölkesen, 1999).

c.)Dosya Tipi Parametreleri:

— O_TEXT : Dosyayı text modunda açar.

— O_BINARY : Dosyayı binary modunda açar(Kara ve Kızıltuğ, 1995).

Örnek:

dt=creat(“alt.dat”,0777);

Açıklama:

Alt.dat adlı dosya bütün kullanıcılara her türlü hak verilerek oluşturulmuştur.

Örnek:

dt= open(“alt.dat”,O_RDONLY);

Açıklama:

İlk parametre dosya adı olan “alt.dat”; ikincisi yalnız okuma için açılacağını gösteren moddur. Erişim izni verilmemiştir. Çünkü erişim izni dosya yeni oluşturulacaksa geçerlidir. Dosyanın okuma modunda açılabilmesi için diskte çalışılan alanda varolması gerekir; yoksa veya başka nedenlerle açılmazsa –1 sayısını döndürür(Çölkesen, 1999)

Örnek:

dt=open(“alt.dat”, O_WRONLY | O_CREAT | O_TRUNC, 0611);

Açıklama:

Yukarıdaki örnekte dosya varsa boyu sıfırlanarak; erişim izni değiştirilmeden açılır. Yoksa 0611 erişim izniyle yeniden oluşturulur.

7.4. Dosyanın Kapatılması:

Alt düzey dosya yöntemi fonksiyonlarıyla açılmış olan bir dosya close() fonksiyonu ile kapatılır(Çölkesen, 1999).

close(int handle);

7.5.Alt Düzey Dosya Sisteminde Kullanılan Fonksiyonlar:

7.5.1.chsize() Fonksiyonu:

Dosya hacminin kullanıcı tarafından ayarlanmasını sağlar.

chsize(int dosya, long buyukluk);

bu fonksiyon “dosya” ile belirtilen dosyanın boyutunu “buyukluk” kadar yapar. Eğer dosyanın boyutu “buyukluk” değerinden küçükse dosya sonuna eksik olan karakter sayısı kadar NULL değer atar. Dosyanın boyutu “buyukluk” değerinden daha büyükse dosya sonundaki karakterler atılır(Kara ve Kızıltuğ, 1995).

Örnek:

chsize(no, 50000);

Açıklama:

No ile belirtilen dosyanın boyutu kulla


Destekliyoruz arkada - arkadas - partner - partner - arkada - proxy - yemek tarifi - powermta - powermta administrator - Proxy