Bölüm 1.1: Bilgisayarlar

Java ile Nesne Yönelimli Programlama
Temel parçalarİkili sayılarİkiye tümleyenKesirli sayılar ASCII ve UnicodeDizgilerSaklanan programvon Neumann mimarisi
Sercan KÜLCÜ · Giresun Üniversitesi · Elektrik-Elektronik Mühendisliği

Giriş

Öğrenme Çıktıları

Donanım

İşlemci, bellek, disk ve veri yolunun görevini açıklamak; bir programın işlemcide Getir–Çöz–Yürüt döngüsüyle nasıl yürüdüğünü izlemek.

Sayılar

Sayıları ikili, sekizli, onaltılı ve ondalık tabanlar arasında çevirmek; ikili toplama ve ikiye tümleyen ile negatif sayıları hesaplamak.

Metin

ASCII, Unicode ve UTF-8 arasındaki farkı açıklamak; bir dizginin bellekte sayılarla nasıl temsil edildiğini göstermek.

Java ile bağlantı

byte ve int sınırlarını ve taşmayı ikiye tümleyenle açıklamak; Java'da tabanlarla çalışmak; assembly komutlarının makine koduna karşılığını göstermek.

Bilgisayarın Temelleri

Bir Bilgisayarın Temel Parçaları

  • İşlemci (CPU, Central Processing Unit): bilgisayarın “beyni”; tüm aritmetik ve mantıksal hesaplamaları yapar.
  • Bellek (RAM, Random Access Memory): çalışan programı ve verilerini geçici olarak saklar. Kapasitesi ve erişim hızı, bilgisayarın hızını doğrudan etkiler.
  • Sabit disk (HDD / SSD): verileri kalıcı olarak saklar; elektrik kesilince silinmez.
Sabit DiskSSD / HDDBellekRAMİşlemciCPUkalıcı · büyükyavaşgeçici · ortahızlıhesaplarkarar verirprogram ve veri yüklenir →
Mutfak benzetmesi: aşçı = işlemci, tezgâh = RAM (küçük ama hemen elinin altında), kiler = disk (büyük ama uzakta). Aşçı malzemeyi kilerden tezgâha alır, orada çalışır.

Bilgisayarın Temelleri

Bilgisayarın İşleyişi ve Programlama

Temel adımlar:

  1. İşlemciye talimatlar (komutlar) gönderilir.
  2. İşlemci talimatları sırayla işler.
  3. Sonuçlar kullanıcıya veya diğer yazılımlara sunulur.

Programlama, bilgisayarın istenen görevi yerine getirmesi için ona anlayacağı biçimde talimatlar yazma sürecidir.

İlk Java programımız: tek bir talimat, “ekrana yaz”.

public class MerhabaDunya {
    public static void main(String[] args) {
        System.out.println("Merhaba, Dünya!");
    }
}

Çıktı:

Merhaba, Dünya!

Java gibi bir dilde yazılan talimatlar, işlemcinin anladığı makine koduna çevrilerek çalıştırılır.

Bilgisayarın Temelleri

Bir Bilgisayar Nasıl İnşa Edilir?

Bilgisayarı katman katman kuracağız. Her katman bir alttakinin üzerine oturur:

  • Önce elektrik sinyallerini sayılara dönüştürürüz.
  • Sayılarla harfleri, harflerle metinleri temsil ederiz.
  • Sayı dizileriyle resim, ses ve film gibi yapılandırılmış bilgiyi saklarız.
  • Komutları da sayı olarak bellekte saklarız.
  • Hepsini von Neumann mimarisi bir araya getirir.
1. SayılarNumbers2. Harf ve DizgilerLetters and Strings3. Yapılandırılmış BilgiStructured Information4. Saklanan Program KavramıStored Program Concept5. von Neumann Mimarisivon Neumann Architecture

Sayılar

Elektrik Sinyalinden Bite

  • Bilgisayarın temel işi, elektrik sinyallerini belirli kurallara göre işlemektir; bu kurallar sayesinde pek çok işlev gerçekleşir.
  • Sinyalleri insanın anlayacağı sayı ve sembollerle ilişkilendirince bilgisayar bize anlamlı bilgi sunabilir.
  • Sinyaller ikili (binary, taban 2) temsille işlenir: her basamak, yani bit (binary digit), yalnızca 0 ya da 1 olabilir.
  • Bütün işlemler bu ikili temelin üzerine inşa edilmiştir.
  • voltajeşik01101011yüksekdüşük
01
Yanlış (false)Doğru (true)
KapalıAçık
Düşük voltajYüksek voltaj
Neden iki durum? Bir telde “voltaj var / yok” ayrımını gürültüye rağmen güvenle yapmak, on farklı voltaj düzeyini ayırt etmekten çok daha kolaydır.

8 bit = 1 bayt (byte). Bellek ve dosya boyutları bayt ile ölçülür: 1 KB ≈ 1000 bayt, 1 KiB = 1024 bayt.

Sayılar

Basamak Değeri: 13 = 1101₂

  • Tam sayılar, 2'nin kuvvetlerinin toplamı olarak yazılır. Her kuvvet 0 ya da 1 kez kullanılır.
  • 4 ardışık kuvvetle (2⁰, 2¹, 2², 2³) 0–15 arasındaki tam sayılar temsil edilir.
  • 13₁₀ = 1·2³ + 1·2² + 0·2¹ + 1·2⁰ = 1101₂

Diğer tabanlarda aynı kural:

Ondalık (10)603₁₀ = 6·10² + 0·10¹ + 3·10⁰
Sekizli (8)207₈ = 2·8² + 0·8¹ + 7·8⁰ = 135₁₀
Onaltılı (16)FF₁₆ = 15·16¹ + 15·16⁰ = 255₁₀
2³ = 811·88+2² = 411·44+2¹ = 200·20+2⁰ = 111·118 + 4 + 0 + 1 = 13

Alt simge tabanı gösterir: 1101₂ “bir bir sıfır bir, ikili” diye okunur, “bin yüz bir” diye değil.

Sayılar

Herhangi Bir Taban ve Bit Sınırları

  • Taban b ≥ 2 ve d basamak ile 0 ile bd − 1 arasındaki her tam sayı yazılabilir.
  • Basamakların alabileceği değerler: 0, 1, …, b − 1 (ikilide 0–1, sekizlide 0–7, onaltılıda 0–9 ve A–F).
  • 64 bitlik bir bilgisayar, işaretsiz olarak 2⁶⁴ − 1 = 18.446.744.073.709.551.615'e kadar sayabilir.
BitEn büyük (2d − 1)
415
8255
1665.535
324.294.967.295

Java'nın tam sayı tipleri işaretlidir: bitlerin yarısı negatiflere ayrılır.

System.out.println(Byte.MAX_VALUE);    // 8 bit
System.out.println(Short.MAX_VALUE);   // 16 bit
System.out.println(Integer.MAX_VALUE); // 32 bit
System.out.println(Long.MAX_VALUE);    // 64 bit
// 64 bitin hepsi 1, işaretsiz okunursa:
System.out.println(Long.toUnsignedString(-1L));

Çıktı:

127
32767
2147483647
9223372036854775807
18446744073709551615

Sayılar · Adım adım kod izleme

Ondalıktan İkiliye: 2'ye Bölme Yöntemi

sayi÷ 2kalanikili""

sayi = 13 ile başlıyoruz.

sayi÷ 2kalanikili""

Sonuç dizgisi boş başlar: ikili = "".

sayi÷ 2kalanikili""

Koşul 13 > 0 doğru → döngüye gir.

sayi÷ 2kalan13→ 61ikili""

Kalan 13 % 2 = 1; bu, sayının en sağdaki henüz yazılmamış bitidir.

sayi÷ 2kalan13→ 61ikili1

Kalan dizginin önüne eklenir → "1"; sayı yarıya iner: 13 / 2 = 6 (tam sayı bölmesi).

sayi÷ 2kalan13→ 61ikili1

Koşul 6 > 0 doğru → döngüye gir.

sayi÷ 2kalan13→ 616→ 30ikili1

Kalan 6 % 2 = 0; bu, sayının en sağdaki henüz yazılmamış bitidir.

sayi÷ 2kalan13→ 616→ 30ikili01

Kalan dizginin önüne eklenir → "01"; sayı yarıya iner: 6 / 2 = 3 (tam sayı bölmesi).

sayi÷ 2kalan13→ 616→ 30ikili01

Koşul 3 > 0 doğru → döngüye gir.

sayi÷ 2kalan13→ 616→ 303→ 11ikili01

Kalan 3 % 2 = 1; bu, sayının en sağdaki henüz yazılmamış bitidir.

sayi÷ 2kalan13→ 616→ 303→ 11ikili101

Kalan dizginin önüne eklenir → "101"; sayı yarıya iner: 3 / 2 = 1 (tam sayı bölmesi).

sayi÷ 2kalan13→ 616→ 303→ 11ikili101

Koşul 1 > 0 doğru → döngüye gir.

sayi÷ 2kalan13→ 616→ 303→ 111→ 01ikili101

Kalan 1 % 2 = 1; bu, sayının en sağdaki henüz yazılmamış bitidir.

sayi÷ 2kalan13→ 616→ 303→ 111→ 01ikili1101

Kalan dizginin önüne eklenir → "1101"; sayı yarıya iner: 1 / 2 = 0 (tam sayı bölmesi).

sayi÷ 2kalan13→ 616→ 303→ 111→ 01okuikili1101

Koşul 0 > 0 yanlış → döngü biter. Kalanlar aşağıdan yukarı okunur.

sayi÷ 2kalan13→ 616→ 303→ 111→ 01okuikili1101

Sonuç yazdırılır: 13₁₀ = 1101₂.

public static void main(String[] args) {
  int sayi = 13;
  String ikili = "";
  while (sayi > 0) {
    int kalan = sayi % 2;
    System.out.println(sayi + " % 2 = " + kalan);
    ikili = kalan + ikili;
    sayi = sayi / 2;
  }
  System.out.println("Sonuç: " + ikili);
}

Sayılar

Java'da Taban Dönüşümleri

System.out.println(Integer.toBinaryString(13));  // ikili
System.out.println(Integer.toOctalString(135));  // sekizli
System.out.println(Integer.toHexString(255));    // onaltılı
System.out.println(Integer.parseInt("1101", 2)); // 2 → 10
System.out.println(Integer.parseInt("207", 8));  // 8 → 10
System.out.println(0b1101 + " " + 0207 + " " + 0xFF);

Çıktı:

1101
207
ff
13
135
13 135 255
0b önekiİkili sabit: 0b1101 = 13 (Java 7+).
0 önekiSekizli sabit: 0207 = 135. 010 on değil, 8'dir!
0x önekiOnaltılı sabit: 0xFF = 255. Renk ve bayt değerlerinde sık kullanılır.

Sayılar

Toplama Her Tabanda Aynı Kurallarla Yapılır

Hangi taban kullanılırsa kullanılsın geçerli ilkeler: basamak değerleri, elde (taşıma, carry) ve doğru sonuç.

¹
57
+28
85

Onlukta 7 + 8 = 15 → 5 yaz, 1 elde. İkilide 1 + 1 = 2 = 10₂ → 0 yaz, 1 elde.

elde5728850000101111010010+

İki sayıyı alt alta yazarız: 57 = 00111001₂ ve 28 = 00011100₂. Toplama sağdan başlar.

elde57288500001011110100101+

Sütun 1: 1 + 0 = 1 → 1 yaz, elde yok.

elde572885000010111101000101+

Sütun 2: 0 + 0 = 0 → 0 yaz, elde yok.

elde5728850000101111011000101+

Sütun 3: 0 + 1 = 1 → 1 yaz, elde yok.

elde572885000010111110011000101+

Sütun 4: 1 + 1 = 2 = 10₂ → 0 yaz, 1 elde.

elde57288500001101111110011000101+

Sütun 5: 1 + 1 + 1 (elde) = 3 = 11₂ → 1 yaz, 1 elde.

elde5728850010011001111110011000101+

Sütun 6: 1 + 0 + 1 (elde) = 2 = 10₂ → 0 yaz, 1 elde.

elde57288500100111001111110011000101+

Sütun 7: 0 + 0 + 1 (elde) = 1 → 1 yaz, elde yok.

elde572885000100111001111110011000101+

Sütun 8: 0 + 0 = 0 → 0 yaz, elde yok. Sonuç: 01010101₂ = 64 + 16 + 4 + 1 = 85 ✓

Sayılar

Negatif Sayılar: İkiye Tümleyen

  • Negatif tam sayılar genellikle ikiye tümleyen (two's complement) ile temsil edilir.
  • Kural: pozitif sayının bitlerini ters çevir, sonra 1 ekle.
  • En soldaki bit işaret biti gibi davranır: 0 → pozitif, 1 → negatif.
  • 8 bitle aralık: −128 … 127. n bitle: −2n−1 … 2n−1 − 1.
+300000011

8 bitlik bir bilgisayarda 3 sayısı: 00000011.

+300000011ters çevir11111100

1. adım: bütün bitler ters çevrilir (0 ↔ 1): 00000011 → 11111100 (birler tümleyeni).

+300000011ters çevir11111100+1 → −311111101

2. adım: 1 eklenir: 11111100 + 1 → 11111101. Bu, −3'ün temsilidir.

+300000011ters çevir11111100+1 → −311111101Sağlama: 00000011 + 11111101 = 1 000000009. bit sığmaz, atılır → 00000000 = 0 ✓

Neden işe yarar? 3 + (−3) toplandığında taşan 9. bit atılır ve sonuç tam olarak 0 olur: toplama devresi aynen kullanılır.

+300000011ters çevir11111100+1 → −311111101−1286432168421−128 + 64 + 32 + 16 + 8 + 4 + 1 = −3

Başka bir bakış: en soldaki bitin ağırlığı −128'dir. Bu yüzden en soldaki bit 1 ise sayı negatiftir.

Sayılar

Java'da İkiye Tümleyen ve Taşma

int sayi = 3;
int eksi = ~sayi + 1; // ters çevir, 1 ekle
System.out.println(eksi);
byte b = (byte) 0b11111101;
System.out.println(b);
System.out.println(Integer.toBinaryString(-3));
System.out.println(Byte.MIN_VALUE + " .. "
    + Byte.MAX_VALUE);
-3
-3
11111111111111111111111111111101
-128 .. 127
byte b = 127;
b++;
System.out.println(b);
int m = Integer.MAX_VALUE;
System.out.println(m + 1);
System.out.println(Math.addExact(m, 1));
-128
-2147483648
Exception in thread "main"
  java.lang.ArithmeticException:
  integer overflow
Taşma (overflow): sonuç tipin aralığına sığmazsa Java hata vermez, sayı “saat gibi” başa sarar: 127 + 1 → −128. Kontrollü toplama için Math.addExact kullanılır.

Sayılar

Çok Büyük ve Çok Küçük Sayılar: Kayan Nokta

  • Sınırlı sayıda rakamla ancak sınırlı sayıda değer temsil edilebilir.
  • Çok büyük / küçük sayılar için sayı kesir (mantis) ve üs olarak iki parçaya ayrılır; parçalar ayrı ayrı saklanır.
  • Örnek: 8 rakamlık 31415901 gösteriminde ilk altı rakam (314159) kesri, son iki rakam (01) 10'un kuvvetini, yani 10¹'i belirtir.
  • Bilgisayarlar aynı fikri ikili tabanda uygular: IEEE 754 standardı. Java'da float 32 bit, double 64 bittir.
31415901kesir (6 rakam)üs (2)0.314159 × 10¹ = 3.14159double (64 bit):111 bit üs52 bit kesir±

Adı buradan gelir: “kayan nokta” (floating point), üs değiştikçe ondalık noktanın yerinin kaymasıdır: 0.314159 × 10³ = 314.159.

Sayılar

Bitlerle Etkileşimli Deney

Bir bite tıklanınca 0 ↔ 1 olur. −3 için: 3 → ters çevir → +1. İşaretli değer, en soldaki bitin ağırlığı −128 sayılarak bulunur.

Harf ve Dizgiler

Harfleri Sayılarla Temsil Etmek: ASCII

  • Metin işlemek için her harfe bir sayı karşılık getirilmelidir: buna karakter kodlaması (character encoding) denir.
  • ASCII (American Standard Code for Information Interchange), 1963'te ABD standartlar kurumu ASA (bugünkü ANSI) tarafından yayımlanmıştır.
  • Büyük ve küçük harfleri, rakamları, noktalama ve özel karakterleri sayıyla temsil eder.
  • 7 bitlik bir koddur: 128 karakter (0–127). 0–31 ve 127 kontrol karakteri, 32–126 yazdırılabilir.
  • 8 bitlik genişletmeler (örneğin Türkçe için ISO 8859-9, Windows-1254) 128–255 arasına ek harfler koyarak 256 sembole çıkar.
  • Tek bir 8 bitlik tablo, dünyanın tüm dillerine yetersizdir.
KarakterOndalıkİkili
'A'651000001
'a'971100001
'0'480110000
boşluk320100000
yeni satır \n100001010
Küçük harf = büyük harf + 32. İkilide fark yalnızca tek bir bittir (2⁵).

Harf ve Dizgiler

ASCII Tablosu: Yazdırılabilir Karakterler

+0123456789101112131415
32SP32!33"34#35$36%37&38'39(40)41*42+43,44-45.46/47
48048149250351452553654755856957:58;59<60=61>62?63
64@64A65B66C67D68E69F70G71H72I73J74K75L76M77N78O79
80P80Q81R82S83T84U85V86W87X88Y89Z90[91\92]93^94_95
96`96a97b98c99d100e101f102g103h104i105j106k107l108m109n110o111
112p112q113r114s115t116u117v118w119x120y121z122{123|124}125~126DEL127

Kod = satır + sütun. Örnek: 'J' = 64 + 10 = 74. Her hücrede üstte karakter, altta ondalık kod.

0–31: kontrol karakterleri; ör. 9 sekme (\t), 10 yeni satır (\n), 13 satır başı (\r). Tablonun tamamı: ASCII tablosu.

Harf ve Dizgiler

Bütün Diller İçin Tek Tablo: Unicode

  • Unicode, dünyadaki tüm yazı sistemlerinin harf, sembol ve işaretlerine birer numara (kod noktası, code point) verir: U+0041 = A, U+00E7 = ç.
  • Unicode Konsorsiyumu tarafından geliştirilir (1991); uluslararası karşılığı ISO/IEC 10646 ile eş zamanlı tutulur.
  • İlk sürüm 16 bitlikti (65.536 karakter). Bu yetmeyince alan U+10FFFF'e genişletildi: 1.114.112 kod noktası, bugün 150.000'den fazla karakter.
  • Her karakteri sabit 32 bitle (UTF-32) saklamak, İngilizce gibi metinlerde gereğinden fazla yer harcar. Bu yüzden UTF (Unicode Transformation Format) kodlamaları tanımlanmıştır.
Kar.Kod noktasıOndalıkUTF-8 baytları
AU+00416541
çU+00E7231C3 A7
ğU+011F287C4 9F
€U+20AC8364E2 82 AC
😀U+1F600128512F0 9F 98 80

İlk 128 kod noktası ASCII ile birebir aynıdır.

Harf ve Dizgiler

UTF-8: Değişken Uzunluklu Kodlama

  • Sık kullanılan karakterler az, nadir olanlar çok bayt kullanır: 1–4 bayt.
  • ASCII metin UTF-8'de de aynen geçerlidir (geriye uyumlu). Bugün web sayfalarının çok büyük bölümü UTF-8'dir.
  • İlk baytın başındaki bitler, karakterin kaç bayt süreceğini söyler.
  • UTF-16 çoğu karakteri 2 baytla yazar (ş = 01 5F, € = 20 AC); Java'nın char tipi bir UTF-16 birimidir.
Kod noktasıBayt kalıbı
U+0000–U+007F0xxxxxxx
U+0080–U+07FF110xxxxx 10xxxxxx
U+0800–U+FFFF1110xxxx 10xxxxxx ×2
U+10000–U+10FFFF11110xxx 10xxxxxx ×3
U+00E7 = 231 = 00011 100111 (11 bit)1100001110100111C3A7renkli: kalıp bitleri · diğerleri: kod noktasının bitleri
String kelime = "çikolata";
System.out.println(kelime.length());
System.out.println(kelime.getBytes(
    StandardCharsets.UTF_8).length);

Çıktı:

8
9

Harf ve Dizgiler

Emoji de Bir Karakterdir

  • Duygu, ifade ve nesneleri hızlıca aktaran simgelerdir; bilgisayar onları metin olarak işler.
  • Standartları Unicode Konsorsiyumu belirler: her emoji benzersiz bir kod noktasıdır, ör. 😀 = U+1F600.
  • Bazı emojiler birden çok kod noktasının birleşimidir: 👨‍👩‍👧 = adam + ZWJ + kadın + ZWJ + kız (5 kod noktası; ZWJ: sıfır genişlikli birleştirici).
  • Kod her cihazda aynıdır, böylece emoji doğru anlaşılır; ama çizimi (glif) üreticiye göre farklı görünebilir.
String yuz = "😀";
System.out.println(yuz.length());
System.out.println(
    yuz.codePointCount(0, yuz.length()));
String aile = "👨‍👩‍👧";
System.out.println(aile.length());

Çıktı:

2
1
8
Java String'i karakterleri UTF-16 ile saklar: char 16 bittir, U+FFFF'in üstündeki karakterler iki char (vekil çift, surrogate pair) tutar. Bu yüzden length() “karakter sayısı” değil, char sayısıdır.

Harf ve Dizgiler · Adım adım kod izleme

Dizginin Karakter Kodlarını Yazdırmak

8uzunluk0ç1i2k3o4l5a6t7a

Dizgi bellekte karakter dizisi ve uzunluk olarak durur.

8uzunluk0ç2311i2k3o4l5a6t7a

i = 0: charAt(0) = 'ç'; (int) dönüşümü kodunu verir: 231. (Unicode U+00E7)

8uzunluk0ç2311i1052k3o4l5a6t7a

i = 1: charAt(1) = 'i'; (int) dönüşümü kodunu verir: 105.

8uzunluk0ç2311i1052k1073o4l5a6t7a

i = 2: charAt(2) = 'k'; (int) dönüşümü kodunu verir: 107.

8uzunluk0ç2311i1052k1073o1114l5a6t7a

i = 3: charAt(3) = 'o'; (int) dönüşümü kodunu verir: 111.

8uzunluk0ç2311i1052k1073o1114l1085a6t7a

i = 4: charAt(4) = 'l'; (int) dönüşümü kodunu verir: 108.

8uzunluk0ç2311i1052k1073o1114l1085a976t7a

i = 5: charAt(5) = 'a'; (int) dönüşümü kodunu verir: 97.

8uzunluk0ç2311i1052k1073o1114l1085a976t1167a

i = 6: charAt(6) = 't'; (int) dönüşümü kodunu verir: 116.

8uzunluk0ç2311i1052k1073o1114l1085a976t1167a97

i = 7: charAt(7) = 'a'; (int) dönüşümü kodunu verir: 97.

8uzunluk0ç2311i1052k1073o1114l1085a976t1167a97

i = 8: koşul 8 < 8 yanlış → döngü biter.

8uzunluk0ç2311i1052k1073o1114l1085a976t1167a97

Satır sonu ve uzunluk yazdırılır: length() = 8.

String kelime = "çikolata";
for (int i = 0; i < kelime.length(); i++) {
  char ch = kelime.charAt(i);
  System.out.print((int) ch + " ");
}
System.out.println();
System.out.println("Uzunluk: " + kelime.length());

Dizginin uzunluğu ayrıca tutulur, metnin nerede bittiği böyle bilinir. “ç” ASCII'de yoktur: 231 onun Unicode kod noktasıdır (U+00E7); aynı değer Latin-1 ve Türkçe ISO 8859-9 tablolarında da 231'dir.

Harf ve Dizgiler

Karakter Kodları: Etkileşimli Deney

Her kutu: karakter · kod noktası (ondalık ve U+onaltılı) · UTF-8 baytları. Renkli kutular ASCII dışıdır. İlk 12 kod noktası gösterilir.

Yapılandırılmış Bilgi

Her Türlü Bilgi Sayılarla Temsil Edilir

Sayı dizileri, bilgiyi saklamamızı ve bilgisayarla etkileşim kurmamızı sağlar.

0,0,00,0,2550,0,0255,255,2550,0,255255,255,2550,0,00,0,2550,0,0Resim: piksel = (R, G, B)Ses: basınç örnekleriFilm: saniyede 24–30 karekare 1kare 2kare 3kare 4
ResimlerHer piksel kırmızı, yeşil, mavi miktarını veren üç sayıdır (0–255). Mavi piksel: (0, 0, 255).
SeslerHavadaki ses basıncı zaman içinde düzenli aralıklarla ölçülür (örnekleme); CD kalitesi saniyede 44.100 örnek.
FilmlerSaniyede 24 veya 30 kare hızında ardışık resimler; her kare, resim gibi sayı dizisidir.

Yapılandırılmış Bilgi

Örnek: Bir Video Ne Kadar Yer Tutar?

long piksel = 1920L * 1080;  // Full HD bir kare
long kare = piksel * 3;      // R, G, B: 3 bayt
long saniye = kare * 30;     // saniyede 30 kare
System.out.println("Piksel: " + piksel);
System.out.println("Kare (bayt): " + kare);
System.out.println("1 saniye (bayt): " + saniye);
System.out.println("1 dakika (MB): "
    + saniye * 60 / 1_000_000);
// 44,1 kHz, 16 bit (2 bayt), stereo, 1 dakika
long ses = 44_100L * 2 * 2 * 60;
System.out.println("1 dk CD sesi (bayt): " + ses);

Çıktı:

Piksel: 2073600
Kare (bayt): 6220800
1 saniye (bayt): 186624000
1 dakika (MB): 11197
1 dk CD sesi (bayt): 10584000
Sıkıştırmasız bir dakikalık Full HD video ≈ 11 GB! Gerçekte video ve ses sıkıştırılarak (H.264, MP3…) saklanır; ama sıkıştırılmış dosya da yine bir sayı dizisidir. Not: 1920L yazımı çarpımı long tipinde yapar; büyük sonuçlar int'e sığmaz.

Saklanan Program

Saklanan Program Kavramı

  • Modern bilgisayarların temel ilkesidir: komutlar da veriler gibi sayıdır ve aynı bellekte saklanır.
  • Bellekte saklanan komutlar ve veriler birlikte programı oluşturur. Her komut bir görevi veya işlemi temsil eder.
  • Komutlar ardışık olarak işlenir.
  • Bir koşul sağlandığında program farklı bir komuta atlayabilir; böylece programlar duruma göre farklı yollar izler (ileride if ve döngüler bunu kullanır).
  • 200LOAD201ADD202STORE203HALT204102205252060komutlarveriler

ENIAC (1945)

  • Program, kablolar ve anahtarlarla elle kurulur.
  • Yeni bir program için günlerce yeniden kablolama.

EDVAC tasarımı (1945)

  • Komutlar ve veriler bellekte sıralı saklanır.
  • Program değiştirmek = belleğe yeni sayılar yazmak: esnek ve genişletilebilir.

Fikri J. von Neumann'ın 1945 tarihli EDVAC raporu yaydı; saklanan programı ilk çalıştıran makine Manchester “Baby” oldu (1948).

Saklanan Program

Bellek Hiyerarşisi

  • Bellek, çalışan programların ve verilerin geçici olarak saklandığı yerdir.
  • L1 önbellek (cache): en hızlısı, işlemcinin içinde.
  • L2 önbellek: L1'i destekler, daha büyüktür. Çoğu işlemcide bir de L3 vardır.
  • Ana bellek (RAM): çok daha büyük ama daha yavaş.
  • İşlemciye yakın bellek daha hızlı ama daha küçük ve pahalıdır; hiyerarşi performansı doğrudan etkiler.
Yazmaçlarbayt · < 1 nsL1 önbellek32–64 KB · ~1 nsL2 önbellek256 KB–2 MB · ~4 nsL3 önbellek8–64 MB · ~15 nsAna bellek (RAM)8–64 GB · ~80 nsDisk (SSD / HDD)TB · µs–msdahahızlı

Boyut ve süreler yaklaşık değerlerdir, işlemciye göre değişir. 1 ns = saniyenin milyarda biri.

Saklanan Program

İşlemci (CPU) ve Veri Yolu (Bus)

Merkezî İşlem Birimi (CPU)

  • Bilgisayarın “beyni”; tüm hesaplamalar burada yapılır.
  • Aritmetik Mantık Birimi (ALU, Arithmetic Logic Unit): toplama, çıkarma, karşılaştırma gibi hesapları yapar.
  • Kontrol Birimi (Control Unit): komutları yorumlar, işlemleri sıraya koyar ve yönlendirir.
  • Yazmaçlar (register): geçici veriler için çok küçük ama çok hızlı saklama alanları.

Veri Yolu (Bus)

  • Birçok paralel telden oluşan bir iletişim yolu sistemidir.
  • Adres sinyalleri: hangi bellek hücresine veya aygıta erişileceğini seçer.
  • Veri sinyalleri: işlenecek ya da saklanacak asıl veriyi taşır.
  • Kontrol sinyalleri: işlemi yönlendirir; ör. “oku” mu “yaz” mı.
CPUALUKontrolYazmaçhesap · yönetim · hızlı saklamaadres yoluveri yolukontrol yoluBellekG/Ç aygıtları
Elektronik bağlantısı: 32 hatlı bir adres yolu 2³² farklı adres seçebilir → 4 GiB bellek. Bu yüzden 32 bitlik sistemler en fazla yaklaşık 4 GB RAM kullanabiliyordu.

Saklanan Program

CPU – Bellek – Veri Yolu – Yazmaçlar

Ana Bellek (RAM)0i = 71j = 912k = j + 1003l = i * kMerkezî İşlem Birimi (CPU)Kontrol BirimiYazmaçlarPC0IR—R1—R2—AC—ALU+ − × ÷sonuçAdres yoluVeri yolukontrol: oku / yaz
  • CPU, adres yolundan hangi hücreyi istediğini söyler.
  • Hücrenin içeriği veri yolundan gelir (okuma) ya da gider (yazma).
  • PC (program sayacı): sıradaki komutun adresi.
  • IR (komut yazmacı): o an çözülen komut.
  • R1, R2, AC (akümülatör): ara sonuçlar.
  • ALU yazmaçlardaki sayılarla hesap yapar.

Saklanan Program

Bellek, Adresler ve Program Sayacı

  • Bellek, veri ve talimatların saklandığı alandır; bir program uzun bir talimat listesidir.
  • Her bellek hücresinin bir adresi vardır; hücrede bir talimatın ya da verinin sayıyla kodlanmış hali bulunur.
  • Talimatlar bellekten tek tek alınıp işlemcideki yazmaçlara yüklenir ve sırayla çalıştırılır.
  • En önemli yazmaçlardan biri program sayacıdır (PC, program counter): sıradaki talimatın adresini tutar.
  • İşlemci normalde adres sırasıyla ilerler; ama bazı talimatlar bu sırayı değiştirir: 204'teki “JUMP 7” PC'yi 211 yapar.
AdresİçerikTür
200ADD to R1talimat
201102veri
202…
203…
204JUMP 7talimat (atla)
……
211sonraki talimattalimat

Bellek hücresi talimat mı veri mi, ona bakarak anlaşılmaz: ikisi de sayıdır. Fark, işlemcinin o hücreyi nasıl kullandığıdır.

Saklanan Program

Getir–Çöz–Yürüt Döngüsü

Getir–Çöz–Yürüt (Fetch–Decode–Execute) döngüsü, programların işlemcide nasıl yürütüldüğünü tanımlar.

  1. Getir (Fetch): işlemci, PC'nin gösterdiği adresteki sıradaki komutu bellekten alır; PC bir sonraki adrese ilerler.
  2. Çöz (Decode): komut çözülür: hangi işlem, hangi yazmaçlar, hangi adres? Her komutun belirli bir işlevi vardır.
  3. Yürüt (Execute): komutun gerektirdiği işlem yapılır: veri işleme, sonuç hesaplama ya da bir işlemi başlatma.

Ardından bir sonraki komut alınır ve döngü, bilgisayar açık olduğu sürece sürekli tekrarlanır.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

3 GHz'lik bir işlemcinin saati saniyede 3 milyar kez “tık” eder; modern işlemciler birden çok komutu üst üste bindirerek (boru hattı, pipeline) işler.

Saklanan Program · Adım adım

Oyuncak Bir Bilgisayarda 102 + 25

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Program ve veriler bellekte. Başlangıçta PC = 200.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Getir: 200'deki komut IR'ye alınır, PC 201'e ilerler.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Çöz: işlem = LOAD (yükle), hedef = R1, adres = 205.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Yürüt: bellek[205] = 102 okunur, R1'e yazılır.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Getir: PC = 201'deki komut alınır, PC 202 olur.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Çöz: işlem = ADD (topla), R1 ile bellek[206] toplanacak.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Yürüt: ALU 102 + 25 = 127 hesaplar, sonuç R1'e.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Getir: 202'deki STORE alınır, PC 203 olur.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Çöz: R1'in değeri 207 adresine yazılacak (kontrol yolu: “yaz”).

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Yürüt: bellek[207] ← 127. Sonuç artık bellekte.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Getir: 203'teki HALT alınır, PC 204 olur.

GetirFetchYürütExecuteÇözDecodesüreklitekrar

Çöz + Yürüt: HALT → işlemci durur. Java'daki toplam = a + b; satırı da sonunda bu tür komutlara dönüşür.

200: LOAD  R1, [205] ; R1 ← bellek[205]
201: ADD   R1, [206] ; R1 ← R1 + bellek[206]
202: STORE R1, [207] ; bellek[207] ← R1
203: HALT            ; dur
204: ...
205: 102             ; veri
206: 25              ; veri
207: 0               ; sonuç buraya

von Neumann Mimarisi

von Neumann Mimarisi

  • Saklanan program fikrinin donanım planıdır: işlemci, bellek, giriş/çıkış ve bunları bağlayan veri yolu.
  • Komutlar ve veriler aynı bellekte durur ve aynı yoldan taşınır.
  • Her komut bir işlem kodu (opcode) ile temsil edilir; işlem kodu hangi işlemin yapılacağını belirtir.
  • Tek yol, işlemciyi bekletebilir: von Neumann darboğazı. Önbellekler bu yüzden vardır.
İşlemci (CPU)Kontrol BirimiALUYazmaçlarPC · IR · R0–R3Girişklavye, sensörÇıkışekran, motorBellekkomutlar + veriler (tek bellek)veri yolu (darboğaz)

Karşılaştırma: Harvard mimarisinde komut ve veri belleği ayrıdır; Arduino'daki AVR gibi pek çok mikrodenetleyici bu yapıyı kullanır.

von Neumann Mimarisi

Komutlar da Sayıdır: Kodlama

Bir oyuncak bilgisayar düşünelim: 8 bit, 4 yazmaç (R0–R3), 256 adet 8 bitlik bellek hücresi ve 4 komut: toplama (00), çıkarma (01), çarpma (10), bölme (11).

  • İlk 2 bit işlem kodu (4 komut → 2 bit).
  • Sonraki 2 bit hedef yazmaç (destination register).
  • Son 4 bit, iki işlenen yazmaç (2'şer bit).

“R0 ile R2'nin içeriğini topla, sonucu R3'e yaz” = 0 3 0 2 → 00110010

işlem kodu000 → toplahedef11R3kaynak 100R0kaynak 210R2

İşlemcinin “çöz” adımı Java'da: basamak değeriyle bölme!

int komut = 0b00110010;
int islemKodu = komut / 64;     // ilk 2 bit
int hedef = (komut / 16) % 4;   // sonraki 2 bit
int kaynak1 = (komut / 4) % 4;  // sonraki 2 bit
int kaynak2 = komut % 4;        // son 2 bit
System.out.println(komut);
System.out.println(islemKodu + " " + hedef
    + " " + kaynak1 + " " + kaynak2);

Çıktı:

50
0 3 0 2

von Neumann Mimarisi · Adım adım kod izleme

Komut Çözme: Kod İzleme

işlem koduhedefkaynak 1kaynak 200110010komutkomut = 5032 + 16 + 2 = 50

Komut 8 bitlik bir sayıdır: 00 11 00 10 = 50. Bitler dört ikili gruba ayrılır.

işlem koduhedefkaynak 1kaynak 200110010komutislemKodu = 0 → toplama50 / 64 = 0

64 = 2⁶ ile bölmek sağdaki 6 biti atar; geriye ilk 2 bit kalır: 00 = 0, yani toplama.

işlem koduhedefkaynak 1kaynak 200110010komuthedef = 3 → R350 / 16 = 3, 3 % 4 = 3

16 ile bölmek sağdaki 4 biti atar (0011 = 3); % 4 son 2 biti alır: 3 → R3.

işlem koduhedefkaynak 1kaynak 200110010komutkaynak1 = 0 → R050 / 4 = 12, 12 % 4 = 0

4 ile bölmek sağdaki 2 biti atar (001100 = 12); 12 % 4 = 0 → R0.

işlem koduhedefkaynak 1kaynak 200110010komutkaynak2 = 2 → R250 % 4 = 2

% 4 doğrudan son 2 biti verir: 10 = 2 → R2.

işlem koduhedefkaynak 1kaynak 200110010komutkomut = 50

Komut sayı olarak yazılır: 50.

işlem koduhedefkaynak 1kaynak 200110010komutR3 ← R0 + R2

Alanlar: 0 3 0 2. Yani 50 sayısı, işlemci için “R3 ← R0 + R2” komutudur.

int komut = 0b00110010;
int islemKodu = komut / 64;     // ilk 2 bit
int hedef = (komut / 16) % 4;   // sonraki 2 bit
int kaynak1 = (komut / 4) % 4;  // sonraki 2 bit
int kaynak2 = komut % 4;        // son 2 bit
System.out.println(komut);
System.out.println(islemKodu + " " + hedef
    + " " + kaynak1 + " " + kaynak2);

von Neumann Mimarisi

Assembly Dili

  • Assembly dili belirli bir işlemci mimarisine özeldir: x86 için yazılan kod ARM'da çalışmaz.
  • Her satır genellikle tek bir makine komutuna karşılık gelir.
  • Bilgisayarın alt düzeyde nasıl çalıştığını anlamak için önemlidir.
  • Performans optimizasyonu ve donanımla doğrudan etkileşim (sürücüler, gömülü sistemler) için kullanılır.
  • MOV AL, 61hçevirici (assembler)B0 61işlemci çalıştırırAL = 97
x86 komutuAnlamıMakine kodu
MOV AL, 61hAL yazmacına 61h (= 97) değerini taşıB0 61
MOV AX, BXBX'teki değeri AX'e kopyala66 89 D8
ADD EAX, 10EAX'e 10 ekle83 C0 0A
XOR EAX, EAXEAX'i sıfırla (x XOR x = 0)31 C0
61h = 0x61 = 97 = ASCII 'a'. Bellekteki bir bayt sayı mı, harf mi, komut mu? Bunu programın onu nasıl kullandığı belirler.

Özet

Özet

KonuHatırlanacaklar
ParçalarCPU hesaplar (ALU + kontrol birimi + yazmaçlar); RAM geçici, disk kalıcı; veri yolu: adres, veri, kontrol
İkili sayılarbit = 0/1, 8 bit = 1 bayt; d basamakla 0 … bd − 1; çevirme: 2'ye böl, kalanları aşağıdan yukarı oku
Negatiflerikiye tümleyen: ters çevir + 1; 8 bit: −128 … 127; sınır aşılırsa sessiz taşma
Kesirli sayılarkesir × tabanüs; IEEE 754 float/double; 0.1 + 0.2 ≠ 0.3
MetinASCII 7 bit / 128 karakter; Unicode kod noktaları (U+0000–U+10FFFF); UTF-8 1–4 bayt; Java char = 16 bit UTF-16
Yapılandırılmış bilgiresim = RGB piksel dizisi, ses = basınç örnekleri, film = kare dizisi
Saklanan programkomutlar da bellekte sayı; PC sıradaki adres; Getir–Çöz–Yürüt; atlama sırayı değiştirir
Düzeyleryüksek düzeyli dil → assembly → makine kodu (bitler); assembly işlemciye özel, her satırı genellikle tek komut

Özet

İlgili Sayfalar

ASCII Tablosu0–255 arası bütün karakterlerin ondalık, onaltılık, sekizlik ve ikilik kodları; karakter ya da kodla arama, ISO-8859-1 ve Windows-1254 görünümleri.

Özet

Sık Yapılan Hatalar

Aralık dışı sabitbyte b = 200; → error: incompatible types: possible lossy conversion from int to byte. byte en fazla 127'dir.
L ekini unutmaklong x = 3000000000; → error: integer number too large. Doğrusu: 3000000000L.
Karakter ile dizgiyi karıştırmakchar c = "A"; → error: incompatible types: String cannot be converted to char. Karakter tek tırnakla: 'A'.
Başta sıfırint x = 010; sekizlidir, değeri 8! int y = 08; ise derlenmez (error: ';' expected): sekizlide 8 rakamı yoktur.
Taşmayı fark etmemekInteger.MAX_VALUE + 1 hata vermez, −2147483648 olur. Büyük çarpımlarda long gerekir: 1920L * 1080.
Kesirlerde ==0.1 + 0.2 == 0.3 → false. Farkın küçüklüğüne bakılır. Ayrıca "😀".length() 1 değil 2'dir.

Özet

Örnek Problemler

  1. 45 sayısını 8 bit ikili olarak yazın.
  2. 10110110₂ işaretsiz olarak kaçtır? 8 bit ikiye tümleyen ile işaretli olarak kaçtır?
  3. −20'yi 8 bit ikiye tümleyen ile yazın.
  4. 0x3F ondalık, ikili ve sekizli olarak nedir?
  5. 01101101₂ + 00110110₂ toplamını bulun. Sonuç 8 bit işaretli byte olarak ne olur?
  6. System.out.println('a' + 'b'); ve System.out.println("" + 'a' + 'b'); ne yazdırır?
  7. Oyuncak bilgisayarda 10011100 komutu ne yapar?
Cevapları göster
  1. 45 = 32 + 8 + 4 + 1 → 00101101.
  2. 128 + 32 + 16 + 4 + 2 = 182; işaretli: −128 + 54 = −74 (= 182 − 256).
  3. 20 = 00010100 → ters 11101011 → +1 → 11101100 (= 236 = 256 − 20).
  4. 3·16 + 15 = 63; ikili 111111; sekizli 77.
  5. 109 + 54 = 163 = 10100011₂; byte olarak en soldaki bit 1 → −93 (taşma).
  6. 195 (97 + 98, iki char sayı olarak toplanır) ve ab (önce dizgi, sonra eklenir).
  7. 10 = çarpma, 01 = R1, 11 = R3, 00 = R0 → R1 ← R3 × R0.

Özet

Alıştırmalar

  1. 16 bitlik işaretli bir tam sayının (Java short) aralığı nedir?
  2. "Java" dizgisinin karakter kodlarını ondalık ve ikili olarak yazın.
  3. 1024 × 768 boyutlu, piksel başına 3 bayt kullanan sıkıştırmasız bir resim kaç bayttır?
  4. "ağaç" için length() ve UTF-8 bayt sayısı nedir?
  5. 0'dan 15'e kadar sayıları 4 basamaklı ikili olarak yazdıran bir Java programı yazın.
  6. 32 hatlı bir adres yolu kaç farklı bayt adresleyebilir?
Cevaplar / ipuçları
  1. −2¹⁵ … 2¹⁵ − 1 = −32768 … 32767 (Short.MIN_VALUE, Short.MAX_VALUE).
  2. J = 74 = 1001010, a = 97 = 1100001, v = 118 = 1110110, a = 97 = 1100001.
  3. 1024 · 768 · 3 = 2.359.296 bayt = 2,25 MiB.
  4. length() = 4; UTF-8: a(1) + ğ(2) + a(1) + ç(2) = 6 bayt.
  5. for (int i = 0; i < 16; i++) içinde String.format("%4s", Integer.toBinaryString(i)).replace(' ', '0') yazdırılır → 0000, 0001, …, 1111.
  6. 2³² = 4.294.967.296 bayt = 4 GiB.

Özet

Kaynaklar

  • D. A. Patterson ve J. L. Hennessy, Computer Organization and Design: The Hardware/Software Interface, RISC-V sürümü, 2. baskı, Morgan Kaufmann, 2020.
  • C. Petzold, Code: The Hidden Language of Computer Hardware and Software, 2. baskı, Microsoft Press, 2022.
  • A. B. Downey ve C. Mayfield, Think Java, 2. baskı, O'Reilly, 2019 (Bölüm 1).
  • Oracle, The Java Tutorials: “Primitive Data Types” ve “Characters”.
  • J. Gosling ve diğ., The Java Language Specification, Java SE 21, §3.10 (Sabitler) ve §4.2 (İlkel tipler).
  • The Unicode Consortium, The Unicode Standard, unicode.org; IEEE 754-2019, Standard for Floating-Point Arithmetic.
  • J. von Neumann, First Draft of a Report on the EDVAC, 1945.

Son

Bölüm 1.1: Bilgisayarlar
Sonraki bölüm: Bölüm 1.2: Hesaplama ve Hesaplamalı Düşünme · Terim sözlüğü
1 / 1 Sercan KÜLCÜ, Tüm hakları saklıdır.