|
|
#1 (permalink) | |||||||||||
|
1 . BÖLÜM : PROGRAMLAMA VE C
Yazılım Nedir Yazılım (software) programlama ve programlamayla ilgili konuların geneline verilen isimdir. Yazılım denince ilk olarak aklımıza programlama dilleri, bu diller kullanılarak yazılmış kaynak programlar ve çeşitli amaçlar için oluşturulmuş dosyalar gelir. Donanım Nedir Donanım (hardware) : Bilgisayarın elektronik kısmı, yapısına verilen isimdir. Yazılımın Sınıflandırılması Yazılımı uygulama alanlarına göre 5 gruba ayırabiliriz : 1. Bilimsel ve mühendislik yazılımları (scientific & engineering software). Bilimsel ve mühendislik konularındaki problemlerin çözülmesinde kullanılan programlardır. Bu tür programlarda veri miktarı göreli olarak düşüktür ancak matematiksel ve istatistiksel algoritmalar yoğun olarak kullanılabilir.Tamamen hesaplama ağırlıklı işlemler içerir. Bu tür programlar ağırlıklı olarak bilgisayarın Merkezi İşlem Birimini (CPU) kullanırlar. Elektronik devrelerin çözümünü yapan programları, istatistik analiz paketlerini bu tür programlara örnek olarak verebiliriz. 2. Mesleki yazılımlar (Business software). Veri tabanı ağırlıklı yazılımlardır. Genel olarak verilerin yaratılması, işlenmesi ve dosyalarda saklanması ile ilgilidir. Bu tür programlara örnek olarak stok kontrol programları, müşteri takip programları, muhasebe programlarını verebiliriz. 3. Yapay zeka yazılımları (artificial intelligence software). İnsan davranışlarını taklit etmeyi amaçlayan yazılımlardır. Örnek olarak robot yazılımları, satranç ya da briç oynatan programlar vs. verilebilir. 4. Görüntüsel yazılımlar. Görüntüsel işlemlerin ve algoritmaların çok yoğun olarak kullanıldığı programlardır. Örnek olarak oyun ve animasyon yazılımlarını verebiliriz. Bu yazılımlar ağırlıklı olarak bilgisayarın grafik arabirimini kullanırlar. 5. Sistem yazılımları (system software): Bilgisayarın elektronik yapısını yöneten yazılımlardır. Derleyiciler, haberleşme programları, işletim sistemi birer sistem yazılımıdır. Örneğin text editörü de bir sistem yazılımıdır. Uygulama programlarına göre daha düşük seviyeli işlem yaparlar. Programlama Dillerinin Sınıflandırılması Programlama dillerini çeşitli açılardan sınıflandırabiliriz. En sık kullanılan sınıflandırmalar: 1. Seviyelerine göre sınıflandırma. 2. Uygulama alanlarına göre sınıflandırma. Bilgisayar Dillerinin Seviyelerine Göre Sınıflandırması ve Seviyelerine Göre Bilgisayar Dillerinin Gelişimi Bir programlama dilinin seviyesi deyince o programlama dilinin insan algısına olan yakınlığının derecesini anlıyoruz. Bir programlama dili insan algılasına ne kadar yakınsa o kadar yüksek seviyeli demektir (high level). Yine bir programlama dili bilgisayarın elektronik yapısına ve çalışma biçimine ne kadar yakınsa o kadar düşük seviyeli (low level) demektir. Yüksek seviyeli dillerle çalışmak programcı açısından kolaydır. Algoritma yoktur. Bu dillerde yalnızca nelerin yapılacağı programa bildirilir ama nasıl yapılacağı bildirilmez. Genel olarak programlama dilinin seviyesi yükseldikçe , o dilin öğrenilmesi ve o dilde program yazılması kolaylaşır. Bir bilgisayar yalnızca kendi makine dilini doğrudan anlayabilir. Makine dili bilgisayarın doğal dilidir ve bilgisayarın donanımsal tasarımına bağlıdır. Bilgisayarların geliştirilmesiyle birlikte onlara iş yaptırmak için kullanılan ilk diller de makine dilleri olmuştur. Bu yüzden makine dillerine 1. kuşak diller de diyebiliriz. Makine dilinin programlarda kullanılmasında karşılaşılan iki temel problem vardır. Makine dilinde yazılan kodlar doğrudan makinanın işlemcisine, donanım parçalarına verilen komutlardır. Değişik bir CPU kullanıldığında ya da bellek organizasyonu farklı bir şekilde yapıldığında artık program çalışmayacak ve programın tekrar yazılması gerekecektir. Çünkü makine dili yalnızca belirli bir CPU ya da CPU serisine uygulanabilir. Makine dili taşınabilir (portable) değildir. Diğer önemli bir problem ise, makine dilinde kod yazmanın çok zahmetli olmasıdır.Yazmanın çok zaman alıcı ve uğraştırıcı olmasının yanı sıra yazılan programı okumak ya da algılamak da o denli zordur. Özellikle program boyutu büyüdüğünde artık makine dili programlarını geliştirmek, daha büyütmek iyice karmaşık bir hale gelir. Başlangıçta yalnızca makine dili vardı. Bu yüzden makine dilleri 1. kuşak diller olarak da isimlendirilir. Yazılımın ve donanımın tarihsel gelişimi içerisinde makine dilinden, insan algılamasına çok yakın yüksek seviyeli dillere (4. kuşak diller) kadar uzanan bir süreç söz konusudur. Bu tarihsel süreci ana hatlarıyla inceleyelim : 1950 li yılların hemen başlarında makine dili kullanımın getirdiği problemleri ortadan kaldırmaya yönelik çalışmalar yoğunlaştı. Bu yıllarda makine dilleri bilgisayarın çok sınırlı olan belleğine yükleniyor ve programlar böyle çalıştırılıyordu. İlk önce makine dilinin algılanma ve anlaşılma zorluğunu kısmen de olsa ortadan kaldıran bir adım atıldı. Sembolik makine dilleri geliştirildi. Sembolik makine dilleri (Assembly ********s) yalnızca 1 ve 0 dan oluşan makine dilleri yerine İngilizce bazı kısaltma sözcüklerden oluşuyordu. Sembolik makine dillerinin kullanımı kısa sürede yaygınlaştı. Ancak sembolik makine dillerinin makine dillerine göre çok önemli bir dezavantajı söz konusuydu. Bu dillerde yazılan programlar makine dilinde yazılan programlar gibi bilgisayarın belleğine yükleniyor ancak programın çalıştırılma aşamasında yorumlayıcı (interpreter) bir program yardımıyla sembolik dilin komutları, bilgisayar tarafından komut komut makine diline çevriliyor ve oluşan makine kodu çalıştırılıyordu. Yani bilgisayar, programı çalışma aşamasında önce yorumluyarak makine diline çeviriyor daha sonra makine diline çevrilmiş komutları icra ediyordu. Bu şekilde çalıştırılan programların hızı neredeyse 30 kat yavaşlıyordu. |
|||||||||||
|
|
|
|
#2 (permalink) | |||||||||||
|
Bu dönemde özellikle iki yorumlayıcı program öne çıkmıştı: John Mauchly nin UNIVAC 1 için yazdığı yorumlayıcı (1950) ve John Backus tarafından 1953 yılında IBM 701 için yazılan "Speedcoding" yorumlama sistemi. Bu tür yorumlayıcılar makine koduna göre çok yavaş çalışsalar da programcıların verimlerini artırıyorlardı. Ama özellikle eski makine dili programcıları yorumlayıcıların çok yavaş olduklarını, yalnızca makine dilinde yazılanların gerçek program deneceğini söylüyorlardı.
Bu sorunun da üstesinden gelindi. O zamanlar için çok parlak kabul edilebilecek fikir şuydu: Her defasında yazılan kod, kodun çalıştırılması sırasında makine diline çevireceğine, geliştirilecek bir başka program sembolik dilinde yazılan kodu bir kez makine diline çevirsin ve artık program ne zaman çalıştırılmak istense, bilgisayar yorumlama olmaksızın yalnızca makine kodunu çalıştırsın. Bu fikiri geliştiren Grace Hopper isimli bir bayandı. Grace Hopper'ın buluşuna "compiler" derleyici ismi verildi. (Grace Hopper aynı zamanda Cobol dilini geliştiren ekipten biridir, bug(böcek) sözcüğünü ilk olarak Grace Hopper kullanmıştır.) Artık programcılar sembolik sözcüklerden oluşan Assembly programlarını kullanıyor. Yazdıkları programlar derleyici tarafından makine koduna dönüştürülüyor ve makine kodu eski hızından birşey kaybetmeksizin tam hızla çalışıyordu. Assembly diller 2. kuşak diller olarak tarihte yerini aldı. Assembly dillerinin kullanılmaya başlamasıyla bilgisayar kullanımı hızla arttı. Ancak en basit işlemlerin bile bilgisayara yaptırılması için bir çok komut gerekmesi, programlama prosesini daha hızlı bir hale getirmek için arayışları başlatmış, bunun sonucunda da daha yüksek seviyeli programlama dilleri geliştirilmeye başlanmıştır. Tarihsel süreç içinde Assembly dillerinden daha sonra geliştirilmiş ve daha yüksek seviyeli diller 3. kuşak diller sayılmaktadır. Bu dillerin hepsi algoritmik dillerdir. Bugüne kadar geliştirilmiş olan yüzlerce yüksek seviyeli programlama dilinden yalnızca pek azı bugüne kadar varlıklarını sürdürebilmiştir: FORTRAN dili (FORmula TRANslator) kompleks matematiksel hesaplamalar gerektiren mühendislik ve bilimsel uygulamalarda kullanılmak üzere 1954 - 1957 yılları arasında IBM firması için John Backus tarafından geliştirilmiştir. FORTRAN dili, yoğun matematik hesaplamaların gerektiği bilimsel uygulamalarda halen yaygın olarak kullanılmaktadır. FORTRAN dilinin FORTRAN IV ve FORTRAN 77 olmak üzere iki önemli versiyonu bulunmaktadır. Doksanlı yılların başlarında FORTRAN - 90 isimli bir versiyon için ISO ve ANSI standartları kabul edilmiştir. FORTRAN dili 3. seviye dillerin en eskisi kabul edilmektedir. COBOL (COmmon Business Oriented ********) 1959 yılında, Amerika'daki bilgisayar üreticileri, özel sektör ve devlet sektöründeki bilgisayar kullanıcılarından oluşan bir grup tarafından geliştirilmiştir. COBOL'un geliştirilme amacı veri yönetimi ve işlemenin gerektiği ticari uygulamalarda kullanılacak taşınabilir bir programlama dili kullanmaktır. COBOL dili de halen yaygın olarak kullanılmaktadır. ALGOL (The ALGOritmick ********) 1958 yılında Avrupa'da bir konsorsiyum tarafından geliştirilmeye başlanmıştır. IBM Firması FORTRAN dilini kendi donanımlarında kullanılacak ortak programlama dili olarak benimsediğinden, Avrupa'lılar da alternatif bir dil geliştirmek istemişlerdi. ALGOL dilinde geliştirilen bir çok prensip modern programlama dillerinin hepsinde kullanılmaktadır. 60'lı yılların başlarında programlama dilleri üzerinde yapılan çalışmalar yapısal programlama kavramını gündeme getirmiştir. Bu dillerden bazılarına kısaca göz atalım: PASCAL dili 1971 yılında akademik çevrelere yapısal programlama kavramını tanıtmak için Profesör Niclaus Wirth tarafından geliştirilmiş (Dilin yaratıcısı, dile matematikçi ve filozof Blaise Pascal'ın ismini vermiştir.) ve bu dil kısa zaman içinde üniversitelerde kullanılan programlama dili haline gelmiştir. Pascal dilinin ticari ve endüstriyel uygulamaları desteklemek için sahip olması gereken bir takım özelliklerden yoksun olması bu dilin bu uygulamalarda fazla kullanılmamasına yol açmıştır. Modula ve Modula-2 dilleri Pascal dili baz alınarak geliştirilmiştir. BASIC dili 1960'lı yılların ortalarında John Kemeney ve Thomas Kurtz tarafından geliştirilmiştir. Her ne kadar BASIC isminin "Beginner's All_purpose Symbolic Instruction Code" sözcüklerinin baş harflerinden oluşturulduğu söylense de, bu sözcüklerin daha sonradan uydurulduğu açıktır. Yüksek seviyeli dillerin en eski ve en basit olanlarından biridir.Tüm basitliğine karşın, bir çok ticari uygulamada kullanılmıştır. BASIC dili de ANSI tarafından standartlaştırılmıştır. Ancak BASIC dilinin ilave özellikler içeren bir sürü versiyonu söz konusudur. Örneğin Microsoft firmasının çıkarttığı Visual Basic diline Nesne Yönelimli Programlamaya ilişkin birçok özellik eklenmiştir. Ayrıca BASIC dilinin bazı versiyonları uygulama programlarında (Örneğin MS Excel ve MS Word'de) kullanıcının özelleştirme ve otomatikleştirme amacıyla yazacağı makroların yazılmasında kullanılan programlama dili olarak da genel kabul görmüştür. ADA dili ise Amerikan Savunma Departmanı (Department of Defence -DoD) desteği ile 70 li yıllar ve 80'li yılların başlarında geliştirilmiştir. Dod dünyadaki en büyük bilgisayar kullanıcılarından biridir. Bu kurum farklı yazılımsal gereksinimleri karşılamak için çok sayıda farklı programlama dili kullanıyordu ve tüm gereksinmelerini karşılayacak bir dil arayışına girdi. Dilin tasarlanması amacıyla uluslararası bir yarışma düzenledi. Yarışmayı kazanan şirket (CII-Honeywell Bull of France) Pascal dilini baz olarak alan çalışmalar sonucunda Ada dilini geliştirdi. Ada dilinin dökümanları 1983 yılında yayımlanmıştır.(Ada ismi, şair Lord Byron'un kızı olan Lady Ada Lovelace'ın isminden alıntıdır. Ada Lovelace delikli kartları hesap makinalarında ilk olarak kullanılan Charles Babbage'in yardımcısıydı. Charles Babbage hayatı boyunca "Fark makinası" (Difference Engine) ve "Analitik Makine" (Analytical Engine) isimli makinaların yapımı üzerinde çalıştı ama bu projelerini gerçekleştiremeden öldü. Yine de geliştirdiği tasarımlar modern bilgisayarların atası kabul edilmektedir. Ada Lovelace Charles Babbage'ın makinası için delikli kartları ve kullanılacak algoritmaları hazırlıyordu. Bu bayanın 1800'lü yılların başında ilk bilgisayar programını yazdığı kabul edilmektedir.) Ada dili genel amaçlı bir dildir, ticari uygulamalardan roketlerin yönlendirilmesine kadar birçok farklı alanda kullanılmaktdır. Dilin önemli özelliklerinden bir tanesi gerçek zaman uygulamalarına (real-time applications / embedded systems) destek vermesidir. Başka bir özelliği de yüksek modülaritesi nedeniyle büyük programların yazımını kolaylaştırmasıdır. Ancak büyük ve karmaşık derleyicilere ihtiyaç duyması, C, Modula-2 ve C++ dillerine karşı rekabetini zorlaştırmıştır. Çok yüksek seviyeli ve genellikle algoritmik yapı içermeyen programların görsel bir ortamda yazıldığı diller ise 4. kuşak diller olarak isimlendirilirler. Genellikle 4GL olarak kısaltılırlar. (fourth generation ********). İnsan algısına en yakın dillerdir. RPG dili 4. kuşak dillerin ilki olarak kabul edilebilir.Özellikle küçük IBM makinalarının kullanıcıları olan şirketlerin, rapor üretimi için basit bir dil istemeleri üzerine IBM firması tarafından geliştirilmiştir. Programlama dillerini seviyelerine göre 5 ana gruba ayırabiliriz: 1. Çok yüksek seviyeli diller ya da görsel diller (visual ********s): Access, Foxpro, Paradox, Xbase, Visual Basic, Oracle Forms. 2. Yüksek seviyeli diller (Bunlara algoritmik diller de denir): Fortran, Pascal, Basic, Cobol. 3. Orta seviyeli programlama dilleri: Ada, C. Orta seviyeli diller daha az kayıpla makine diline çevrilebildiğinden daha hızlı çalışır. 4. Alçak seviyeli programlama dilleri: Sembolik makine dili (Assembly ********). 5. Makine dili: En aşağı seviyeli programlama dili. (Saf makine dili tamamen 1 ve 0 lardan oluşuyor.) Uygulama Alanlarına Göre Sınıflandırma
__________________ |
|||||||||||
|
|
|
|
#3 (permalink) | |||||||||||
|
1. Bilimsel ve mühendislik uygulama dilleri:
Pascal, C (C programlama dili üniversitelerdeki akademik çalışmalarda da yoğun olarak kullanılıyor.), FORTRAN 2. Veri tabanı dilleri: XBASE, (Foxpro, Dbase, CA-Clipper), Oracle Forms, Visual Foxpro. 3. Genel amaçlı programlama dilleri: Pascal, C, Basic. 4. Yapay zeka dilleri: Prolog, Lisp. 5. Simulasyon dilleri GPSS, Simula 67 6. Makro Dilleri (Scripting ********s) awk, Perl, Python, Tcl, **********. 7. Sistem programlama dilleri: Sembolik makine dilleri, BCPL, C, C++, occam. Günümüzde sistem yazılımların neredeyse tamamının C dili ile yazıldığını söyleyebiliriz. Örnek vermek gerekirse UNIX işletim sisteminin % 80'i C dili ile geri kalanı ise sembolik makine dili ile yazılmıştır. Bu işletim sistemi ilk olarak BELL labaratuarlarında oluşturulmuştur. Kaynak kodları gizli tutulmamış, böylece çeşitli kollardan geliştirilmesi mümkün olmuştur. Daha sonra geliştirilen UNIX bazlı işletim sistemi uygulamalarına değişik isimler verilmiştir. C bilimsel ve mühendislik alanlarına kullanılabilen genel amaçlı bir sistem programlama dilidir. Programlama Dillerinin Değerleme Ölçütleri Kaynaklar şu an halen kullanımda olan yaklaşık 1000 - 1500 programlama dilinin varlığından söz ediyor. Neden bu kadar fazla programlama dili var? Bu kadar fazla programlama dili olmasına karşın neden halen yeni programlama dilleri tasarlanıyor? Bir programlama dilini diğerine ya da diğerlerine göre daha farklı kılan özellikler neler olabilir? Bir programlama dilini tanımlamak istesek hangi sıfatları kullanabiliriz? Programlama dilleri hakkındaki bu sorulara yanıt verebilmemiz için elimizde değerlendirme yapmamıza olanak sağlayacak ölçütler olmalıdır. Bu ölçütleri kısaca inceleyelim: Verimlilik (efficiency) Bu özelliğe programın hızlı çalışma özelliği diyebiliriz. Programın çalışma hızı pek çok faktöre bağlıdır. Algoritmanın da hız üzerinde etkisi vardır. Çalışmanın yapıldığı bilgisayarın da doğal olarak hız üzerinde etkisi vardır. Verimliliği bir programlama dilinde yazılmış bir programın hızlı çalışması ile ilgili bir kavram olarak düşünebiliriz. Bu açıdan bakıldığında C verimli bir dildir. Veri türleri ve yapıları (data types and structures) Çeşitli veri türlerini (tamsayı, gerçek sayı, karakter...) ve veri yapılarını (diziler, yapılar vs.) destekleme yeteneğidir. Veri yapıları, veri türlerinin oluşturduğu mantıksal birliklerdir. Örneğin C ve Pascal dilleri veri yapıları bakımından zengin dillerdir. Alt programlama yeteneği (Modularity) Bir bütün olarak çözülmesi zor olan problemlerin parçalara ayrılması ve bu parçaların ayrı ayrı çözümlenmesinden sonra parçalar arasındaki koordinasyonun sağlanması programada sık başvurulan bir yöntemdir. Bir programlama dili buna olanak sağlayacak araçlara sahipse alp programlama yeteneği vardır diyebilirriz. Alt programlama yeteneği bir programlama dilinin, programı parçalar halinde yazmayı desteklemesi anlamına gelir. (C modülaritesi çok yüksek bir dildir) Alt programlama Yapısal Programlama tekniği'nin de ayrılmaz bir parçasıdır. Alt programlamanın getirdiği bazı önemli avantajlar vardır. Alt programlar kodu küçültür. Çok tekrarlanan işlemlerin alt programlar kullanılarak yazılması çalışabilir programın kodunu küçültür. Çünkü alt programlar yalnızca bir kere çalışabilir kod içine yazılırlar. Ama program kodu alt programın olduğu yere atlatılarak bu bölgenin defalarca çalıştırılması sağlanabilir. Alt programlama algılamayı kolaylaştırır, okunabilirliği artırır. Alt programlama kaynak kodun test edilebilirliğini artırır. Kaynak kodun daha kolay güncelleştirilmesi ve yeniden kullanılabilme olanağını artırır. Alt programlamanın en önemli avantajlarından biri de genel amaçlı kodlar yazarak bu yazılan kodları birden fazla projede kullanabilmektir. (reusability) C alt programlama yeteneği yüksek bir dildir. C'de alt programlara fonksiyon denir. Fonksiyonlar C Dili'nin yapıtaşlarıdır. Yapısallık (structural programming support) Yapısallık bir programlama tekniğidir. Bugün artık hemen hemen bütün programlama dilleri yapısal programlamayı az çok destekleyecek bir şekilde geliştirilmiştir. Yapısal Programlama fikri 1960'lı yıllarda geliştirilmiştir. Yapısal programlama tekniği dört ana ilke üzerine kurulmuştur : 1. Böl ve üstesinden gel (divide and conquer) Yapısal programlama tekniğinde, tek bir bütün olarak çözüm getirmek zor olan programlar, daha küçük ve üstesinden daha kolay gelinebilecek parçalara bölünürler. Bu parçalar fonksiyon, prosedür, subroutine, alt program vs. olarak isimlendiriler. Alt program yapısının getirdiği avantajlar modularite konusunda yukarıda açıklanmıştır. 2. Veri gizleme (Data hiding) Yapısal programlama tekniğinde, programın diğer parçalarından ulaşılamayan, yalnızca belli bir faaliyet alanı olan, yani kodun yalnızca belli bir kısmında faaliyet gösterecek değişkenler tanımlanabilir. Bu tür değişkenler genel olarak "yerel değişkenler" (local variables) olarak isimlendirilirler. Değişkenlerin faaliyet alanlarının kısıtlanabilmesi hata yapma riskini azalttığı gibi, programların daha kolay değiştirilebilmesini ve program parçalarının başka programlarda tekrar kullanabilmesini de sağlar. Alt programların, ve daha geniş şekliyle modüllerin, bir işi nasıl yaptığı bilgisi, o alt programın ya da modülün kullanıcısından gizlenir. Kullanıcı için (client) alt programın ya da modülün işi nasıl yaptığı değil, ne iş yaptığı önemlidir. 3. Tek giriş ve Tek çıkış (single entry single exit) Yapısal programlama tekniğini destekleyen dillerde her bir altprogram parçasına girmek için tek bir giriş ve tek bir çıkış mekanizması vardır. Bu mekanizma programın yukarıdan aşağı olarak akışı ile uyum halindedir. Program parçalarına ancak tek bir noktadan girilebilir. 4. Döngüler ve diğer kontrol yapıları. Artık hemen hemen kullanımda olan bütün programlama dilleri az ya da çok Yapısal Programlama tekniğini desteklemektedir. Zira bu teknik 60'lı yıllar için devrim niteliğindeydi. Esneklik (flexibility) Esneklik programlama dilinin programcıyı kısıtlamaması anlamına gelir.Esnek dillerde birçok işlem, hata yapma riski artmasına karşın rağmen kullanıcı için serbest bırakılmıştır. Programcı bu serbestlikten ancak yetkin bir programcıysa bir fayda sağlayabilir. Fakat programcı deneyimsiz ise bu esneklikten zarar görebilir. Öğrenme ve öğretme kolaylığı (pedagogy) Her programlama dilini öğrenmenin ve öğrenilen programlama dilinde uygulama geliştirebilmenin zorluğu aynı değildir. Genel olarak programlama dillerinin seviyesi yükseldikçe, öğrenme ve bu programlama dilini başkalarına öğretme kolaylaşır, öğrenme için harcanacak çaba ve zaman azalır. Bugün yaygın olarak kullanılan yüksek seviyeli programlı dillerinin bu derece popüler olmasının önemli bir nedeni de bu dillerin çok kolay öğrenilebilmesidir. Ne yazık ki C öğrenimi zor ve zahmetli bir dildir. Genellik (generality) Programlama dillerinin çok çeşitli uygulamalarda etkin olarak kullanılabilmesidir. Örneğin COBOL mühendislik uygulamalarında tercih edilmez zaten ticari uygulamalar için tasarlanmıştır, Clipper ya da FOXPRO veri tabanı dilleridir. Oysa PASCAL, BASIC daha genel amaçlı dillerdir. C dili de bir sistem programlama dili olarak doğmasına karşın, güçlü yapısından dolayı, kısa bir süre içinde, genel amaçlı bir dil haline gelmiştir. Giriş / Çıkış (input / output, I / O facility) kolaylığı Sıralı, indeksli ve rasgele dosyalara erişme, veritabanı kayıtlarını geri alma, güncelleştirme ve sorgulama yeteneğidir. Veritabanı programlama dillerinin (DBASE, PARADOX vs.) bu yetenekleri diğerlerinden daha üstündür ve bu dillerin en tipik özelliklerini oluşturur. Fakat C giriş çıkış kolaylığı kuvvetli olmayan bir dildir. C'de veri tabanlarının yönetimi için özel kütüphanelerin kullanılması gerekir. Okunabilirlik (readability) Okunabilirlik, kaynak kodun çabuk ve iyi bir biçimde algılanabilmesi anlamına gelen bir terimdir. Kaynak kodun okunabilirliğinde sorumluluk büyük ölçüde programı yazan kişidedir. Fakat yine verimlilik de olduğu gibi dillerin bir kısmında okunabilirliği güçlendiren yapı ve mekanizmalar bulunduğu için bu özellik bir ölçüde dilin tasarımına da bağlıdır. En iyi program kodu, sanıldığı gibi "en zekice yazılmış fakat kimsenin anlayamayacağı" kod değildir. Birçok durumda iyi programcılar okunabilirliği hiçbirşeye feda etmek istemezler. Çünkü okunabilir bir program kolay algılanabilme özelliğinden dolayı seneler sonra bile güncelleştirmeye olanak sağlar. Birçok kişinin ortak kodlar üzerinde çalıştığı geniş kapsamlı projelerde okunabilirlik daha da önem kazanmaktadır. C de okunabilirlik en fazla vurgulanan kavramlardan biridir. Biz de kursumuz boyunca okunabilirlik konusuna sık sık değineceğiz ve C programlarının okunabilirliği konusunda bazı temel prensipleri benimseyeceğiz. Taşınabilirlik (portability) Bir sistem için yazılmış olan kaynak kodun başka bir sisteme götürüldüğünde, hatasız bir biçimde derlenerek, doğru bir şekilde çalıştırılabilmesi demektir. Taşınabilirlik standardizasyon anlamına da gelir. Programlama dilleri (ISO International Standard Organization) ve ANSI (American National Standard Institute) tarafından standardize edilirler. 1989 yılında standartlaştırma çalışmaları biten C Dili, diğer programlama dillerinden daha taşınabilir bir programlama dilidir. Nesne Yönelimlilik (object orientation) Nesne yönelimlilik de bir programlama tekniğidir. Yapısal programlama Tekniği 1960 yılarında gündeme gelmişken, Nesne Yönelimli Programlama Tekniği 1980'li yıllarda popüler olmuştur. Bu teknik kaynak kodların çok büyümesi sonucunda ortaya çıkan gereksinim yüzünden geliştirilmiştir. C dilinin geliştirildiği yıllarda, akla gelebilecek en büyük programlar ancak onbin satırlar mertebesindeydi, ancak kullanıcıların bilgisayar programlarından beklentilerinin artması ve grafik arayüzünün artık etkin olarak kullanılmasıyla, bilgisayar programlarının boyutu çok büyümüş, yüzbin satırlarla hatta milyon satırlarla ölçülebilir hale gelmiştir. Nesne yönelimli programlama Tekniği, herşeyden önce büyük programların yazılması için tasarlanmış bir tekniktir. C dilinin yaratıldığı yıllarda böyle bir tekniğin ortaya çıkması söz konusu değildi, çünkü zaten programlar bugünkü ölçülere göre çok küçüktü. Nesne yönelimli programlama Tekniğinin yaygın olarak kullanılmaya başlanmasıyla birlikte bir çok programlama dilinin bünyesine bu tekniğin uygulanmasını kolaylaştırıcı araçlar eklenek, yeni versiyonları oluşturulmuştur. Örneğin C'nin nesne yönelimli programlama tekniğini uygulayabilmek için Bjarne Stroustrup tarafından geliştirilmiş haline C++ denmektedir. C++ dili C dili baz olarak alınıp, geliştirilmiş yeni bir programlama dilidir. C++ dilini iyi öğrenebilmek için öncelikle C dilini çok iyi öğrenmek gerekir. Pascal diline eklemeler yapılarak Delphi dili, Cobol dilinden yenilemesiyle OOCobol, Ada dilinin yenilenmesiyle ise ADA 95 dilleri geliştirilmiştir. Bazı programlama dilleri ise doğrudan N.Y.P.T'ni destekleyecek şekilde tasarlanarak geliştirilmiştir. Örneğin JAVA dili C++ dilinin basitleştirilmiş biçimi olup daha çok Internet uygulamalarında kullanılmaktadır. Başka bir örnek olarak da Eiffel dili verilebilir. C Nasıl bir Programlama Dilidir? Bütün bunlardan sonra yukarıda açıkladığımız kavramları da kullanarak C dilini aşağıdaki şekilde tanımlayabiliriz : C orta seviyeli bir programlama dilidir. Yapısal diğer programlama dillerine göre C dilinin seviyesi daha düşüktür. C dili hem yüksek seviyeli dillerin, kontrol deyimleri, veri yapıları gibi avantajlarını bünyesinde barındırıyor, aynı zamanda bitsel operatörler gibi makine kodu deyimlerini yansıtan operatörlerlere sahip. Yani hem makinaya yakın hem de insan algılamasına. Zaten çok tercih edilmesinin en önemli nedenlerinden biri de bu. C bir sistem programlama dilidir. Sistem Programlama ne anlama geliyor? Donanımın yönetilmesi, kontrolu ve denetimi için yazılan, doğrudan donanımla ilişkiye giren programlara sistem programı diyoruz. Örneğin, işletim sistemleri, derleyiciler, yorumlayıcılar, aygıt sürücüleri (device drivers), bilgisayarların iletişimine ilişkin programlar, otomasyon programları, sistem programlarıdır. Diğer uygulama programlarına destek veren yazılımlar da çoğunlukla sistem programları olarak ele alınırlar. C'den önce sistem programları assembly dillerle yazılıyordu.Sistem programlarının yazılmasında hemen hemen alternatifsiz olduğunu söyleyebiliriz. Bugün cep telefonlarından, uçaklara kadar her yerde C kodları çalışmaktadır. Örneğin Boeing uçaklarında 100.000 satırdan fazla C kodu çalıştığı bilinmektedir. C algoritmik bir dildir. C'de program yazmak için yalnızca dilin sentaks ve sementik yapısını bilmek yetmez genel bir algoritma bilgisi de gerekir. C diğer dillerle kıyaslandığında taşınabilirliği çok yüksek olan bir dildir. Çünkü 1989 yılından bu yana genel kabul görmüş standartlara sahiptir. İfade gücü yüksek , okunabilirlik özelliği güçlü bir dildir. C çok esnektir. Diğer dillerde olduğu gibi programcıya kısıtlamalar getirmez. Güçlü bir dildir. Çok iyi bir biçimde tasarlanmıştır. C'ye ilişkin operatörlerin ve yapıların bir çoğu daha sonra başka programlama dilleri tarafından da benimsenmiştir. C verimli bir dildir. Seviyesinden dolayı hızlı çalışır. Verimlilik konusunda assembly diller ile rekabet edebilir. C doğal bir dildir. C bilgisayar sisteminin biçimiyle uyum içindedir. C küçük bir dildir. Yeni sistemler için derleyici yazmak zor değildir. C'nin eğitimi diğer bilgisayar dillerine göre daha zordur. C Programlama Dili'nin Tarihi C dilinin tarihini incelediğimizde C dilinin UNIX işletim sisteminin bir yan ürünü olarak doğduğunu söyleyebiliriz. UNIX işletim sisteminin orjinal ilk versiyonunu Bell Labaratuarları'nda çalışan Ken Thompson tek başına yazmıştı ve UNIX'in bu ilk versiyonu DEC PDP-7 isimli bilgisayarda çalışıyordu. DEC PDP-7 ilk mini bilgisayarlardan biriydi ve ana belleği yalnızca 16 K (16 MB değil!). Yıllardan 1969'du. Zamanının diğer işletim sistemleri gibi UNIX de assembly dilinde yazılmıştı. Assembly dilinde yazılan programları geliştirmek çok zor ve zahmetli olduğundan, Thompson UNIX işletim sistemini daha geliştirebilmek için, makine dilinden daha yüksek seviyeli bir dile gereksinim duydu. Bu amaçla küçük bir programlama dili tasarladı. Kendi dilini tasarlarken Thompson, 1960 yıllarının ortalarında Martin Richards tarafından geliştirilmiş BCPL dilinden yola çıktı. (BCPL = Business Common Programming ********. Bu dil de CPL = Cambridge Programming ********'den türetilmiştir. CPL'in kaynağı da tüm zamanların en eski ve en etkili dillerinden biri olan ALGOL 60'dır. ALGOL 60 Pascal, ADA, Modula2 dillerinin de atasıdır, bu dillere bu yüzden C dilinin kuzenleri de diyebiliriz. Aşağıda ALGOL 60 dil ailesi görülmektedir: Algol 60 Algol 68 Algol W Simula 67 BCPL C Pascal C++ Java Modula-2 Ada Delphi Oberon Thompson geliştirdiği bu dilin ismini B koydu. Dennis Ritchie UNIX projesine katılınca B dilinde programlamaya başladı. B dili daha da geliştirilmişti ve artık daha yeni teknoloji olan PDP-11 bilgisayarlarda çalışıyordu. Thompson UNIX işletim sisteminin bir kısmını B dilinde tekrar yazdı. Artık 1971 yılına gelindiğinde B dilinin PDP-11 bilgisayarlar ve UNIX işletim sisteminin geliştirilmesi için çok uygun olmadığı iyice ortaya çıktı. Bu yüzden Ritchie B programlama dilinin daha ileri bir versiyonunu geliştirmeye başladı. Oluşturduğu dili ilk önce NB (new B) olarak isimlendirdi. Ama geliştirdiği dil B dilinden iyice kopmaya ve ayrı bir karakter göstermeye başlayınca dilin ismini de C olarak değiştirdi. 1973 yılında UNIX işletim sisteminin büyük bir kısmı C dili ile tekrar yazıldı. Ken Thompson ve Dennis Ritchie Unix İşletim Sistemi üzerinde çalışırken (Yıl: 1972) C'nin evrimi ve gelişmesi 70'li yıllarda da devam etti. Geniş kitleler tarafından tanınması ve kullanılmaya başlaması 1978 yılında Dennis Ritchie ve Brian Kernighan tarafından yazılan "The C Programming ********" kitabı ile olmuştur. Bu kitap aynı zamanda yazılım konusunda yazılan en iyi eserlerden biri olarak değerlendirilmektedir. C'nin standardize edilmesine kadar olan dönemde bu kitap çoğunluğun benimsediği genel kabul gören gayriresmi bir standard vazifesi de görmüştür. 1970'li yıllarda C programcılarının sayısı azdı ve bunlardan çoğu UNIX kullanıcılarıydı. Ama artık 80'li yıllar gelince C nin kullanımı UNIX sınırlarını aştı, ve farklı işletim sistemlerinde çalışan derleyiciler piyasaya çıktı, C dili de IBM PC'lerde yoğun olarak kullanılmaya başladı. C'nin artan popülaritesi problemleri de beraberinde getirdi. Derleyici yazan kişiler, referans olarak Ritchie ve Kernighan'ın kitabını esas alıyorlardı ama söz konusu kitapta bazı noktalar çok da detaylı bir biçime açıklanmamıştı. Özellikle hangi noktaların C dilinin bir özelliği hangi noktaların ise UNIX işletim sisteminin bir özelliği olduğu o kadar açık olmadığı için bir takım karışıklıklar ortaya çıkıyordu. Böylece derleyici yazanların ürünlerinde de farklılıklar ortaya çıkıyordu. Ayrıca kitabın yayınlanmasından sonra da dilde bir takım geliştirmeler, iyileştirmeler, değişiklikler yapıldığı için, birbirinden çok farklı derleyiciler piyasada kullanılmaya başlanmıştı. Artık C dilinin standardizasyonu neredeyse zorunlu bir hale gelmişti! C'nin standardizasyon çalışmaları 1983 yılında ANSI (American National Standards Institute ) gözetiminde ve desteğinde başladı. Yapılan birçok değişiklikten sonra standart çalışmaları 1988 yılında sona erdi ve 1989 yılının Aralık ayında ANSI C standardı Jim Brodie başkanlğında X3.159 - 1989 numarasıyla resmi olarak onaylandı. 1990 yılında ise ISO/IEC 9899 - 1990 numarasıyla ISO (International Standards Organization) tarafından standardizasyonu kabul edildi. Standardizasyonu tamamlandıktan sonra C yüksek oranda taşınabilir bir sistem programlama dili haline gelmiştir. Günümüzde de sistem programlarının (derleyiciler, editörler, işletim sistemleri) çoğu C dili ile yazılmaktadır.
__________________ |
|||||||||||
|
|
|
|
#4 (permalink) | |||||||||||
|
2 . BÖLÜM : SAYI SİSTEMLERİ
Günlük hayatta 10’luk sayı sistemini kullanıyoruz. 10 luk sistemde bir sayının değeri aslında her bir basamak değerinin 10 sayısının ilgili kuvvetiyle çarpımlarının toplanmasıyla elde edilir. Örneğin 1273 = (3 * 1) + (7 * 10 ) + (2 * 100) + (1 * 1000) Ancak bilgisayar sistemlerinde bütün bilgiler ikilik sistemde(binary system) ifade edilir. Genel olarak sayı sistemi kaçlıksa o sayı sisteminde o kadar sembol bulunur. Örneğin 10’luk sistemde 10 adet sembol vardır ve bu semboller 0, 1, 2, 3, 4, 5, 6, 7, 8, 9’dur. Aynı şekilde ikilik sayı sisteminde yalnızca iki adet sembol bulunur. Yani yalnızca 0 ve 1. Bir sayıyı başka bir sayı sisteminde ifade etmek o sayının değerini değiştirmez. Yalnızca sayının gösteriliş biçimi değişir. Örneğin onluk sayı sisteminde sayısal değeri 32 olan büyüklüğü çeşitli farklı sayı sistemlerinde farklı biçimlerde gösterebiliriz ama sayının büyüklüğünü değiştirmiş olmayız. İkilik sistemde her bir basamağa 1 bit denir. Bit kelimesi binary digit sözcüklerinden türetilmiştir. Örneğin 1011 sayısı 4 bittir. (Ya da 4 bit uzunluğundadır). 11011001 sayısı 8 bittir. 8 bitlik bir büyüklük bir byte olarak isimlendirilir. 1 kilobyte 1K = 1024 byte dır. (yani 210 byte) 1 mega byte 1 MB = 1024 Kilo byte dır. (yani 220 byte) 1 gigabyte 1 GB = 1024 MB dır. (yani 230 byte) 1 terabyte 1 TB = 1024 GB dır. (yani 240 byte) 1 petabyte 1PB = 1024 TB dır. (yani 250 byte) 1 exabyte 1EB = 1024 PB dır. (yani 260 byte) 1 zettabyte 1ZB = 1024 EB dir.( yani 270 byte) 1 yottabyte 1YB = 1024 ZB dır.( yani 280 byte) Kilo büyüklük olarak 1000 kat anlamına gelmektedir, ancak bilgisayar alanında Kilo 2'nin 1000'e en yakın kuvveti olan 210 yani 1024 kat olarak kullanılır. 4 bit 1 Nybble (Nibble şeklinde de yazılır) 8 bit 1 byte 16 bit 1 word 32 bit 1 double word 64 bit 1 quadro word olarak da isimlendirilmektedir. ikilik sisteme ilişkin genel işlemler i. İkilik sistemdeki bir sayının 10 luk sistemde ifade edilmesi: ikilik sayı sisteminde ifade edilen bir sayının 10’luk sistemdeki karşılığını hesaplamak için en sağdan başlayarak bütün basamakları tek tek 2’nin artan kuvvetleriyle çarpılır. Örneğin : 1 0 1 1 = 1 * 20 + 1 * 21 + 0 * 22 + 1 * 23 = 11 0010 1001 = (1 * 1) + (1 * 8) + (1 * 32) = 41 Bu arada sık kullanılan iki terimi de açıklayalım. İkilik sayı sisteminde yazılan bir sayının en solundaki bit, yukarıdaki örnekten de görüldüğü gibi en yüksek sayısal değeri katıyor. Bu bite en yüksek anlamlı bit (most significant digit) diyeceğiz ve bu bit için bundan sonra MSD kısaltmasını kullanacağız. İkilik sayı sisteminde yazılan bir sayının en sağındaki bit, yine yukarıdaki örnekten de görüldüğü gibi en düşük sayısal değeri katıyor. Bu bite en düşük anlamlı bit (least significant digit) diyeceğiz ve bu bit için bundan sonra LSD kısaltmasını kullanacağız. Örnek : 0101 1101 sayısı için MSD = 0 LSD = 1 İkilik sayı sisteminde yazılan bir sayının belirli bir basamağından (bitinden) söz ettiğimizde, hangi bitten söz edildiğinin doğru bir şekilde anlaşılması için basamaklar numaralandırılır. 8 bitlik bir sayı için, sayının en sağındaki bit (yani (LSD) sayının 0. bitidir. Sayının en solundaki bit (yani MSD) sayının 7. bitidir. ii. 10’luk sistemdeki bir sayının 2’lik sistemde ifadesi : Sayı sürekli olarak 2 ye bölünür. Her bölümden kalan değer( yani 1 ya da 0) oluşturulacak sayının 0. bitinden başla****** basamaklarını oluşturacaktır. Bu işleme 0 sayısı elde edilinceye kadar devam edilir. Örnek: 87 sayısını ikilik sayı sisteminde ifade etmek isteyelim: 87 / 2 = 43 (kalan 1) Sayının 0. biti 1 43 / 2 = 21 (kalan 1) Sayının 1. biti 1 21 / 2 = 10 (kalan 1) Sayının 2. biti 1 10 / 2 = 5 (kalan 0) Sayının 3. biti 0 5 / 2 = 2 (kalan 1) Sayının 4. biti 1 2 / 2 = 1 (kalan 0) Sayının 5. biti 0 1 / 2 = 0 (kalan 1) Sayının 6. biti 1 87 = 0101 0111 İkinci bir yöntem ise 10 luk sistemde ifade edilen sayıdan sürekli olarak 2'nin en büyük kuvvetini çıkarmaktır. 2’nin çıkarılan her bir kuvveti için ilgili basamağa 1 değeri yazılır. Bu işleme 0 sayısı elde edilene kadar devam edilir. Örnek: Yine 87 sayısını ikilik sayı sisteminde ifade etmek isteyelim: 87'den çıkarılabilecek, yani 87'den büyük olmayan ikinin en büyük kuvveti nedir? Cevap 64. O zaman 64 = 26 olduğuna göre 6.bit 1 değerini alacak. 87 - 64 = 23. Şimdi 23'den çıkarılabilecek ikinin en büyük kuvvetini bulalım. Bu say1 16'dır. Yani 24 'dür. O zaman sayımızın 4. biti de 1 olacak. 23 - 16 = 7. 7'den çıkarılabilecek ikinin en büyük kuvveti 4'dür ve 4 = 22 'dir. Sayımızınj 2. biti de 1 olacak. 7 - 4 = 3. 3 - 2 = 1 (2 = 21 ) Sayımızın 1. biti 1 olacak. 1 - 1 = 0 (1 = 20 ) Sayımızın 0. biti 1 olacak. 1 değeri olmayan tüm bitleri 0 bitiyle doldurarak sayımızı ikilik sistemde ifade edelim: 87 = 0101 0111 iii. İkilik sistemde ifade edilen bir sayının 1’e tümleyeni. Sayının tüm bitlerinin tersinin alınmasıyla elde edilir. Yani sayıdaki 1’ler 0 ve 0’lar 1 yapılır. Bir sayının 1’e tümleyeninin 1’e tümleyeni sayının yine kendisidir. iv. İkilik sistemde ifade edilen bir sayının 2’ye tümleyeninin bulunması: Önce sayının 1’e tümleyeni yukarıdaki gibi bulunur. Daha sonra elde edilen sayıya 1 eklenirse sayının 2’ye tümleyeni bulunmuş olur. 2'ye tümleyeni bulmak için daha daha pratik bir yol daha vardır : Sayının en solundan başlayarak ilk defa 1 biti görene kadar (ilk görülen 1 dahil) sayının aynısı yazılır, daha sonraki tüm basamaklar için basamağın tersi yazılır. (Yani 1 için 0 ve 0 için 1) Örneğin : 1110 0100 sayısının ikiye tümleyeni 0001 1100 dır. 0101 1000 sayısının ikiye tümleyeni 1010 1000 dır. Bir sayının ikiye tümleyeninin ikiye tümleyeni sayının kendisidir. (Deneyiniz) 8 bitlik bir alana yazılacak en büyük tam sayı kaçtır? 1111 1111 = 255 dir. (1 + 2 + 4 + 8 + 16 + 32 + 64 + 128 = 255) 8 bitlik bir alana yazılacak en küçük tam sayı kaçtır? 0000 0000 = 0’dır. Negatif bir tamsayı ikilik sistemde nasıl gösterilir? Negatif tamsayıların da ifade edildiği ikilik sayı sistemine işaretli ikilik sayı sistemi (signed binary system) denir. İşaretli ikilik sayı siteminde, negatif sayıları göstermek için hemen hemen tüm bilgisayar sistemlerinde aşağıdaki yol izlenir: Sayının en yüksek anlamlı biti işaret biti (sign bit) olarak kabul edilir. Ve bu bit 1 ise sayı negatif, bu bit 0 ise sayı pozitif olarak değerlendirilir. İkilik sistemde bir negatif sayı aynı değerdeki pozitif sayının ikiye tümleyenidir. Örnek olarak, ikilik sistemde yazacağımız –27 sayısı yine ikilik sistemde yazılan 27 sayısının ikiye tümleyenidir. Pozitif olan sayıların değerini tıpkı işaretsiz sayı sisteminde olduğu gibi elde ederiz: 0001 1110 işaretli sistemde pozitif bir sayıdır. (Decimal olarak 29 sayısına eşittir.) Ancak negatif olan sayıların değerini ancak bir dönüşümle elde edebiliriz: 1001 1101 işaretli sistemde negatif bir sayıdır. (Çünkü işaret biti 1) 2lik sistemde ifade edilen negatif bir sayının 10’luk sistemde hangi negatif sayıya eşit olduğunu nasıl bulunur? Sayının en yüksek anlamlı biti (MSD) işaret bitidir. Bu bit 1 ise sayı negatifdir. Sayının kaça eşit olduğunu hesaplamak için ilk önce sayının 2’ye tümleyeni bulunur. Ve bu sayının hangi pozitif sayıya karşılık geldiğini hesap edilir. Elde etmek istenen sayı, bulunan pozitif sayı ile aynı değerdeki negatif sayı olacaktır. Örneğin 1001 1101 sayısının 10’luk sistemde hangi sayıya karşılık geldiği bulunmak istenirse: Sayının en soldaki biti 1 olduğuna göre bu sayı negatif bir sayı olacaktır. Hangi negatif sayı olduğunu bulmak için sayının 2’ye tümleyenini alınır. 1001 1101 sayısının ikiye tümleyeni 0110 0011 sayısıdır. Bu sayının 10'luk sistemde hangi sayıya denk olduğu hesaplanırsa : (1 * 1 + 1 * 2 + 0 * 4 + 0 * 8 + 0 * 16 + 1 * 32 + 1 * 64 = 99) ilk yazılan sayının -99 olduğu anlaşılmış olur. 10'luk sistemde ifade edilen negatif sayıların işaretli ikilik sistemde yazılması :
__________________ |
|||||||||||
|
|
|
|
#5 (permalink) | |||||||||||
|
Önce sayının aynı değerli fakat pozitif olanı ikilik sistemde ifade edilir : Daha sonra yazılan sayının ikiye tümleyenini alınarak, yazmak istenilen sayı elde edilir.
Örnek : İkilik sistemde –17 yazmak istenirse; önce 17 yazılır. 0001 0001 bu sayının 2'ye tümleyeni alınırsa 1110 1111 sayısı elde edilir. Sayı değeri aynı olan Negatif ve Pozitif sayılar birbirlerinin ikiye tümleyenleridir. İkilik sistemde gösterilmiş olsa da aynı sayının negatifiyle pozitifinin toplamı 0 değerini verecektir. (Deneyiniz!) Bir byte’lık (8 bitlik) bir alana yazabileceğimiz (işaret bitini dikkate almadan) en büyük sayı 255 (1111 1111) ve en küçük sayı ise 0’dır.(0000 0000). Peki işaret biti dikkate alındığında 1 byte’lık alana yazılabilecek en büyük ve en küçük sayılar ne olabilir? En büyük sayı kolayca hesaplanabilir. işaret biti 0 olacak (yani sayı pozitif olacak) ve sayı değerini en büyük hale getirmek için diğer bütün bit değerleri 1 olacak, bu sayı 0111 1111 sayısıdır. Bu sayıyı desimal sisteme dönüştürürsek 127 olduğunu görürüz. Peki ya en küçük negatif sayı kaçtır ve nasıl ifade edilir? 0111 1111 sayısının ikiye tümleyenini alındığında –127 sayısını elde edilir. 1000 0001 (127) Bu sayıdan hala 1 çıkartabilir. 1000 0000 (-128) 1 byte alana yazılabilecek en küçük negatif sayıdır. Burada dikkat edilmesi gereken iki önemli nokta vardır : 1 byte alana yazılabilecek en büyük sayı sınırı aşıldığında negatif bölgeye geçilir. 0111 1111 (en büyük pozitif tamsayı) 1 (1 toplarsak) 1000 0000 (-128 yani en küçük tamsayı) yani 1 byte alana yazılabilecek en büyük tamsayıya 1 eklendiğinde 1 byte alana yazılabilecek en küçük tamsayıyı elde ederiz. 1 byte alana yazılabilecek en küçük tamsayıdan 1 çıkardığımızda da 1 byte alana yazılabilecek en büyük tamsayıyı elde ederiz. Yukarıda anlattıklarımıza göre -1 sayısının işaretli ikilik sayı sisteminde 8 bitlik bir alanda aşağıdaki şekilde ifade edilecektir. -1 = 1111 1111 Yani işaretli ikilik sayı sisteminde tüm bitleri 1 olan sayı -1'dir. İleride bu sayıyla çok işimiz olacak! 16’lık sayı sistemi (hexadecimal numbering system) ve 8’lik sayı sistemi (octal system) Bilgisayarların tamamen 2’lik sistemde çalıştığını söylemiştik, ama yukarıda görüldüğü gibi 2’lik sistemde sayıların ifade edilmesi hem çok uzun hem de zahmetli. Bu yüzden, yazım ve algılama kolaylığı sağlamak için 16’lık ve 8’lik sayı sistemleri de kullanılmaktadır. 16'lık ve 8’lik sayı sistemlerinde sayılar daha yoğun olarak kodlanıp kullanabilir. Başta da söz edildiği gibi 10 luk sistemde 10, 2’lik sistemde ise 2 sembol bulunmaktadır. Bu durumda 16’lık sayı sisteminde de 16 sembol bulunur. ilk 10 sembol 10'luk sistemde kullanılan sembollerle tamamen aynıdır : 1, 2, 3, 4, 5, 6, 7, 8, 9, Daha sonraki semboller A = 10 B = 11 C = 12 D = 13 E = 14 F = 15 16’lık sayı sisteminde yazılmış bir sayıyı 10’luk sisteme çevirmek için, en sağdan başlayarak basamak değerleri 16’nın artan kuvvetleriyle çarpılır : 01AF = (15 * 1) + (10 * 16) + (1 * 256) + (0 * 4096) = 431 10’luk sistemde yazılmış bir sayıyı 16’lık sisteme çevirmek için 10 luk sistemden 2’lik sisteme yapılan dönüşümlerdekine benzer şekilde sayı sürekli 16 ya bölünerek, kalanlar soldan sağa doğru yazılır. Pratikte 16 lık sayı sistemlerinin getirdiği önemli bir avantaj vardır. Bu avantaj 16 lık sayı sistemi ile 2’lik sayı sistemi arasındaki dönüşümlerin kolay bir şekilde yapılmasıdır. 16’lık sistemdeki her digit 2’lik sistemdeki 4 bit (1 Nibble) alan ile ifade edilebilir : 0001 1 0010 2 0011 3 0100 4 0101 5 0110 6 0111 7 1000 8 1001 9 1010 A 1011 B 1100 C 1101 D 1110 E 1111 F Örnek : 2ADFH sayısının (en sondaki H sayının hexadecimal olarak gösterildiğini anlatır yani sayıya ilişkin bir sembol değildir) 16'lık sistemde ifadesi : 2 = 0010 A = 1010 D = 1101 F = 1111 Bu durumda 2ADFH = 0010 1010 1101 1111 2’lik sistemden 16’lık sisteme yapılacak dönüşümler de benzer şekilde yapılabilir : Önce sayıları sağdan başlayarak dörder dörder ayırırız (en son dört eksik kalırsa sıfır ile tamamlarız.) Sonra her bir dörtlük grup için doğrudan 16'lık sayı sistemindeki karşılığını yazarız. 1010 1110 1011 0001 = AEB1H 0010 1101 0011 1110 = 2D3EH soru : 16'lık sayı sisteminde 2 byte'lık bir alanda yazılmış olan 81AC H sayısı pozitif mi negatif midir? cevap : Sayının yüksek anlamlı biti 1 olduğu için, işaretli sayı sistemlerinde sayı negatif olarak değerlendirilecektir. (1001 0001 1010 1100) 16 bitlik bir alanda ve işaretli sayı sisteminde -1 sayısını nasıl ifade edebiliriz : Cevap : FFFF 8’lik sayı sistemi (octal numbering system) Daha az kullanılan bir sayı sistemidir. 8 adet sembol vardır. (0 1 2 3 4 5 6 7) 8’lik sayı sisteminin her bir digiti 2’lik sistemde 3 bit ile ifade edilir. 001 1 010 2 011 3 100 4 101 5 110 6 111 7 8'lik sayı sisteminin de kullanılma nedeni, 2'lik sayı sistemine göre daha yogun bir ifade tarzı olması, ve ikilik sayı sistemiyle, 8'lik sayı sistemi arasında yapılacak dönüşümlerin çok kolay bir biçimde yapılabilmesidir.
__________________ |
|||||||||||
|
|
| Konu Araçları | |
| Mod Seç | |
|
|
|
||||
| Konu | Konuyu Başlatan | Forum | Yanıt | Son Mesaj |
| Zirveye Tırmanma Yolları.... | rojda_06 | Genel Kültür | 6 | 20-05-2007 01:30 PM |
| Lübnan'a asker gönderilmesini onaylayan tezkere Meclis Genel Kurulu'ndan 340 oyla geç | Sumaye | Sınırsız Muhabbet Burada | 8 | 03-03-2007 04:37 PM |
| Yenİ Bİr Sayfa AÇilsin... | ||||