[Makale] C’nin Standart Dosya Fonksiyonlarının Uyguladığı Tamponlama Mekanizması
Standart C fonksiyonlarını kullanmadan bir dosyanın her byte’ı üzerinde sırasıyla işlem yapmak isteyelim. Herhalde ilk akla gelecek yöntem doğrudan işletim sisteminin sistem fonksiyonlarını çağırmak olacaktır. Örneğin UNIX/Linux sistemlerinde dosyayı read fonksiyonuyla (Windows sistemlerinde ReadFile fonksiyonuyla) byte byte aşağıdaki gibi okuyabiliriz:
int fd;
ssize_t result;
unsigned char ch;
if ((fd = open("test", O_RDONLY)) < 0) {
perror("open");
exit(EXIT_FAILURE);
}
while ((result = read(fd, &ch, 1)) > 0) {
/* Okunan byte işleniyor */
}
if (result < 0) {
perror("read");
exit(EXIT_FAILURE);
}
close(fd);
[Makale] Programların Komut Satırı Argümanları
İşletim sistemi tarafından prosese geçirilen komut satırı argümanları program içerisinden çeşitli biçimlerde elde edilebilmektedir. En yaygın yöntem komut satırı argümanlarının programın başlangıç fonksiyonunun parametrelerinden elde edilmesidir. Örneğin, C ve C++’ta komut satırı argümanları main fonksiyonuna parametre olarak geçirilirler. Bu dillerin standartlarına göre programın başlangıç noktasını (entry point) belirten main fonksiyonunun parametrik yapısı ve geri dönüş değeri aşağıdaki iki durumdan biri biçiminde olmalıdır:
int main(void) { /* ... */ }
int main(int argc, char *argv[]) { /* ... */ }
[Makale] UNIX/Linux ve Windows Sistemlerinde Stdin, Stdout ve Stderr Dosyaları
Yalnızca UNIX/Linux sistemlerinde değil modern işletim sistemlerinin çoğunda aygıtlar birer dosyaymış gibi ele alınmaktadır. Örneğin klavye ve ekran -aslında birer dosya olmadığı halde- işletim sistemi tarafından sanki birer dosyaymış gibi işleme sokulurlar. Aygıtlara ilişkin bu tür dosyalar için de birer dosya betimleyicisi ve dosya nesnesi vardır. Bu betimleyicilerle işlem yapıldığında işletim sisteminin dosya alt sistemi aslında bu dosyaların birer aygıta ilişkin olduğunu anlar ve okuma/yazma amacıyla o aygıtlara yönelir. UNIX türevi sistemlerdeki çokbiçimliliği (polymophism) andıran bu tasarıma Sanal Dosya Sistemi (Virtual File System) denilmektedir.
[Blog] C#'taki Yapı ve Sınıf Nesneleri Nerede Yaratılıyor?
Pek çok C# programcısının sınıf ve yapı kavramlarıyla stack ve heap kavramlarını yanlış bir biçimde ilişkilendirdiğini görüyorum. Örneğin, “yapı nesneleri stack’te sınıf nesneleri heap’te tutulur” biçiminde yanlış anlaşılmaya yol açacak bilgiler veren yerli ve yabancı çok sayıda yazı ve makaleyle karşılaştım. Konuya biraz açıklık getirmek istiyorum.
[Makale] UNIX/Linux Sistemlerinde Dosya Betimleyicilerinin Anlamı
UNIX/Linux sistemlerinde her prosesin proses tablosu yoluyla erişilen bir dosya betimleyici tablosu (file descriptor table) vardır. Dosya betimleyici tablosu bir gösterici dizisi biçimindedir. Betimleyci tablo içersindeki her gösterici açılmış bir dosyanın bilgilerinin tutulduğu ve ismine dosya nesnesi (file object) denilen bir veri yapısını gösterir. open fonksiyonundan elde edilen dosya betimleyicisi (file descriptor) prosesin dosya betimleyici tablosunda bir indeks belirtmektedir.
[Makale] Proseslerin Çevre Değişkenleri
Modern işletim sistemlerinde her prosesin bir çevre değişken bloğu vardır. Prosesin çevre değişken bloğu çevre değişkenlerinden ve onların değerlerinden oluşmaktadır. Örneğin, MESAJ bir çevre değişkeninin ismi olabilir, “Merhaba Dunya” ise onun değeri olabilir. Çevre değişkenleri pek çok işletim sisteminde proses yaratılırken belirlenebilmekte ya da üst prosesten (parent process) aktarılabilmektedir. Çevre değişkenlerinin üst prosesten aktarılması en çok karşılaşılan tipik durumdur.
Bir nesne ya da olgunun bütün içerisindeki yerinin belirlenmesi ve diğer nesne ya da olgularla ilişkilerinin betimlenmesi sürecine kategorizasyon deniyor. Kategorizasyonun sentezlemeyi artırarak öğrenmeye katkıda bulunduğunu söyleyebiliriz. Sentezleme süreci de anlamsal bellek (semantic memory) içeriğindeki ilişkileri sağlamlaştırıyor olabilir.
İngilizce'de categorization, taxonomy ve classification terimleri birbirleri yerine kullanılabiliyor olsa da bunların etimolojileri ve kavramsal vurgulamaları arasında bazı farklılıklar göze çarpıyor. Örneğin taxonomy terimi daha çok (etimolojisi biyoloji ile ilgili) nesneleri ve olguları altlık üstlük ilişkisi içerisinde sınıflandırmak için kullanılırken, categorization daha genel sınıflandırmalar için kullanılan bir terim. Yani taxonomy bir ağaç yapısını çağrıştırırken categorization bir graf yapısını çağrıştırıyor. Classification teriminin ise daha genel anlamda kullanıldığını görüyoruz. Fakat ne olursa olsun bu üç terimin aralarındaki farklar çok belirgin değil ve bu terimler birbirlerinin yerine kullanılabiliyor.
Bir konu hangi konunun içindedir? O konunun alt konuları nelerdir? Diğer yakın konularla ilişkileri nasıldır?.. Kategorizasyon bu sorulara yanıt oluşturuyor. Örneğin:
- C nedir?
- Bir programlama dilidir.
- Programlama dili nedir?
- Bir bilgisayar dilidir.
- Bilgisayar dili nedir?
- Kurgusal bir dildir.
- Kurgusal dil nedir?
....
Pekiyi C yalnızca bir programlama dili midir?..
Ben bu yazıda bilgisayar bilimleri için çokça karşılaşılan iki kategorizasyon sisteminden bahsedeceğim. Birincisi ACM’nin (Association for Computing Machinery) sistemi. ACM bilimsel makaleleri bu sisteme göre sınıflandırıyor. (Ben de ACM üyesi olarak ACM’in dijital kütüphanesinden ve buradaki makalelerden uzunca bir süredir faydalanıyorum: www.acm.org) Diğeri ise Wikipedia’nın kullandığı sistem. Wikipedia oldukça zengin bir ansiklopedik kaynak. Günbegün daha da zenginleşiyor.[1]
ACM kategorizasyon sistemi 4 düzeyli (yani yüksekliği 4 olan) bir ağaç yapısı biçiminde. ACM bu ağaç yapısını birkaç kez yeniledi. Ağacın son uyarlaması 98 yılında yapıldı (http://www.acm.org/about/class/). ACM sınıflama ağacının ilk üç düzeyi kodlanmış elemanlardan, son düzeyi ise kodlanmamış elemanlardan oluşuyor. İlk düzeydeki elemanlar harflerle temsil edilmiş. Aşağıda ilk düzey elemanları görüyorsunuz:
A. General Literature
B. Hardware
C. Computer Systems Organization
D. Software
E. Data
F. Theory of Computation
G. Mathematics of Computing
H. Information Systems
I. Computing Methodologies
J. Computer Applications
K. Computing Milieux
İkinci düzey elemanlar numara içeriyor. Örneğin, "D (Software)" düğümünün alt düğümleri şöyle:
D. Software
D.0 GENERAL
D.1 PROGRAMMING TECHNIQUES
D.2 SOFTWARE ENGINEERING
D.3 PROGRAMMING LANGUAGES
D.4 OPERATING SYSTEMS
D.m MISCELLANEOUS
İlk düzey dışındaki her düzeyin sonunda “m" kodlu bir "Miscellaneous” bölümü bulunuyor. Diğer konuların içerisine girmeyen konular bu bölüme yerleştiriliyor. Üçüncü düzey de yine numara içeren elemanlardan oluşmakta. Örneğin, "D.3 PROGRAMMING LANGUAGES" düğümünün üçüncü düzey alt düğümleri şöyle:
D. Software
D.3 PROGRAMMING LANGUAGES
D.3.0 General
D.3.1 Formal Definitions and Theory
D.3.2 Language Classifications
D.3.3 Language Constructs and Features
D.3.4 Processors
D.3.m Miscellaneous
Ağacın dördüncü düzey elemanları kodlanmamış biçimde bulunuyor. Bu düzeydeki elemanlara “Implicit Subject Descriptors” ya da “Proper Noun Subject Descriptors” deniyor ve bu elemanların güncellemesi sıkça yapılıyor. Örneğin, “D.3.2 Language Classifications” düğümünün kodlanmamış elemanlarının bir bölümü şöyle:
D. Software
D.3 PROGRAMMING LANGUAGES
D.3.0 General
D.3.1 Formal Definitions and Theory
D.3.2 Language Classifications
...
BRL
Bertrand
Borland C++
C
C#
C++
CADLAN
CDL*
CHILL
CIL
CIP
CLEAR
CLIST
CLIX
CLOS
...
Bu durumda “C Programlama Dili”nin kategorizasyonu ACM’in sistemine göre aşağıdaki gibidir:
D. Software
D.3 PROGRAMMING LANGUAGES
D.3.2 Language Classifications
C
Şimdi gelelim Wikipedia’ya. Wikipedia’nın kategorizasyon sistemi yönlü (directed) ve döngüsellik içerebilen bir graf (cyclic graph) biçiminde. Graf kategorilerden ve makalelerden oluşuyor. Bir kategorinin birden fazla üst kategorisi (parent category) olabiliyor. Başka bir deyişle bir kategori birden fazla kategorinin içerisinde bulunabiliyor. Makaleler (ya da Wikipedia terimiyle sayfalar) ise kategorilerin içerisinde. Ayrıca, makalelerin de tek bir kategori içerisinde bulunması zorunlu değil. Bir makale birden fazla kategori içerisinde bulunabiliyor. O halde şöyle özetleyebiliriz: Wikipedia’da bir makale bir ya da birden fazla kategori içerisindedir. O makalenin içinde bulunduğu kategoriler de bir ya da birden fazla kategori içerisinde bulunabilirler. Örneğin Wikipedia kategori grafının "C Programlama Dili" ile ilgili bölümü şöyle:
Algısal karmaşıklığı engellemek için grafın büyük kısmını kırptım. Gördüğünüz gibi "C Programalama Dili" kategorisi hem "C Programlama Dili Ailesi" hem de "Sistem Programlama Dilleri" kategorilerinde bulunuyor. Grafın şu kısmına dikkat ediniz:
Languages
Constructed languages
Computer languages
Programming languages
Procedural programming languages
C programming language
Wikipedia’da bir makaleyi açtığınızda o makalenin hangi kategoriler içerisinde bulunduğu sayfanın en altında veriliyor. Ayrıca belli bir kategorideki alt kategorilerin ve makalelerin listesi de yardımcı yazılımlarla elde edilebiliyor. Örneğin, Wikipedia’daki makale ve kategorilerin graflarını http://toolserver.org/~dapete/catgraph/ sitesinden faydalanarak çizdirebilirsiniz. Ben de yukarıdaki grafı bu siteyi kullanarak oluşturdum.
[1] Wikipedia'nın akademik bir kaynak olarak kullanılamayacağını belirtmeliyim. Bunun pek çok nedeni var. Fakat burada ben bunlardan söz etmeyeceğim.
CSD C ve Sistem Programcıları Derneği