Birkaç yorumda gönderdiğiniz soruyu ele almak için (ki gönderinizi düzenlemelisiniz bence):
Anlamadığım, bilgisayarın bir değişkenin değerini okuduğu zaman, bir int veya char ise 10001 gibi bir adres okuduğunu nasıl bildiğidir. Herhangi bir programa, herhangi bir programa tıkladığımı hayal edin. Hemen kod çalıştırılmaya başlar. Bu exe dosyası, değişkenlerin içinde veya char olarak saklanıp saklanmadığı hakkında bilgi içeriyor mu?
O zaman ona bir kod koyalım. Diyelim ki yazıyorsun:
int x = 4;
Ve bunun RAM'de saklandığını varsayalım:
0x00010004: 0x00000004
İlk kısım adres, ikinci kısım değer. Programınız (makine kodu olarak çalışır) çalıştığında, tüm gördüğü 0x00010004
değerdir 0x000000004
. Bu verilerin türünü 'bilmiyor' ve nasıl kullanılması gerektiğini 'bilmiyor'.
Peki, programınız yapılacak doğru şeyi nasıl belirler? Bu kodu düşünün:
int x = 4;
x = x + 5;
Burada bir okuma ve yazma var. Programınız x
bellekten okursa , 0x00000004
orada bulur . Ve programın 0x00000005
buna eklemeyi biliyor . Programınızın bunun geçerli bir işlem olduğunu bilmesinin nedeni, derleyicinin işlemin tür güvenliği ile geçerli olmasını sağlamasıdır. Sizin derleyici zaten ekleyebilir doğruladı 4
ve 5
birlikte. Bu nedenle, ikili kodunuz çalıştığında (exe), bu doğrulamayı yapmak zorunda değildir. Sadece her adımı körce uygular, her şeyin yolunda olduğunu varsayarak (aslında sorun olmadığında kötü şeyler olur, tamam değil).
Bunu düşünmenin başka bir yolu da böyle. Sana bu bilgiyi veriyorum:
0x00000004: 0x12345678
Öncekiyle aynı format - soldaki adres, sağdaki değer. Değer ne tür? Bu noktada, kod yürütürken bilgisayarınızın yaptığı değer kadar bilgi biliyorsunuzdur. Bu değere 12743 eklemenizi söyleseydim, bunu yapabilirsiniz. Bu işlemin sonuçlarının tüm sistemde ne olacağı hakkında hiçbir fikriniz yok, ancak iki sayı eklemek gerçekten iyi olduğunuz bir şeydir, böylece başarabilirsiniz . Bu değeri bir int
mi yapar ? Mutlaka gerekli değil - Tüm gördüğünüz iki adet 32 bit değer ve toplama işleci.
Belki bazı karışıklıkların ardından verileri geri alıyor. Eğer sahipsek:
char A = 'a';
Bilgisayar a
konsolda görüntülenmesini nasıl biliyor ? Bunun için çok fazla adım var. İlki A
, bellekteki konumuna gitmek ve onu okumaktır:
0x00000004: 0x00000061
a
ASCII'deki hex değeri 0x61, bu nedenle yukarıdakiler bellekte göreceğiniz bir şey olabilir. Artık makine kodumuz tamsayı değerini biliyor. Tamsayı değerini görüntülemek için bir karaktere dönüştürmeyi nasıl biliyor? Basitçe söylemek gerekirse, derleyici bu geçişi yapmak için gerekli tüm adımları attığınızdan emin oldu. Ancak bilgisayarınızın kendisi (veya program / exe) bu verilerin türünün ne olduğu hakkında hiçbir fikriniz yok. Bu 32 bitlik değer herhangi bir şey olabilir - int
, bir işaretçinin char
yarısı double
, bir göstergenin, bir dizinin parçası, a'nın bir string
parçası, komutun parçası, vb.
İşte programınızın (exe) bilgisayar / işletim sistemiyle yapabileceği kısa bir etkileşim.
Program: başlamak istiyorum. 20 MB belleğe ihtiyacım var.
İşletim Sistemi: Kullanılmayan 20 MB boş hafıza alanı bulur ve teslim eder
(Önemli not bu geri dönebilirler ki herhangi , hatta bitişik olması gerekmez bellek 20 ücretsiz MB. Bu noktada, program şu anda OS konuşmadan sahip olduğu bellek içinde çalışabilir)
Program: Bellekteki ilk noktanın 32-bit bir tamsayı değişkeni olduğunu kabul edeceğim x
.
(Derleyici, diğer değişkenlere erişimin, bellekteki bu noktaya asla dokunmayacağından emin olur. Sistemde, ilk bayt değişken x
veya bu değişken x
bir tamsayı olduğunu söyleyen hiçbir şey yoktur . Bir benzetme: bir çantanız var. Bu çantaya sadece sarı renkli topları koyacaksınız, birisi daha sonra bir şeyleri çantadan çıkardığında, mavi veya küp bir şey çıkarmaları şok edici olurdu - bir şey korkunç derecede yanlış gitti. Aynı şey bilgisayarlar için de geçerli: program şimdi ilk bellek noktasının x değişkeni olduğunu ve bunun bir tamsayı olduğunu varsayar, bu bellek baytının üzerine başka bir şey yazılmışsa ya da başka bir şey olduğu varsayılırsa - korkunç bir şey oldu. olmadı)
Program: Şimdi 2
varsaydığım ilk dört bayta yazacağım x
.
Program: 5'e eklemek istiyorum x
.
X'in değerini geçici bir sicile okur
Geçici sicile 5 ekler
Geçici yazıcının değerini, hala olduğu varsayılan ilk bayta geri depolar x
.
Program: Bir sonraki kullanılabilir baytın char değişkeni olduğunu varsayacağım y
.
Program: a
Değişkene yazacağım y
.
Bir bayt değerini bulmak için bir kütüphane kullanılır. a
Bayt, programın varsaydığı adrese yazılır y
.
Programın içeriğini görüntülemek istiyorum y
İkinci bellek noktasındaki değeri okur
Bayttan karaktere dönüştürmek için bir kütüphane kullanır
Konsol ekranını değiştirmek için grafik kitaplıklarını kullanır (pikselleri siyahtan beyaza ayarlama, bir satıra kaydırma vb.)
(Ve buradan devam ediyor)
Muhtemelen kapattığınız şey şudur: bellekteki ilk nokta artık olmadığında ne olur x
? ya da ikinci artık değil y
mi? Birisi x
bir char
veya y
bir işaretçi olarak okuduğunda ne olur ? Kısacası, kötü şeyler olur. Bunların bazıları iyi tanımlanmış davranışlara sahipken, bazıları tanımsız davranışlara sahiptir. Belirsiz davranış tam olarak budur - hiçbir şeyden, hiçbir şeyden, programın veya işletim sisteminin çökmesine kadar bir şey olabilir. İyi tanımlanmış davranışlar bile zararlı olabilir. Degisebilirim ise x
tam hacker şey bu - programıma için bir işaretçi ve program bir işaretçi olarak kullanmak için olsun, o zaman benim program çalıştırdığı başlatmak için program alabilirsiniz. Derleyici biz kullanmayan sağlayabileceğiniz orada int x
bir şekildestring
ve o doğadaki şeyler. Makine kodunun kendisi türlerin farkında değildir ve yalnızca talimatların yapmasını istediği şeyi yapar. Çalışma zamanında keşfedilen çok miktarda bilgi var: programın hangi byte belleğini kullanmasına izin verilir? x
İlk baytta veya 12'de başlıyor mu ?
Ancak, bunun gibi programları (ve meclis dilinde yapabilirsiniz) yazmanın ne kadar korkunç olacağını hayal edebilirsiniz. Eğer değişkenleri 'bildirerek' başlamak - Kendinizi o bayt 1'dir anlatmak x
bayt 2'dir, y
ve kod, yükleme ve depolama kayıtları her satırı yazarken, (bir insan gibi) hangisinin hatırlamak zorunda x
ve hangi birincisi y
, çünkü sistemin hiçbir fikri yok. Ve siz (bir insan olarak) ne tür x
ve ne olduğunu hatırlamak zorundasınız y
, çünkü yine - sistemin hiçbir fikri yok.