Kod satırları CPU tarafından nasıl yürütülür?


11

Gerçekten tam olarak nasıl bir üst düzey dil makine koduna dönüştürülür ve sonra cpu tarafından yürütülen anlamaya çalışıyorum.

Kodun, CPU'nun kullanabileceği düşük düzeyli kod olan makine koduna derlendiğini anlıyorum. Bir atama ifadem varsa söyle:

x = x + 5;
y = x - 3;

CPU her satırı birer birer yürütüyor mu? Bu yüzden önce x = x + 5'i çalıştırır; komut ve ardından CPU'nun yürüteceği bir sonraki komut y = x-3; Gerçekten yürütme sürecini ve ben yazmak kod aslında CPU tarafından yürütmek nasıl anlamaya çalışıyorum.


Açık kaynaklı CPU'lardan birinin tasarımını anlamaya çalışabilirsiniz, excamera.com/sphinx/fpga-j1.html gibi yığın tabanlı bazı uygulamalar var - bunlar 3 adresli mimarilerden çok daha basit örneğinizde olduğu gibi.
SK-logic

3
Bu işe girdiğimde, bunun basit ve iyi tanımlanmış cevapları olurdu. Günümüzde, CPU'lar son derece karmaşıktır ve işlem gücünü artırmak için her şeyi yapar.
David Thornley

Yanıtlar:


12

Kod satırlarının CPU'nun yürütme şekliyle ilgisi yoktur. Montajcıyı okumanızı tavsiye ederim, çünkü bu size donanımın gerçekten işleri nasıl yaptığına dair çok şey öğretecek. Birçok derleyiciden derleyici çıktısı da alabilirsiniz.

Bu kod (derlenmiş bir montaj dilinde) gibi bir şeye derlenebilir:

load R1, [x] ; meaning load the data stored at memory location x into register 1
add R1, 5
store [x], R1 ; store the modified value into the memory location x
sub R1, 3
store R1, [y]

Ancak, derleyici bir değişkenin tekrar kullanılmadığını bilirse, depolama işlemi yayınlanmayabilir.

Şimdi hata ayıklayıcının hangi makine kodunun bir program kaynağına karşılık geldiğini bilmesi için, derleyici tarafından makine kodunda nereye karşılık geldiğini göstermek için ek açıklamalar eklenir.


Neden olmasın? Bir 3-adresi mimari gibi talimatları olacaktır ADD Rx, Rx, $5ve SUB Ry, Rx, $3(x ve y değişken kayıt eşlenir olduğunu varsayarak). Bir yük / mağaza RISC yaklaşımını tarif ediyorsunuz.
SK-logic

1
@ SK-logic: Veri tipleri ve işlemlerle çok basit programlama dillerinde çok basit kod satırları için bu durum gerçekleşebilir, ancak CPU yeterince iyi desteklemez. Uzmanlar için uygundur, ancak öncelikle, makine kodu talimatlarının, üst düzey bir dildeki kod satırlarına genellikle çok az direnç gösterdiğini fark etmek önemlidir.

@ SK-Logic: bu sadece bu örnek için geçerlidir. Bununla birlikte, genel olarak, maxpolun haklıdır. Üst düzey dil ifadeleri, daha basit bir şey yapmak için daha fazla "bürokrasi" ile daha düşük bir dile çevrilmelidir. Sanırım OP bu dönüşümün bir örneğini istiyordu.
Andres F.

1
@ SK-Logic: OP sorusuna "Tam olarak ne kadar üst düzey bir dilin olduğunu tam olarak anlamaya çalışıyorum [...]" ile başladı
Andres F.

1
@ SK-logic Bağlam "Bir atama ifadem varsa söyle: [kod snippet'i] CPU her satırı birer birer çalıştırıyor mu?" - bana montajcı olmayan bir dilde kaynak kodu olması amaçlanmış gibi geliyor. Daha genel olarak, düşük seviyeli makine kodunun ne olduğunun anlaşıldığına dair bir gösterge görmüyorum ve bazı ifadeler (satırlardan bahsetmek gibi) bazı yanlış kavramları gösteriyor. Bu, ima ettiğiniz kadar imkansız değil, herkes ilk önce bazı basit mikrodenetleyicilere (benim gibi ve görünüşe göre diğerleri) kafa atmaktan zevk almadı. Belki Frankie açıklığa kavuşturmalıdır.

2

Değişir.

Gerçekten basit makinelerin ilk günlerinde, evet, kod her seferinde bir satır yürüttü. Makineler büyüdükçe, daha hızlı ve daha karmaşık hale geldikçe, hem eşzamanlı olarak birden fazla talimatı yürütme yeteneğini hem de bellek okuma ve yazma işlemlerinin yazmaçlardaki işlemlerden çok daha uzun sürdüğünü görmeye başladınız.

Derleyicileri optimize etmek bunu hesaba katmak zorundaydı ve verdiğiniz çizgiler paralel olarak "az ya da çok" çalıştırılabilir, işlemcinin bir kısmı y'nin hesaplanması üzerinde çalışırken, bir kısmı da önceden hesaplanan yeni değeri x (ve y'nin hesaplanması kayıttaki yeni değeri kullanıyordu).

Kontrol Verileri 6600, bu tür şeyler yapan ilk makineydi. Tamsayı ekleme 300 nsn aldı, bellek referansı (okuma veya yazma) 1000 nsn aldı, çoğaldı ve bölmeler çok daha uzun sürdü. Hangi işlevsel birimlerin gerekli olduğuna bağlı olarak, on taneye kadar komutun tümü paralel olarak yürütülebilir. CDC 6600 FORTRAN derleyicileri tüm bunları planlarken ÇOK iyiydi.


Bu durumda bir sonraki talimat giriş ilk talimat sonucu bağlıdır, bu yüzden olmalı sırayla çalıştırılabilir.
SK-logic

@ SK-logic: Pek değil. İkinci satırın girişi, ilk satırın sağ tarafının sonucuna bağlıdır, ancak yalnızca orijinal örnek kodda görebildiğimiz şeye bağlı olarak, sonucun hafızasına depoya bağlı OLMAYABİLİR. ilk satır. X değişken (C / C ++ 'da) olarak bildirilmiş olsaydı, derleyicinin önce sonucu saklaması ve "volatile" ifadesinin (bir kesme işleyicisi diyelim) içeri girebilir ve iki satır arasında x işaretini kaldırabilir.
John R. Strohm

Ben x ve y kayıtları olduğunu varsayalım (ve kod C gibi bir şey yerine 3 adresli sözde montaj dilinde). Bu durumda, her iki komut da kaçınılmaz olarak ardışıktır. Aksi takdirde OP bunun yerine iki veya daha fazla farklı soru sormak zorunda kaldı.
SK-logic

Ben işlemciler için denemek olsaydı değeri nedir "spekülasyon" acaba xnedir? Bu şekilde kodu zaten yürüttü ve önbellekte sakladı.
Kolob Kanyonu

Kayıt olsalar bile, MAKİNEYE BAĞLI, talimatların tamamen sırayla yürütüldüğünü varsayamazsınız. 6600, programcının bariz olanı yapmak istediği varsayımına dayanarak sıralı anlambilimi zorlayacak programlama mantığına ("skor tahtası") sahipti. Daha sonraki makineler, talimatları dikkatli bir şekilde planlamak için derleyicilere güvenerek bu donanımı atladı. Bu canavarlar üzerinde montaj dili programlaması yapan insan programcılar ONLAR KENDİ'NDE.
John R. Strohm

1

Hayır, üst ve alt düzey dillerde kod satırları / talimatları arasında bire bir eşleme yoktur. Aslında, yukarıdaki her iki satır da birden çok makine kodu yönergesine çevrilir.

  1. bir belleğe belirli bir bellek adresinden bir değer yükleme
  2. değeri değiştir
  3. hafızaya geri yaz

Bu talimatların gerçek detayları platformlar arasında farklılık gösterir.

Bu, şeylerin temel görünümüdür. Bununla birlikte, sorunları daha da karmaşıklaştırmak için, modern CPU'lar diğerleri arasında yürütme boru hatları , sıra dışı yürütme ve çoklu çekirdekler gibi teknikler uygular . Bunlar, CPU'nun aynı anda birden çok şey yapmasına neden olur, örneğin boru hatları, aynı işlem birimi içinde paralel olarak sonraki talimatların farklı aşamalarını işlerken, çoklu çekirdekler bağımsız talimatları paralel olarak işleyebilir.


0

Nasıl çalıştığına dair daha fazla ayrıntı bulmak için bir kitapta harika ayrıntılara bakmalısınız, muhtemelen bir derleyici sınıfı da.

Temel olarak, sorunuz 2 farklı konuya odaklanıyor.

1) Kod makine koduna nasıl çevrilir?

2) Kod paralelleştirme kullanılarak ne zaman / nasıl hesaplanır?

1) yanıtı kullandığınız dile bağlıdır (örneğiniz için önemsiz olmasına rağmen çıktı aynı olacaktır). Derleyicinin makine koduna çeviri yapma şekli, dilin kuvvetlerinden biridir. Ayrıca, örneğinizde dikkate alınması gereken birkaç endişe vardır, kod verileri belleğe yüklemeli, saklamalıdır vb.

Son olarak, paralelleştirme, programlama açısından zorlayabileceğiniz bir özelliktir, ancak kısaca, bazı işlemciler, kodun bir kısmının aynı anda çalıştırılabileceğini düşünmeye çalışabilir, çünkü bağımsızdırlar. Sizin durumunuzda, ifadeleri sırayla yürütmeniz gerektiği için durum böyle değildir, bu nedenle hayır, aynı anda çalışmaz.

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.