Modern bir bilgisayar için teorik minimum kayıt sayısı?


10

Lisans eğitimimde derleyiciler üzerine bir ders aldım; burada, Java benzeri bir dilde kaynak programları bir oyuncak montaj diline (bir tercümana sahip olduğumuz) derleyen bir derleyici yazdık. Projede, hedef makine hakkında "gerçek" yerel yürütülebilir dosyalar ile yakından ilişkili bazı varsayımlar yaptık:

  • özel bir yığın işaretçisi ("SP") kaydı tarafından izlenen bir çalışma zamanı yığını
  • özel bir yığın işaretçisi ("HP") kaydı tarafından izlenen dinamik nesne ayırma yığını
  • özel bir program sayaç kaydı ("PC")
  • hedef makinenin 16 kaydı var
  • Veriler üzerindeki işlemler (örn. atlamaların aksine) kayıttan kayıt işlemlerine

Birime kayıt tahsisini optimizasyon olarak kullanma konusuna geldiğimizde beni meraklandırdı: Böyle bir makine için teorik minimum kayıt sayısı nedir? Varsayımlarımıza göre derleyicimizde beş kayıt (SP, HP, PC, artı ikili işlem için depolama olarak kullanılmak üzere) kullandığımızı görebilirsiniz. Kayıt tahsisi gibi optimizasyonlar kesinlikle daha fazla kayıttan yararlanabilirken, yığın ve yığın gibi yapıları korurken daha azıyla uğraşmanın bir yolu var mı? Kayıt adreslemeyle (kayıttan kayıt işlemlerine) en az iki kayda ihtiyacımız var, ama ikiden fazlasına ihtiyacımız var mı?


Bir "yığın işaretçisi" garip bir fikir gibi görünüyor. Yığının aksine, yığın LIFO değildir ve push / pop anlambilimine indirgenmez. Dinamik bellek tahsisini malloc / free rutinlerine çağrı olarak görmelisiniz.
Yves Daoust

Yanıtlar:


14

Bellek adresine doğrudan bellek erişimine izin verirseniz, bunun yerine bellek kayıtlarını kullanabileceğiniz için herhangi bir "kayıt" a ihtiyacınız yoktur. Örneğin, 0 konumundaki bellek program sayacı olabilir, 1 numaralı konumda yığın işaretçisi vb. Vardır. Ama bu hile yapıyor.

Kendimizi aldatmaktan kaçınmak için, doğrudan bellek erişimi olmadığını varsayalım, çünkü sabit bellek konumlarını kayıt olarak kullanabiliriz. Daha sonra, yığın makineleri hakkındaki Wikipedia makalesinde açıklandığı gibi, bir program sayacı ve bir yığın işaretçisi olan iki kayıttan kurtulabiliriz . Yığına yalnızca yığın işaretçisi üzerinden erişilebilir ve programa yalnızca program sayacı üzerinden erişilebilir.

Başka bir olasılık da sayaç makineleri kullanmaktır. İki sayaçlı bir makine Turing tamamlandı, yani Turing makinesinin yapabildiği her şeyi hesaplayabilir. Bu yine sayaç makinelerine ilişkin Wikipedia makalesinde güzel bir şekilde açıklanmıştır .


Cevabınız için teşekkürler! Bununla birlikte, yığın makineleri hakkındaki makale, makinenin doğrudan bellek erişimine sahip olabileceğinden (en üst yığın öğelerinde işlemleri gerçekleştirmek ve sonucu tekrar itmek için) bahsetmektedir, bu yüzden hala hile yapıyor, değil mi? Sayaç makinesine gelince, bu makaleyi okudum. Ben de benzer bir TC-2 kanıtı kanıtı okudum, ama her ikisi de etkili bir şekilde tüm RAM'i iki kayıtta depolamayı içeriyor, bu da beni daha çok aldatmaya benziyor.
BlueBomber

Bir noktada artık hile yapmıyor. Yığın işlemleri, bellekteki sabit bir konuma doğrudan erişime izin vermediği sürece hile yapmaz. Diyelim ki, yığının en üstteki üç elemanını döndürmek mümkün. Sorunuz her neyse, biraz garip, bu yüzden neyin neyin hile olduğunu ve neyin takıntılı olduğunu saplantı haline getirmekten ödün vermiyor.
Andrej Bauer

Cevabınız için tekrar teşekkürler. Konu teorik sınırlarla ilgili olduğunda, hile daha az kabul edilebilir! Bu, öğretici olmadığı anlamına gelmez. Hile yapmadığı nokta, hile olmadığı zaman, sanırım. İlk cevabınızı bilgilendirici buldum, ancak sorun şu ki, modelimiz Turing Makinesi, Sayaç Makinesi ve Yığın Makinesi modellerinin hepsiyle örtüşüyor ve varsayımlarımız (sonlu çok sayıda sonlu kayıt ve doğrudan bellek erişimi dahil değil) verildiğinde, sadece iki kayıt ile?
BlueBomber

1
Soruyu garip buluyorum çünkü işlemci, kayıt, bellek erişimi vb.Gibi gerçek kavramları tespit etmek zor, ancak herhangi bir şeyi kanıtlayabilmek için sabitlenmiş olanlara ihtiyacınız var. Sonuç olarak, kanıtladığınız şeyin kanıtlanması kolay olacaktır, ancak sorunun biçimini nasıl resmileştirdiğinize ("işlemci", "kayıt", "bellek" vb. Teorik kavramınızın ne olduğuna) bağlı olacaktır.
Andrej Bauer

1
Bir derleyici ders kitabı, en azından "kanıt" sözcüğünün matematiksel anlamında çok fazla kanıtlanmamıza izin vermez. Kanıt sağlayacak bir şeye ulaşmak için donanımın resmileştirilmesinde bir adım daha ileri gitmelisiniz . Her neyse, kılları bölüyoruz ve sana en iyi cevabımı verdim.
Andrej Bauer

1

General Instruments tarafından 1970'lerde tanıtılan ve bugün hala kullanımda olan PIC mimarisi aşağıdaki kayıtlara sahipti:

W register (not addressible)
01    Timer/Counter
02    Program Counter
03    Status
04    File-Select Register
05-07 One register for each I/O port
08-1F General-purpose registers/"memory"

Tipik bir talimat bir kaydı okuyacak, read ve W değerini kullanarak bir hesaplama gerçekleştirecek ve daha sonra hesaplamanın sonucunu W veya okunan yazmacıya kaydedecektir. Mevcut hesaplamalardan biri "okunan değeri W'yi göz ardı ederek" verir; bir diğeri ise "W değerini al, okunan değeri yok sayarak". NOP için çeşitli özel talimatların yanı sıra "XX okuyun, sonra W alın, okunan değeri yok sayın ve sonucu W olarak saklayın" ifadesi kullanılır.

Adres hesaplamalarına izin vermek için, işlemcinin yürütme birimi 00 adresini kodlayan talimatları izleyecek ve adres için Dosya Seçme Kaydının içeriğini değiştirecektir.

Her ne kadar W kaydı yoluyla tüm değerleri beslemek zorunda kalmak bir darboğaz olsa da, PIC mimarisi aynı uzunluk talimat kelimesini kullanan diğer mimarilerden daha büyük bir çalışma setine sahiptir. PIC16C54 üzerinde (bugün hala yapılmış ve 1970'lerin PIC'lerine çok benzer) talimatlar 12 bit uzunluğundadır. Diğer birçok 16Cxx veya 16Fxx parçasında, talimatlar 14 bit uzunluğundadır ve doğrudan 128 baytlık adres alanına erişebilir. Bir programın çalışma kümesi komut kümesinin çalışma kümesine iyi uyuyorsa, "total + = değer" gibi bir ifade, "total" ve "value" unsigned chartüründedir:

movf  value,w
addwf total,f

ARM gibi bir şeyde, bir kişinin değişkenlerinin temel adresi ile önceden yüklenmiş bir kaydı olsa bile, kod daha çok şöyle olacaktır:

ldr    r0,[r7+value]
ldr    r1,[r7+total]
add    r1,r1,r0
str    r1,[r7+total]

Birçok durumda, bir derleyici her işlemle yük ve depo yapmaktan kaçınabilir, ancak PIC gibi bir şeyde, daha büyük çalışma setinin faydaları bazen W'den geçmek zorunda kalmanın sınırlamalarından daha ağır basabilir.

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.