Amiga C

1. Bölüm

Erdem Taylan

Merhaba! Bana Amiga ve C dili hakkında bir yazı dizisi hazırlama görevi verildiğinde, önceleri bir türlü nereden başlayacağımı bilemedim. C, o kadar geniş ve etkili olanaklara sahip bir dil ki, onu böyle bir yazı dizisiyle anlatmanın mutlaka bir yerlerde eksikler bırakacağını düşünüyordum. Fakat sonra bu yazı dizisinin amacının sizi C ustası yapmak değil, size C'nin olanaklarını sunarak ve biraz da alıştırma yaptırarak gerisini sizin çalışmanıza bırakmak olduğunu düşündüm. Gerçekten de bir dergide C'yi herkesi usta yapacak kadar anlatmak seneler sürecek bir iş. Dolayısıyla kendime bazı hedefler saptadım ve bunları gözönüne alarak Amiga'nın başına geçip yazı dizisini yazmaya başladım. Şimdi size bu hedefleri, yazı dizisinde kullanılacak bazı sembolleri, gerekli olabilecek bazı kaynak kitapları ve yazı dizisinin iyice anlaşılması için bence önemli olan öğeleri açıklamak istiyorum:

Öncelikle bu dizinin amacı; size genel bir C bilgisi vermek, yani C'nin sunduğu olanakları size aktarmak, dilin komutları tanıtmak (aslında pek fazla değil ama!), onu diğer dillerden ayıran özellikler üzerinde durmak ve Amiga ile C birlikteliğinin sonuçlarını görmektir. Dili size anlatırken karşılaşılacak en önemli sorunların biri, dilin İngilizce terimler kullanması. Bundan dolayı ben terimleri size yazının içinde yeri geldikçe açıklamayı daha uygun buldum. Bu amaçla yazının tümünde kullanılacak olan bazı semboller var. Semboller şunlar:
1) Parantez içinde "İng:" Sembolü: Bu sembol "İng." yazısından sonra gelen sözcüğün parantezden önceki kelimenin programcılık dilindeki İngilizce karşılığı olduğunu gösterir. Örneğin "dizi (İng: array)" demek dizinin programcılık dilindeki İngilizce karşılığının "array" olduğunu gösterir.
2) Parantez içinde "Tk:" sembolü: Bu sembolde "Tk." yazısından sonra gelen sözcüğün parantezden önceki kelimenin Türkçe karşılığı olduğunu belirtir. Yani "array (Tk: dizi)" array'ın Türkçe karşılığının dizi olduğunu gösterir. Ayrıca bu İngilizce kelimelerin söyleniş tarzı için bir İngilizce sözlüğe bakılmasında da bence yarar var.

Gerekli olabilecek kaynak kitaplara gelince: C konusunda yazılmış bir çok kitap var. Fakat bunlardan en önemlisi dilin yaratcıları Dennis M.Richtie ve Brian M.Kernighan tarafından yazılmış olan "The C Programming Language" adlı kitap. Bu kitap C hakkındaki tüm bilgileri içermekte ve C'nin referans kitabı olarak tanımlanmakta. Yazı dizim de bu kitaba paralel olarak ilerleyeceğinden kitap oldukça önemli. Ayrıca yazı dizisindeki tüm programların yazıldığı "Aztec C V3.6" 'nın kullanıcı kitabının da sizin için yararlı olacağını söylemeliyim. Yine "Aztec C" ile ilgili bir program olan ve programlarınızdaki hataları bulmaya yarayan "Aztec C Source Level Debugger" 'ın kullanıcı kitabı da oldukça önemli. Öyleyse gerekli olabilecek üç kaynak var:
1) The C Programming Language
2) Aztec C Reference Manual
3) Aztec C Source Level Debugger Reference Manual

Yukarıda da belirttiğim gibi yazı dizisindeki program örnekleri "Aztec C" için verileceğinden, önce gidip almanız gereken birkaç program var. Bunlar:
1) Aztec C V3.6
2) Aztec C Source Level Debugger
3) Power Windows

Bunlardan sonuncusu Amiga'daki C kullanımına yönelik bir program. Power Windows'un yardımıyla pencere, menü gibi program elemanlarının oldukça uzun olabilen geliştirme zamanı önemli ölçüde kısaltılabilmekte.

Son olarak yazının genel karakteri hakkında birkaç şey söylemek istiyorum:

Yazı dizimizi okurken gözönünde bulundurulması gereken önemli bir konu var. Bu da dizinin genel bir programlama bilgisine sahip olunduğunu kabul etmesi. Dolayısıyla en azından BASIC'in iyi bilinmesi çok önemli. Kısaca bence C ilk öğrendiğiniz dil olmamalı. Bu hem öğrenme zamanınızı uzatır, hem de dilden soğumanıza neden olabilir. Ayrıca CLI bilginizin iyi olması da önemli bir faktör. Yazının gelişme aşamaları ise şöyle olacak:
1) Amiga programcılığı hakkında birkaç söz,
2) C'nin genel özellikleri ve tarihçesi,
3) "Aztec C" ile ilgili bilgiler,
4) C dünyasının içine giriş,
5) C
6) Amiga ile C uygulamaları.

Evet. Böylece yazı dizimiz başlama aşamasına geldi. Şimdi isterseniz yukarıda belirttiğim sıraya göre ilerleyelim:

Amiga programcılığı denince akla hemen bir çok programlama dili geliyor. Örneğin BASIC, PASCAL, FORTH, C, FORTRAN, MODULA 2, LISP gibi. Doğal olarak ilk program yapma deneyimleri genelde bilgisayarın yanında standart olarak verilen Amiga-BASIC ile elde ediliyor. Bu BASIC öncelerine göre oldukça hızlı ve kaliteli. Fakat belirli bir zaman sonra BASIC'in yetersiz kaldığı alanların varlığı ortaya çıkıyor ve programcılar başka seçeneklere yöneliyorlar. Bu yetersizliklerin en önemlileri arasında; dilin Amiga'nın tüm olanaklarından etkin bir biçimde yararlanmaması, hızının yavaş olması, bazı komutların aksaklıkları, az komut sayısı ve modüler programlamanın pek kolay olmayışı sayılabilir. İşte programcıların yöneldiği seçeneklerin en güçlülerinden biri yazı dizimizin konusu C.

C Amiga programcılığında en çok kullanılan birkaç dilden biri. Özellikle büyük boyutlu ve genel amaçlı programlarda sıkça kullanılan bir dil. Acaba programcıları C'ye iten ne? İsterseniz bu soruyu C'nin genel özelliklerini görerek açıklayalım:

NEDİR BU C?

C genel amaçlı bir programlama dilidir. Yani özel bir uygulama için düzenlenmemiştir (örneğin mühendislik uygulamaları için düzenlenen Fortran veya ticari uygulamalar için hazırlanan Cobol gibi değildir). C'nin bize sundukları arasında modern program akışı, veri structure'ları (Tk. yapı, düzen), zengin işlem seti sayılabilir. C pek de yüksek seviyeli bir dil değildir. Burada yüksek seviyeli dil ile anlatılmak islenen şudur; Eğer bir dil kullanıcının hemen anlayabileceği veya işlevini tahmin edebileceği bir komut dizini kullanıyorsa yüksek seviyeli bir dil (Örneğin BASIC gibi. PRINT diye bir komut gördüğünüzde bunun yazma işi ile ilgili bir kavram olduğunu veya INPUT diye bir komut gördüğünüzde bunun veri girişiyle ilgili bir kavram olduğunu tahmin edebilirsiniz), aksi halde ise düşük seviyeli (Örneğin assembler gibi. Dcb diye bir komut gördüğünüzde bunun bir byte uzunluğunda sabit tanımla demek olduğunu herhalde anlamadınız!) bir dildir. C için orta seviyeli bir dil demek en doğrusu olacaktır. Çünkü C her iki tür dil sınıfının -yüksek ve düşük- özelliklerine sahiptir. C dili ilk olarak UNIX (Mini ve yeni mikro bilgisayarlar dünyasında oldukça yaygın bir işletim sistemi) işletim sistemi için sistemin makinadan makinaya aktarılması sırasında çıkan sorunların üstesinden gelmek için Dennis Ritchie tarafından yazılmıştır. Daha sonra da UNIX'in yazımı için kullanılmıştır. Böylece yaratılan C'nin esnekliği onu hiçbir makineye bağlı yapmamış bu da dilin makinadan makinaya uyarlanmasında büyük kolaylıklar sağlamıştır. C'nin uyumluluğu, yani bir makinede yazılan programın diğer bir makinede çalışması olanağı oldukça fazladır. Kısaca eğer kullandığınız makinaya ait ve başka makinalarda bulunmayan bir özelliği kullanmadıkça yazdığınız program başka bir makinada çalışacaktır. Bundan dolayıdır ki C genellikle sistem programlama dili olarak anılır. Fakat dil hemen hemen tüm uygulamalarda kullanılabilir.

Şimdi de C hakkında biraz tarihsel ve teknik bilgi:

C'nin kullandığı yöntemlerin en önemlilerinin çoğu kıyasla eski fakat hâlâ daha sıkça kullanılan bir dil olan BCPL'den alınmıştır (AmigaDOS bu dil ile yazılmıştır). BCPL'nin C üzerindeki etkisi dolaylı olarak başka bir dil olan B'den gelmektedir. Bu dil ise yine UNIX için Ken Thompson tarafından 1970 yılında hazırlanmıştır. C'deki ana veri tipleri: Karakterler (char), tam sayılar (int), kayan noktalı sayılardır (virgüllü sayılar da denir, C'deki kısaltması float- Ayrıca bunların düzenlenmesiyle elde edilmiş pointer (Tk: işaretçi), diziler (İng: arrays), structure'lar (Tk: yapı, düzen), union'lar (Tk. birleşmiş, birleştirilmiş veri yapılarıyla oluşan tipin C'de ki adıdır), ve fonksiyonlardır (İng: function).

C iyi düzenlenmiş yapısal programlar için gerekli olan akış-kontrol elemanları da sunmaktadır. Bunlar arasında: karar testleri (if), çıkış testi başlangıçta olan döngüler (while, for), çıkış testi sonda olan döngüler (do) ve çeşitli olasılıklardan bir tanesini seçme (switch) bulunmaktadır.

C genelde assembler'larda bulunan adres aritmetiği ve pointer'ları da içerir. Fonksiyonlara geçirilen değişkenler sadece değerleri kopyalanarak işleme sokulurlar. Dolayısıyla bir fonksiyon çağırılırken kendisine geçirilen değişkenlerin değerlerini etkileyemez. Eğer bu isteniyorsa o değişkene bir pointer tanımlanır ve fonksiyona bu pointer geçirilir. Böylece fonksiyon o pointer'ın işaret ettiği adrese giderek değişkeni modifiye edebilir. Bu arada farklı olarak diziler fonksiyonlara geçirilirken değer olarak değil, adres olarak geçirildiğinden onlar için yukarıda anlatılanlar geçerli değildir. C'de fonksiyonların ayrı bir önemi vardır. Çünkü her işlem fonksiyonlara bölünerek programlanmaktadır. İsterseniz tek bir fonksiyon içinde aynen BASIC'te olduğu gibi her şeyi programlayabilirsiniz ama bu C'ye ve onun olanaklarına kötülük etmekten başka bir ise yaramaz. Herhangi bir fonksiyon kendi kendini çağırabilir (İng: recursion). Fonksiyonların içinde tanımlanan değişkenler otomatiktir, yani fonksiyon işlemini bitirdiğinde otomatik olarak bellekten silinirler. Değişkenler bir fonksiyona ait veya bütün fonksiyonların kullanabileceği şekilde (İng: global) olabilir.

Evet C üzerine bu kadar sözden sonra biraz da Amiga ve C hakkında konuşalım:

AMIGA ve C

Amiga gibi işletim sistemi DOS'u hariç tamamen C'de yazılmış bir makina'da C'yi kullanmanın ayrı bir zevki olduğu şüphesiz. Bugün Amiga'da C dilinde program yazmak isterseniz, kullanabileceğiniz iki ticari program var. Biri Manx firmasının Aztec C V5.6'sı, diğeri de Lattice firmasının Lattice C V5.0'ı. Her ne kadar Aztec C'nin 5.0 versiyonu çıkmış olsa da, o şu anda Türkiye'ye ulaşmadı. İki programın sunduğu olanaklar birbirine yakın ama biz Aztec C V3.6'yi kullanıyoruz. Çünkü bu programda hazırlanan C programları biraz daha hızlı çalışıyor, ayrıca programın kodunun uzunluğu önemli miktarda az oluyor. Yine Aztec C teknik olarak da bazı üstünlüklere sahip. Örneğin uzun programları yazarken oldukça gerekli olan birçok bellek düzenleme yöntemi sunuyor. Ayrıca Source Level Debugger (Tk: Program Düzeyli Hata Düzeltici) adlı programlarınızın hatalarını bulmayı oldukça kolaylaştıran bir yardımcı program da var. Kısaca biz bu yazı dizimizdeki tüm örnek programları Aztec C'de hazırladığımız şekliyle sunacağız ve size de onu kullanmanızı öneriyoruz. Bu arada her iki programın da compiler (derleyici) olduğunu belirtelim. Yani BASIC'te (BASIC bir interpreter -yorumlayıcı- dır) olduğu gibi programınız her seferinde çalışmak için önce C'nin yüklenmesine ihtiyaç duymayacaktır. Kısaca C'de program bir kere makinanın anlayacağı şekle sokulduktan sonra (değerlendikten sonra) kendi başına çalışabilir. Oysa BASIC'te programınız her seferinde yeniden makinanın anlayacağı dile çevrilir. Dolayısıyla derleyicilerden alınan sonuçlar çok daha hızlı ve daha az bellek gerektiren şekilde olurlar. Gerçi derleme işlemi yorumlayıcılara kıyasla uzun sürse de sonuçlar çok daha etkileyicidir.

Aztec C'de derlemenin nasıl yapıldığına geçmeden önce aletinizi çalıştırın ve bir numaralı kutuda yazılan adımları uygulayın. Bu sayede Aztec C'nin yaptığı ara işlemler Ram Disk'te gerçekleşir ve böylece işlemler oldukça hızlanmış olur. Ayrıca disketleriniz de üzerine devamlı yazılıp silinmeden kurtulur.

Şimdi de Aztec C'de derlemenin nasıl yapıldığı ve program yazma adımlarının, neler olduğuna değinelim:

AZTEC C

Aztec C tamamen CLI'dan çalışmaktadır. Yani program her biri CLI'dan adı yazılarak aktif duruma geçirilen modüllerden olmuştur. Bu arada CLI bilginizin iyi olması programla çalışmayı kolaylaştıracaktır. Şimdi sırayla programın modüllerini tanıyalım:

1) cc: Bu komut herhangi bir editörde (Örneğin c directory'sindeki ed gibi) yazdığınız programı obje file haline sokar. Yani programınız link (açıklaması ileride) edildikten sonra eğer hatası yoksa kullanıma hazır hale gelir. Bu komut hazırladığınız program üzerinde birçok işlem yaptıktan sonra programınızın assembler listesini çıkarır ve otomatik olarak as (assembler) adlı başka bir komutu çağırır. Komutun bir çok seçeneği vardır. Bunlardan önemli bazıları ve komutun formatı şöyledir:
a) Komutun formatı: cc [-seçenekler] dosyaismi. c
b) -A seçeneği: Derleme işlemi bitince otomatikman assembler'ı başlatmaz. Böylece programınızın assembler listesini alabilirsiniz. Bu listeyi dosyaismi.asm dosyasına bakarak bulabilirsiniz.
c) -S seçeneği: Bu seçenek derleme işlemi sırasında ortaya çıkan uyarı mesajlarını ekrana yazma demektir.
d) -N seçeneği: Bu seçenek'te Program Düzeyli Hata Düzelticisi için gerekli dosyanın hazırlık işlemlerini yap demektir.

2) as (assemble): Bu komut aslında cc adlı komut tarafından otomatik olarak çağırılır. Görevi cc'nin oluşturduğu assembler listesini obje dosyası haline getirmektir. Fakat eğer C'den ayrı olarak assembler'da bir program yaparsanız, sadece bu komutu yazarak onu obje dosyası haline getirebilirsiniz. Bu komutun oluşturduğu obje dosyasını çalışır hale getirmek için In(link) komutunu kullanmalısınız. Komutun formatı şöyledir:

as {-seçenekler} dosyaismi
Komutun seçeneklerini Aztec C'nin kitabında ayrıntılı olarak bulabilirsiniz.

3) ln (link): Bu komut cc ve daha sonra onun çağırdığı as komutlarından hazırladığı obje dosyasını alır ve programınızda kullandığınız, sizin tanımlamadığınız fonksiyonları, ki bunlar ya Amiga'nın ROM'unda, ya da Aztec C'nin size sunduğu fonksiyon kütüphanelerinde bulunur, bulup programınıza ekler ve programınızı çalışır hale getirir. Eğer bu işlem sırasında ne sizin, ne de fonksiyon, ama programda adı geçen bir fonksiyona rastlarsa, bunu size bildirir ve hata vererek işlemi keser. Bu komutun da bir çok seçeneği vardır. Komutun formatı ve bu seçeneklerden önemli olanları şunlardır:
a) Komutun Formatı: ln [-seçenekler] dosyaismi1.o {dosyaismi2.o...} {kütüphaneadı1. kütüphaneadı2...}
b) -L (kütüphaneadı) seçeneği: Bu seçenekte kütüphane adı yerine yazılan dosya, programda kullanılan fonksiyonlardan tanımlamadıklarınız için incelenir. Bulunanlar programa eklenir. Bu seçenek birkaç kütüphane için ardarda birkaç defa kullanılabilir. Örneğin ln dosyaismi.o -lc32 -lm32 demek obje dosyası dosyaismi.O'yi c32 ve m32 kütüphaneleri ile link (Tk: bağla) et demektir.
c) -O seçeneği: Bu seçenek cc komutunun -M seçeneği ile hazırladığı Program Düzeyli Hata Düzelticisi için olan dosyayı tamamlar ve buna dosyaismi.dbg adım verir. Artık bu dosya Program Düzeyli Hata Düzelticisine yüklenerek varsa hataların nedenleri kolayca bulunabilir.

Şimdi tüm modüllerin birlikte çalışması üzerine bir örnek görelim (bu C'de yazıp derlediğiniz ilk program olacak!):

Önce, ikinci kutuda yazılan adımları sırasıyla uygulayın. Sonra eğer CLI'da "hello" yazarsanız makinanın size "Merhaba Dunya" diye karşılık verdiğini görürsünüz. Böylece de C'de ilk programınızı yapmış olursunuz. Bu programın neden bu şekilde yazıldığını bir dahaki yazımızda ayrıntılı olarak inceleyeceğiz. Programın bu aşamada kullanılmasının amacı Aztec C modüllerinin nasıl çalıştığının daha iyi anlaşılmasıydı.

Şimdi eğer üçüncü kutudaki adımları uygularsanız, bu sefer Aztec C'nin Source Level Debugger'da kullanmak için hello.dbg adlı bir dosya ürettiğini görürsünüz. Eğer şimdi de dördüncü kutuyu uygularsanız, programınızın Source Level Debugger'da sizin yazdığınız haliyle, yani program düzeyinde yüklendiğini görürsünüz. Source Level Debugger'da "s" yazarsanız programınızın bir adım ilerlediğini görürsünüz. Source Level Debugger'dan çıkmak için ise "q" yazın. Evet bu aylık bu kadar yeter sanırım, gelecek ay birkaç program yazacağımızı belirterek C dünyasına hoş geldiniz diyorum.


KUTU 1

1) Bilgisayarınızı açın,
2) Aztec C'nin birinci disketini takın,
3) Bilgisayar işini bitirdikten sonra (yeşil ışık söndükten sonra),
   "ed df0:s/startup-sequence" yazın,
4) Dosyanın içinde "df0:BIN/set CCTEMP=sys: " yazılı yeri bulun
   (dosyanın sonlarına yakın bir yerde),
5) Bu satırı "df0:BIN/set CCTEMP=ram: " olarak değiştirin,
6) Böylece CC'nin yaptığı ara işlemlerin Ram Disk'te yapılmasını,
   dolayısıyla da çok daha hızlı olmasını sağlarsınız,
7) Ayrıca, eğer derleyeceğiniz dosyayı da Ram Disk'le açarsanız
   işlemler daha da hızlanır. 

KUTU 2

1) Bilgisayarı açın.
2) Aztec C'nin birinci disketini takın,
3) Bilgisayar işini bitirdikten ve yeşil ışık söndükten sonra
   "copy * ram:hello.c" yazın,
4) Daha sonra aşağıdaki kısa programı girin: 

main( )
{
printf("Merhaba Dünya!\n");
}

5) Yazmayı bitirdikten sonra CTRL (control) tuşunu basılı
   tutarken "\" tuşuna basın,
6) Şimdi "cc ram:hello.c" yazın,
7) Daha sonra "ln ram:hello.o -lc" yazın,
8) Artık "ram:hello" yazarak programınızı çalıştırabilirsiniz.

KUTU 3

1) Bilgisayarı açın.
2) Aztec C'nin birinci disketini takın.
3) Bilgisayar işini bitirdikten ve yeşil ışık söndükten sonra
   "copy * ram:hello.c" yazın,
4) Daha sonra aşağıdaki kısa programı girin: 

main( )
{
printf("Merhaba Dünya!\n");
}

5) Yazmayı bitirdikten sonra CTRL (control) tuşunu basılı tutarken
   "\" tuşuna basın.
6) Şimdi "cc -n ram:hello.c" yazın,
7) Daha sonra "ln -g ram:hello.o -lc" yazın,
8) Eğer "dir ram:" yazarsanız hello.dbg adlı bir dosya görürsünüz,
9) Artık "ram:hello" yazarak programınızı çalıştırabilirsiniz.

KUTU 4

1) Aztec C disketini çıkarın,
2] Source Level Debugger disketini takın,
3) "df0:sdb ram:hello" yazın,
4) Programınızın Sdb'de yüklendiğini göreceksiniz.
5) "s" yazarak programda o anki ışıklandırılmış satırı çalıştırabilirsiniz, 
6) "q" yazarak sdb'den çıkabilir,
7) "lb" yazarak programı yeniden yükleyebilir,
8) "?" yazarak sdb'de kullanılan komutları görebilirsiniz.