Jumlah register minimum teoretis untuk komputer modern?

10

Saya mengambil kursus tentang kompiler dalam studi sarjana saya di mana kami menulis kompiler yang mengkompilasi program sumber dalam bahasa seperti mainan Java ke bahasa perakitan mainan (yang kami punya juru bahasa). Dalam proyek ini kami membuat beberapa asumsi tentang mesin target yang terkait erat dengan executable asli "nyata", termasuk:

  • tumpukan run-time, dilacak oleh register stack pointer ("SP") khusus
  • heap untuk alokasi objek dinamis, dilacak oleh register heap pointer ("HP") khusus
  • register penghitung program khusus ("PC")
  • mesin target memiliki 16 register
  • operasi pada data (sebagai lawan dari, misalnya, lompatan) adalah operasi register-to-register

Ketika kami sampai di unit tentang menggunakan alokasi register sebagai optimasi, itu membuat saya bertanya-tanya: Berapa jumlah minimum register secara teoritis untuk mesin seperti itu? Anda dapat melihat dengan asumsi kami bahwa kami menggunakan lima register (SP, HP, PC, ditambah dua untuk digunakan sebagai penyimpanan untuk operasi biner) dalam kompiler kami. Sementara optimisasi seperti alokasi register tentu dapat memanfaatkan lebih banyak register, apakah ada cara untuk bertahan dengan lebih sedikit sementara masih mempertahankan struktur seperti tumpukan dan tumpukan? Saya kira dengan pengalamatan register (operasi register-to-register) kita membutuhkan setidaknya dua register, tetapi apakah kita membutuhkan lebih dari dua?

BlueBomber
sumber
"Heap pointer" sepertinya ide yang aneh. Karena bertentangan dengan stack, heap bukan LIFO dan tidak berkurang menjadi push / pop semantik. Anda seharusnya melihat alokasi memori dinamis sebagai panggilan ke malloc / rutinitas gratis.
Yves Daoust

Jawaban:

14

Jika Anda mengizinkan akses memori langsung berdasarkan alamat memori, maka Anda tidak memerlukan "register" karena Anda dapat menggunakan lokasi memori. Sebagai contoh, memori di lokasi 0 dapat menjadi penghitung program, di lokasi 1 kita memiliki stack pointer, dll. Tapi itu curang.

Jadi untuk mencegah diri kita dari kecurangan, mari kita asumsikan tidak ada akses memori langsung, karena kita bisa menggunakan lokasi memori tetap sebagai register. Kemudian kita bisa lolos dengan dua register, penghitung program dan penunjuk tumpukan, seperti yang dijelaskan dalam artikel Wikipedia di mesin tumpukan . Tumpukan hanya dapat diakses melalui penunjuk tumpukan, dan program hanya dapat diakses melalui penghitung program.

Kemungkinan lain adalah menggunakan mesin pencacah. Mesin dua counter adalah Turing lengkap, yaitu, dapat menghitung apa pun yang bisa dilakukan mesin Turing. Ini sekali lagi dijelaskan dengan baik dalam artikel Wikipedia tentang mesin pencacah .

Andrej Bauer
sumber
Terima kasih atas balasannya! Artikel tentang mesin stack menyebutkan, bahwa mesin tersebut mampu mengakses memori langsung (untuk melakukan operasi pada elemen stack paling atas dan mendorong kembali hasilnya), sehingga masih curang, kan? Sedangkan untuk mesin penghitung, saya membaca artikel itu. Saya juga telah membaca bukti serupa dari TC 2-CM, tetapi keduanya secara efektif melibatkan penyimpanan semua RAM dalam dua register, yang tampaknya bahkan lebih seperti menipu saya.
BlueBomber
Nah, pada titik tertentu sudah tidak curang lagi. Operasi stack tidak curang, asalkan tidak mengizinkan akses langsung ke lokasi tetap dalam memori. Tidak apa-apa untuk dapat, katakanlah, memutar tiga elemen paling atas dari stack. Pertanyaan Anda agak aneh, jadi, itu tidak membayar untuk terobsesi tentang apa yang curang dan tidak.
Andrej Bauer
Sekali lagi terima kasih atas jawabannya. Kapan pun topiknya berkaitan dengan batasan teoretis, menyontek bahkan lebih tidak bisa diterima! Itu tidak berarti itu tidak instruktif. Poin ketika itu tidak curang adalah ketika, yah, tidak ada kecurangan, saya kira. Saya menemukan jawaban awal Anda informatif, tetapi masalahnya adalah bahwa model kami tumpang tindih dengan semua model Mesin Turing, Mesin Pencacah, dan Mesin Stack, dan memberikan asumsi kami (termasuk banyak register terbatas dan tidak ada akses memori langsung), dapat kami dapatkan dengan hanya dengan dua register?
BlueBomber
1
Saya menemukan pertanyaan aneh karena sulit untuk menjabarkan konsep dunia nyata seperti prosesor, register, akses memori, dll, tetapi Anda perlu yang ditembaki agar dapat membuktikan apa pun. Jadi hasil akhirnya adalah apa pun yang Anda buktikan mudah dibuktikan, tetapi sangat tergantung pada bagaimana Anda meresmikan pertanyaan (apa gagasan teoretis Anda tentang "prosesor", "daftar", "memori", dll.).
Andrej Bauer
1
Sebuah buku teks kompiler tidak memungkinkan kita untuk membuktikan banyak hal, setidaknya tidak dalam arti matematika dari kata "membuktikan". Anda perlu melangkah lebih jauh dalam formalisasi perangkat keras untuk sampai pada sesuatu yang akan memungkinkan pembuktian . Bagaimanapun, kami memisahkan rambut, dan saya sudah memberi Anda jawaban terbaik saya.
Andrej Bauer
1

Arsitektur PIC yang diperkenalkan oleh Instrumen Umum pada 1970-an dan masih digunakan sampai sekarang memiliki register berikut:

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"

Instruksi umum akan membaca register, melakukan perhitungan menggunakan nilai read dan W, dan kemudian menyimpan hasil perhitungan baik ke W atau ke register yang telah dibaca. Salah satu perhitungan yang tersedia menghasilkan "nilai yang dibaca, mengabaikan W"; yang lain adalah "ambil W, abaikan nilai yang dibaca". Pola bit yang sesuai dengan "baca XX, lalu ambil W, abaikan nilai baca, dan simpan hasilnya dalam W" digunakan untuk NOP serta berbagai instruksi khusus.

Untuk memungkinkan perhitungan alamat, unit eksekusi prosesor akan mengawasi instruksi yang menyandikan alamat 00, dan mengganti isi File Select Register untuk alamat tersebut.

Meskipun harus memberi makan semua nilai melalui register W bisa menjadi hambatan, arsitektur PIC memiliki set kerja yang lebih besar daripada arsitektur lain menggunakan kata instruksi panjang yang sama. Pada PIC16C54 (masih dibuat hari ini, dan sangat mirip dengan PIC tahun 1970-an) instruksi adalah 12 bit. Pada banyak bagian 16Cxx atau 16Fxx lainnya, instruksi panjangnya 14 bit dan dapat langsung mengakses ruang alamat 128-byte. Jika set kerja suatu program cocok dengan set kerja set instruksi, pernyataan seperti "total + = nilai", di mana "total" dan "nilai" bertipe unsigned char, akan dikompilasi ke:

movf  value,w
addwf total,f

Pada sesuatu seperti ARM, bahkan jika seseorang memiliki register yang sudah dimuat sebelumnya dengan alamat basis variabel seseorang, kode akan lebih seperti:

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

Dalam banyak kasus, kompiler akan dapat menghindari melakukan banyak dan menyimpan dengan setiap operasi, tetapi pada sesuatu seperti PIC, manfaat dari set kerja yang lebih besar kadang-kadang dapat melebihi batasan harus melalui W sepanjang waktu.

supercat
sumber