Bilgisayar bir bayt veri türünü nasıl belirler?


31

Örneğin, bilgisayar 10111100belirli bir RAM baytında depolandıysa, bilgisayar bu baytı bir tamsayı, ASCII karakteri veya başka bir şey olarak yorumlamayı nasıl bilir? Tip verileri bitişik bir baytta mı depolanıyor? (Bunun bir bayt için iki katı alan kullanmasıyla sonuçlanacağını sanmıyorum.)

Belki bir bilgisayarın veri türünü bile bilmediğinden, yalnızca onu kullanan programın bildiğinden şüpheleniyorum. Tahminime göre, RAM R AM olduğundan ve sırayla okunmadığından, belirli bir programın CPU'ya bilgileri belirli bir adresten almasını söylemesi ve programın nasıl davranılacağını tanımlamasıdır. Bu, tip tahminine ihtiyaç gibi programlama şeyleriyle uyumlu gibi görünmektedir.

Doğru yolda mıyım?


4
Not olarak: Türlerden bahsediyorsanız, bunu dil bağlamında yapmalısınız. Bu tür şeyleri işlemek için derleyiciye bırakılmıştır (semboller, kontrol tipleri, işlemler, döküm, adres tokası vb.). CPU ve RAM sadece baytları bilir
jean

4
Bir bayt veri türü bir bayttır. Bunun ötesinde, bilgisayar hiçbir şey bilmiyor. Bir program bir baytı veya bir bayt grubunu belirli bir veri türü olarak yorumlayabilir ve bunlar üzerinde işlem yapmaya çalışabilir, ancak burada kısıtlama yoktur. Aynı bayt grubu birden fazla veri tipi olarak yorumlanabilir (örn. Değer türlerine işaretçiler, C benzeri sendikalar vb.). RAM'in sıralı olarak okunmaması gerçekten alakalı değildir. - Daha fazlası RAM'in genel amacı olduğu için. - Örneğin, kayıtlar da sırayla okunmaz, ancak yazılır.
BrainSlugs83

5
Kendim için utanmaz bir eklenti vardı, ancak bu soru temel olarak yaklaşık bir ay önce SE programcılarına sorulmuştu. İşte cevabım . Bu noktada biraz uzun, ama birkaç farklı açıdan saldırıyor.
Shaz

2
Donanımın veri türü agnostik olmasının kullanışlı bir sonucu, tek bir baytın (veya kelimenin vb.) Bir program tarafından birçok şekilde yorumlanabilmesidir. Özellikle hızlı kayan karekökü hesaplamak için bir kayan noktalı sayıyı geçici olarak bir tamsayı olarak yorumlamak kullanılır .
Aoeuid

@ BrainSlugs83, bunu bir cevaba dönüştürmeyi düşünebilir misiniz?
DW

Yanıtlar:


38

Şüphe doğru. CPU verilerinizin anlamını umursamıyor. Bazen olsa da, bir fark yaratıyor. Örneğin, bazı aritmetik işlemler argümanlar semantik olarak imzalandığında veya imzalandığında farklı sonuçlar verir. Bu durumda CPU'ya hangi yorumu yapmak istediğinizi söylemeniz gerekir.

Verilerini anlamak programcıya kalmıştır. İşlemci sadece emirlere uyuyor, anlamlarından ve amaçlarından habersiz bir şekilde haberi yok.


1
"Bağımsız değişkenler anlamsal olarak imzalandığında veya imzalandığında" ile ilgili olarak, CPU nasıl bilebilir? CPU işlemleri sadece parametre baytlarını görüyor ve bu tür veri türü bağlamı farkındalığından yoksun. Veri türünü uygun CPU işlemini seçerek ima edersiniz (veya derleyiciniz yapar).
Shiv

4
@Shiv Bu gibi durumlarda, CPU'ya imzasız numaralara karşı imzalı sayıları işlemek için aslında farklı bir talimat verilir. OP'nin şüphelerinde olduğu gibi, program bu ayrıntıları vermekle yükümlüdür, çünkü CPU habersizdir.
Cort Ammon - Monica

2
Kendimi hatırladığımdan beri bilgisayarlarla çalışıyorum ve CPU'nun yüksek seviye programlamada kullandığımız yüksek seviyeli yapıları önemsemediğini bilmeme rağmen, ancak bu kavramların ayrılması beni zaman zaman korkutuyor
Loupax

1
@Loupax Gerçekten düşük seviyeli bir montaj ile çalışmak biraz yardımcı olur - hatta bir mov al, 42üst seviye olsa bile - bunun isteyebileceği tek bir talimat olduğu açıktır, ancak hala biraz soyutlanmıştır. Ancak, mov.8 al, 42açıkça kullanmak bu acı verici bir şekilde açık kılar :)
Luaan

1
@Shiv: Bellekteki verilerin yazıldığı makineler olduğunu not etmek isterim. Bunlara etiketli bellek mimarileri (veya basitçe etiketlenmiş mimariler) denir, ancak ticari olarak kısmen normal mimariler kadar başarılı olmadılar, çünkü şimdi çoğunlukla derleme yerine derlenmiş dillerde programlıyoruz ve derleyici yazmaya özen gösteriyor. Bakınız: en.wikipedia.org/wiki/Tagged_architecture
slebetman

14

Diğerleri zaten cevaplamış olduğu gibi, bugünün ortak CPU'ları belirli bir hafıza pozisyonunun ne içerdiğini bilmez; yazılım karar verir.

Ancak, başka olasılıklar da var. Örneğin, Lisp Machines , her bir bellek konumunun türünü depolayan etiketli bir mimari kullandı ; Bu şekilde donanımın kendisi de üst seviye dillerin bazılarını yapabilirdi.

Ve şimdi bile, Intel, AMD, ARM ve diğer mimarilerdeki NX bitini aynı prensibi izleyebileceğini düşünebilirsiniz : belirli bir bellek bölgesinin veri veya talimatlar içerip içermediğini donanım düzeyinde ayırt edin.

Ayrıca, sadece eksiksiz olması için Harvard mimarilerinde (bazı mikrodenetleyiciler gibi) veriler ve talimatlar fiziksel olarak ayrılmıştır, bu nedenle CPU'nun ne okuduğu hakkında bir fikri vardır.

Bu Quora sorusunda etiketli hafızanın nasıl çalıştığı, performans etkileri ve ölümü ve daha fazlası hakkında bazı yorumlar var.


Tagged mimarisi ilginç bir nottur. Çok daha hızlı olur mu?
Bassinator

4

Evet. Program sadece bellekten bir bayt alır ve istediği şekilde yorumlayabilir.


3

Tip ek açıklaması yok.
RAM saf verileri depolar ve program ne yapacağını tanımlar.

İşlemci kayıtlarında biraz daha zordur, eğer belli tipteki kayıtlarınız varsa (FPU gibi) içeride ne olduğunu söylersiniz.
Kayan nokta kayıtlarındaki işlemler açıkça yazılı veriler kullanılarak yapılır. Siz veya derleyiciniz oraya ne ve ne zaman konması gerektiğini söyler, böylece böyle bir özgürlüğünüz olmaz.
Bilgisayar, RAM'deki verilerin altında herhangi bir varsayımda bulunmaz ve bir istisna içeren kayıtlarda - CPU'da yazılan kayıtlar, bununla başa çıkmak için optimize edilmiş olarak bilinen tiptedir. Bu, yalnızca verilerin beklenen türde olması gereken yerler olduğunu göstermek içindir, ancak hiçbir şey sizi sicim dizelerinden kayan noktalara kadar durdurmaz ve çoğaltır.

Programlama dillerinde, türünü belirtirseniz veya daha yüksek dillerde, veriler geneldir ve derleyici / yorumlayıcı / VM, ek yükün içinde ne olduğunu kodlar.
Örneğin, C'de işaretçi türünüz verilerle ne yapılacağını, ona nasıl erişeceğinizi söyler.

Elbette string (karakterler) okuyabilir ve sonra kayan nokta değerleri olarak kabul edebilir, tamsayılar ve karıştırabilirsiniz.


Bir FPU kaydındaki bitler bile her zaman kayan nokta değerlerini temsil etmez. Eski günlerde (belki artık çok fazla değil?), Genel bir optimizasyon, genel amaçlı / tam sayı kaydedicilerden (32-bit) daha hızlı veri kopyalamak için kayan nokta yazmaçlarını (64-bit veya daha büyük) kullanmaktı, genellikle verileri iki kat daha hızlı kopyalayabiliyorlardı.
Seth

1
Seninle tamamen aynı fikirdeyim, bu yüzden birinin oraya ipleri basabileceğini yazdım. Aynı zamanda insanlar tam sayılar üzerinde kayan nokta operasyonları yaptılar çünkü daha hızlıydı. Mesele bu!
Kötülük

@HCBPshenanigans, kayan nokta değerlerini değiştiren talimatlar vardır. FADD kullanılıyorsa, yalnızca (4,8 veya 10) bayt bellek gruplarının kayan nokta sayıları tutması mantıklı olur. Bu birkaç çeşit talimat için geçerlidir: iki tamsayı ile çarpmak sadece tamsayılarsa mantıklı olur, zıplamak sadece bir adresse anlamlıdır.
JDługosz

Kayan nokta için kullanılan 8087 talimatının üstlendiği varsayılmayan ve kötülükler, ancak yorumlanmadan (aynı hizada olmaları gerekir) yükleme / kaydetme için kullanılabilecek daha yeni CIMD kayıtları için geçerlidir ve bir uyarı CIMD kayıtları hiç kullanılmamışsa, bağlam anahtarına kaydedilmeleri gerekmediğini belirtir . Eğer (sadece) 8 byte'ı XMM kaydı ile taşırsanız, tüm setin kaydedilmesi gereken net kayıptır.
JDługosz 4:15

3

İşlemci umursamıyor, sadece hareket eden, hareket ettiren, ekleyen veya çoğaltan hareket eden derleme kodunu çalıştırıyor ...

Veri Türleri daha üst seviye bir dil kavramıdır: C veya C ++ 'da, işlediğiniz her veri parçası için Türler belirtmeniz gerekir; C / C ++ Derleyicisi bu veri parçalarını CPU'nun işlemesi için doğru komutlara dönüştürür (derleyiciler derleme kodu yazar)

Hatta bazı daha üst seviyelerde, Türler çıkarılabilir: Python veya Javascript'te, örneğin, biri veri türlerini belirtmek zorunda değildir, ancak verilerin bir türü vardır ve bir tamsayı içeren bir dize ekleyemezsiniz, ancak Bir tamsayı olan bir şamandıra: 'derleyici' (Javascript durumunda bir JIT (Just in Time) Derleyicisidir. Javascript genellikle 'yorumlanmış' bir dil olarak adlandırılır, zira tarihsel olarak tarayıcılar Javascript kodunu yorumlamaktadır, fakat günümüzde Javascript motorları derleyicilerdir.

Kod, daima makine koduna derlenir, ancak makine kodu formatı, hedeflediğiniz makineye bağlıdır (örneğin x86 64bit kod, bir x86 32 bit makinede veya bir ARM işlemcide çalışmaz)

Dolayısıyla, yorumlanmış kodun çalıştırılmasına dahil olan birçok katman var.

Java veya C #, Java veya C # kodu teknik olarak bir Java binaryine (bytecode) teknik olarak 'derlendiğinden', diğer ilginç olanlardır, ancak bu kodun kendisi, temel donanımlara özgü olan Java Çalışma Zamanı Modülü tarafından yorumlanır (birinin yüklenmesi gerekir) Java ikili dosyalarını çalıştırmak için doğru makineyi hedefleyen JRE (Kavanozlar)


Bir derleyici, JIT olsun ya da olmasın derler; ve bir tercüman derlemeden yorum yapar (çünkü derleyici olmaz!). Onlar çok farklı şeyler. Ve bayt kodu yorumlaması nedeniyle "Java'nın komik olması" ile ilgili olarak, x86 makine kodunun bile mikroişlemci tarafından mikro kodda yorumlanacağını (hatta derlenebileceğini?) Düşünün .
hmijail

Açıklama için teşekkürler ... Kabul edildi: bir derleyici derlenir ve bir tercüman yorum yapar. Javascript durumunda, hikaye biraz karmaşık olsa da, bazı eski tarayıcılar kodu yorumlarken, daha modern tarayıcılar tam olarak tam zamanında derlenir; bu nedenle muhtemelen yine de 'yorumlanmış' bir dil olarak adlandırılmasının nedeni budur. teknik olarak artık değil.
Mr

Ancak AFAIK, JS yorumlanmaya başlar ve gerektiğinde derlenebilir. Ve JIT'ler, birçok şeye bağlı olarak, yorumlanandan derlenmişe tekrar yorumlanmaya geçiş yapabilir. Örneğin, belirli bir türe sahip bir değişken için bir kod parçası derlenebilir; fakat daha sonra kod farklı bir türe sahip olan değişkenle tekrar çalıştırılır, bu nedenle mevcut derlenmiş kod kullanılamaz, böylece tercüman atlar - kod yeni tür için tekrar derleninceye kadar ...
hmijail

Beni söylemediğim bir şeyden alıntı yapıyorsunuz, lütfen kaldırın, çünkü tamamen yanlış. Microcode'un OS ile ilgisi yoktur; Mikroişlemcinin içinde bir şey var. 32 bit veya 64 bit'in bununla hiçbir ilgisi yok.
hmijail

3

Veri tipleri bir donanım özelliği değildir. CPU bir kaç tane (iyi, çok) farklı komutları bilir. Buna CPU'nun komut seti denir .

En iyi bilinenlerden biri x86 komut setidir . Bu sayfada "çarpma" kelimesini ararsanız, 50 sonuç alırsınız. MULPDve MULSDçiftlerin FIMULçarpımı için, tam sayı çarpımı için, ...

Bu komutlar kayıtlar üzerinde çalışır. Kayıtlar, bu bitlerin ne anlama geldiğine bakılmaksızın, sabit sayıda bit (genellikle CPU'nuzun hangi mimariye bağlı olduğuna bağlı olarak 32 veya 64) içerebilen bellek yuvalarıdır. Bu nedenle CPU talimatı yazmaçların değerlerini farklı şekilde yorumlar, ancak değerlerin kendilerinin tipleri yoktur.

PyCon 2017'de Stuart Williams tarafından bir örnek verildi :

görüntü tanımını buraya girin


1
Bunun kesinlikle doğru olmadığını unutmayın: isteğe bağlı değerler içeremeyen özel amaçlı kayıtlar vardır (örneğin, yalnızca herhangi bir adres olmayan ve isteğe bağlı eklemelere izin vermeyen işaretçi kayıtları veya yapabileceğiniz kayan nokta kayıtları) normalize edilmemiş değerleri saklamayın). Ancak cevabınız çoğu mimaride genel amaçlı kayıtlar için doğrudur .
Gilles 'SO- kötülük' dur

2

... belirli bir program sadece CPU'ya bilgileri belirli bir adresden almasını söyler ve program nasıl davranılacağını tanımlar.

Kesinlikle. Ancak RAM "sırayla" okunmaz ve tam tersi olan Rasgele Erişim Belleği anlamına gelir .

Bir bayt bilerek yanında olduğunu bir buysa, hatta bilmiyorum bayt veya bir kayan nokta sayısı gibi daha büyük bir öğenin bir parçası.

Bazı özel örnekler vererek başka cevaplara eklemek istiyorum.

Düşünün 01000001. Program, herhangi bir anlam ifade etmeden büyük bir veri paketinin parçası olarak bir yerden diğerine kopyalayabilir. Ancak bunu metin modu video arabelleği tarafından kullanılan adrese kopyalamak, mektubun Aekranda bir konumda görünmesine neden olur . Kart bir CGA grafik modundayken de aynı işlem, kırmızı bir piksel ve mavi bir piksel görüntüler.

Bir kayıtta, tamsayı olarak 65 sayısı olabilir. 32'nin bitini ayarlamak için aritmetik işlem yapmak, bağlamsız bir şey anlamına gelebilir , ancak özellikle bir harfi küçük harfe çevirmek olabilir.

8086 CPU (hala) olarak adlandırılan özel talimatlar vardır DAA sadece iki basamak olarak yorumlanıyor ki talimat kullanılan eğer öyleyse, kayıt 2 ondalık basamak tutar zaman kullanılır 41.

Programlar çöküyor, çünkü bir bellek sözcüğü, başka bir şey orada saklandığında bir işaretçi olduğunu düşünerek okunur.

Bir hata ayıklayıcı kullanarak, belleği inceleyerek, gösterimin görüntülenmesine rehberlik etmek için bir harita kullanılır. Bu sembol bilgisi olmadan, düşük seviyeli bir hata ayıklayıcı şunları belirtmenizi sağlar: bu adresi 16 bitlik kelimeler olarak göster, bu adresi uzun kayan nokta, dizeler olarak göster… her neyse. Bir ağ paket dökümü veya bilinmeyen bir dosya biçimine bakmak, onu şaşırtmak için bir zorluktur.

Bu, modern bilgisayar mimarisinde temel bir güç ve esneklik kaynağıdır: bir bellek hücresi, yalnızca, programa, değeri ile yaptığı ve sonraki işlemleri nasıl etkilediği ile ne anlama geldiği ile "ne anlama geldiği" anlamına gelen herhangi bir şey , veri veya talimat anlamına gelebilir . anlamı tamsayı genişliğinden daha derin: bu karakterler ... ascii veya ebcdic'deki karakterler mi? İngilizce veya SQU ürün kodlarında kelimeler oluşturmak? Gönderilecek adres veya geldiği adres? En düşük seviye yorumu (mantıksal bit; tamsayı benzeri, imzalı veya imzasız; şamandıra; bcd; işaretçi) talimat kümesi düzeyinde bağlamsal, ancak bu aşamanın her bir seviyede bağlam: hiçadres, zarfın üzerinde basılı bulunduğu konumdan dolayı olduğu gibi. İşlemcinin değil postacının kurallarına bağlamsaldır. Bağlam, bir ucunda bitler olan büyük bir sürekliliktir.


※ Dipnot: DAA komutu bir bayt olarak kodlanmıştır 00100111. Bu nedenle, bayt, komut akışında okunuyorsa önceden adlandırılmış komuttur, ve rakamlar bcd basamakları 27olarak yorumlanırsa rakamlar ve 0x27 = 39 , ASCII'deki 9 rakamı olan ve bir kesme tablasının parçası (INT 13'ün yarısı) 2-bayt adres, BIOS servis rutinleri için kullanılır).


1

Bilgisayarın bir bellek konumunun bir talimat olduğunu bilmesinin tek yolu, talimat işaretçisi adı verilen özel amaçlı bir kaydın bir nokta veya başka bir noktaya işaret etmesidir. Komut işaretçisi bir hafıza kelimesini gösteriyorsa, komut olarak yüklenir. Bunun dışında, bilgisayarın programlar ve diğer veri türleri arasındaki farkı bilme yolu yoktur.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.