Bagaimana CPU tidak dapat mendukung tumpukan? Bukankah ada arsitektur yang menggunakan subrutin (Saya cukup yakin itu semua arsitektur) harus mendorong alamat kembali ke stack sehingga dapat kembali ke tempat itu disebut subrutin? Tumpukan hanya berarti bagian dari memori dengan pointer yang tumbuh dalam arah tertentu dan bertindak sebagai susunan data stack bukan? Saya hanya tidak mengerti bagaimana arsitektur tidak dapat mendukung stack.
Sejauh mana penyimpanan memori otomatis (variabel otomatis vs variabel statis) ditentukan oleh kompiler vs arsitektur perangkat keras?
Ada banyak mikrokontroler tingkat rendah yang memiliki tumpukan perangkat keras untuk panggilan / kembali subrutin dan penanganan interupsi, tetapi menyulitkan jika tidak mungkin untuk menyimpan data (variabel) di sana, dan menerapkan tumpukan data perangkat lunak murni akan sangat tidak efisien. 8051 adalah salah satu contoh klasik, dan PIC low-end (PIC12 / PIC16) adalah contoh lain. Pada mesin ini, tumpukan data ditiru dengan menetapkan lokasi penyimpanan statis untuk variabel otomatis, dengan jumlah penggunaan kembali lokasi ini yang bergantung pada kecanggihan kompiler.
Perhatikan bahwa jika emulasi tumpukan dilakukan dengan cara ini, itu berarti rekursi - suatu fungsi yang memanggil dirinya sendiri, baik secara langsung maupun tidak langsung - tidak berfungsi, karena setiap instance fungsi menggunakan kembali lokasi statis yang sama untuk variabel yang seharusnya "pribadi". Beberapa kompiler memungkinkan penggunaan rekursi yang terbatas (biasanya diimplementasikan dengan cara #pragmatertentu), yang akan menyebabkannya membuat tumpukan data yang benar, tidak peduli berapa banyak memperlambatnya.
Selain itu, ada arsitektur CPU yang tidak memiliki setumpuk perangkat keras sama sekali, bahkan untuk penanganan subrutin / interupsi, termasuk DEC PDP-8 dan IBM System / 360. Pada mesin-mesin ini, PC (alamat pengirim) dan register status (untuk gangguan) disimpan dalam register atau lokasi memori, tetapi dalam setiap contoh yang dapat saya pikirkan, mesin juga memiliki mode alamat yang cukup fleksibel yang membuatnya mudah untuk membuat stack. dengan perangkat lunak.
Beberapa komputer sebelumnya akan menulis instruksi lompatan ke dalam kode untuk menyebabkan pengembalian - tidak memiliki lompatan tidak langsung - membuat fungsi reentrant menjadi tidak praktis (secara teoritis seseorang dapat melakukan percabangan atas lompatan tetapi itu menambah kompleksitas, dalam beberapa kasus terutama ketika alamat data sepenuhnya dikodekan. dalam instruksi).
Paul A. Clayton
4
"mendukung tumpukan" artinya
memiliki register stack pointer yang eksplisit, dan
memiliki instruksi kode mesin primitif untuk memanipulasi / menggunakan register penunjuk tumpukan (seperti reti, yang mengubah penghitung program berdasarkan penunjuk tumpukan untuk kembali dari pemanggilan fungsi).
Anda dapat meniru ini tanpa dukungan perangkat keras melalui emulasi, yang merupakan kode yang dihasilkan oleh kompiler yang sama-sama menggunakan RAM. Jarang / tidak umum untuk tidak memiliki dukungan langsung untuk stack dalam arsitektur komputer modern apa pun.
Semantik variabel dalam bahasa pemrograman hampir tidak ada hubungannya dengan arsitektur perangkat keras target, untuk bahasa apa pun yang lebih tinggi dari perakitan lurus. Pekerjaan kompiler adalah untuk menghasilkan kode mesin yang sesuai dengan kontrak semantik bahasa pemrograman.
Sebagian besar SPA RISC (mis., MIPS [tidak termasuk MIPS16 dan microMIPS], Alpha, SPARC, PA-RISC, Power, SuperH) tidak memiliki register penunjuk stack eksplisit, sebagai gantinya mendefinisikan dalam ABI. ARM adalah pengecualian (sebagian karena membayangi SP untuk beberapa mode operasi) seperti MIP16 dan microMIPS (untuk kepadatan kode).
Paul A. Clayton
2
Beberapa arsitektur (misalnya PIC) memiliki tumpukan perangkat keras yang kemampuannya terbatas (hanya dapat digunakan untuk alamat pengirim, bukan variabel). Beberapa arsitektur yang sangat kecil tidak memiliki instruksi store-and-increment atau PUSH, jadi lebih baik untuk melakukan stack.
variabel 'otomatis' dalam C harus selalu dikompilasi ke sesuatu dengan perilaku inisialisasi 'otomatis', dan 'statis' dengan perilaku statis; pada beberapa arsitektur Anda tidak diperbolehkan melakukan rekursi, dalam hal ini kompiler dapat secara statis mengalokasikan semua variabel.
"mendukung tumpukan" artinya
Anda dapat meniru ini tanpa dukungan perangkat keras melalui emulasi, yang merupakan kode yang dihasilkan oleh kompiler yang sama-sama menggunakan RAM. Jarang / tidak umum untuk tidak memiliki dukungan langsung untuk stack dalam arsitektur komputer modern apa pun.
Semantik variabel dalam bahasa pemrograman hampir tidak ada hubungannya dengan arsitektur perangkat keras target, untuk bahasa apa pun yang lebih tinggi dari perakitan lurus. Pekerjaan kompiler adalah untuk menghasilkan kode mesin yang sesuai dengan kontrak semantik bahasa pemrograman.
sumber
Beberapa arsitektur (misalnya PIC) memiliki tumpukan perangkat keras yang kemampuannya terbatas (hanya dapat digunakan untuk alamat pengirim, bukan variabel). Beberapa arsitektur yang sangat kecil tidak memiliki instruksi store-and-increment atau PUSH, jadi lebih baik untuk melakukan stack.
variabel 'otomatis' dalam C harus selalu dikompilasi ke sesuatu dengan perilaku inisialisasi 'otomatis', dan 'statis' dengan perilaku statis; pada beberapa arsitektur Anda tidak diperbolehkan melakukan rekursi, dalam hal ini kompiler dapat secara statis mengalokasikan semua variabel.
sumber