Bölüm 1.1: Bilgisayarlar
Giriş
Öğrenme Çıktıları
İş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ı ikili, sekizli, onaltılı ve ondalık tabanlar arasında çevirmek; ikili toplama ve ikiye tümleyen ile negatif sayıları hesaplamak.
ASCII, Unicode ve UTF-8 arasındaki farkı açıklamak; bir dizginin bellekte sayılarla nasıl temsil edildiğini göstermek.
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.
Bilgisayarın Temelleri
Bilgisayarın İşleyişi ve Programlama
Temel adımlar:
- İşlemciye talimatlar (komutlar) gönderilir.
- İşlemci talimatları sırayla işler.
- 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.
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.
| 0 | 1 |
|---|---|
| Yanlış (false) | Doğru (true) |
| Kapalı | Açık |
| Düşük voltaj | Yüksek voltaj |
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₁₀ |
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.
| Bit | En büyük (2d − 1) |
|---|---|
| 4 | 15 |
| 8 | 255 |
| 16 | 65.535 |
| 32 | 4.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 = 13 ile başlıyoruz.
Sonuç dizgisi boş başlar: ikili = "".
Koşul 13 > 0 doğru → döngüye gir.
Kalan 13 % 2 = 1; bu, sayının en sağdaki henüz yazılmamış bitidir.
Kalan dizginin önüne eklenir → "1"; sayı yarıya iner: 13 / 2 = 6 (tam sayı bölmesi).
Koşul 6 > 0 doğru → döngüye gir.
Kalan 6 % 2 = 0; bu, sayının en sağdaki henüz yazılmamış bitidir.
Kalan dizginin önüne eklenir → "01"; sayı yarıya iner: 6 / 2 = 3 (tam sayı bölmesi).
Koşul 3 > 0 doğru → döngüye gir.
Kalan 3 % 2 = 1; bu, sayının en sağdaki henüz yazılmamış bitidir.
Kalan dizginin önüne eklenir → "101"; sayı yarıya iner: 3 / 2 = 1 (tam sayı bölmesi).
Koşul 1 > 0 doğru → döngüye gir.
Kalan 1 % 2 = 1; bu, sayının en sağdaki henüz yazılmamış bitidir.
Kalan dizginin önüne eklenir → "1101"; sayı yarıya iner: 1 / 2 = 0 (tam sayı bölmesi).
Koşul 0 > 0 yanlış → döngü biter. Kalanlar aşağıdan yukarı okunur.
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.
İki sayıyı alt alta yazarız: 57 = 00111001₂ ve 28 = 00011100₂. Toplama sağdan başlar.
Sütun 1: 1 + 0 = 1 → 1 yaz, elde yok.
Sütun 2: 0 + 0 = 0 → 0 yaz, elde yok.
Sütun 3: 0 + 1 = 1 → 1 yaz, elde yok.
Sütun 4: 1 + 1 = 2 = 10₂ → 0 yaz, 1 elde.
Sütun 5: 1 + 1 + 1 (elde) = 3 = 11₂ → 1 yaz, 1 elde.
Sütun 6: 1 + 0 + 1 (elde) = 2 = 10₂ → 0 yaz, 1 elde.
Sütun 7: 0 + 0 + 1 (elde) = 1 → 1 yaz, elde yok.
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.
8 bitlik bir bilgisayarda 3 sayısı: 00000011.
1. adım: bütün bitler ters çevrilir (0 ↔ 1): 00000011 → 11111100 (birler tümleyeni).
2. adım: 1 eklenir: 11111100 + 1 → 11111101. Bu, −3'ün temsilidir.
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.
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
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
float32 bit,double64 bittir.
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.
| Karakter | Ondalık | İkili |
|---|---|---|
'A' | 65 | 1000001 |
'a' | 97 | 1100001 |
'0' | 48 | 0110000 |
| boşluk | 32 | 0100000 |
yeni satır \n | 10 | 0001010 |
Harf ve Dizgiler
ASCII Tablosu: Yazdırılabilir Karakterler
| + | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 32 | SP32 | !33 | "34 | #35 | $36 | %37 | &38 | '39 | (40 | )41 | *42 | +43 | ,44 | -45 | .46 | /47 |
| 48 | 048 | 149 | 250 | 351 | 452 | 553 | 654 | 755 | 856 | 957 | :58 | ;59 | <60 | =61 | >62 | ?63 |
| 64 | @64 | A65 | B66 | C67 | D68 | E69 | F70 | G71 | H72 | I73 | J74 | K75 | L76 | M77 | N78 | O79 |
| 80 | P80 | Q81 | R82 | S83 | T84 | U85 | V86 | W87 | X88 | Y89 | Z90 | [91 | \92 | ]93 | ^94 | _95 |
| 96 | `96 | a97 | b98 | c99 | d100 | e101 | f102 | g103 | h104 | i105 | j106 | k107 | l108 | m109 | n110 | o111 |
| 112 | p112 | q113 | r114 | s115 | t116 | u117 | v118 | w119 | x120 | y121 | z122 | {123 | |124 | }125 | ~126 | DEL127 |
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ık | UTF-8 baytları |
|---|---|---|---|
| A | U+0041 | 65 | 41 |
| ç | U+00E7 | 231 | C3 A7 |
| ğ | U+011F | 287 | C4 9F |
| € | U+20AC | 8364 | E2 82 AC |
| 😀 | U+1F600 | 128512 | F0 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ınchartipi bir UTF-16 birimidir.
| Kod noktası | Bayt kalıbı |
|---|---|
| U+0000–U+007F | 0xxxxxxx |
| U+0080–U+07FF | 110xxxxx 10xxxxxx |
| U+0800–U+FFFF | 1110xxxx 10xxxxxx ×2 |
| U+10000–U+10FFFF | 11110xxx 10xxxxxx ×3 |
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
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
Dizgi bellekte karakter dizisi ve uzunluk olarak durur.
i = 0: charAt(0) = 'ç'; (int) dönüşümü kodunu verir: 231. (Unicode U+00E7)
i = 1: charAt(1) = 'i'; (int) dönüşümü kodunu verir: 105.
i = 2: charAt(2) = 'k'; (int) dönüşümü kodunu verir: 107.
i = 3: charAt(3) = 'o'; (int) dönüşümü kodunu verir: 111.
i = 4: charAt(4) = 'l'; (int) dönüşümü kodunu verir: 108.
i = 5: charAt(5) = 'a'; (int) dönüşümü kodunu verir: 97.
i = 6: charAt(6) = 't'; (int) dönüşümü kodunu verir: 116.
i = 7: charAt(7) = 'a'; (int) dönüşümü kodunu verir: 97.
i = 8: koşul 8 < 8 yanlış → döngü biter.
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.
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
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
ifve döngüler bunu kullanır).
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.
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ı.
Saklanan Program
CPU – Bellek – Veri Yolu – Yazmaçlar
- 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 | İçerik | Tür |
|---|---|---|
| 200 | ADD to R1 | talimat |
| 201 | 102 | veri |
| 202 | … | |
| 203 | … | |
| 204 | JUMP 7 | talimat (atla) |
| … | … | |
| 211 | sonraki talimat | talimat |
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.
- Getir (Fetch): işlemci, PC'nin gösterdiği adresteki sıradaki komutu bellekten alır; PC bir sonraki adrese ilerler.
- Çöz (Decode): komut çözülür: hangi işlem, hangi yazmaçlar, hangi adres? Her komutun belirli bir işlevi vardır.
- 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.
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
Program ve veriler bellekte. Başlangıçta PC = 200.
Getir: 200'deki komut IR'ye alınır, PC 201'e ilerler.
Çöz: işlem = LOAD (yükle), hedef = R1, adres = 205.
Yürüt: bellek[205] = 102 okunur, R1'e yazılır.
Getir: PC = 201'deki komut alınır, PC 202 olur.
Çöz: işlem = ADD (topla), R1 ile bellek[206] toplanacak.
Yürüt: ALU 102 + 25 = 127 hesaplar, sonuç R1'e.
Getir: 202'deki STORE alınır, PC 203 olur.
Çöz: R1'in değeri 207 adresine yazılacak (kontrol yolu: “yaz”).
Yürüt: bellek[207] ← 127. Sonuç artık bellekte.
Getir: 203'teki HALT alınır, PC 204 olur.
Çö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.
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
İş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
Komut 8 bitlik bir sayıdır: 00 11 00 10 = 50. Bitler dört ikili gruba ayrılır.
64 = 2⁶ ile bölmek sağdaki 6 biti atar; geriye ilk 2 bit kalır: 00 = 0, yani toplama.
16 ile bölmek sağdaki 4 biti atar (0011 = 3); % 4 son 2 biti alır: 3 → R3.
4 ile bölmek sağdaki 2 biti atar (001100 = 12); 12 % 4 = 0 → R0.
% 4 doğrudan son 2 biti verir: 10 = 2 → R2.
Komut sayı olarak yazılır: 50.
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.
| x86 komutu | Anlamı | Makine kodu |
|---|---|---|
MOV AL, 61h | AL yazmacına 61h (= 97) değerini taşı | B0 61 |
MOV AX, BX | BX'teki değeri AX'e kopyala | 66 89 D8 |
ADD EAX, 10 | EAX'e 10 ekle | 83 C0 0A |
XOR EAX, EAX | EAX'i sıfırla (x XOR x = 0) | 31 C0 |
'a'. Bellekteki bir bayt sayı mı, harf mi, komut mu? Bunu programın onu nasıl kullandığı belirler.Özet
Özet
| Konu | Hatırlanacaklar |
|---|---|
| Parçalar | CPU hesaplar (ALU + kontrol birimi + yazmaçlar); RAM geçici, disk kalıcı; veri yolu: adres, veri, kontrol |
| İkili sayılar | bit = 0/1, 8 bit = 1 bayt; d basamakla 0 … bd − 1; çevirme: 2'ye böl, kalanları aşağıdan yukarı oku |
| Negatifler | ikiye tümleyen: ters çevir + 1; 8 bit: −128 … 127; sınır aşılırsa sessiz taşma |
| Kesirli sayılar | kesir × tabanüs; IEEE 754 float/double; 0.1 + 0.2 ≠ 0.3 |
| Metin | ASCII 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ış bilgi | resim = RGB piksel dizisi, ses = basınç örnekleri, film = kare dizisi |
| Saklanan program | komutlar da bellekte sayı; PC sıradaki adres; Getir–Çöz–Yürüt; atlama sırayı değiştirir |
| Düzeyler | yüksek düzeyli dil → assembly → makine kodu (bitler); assembly işlemciye özel, her satırı genellikle tek komut |
Özet
İlgili Sayfalar
Özet
Sık Yapılan Hatalar
byte 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.char c = "A"; → error: incompatible types: String cannot be converted to char. Karakter tek tırnakla: 'A'.int x = 010; sekizlidir, değeri 8! int y = 08; ise derlenmez (error: ';' expected): sekizlide 8 rakamı yoktur.Integer.MAX_VALUE + 1 hata vermez, −2147483648 olur. Büyük çarpımlarda long gerekir: 1920L * 1080.==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
- 45 sayısını 8 bit ikili olarak yazın.
10110110₂işaretsiz olarak kaçtır? 8 bit ikiye tümleyen ile işaretli olarak kaçtır?- −20'yi 8 bit ikiye tümleyen ile yazın.
0x3Fondalık, ikili ve sekizli olarak nedir?01101101₂ + 00110110₂toplamını bulun. Sonuç 8 bit işaretlibyteolarak ne olur?System.out.println('a' + 'b');veSystem.out.println("" + 'a' + 'b');ne yazdırır?- Oyuncak bilgisayarda
10011100komutu ne yapar?
Cevapları göster
- 45 = 32 + 8 + 4 + 1 → 00101101.
- 128 + 32 + 16 + 4 + 2 = 182; işaretli: −128 + 54 = −74 (= 182 − 256).
- 20 = 00010100 → ters 11101011 → +1 → 11101100 (= 236 = 256 − 20).
- 3·16 + 15 = 63; ikili 111111; sekizli 77.
- 109 + 54 = 163 = 10100011₂;
byteolarak en soldaki bit 1 → −93 (taşma). - 195 (97 + 98, iki
charsayı olarak toplanır) ve ab (önce dizgi, sonra eklenir). - 10 = çarpma, 01 = R1, 11 = R3, 00 = R0 → R1 ← R3 × R0.
Özet
Alıştırmalar
- 16 bitlik işaretli bir tam sayının (Java
short) aralığı nedir? "Java"dizgisinin karakter kodlarını ondalık ve ikili olarak yazın.- 1024 × 768 boyutlu, piksel başına 3 bayt kullanan sıkıştırmasız bir resim kaç bayttır?
"ağaç"içinlength()ve UTF-8 bayt sayısı nedir?- 0'dan 15'e kadar sayıları 4 basamaklı ikili olarak yazdıran bir Java programı yazın.
- 32 hatlı bir adres yolu kaç farklı bayt adresleyebilir?
Cevaplar / ipuçları
- −2¹⁵ … 2¹⁵ − 1 = −32768 … 32767 (
Short.MIN_VALUE,Short.MAX_VALUE). - J = 74 = 1001010, a = 97 = 1100001, v = 118 = 1110110, a = 97 = 1100001.
- 1024 · 768 · 3 = 2.359.296 bayt = 2,25 MiB.
length()= 4; UTF-8: a(1) + ğ(2) + a(1) + ç(2) = 6 bayt.for (int i = 0; i < 16; i++)içindeString.format("%4s", Integer.toBinaryString(i)).replace(' ', '0')yazdırılır → 0000, 0001, …, 1111.- 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.