Bagaimana CPU yang dirancang murni untuk pemrograman fungsional berbeda?

14

CPU sampai batas tertentu dirancang dengan mengingat perangkat lunak yang orang akan menulis untuk itu, secara implisit atau eksplisit.

Tampak bagi saya bahwa jika Anda melihat desain arsitektur set instruksi, mereka sangat "penting", dalam arti bahwa setiap instruksi mengkodekan perintah gaya imperatif. Sepertinya saya juga bahwa arsitektur set instruksi saat ini telah berevolusi sebagian berdasarkan pada jenis kode yang dihasilkan oleh pemrogram.

Jika seseorang akan mendesain CPU dari awal, mengetahui bahwa itu hanya akan menjalankan program yang ditulis dalam gaya pemrograman fungsional, bagaimana CPU itu akan dirancang berbeda dari CPU yang ada?

pengguna56834
sumber
9
John Backus dalam bukunya, "Bisakah Pemrograman Dibebaskan dari Gaya von Neumann?" menyebutkan beberapa karya semacam itu (bagian 15).
Dmitri Urbanowicz
Cari mesin pengurang (grafik) atau kunjungi perpustakaan riset lokal Anda dengan harapan dapat menemukan salinan buku W. Kluge yang sudah tidak dicetak lagi, Organisasi Pengurangan, Aliran Data, dan Sistem Aliran Kontrol (MIT Press, 1992).
Kai
2
Juga buku Koopman, An Architecture for Combinator Graph Reduction (AP, 1990). Melihat ke mesin Lisp mungkin juga bermanfaat. en.wikipedia.org/wiki/Lisp_machine
Nama samaran
Saya pikir pada dasarnya mesin kami akan selalu sangat penting karena mereka mengeksekusi dari waktu ke waktu, mengubah keadaan mereka.
orlp
Beberapa fitur CPU yang berguna akan menjadi dukungan asli untuk thunks dan melompat lebih efisien. CPU juga mungkin dapat mengambil beberapa jalan pintas dengan mengetahui bahwa lokasi tertentu dalam memori tidak akan ditimpa dalam lingkup tertentu dan CPU tidak perlu memelihara tumpukan dengan cara yang sama seperti dalam bahasa berbasis tumpukan.
Pasang kembali Monica

Jawaban:

2

Sebenarnya, itu telah dilakukan: https://en.wikipedia.org/wiki/Lisp_machine

Salah satu aspek dalam desain CPU untuk FP adalah pengumpulan sampah. GC sangat penting untuk bahasa fungsional. Implementasi umum mengharuskan GC dapat membedakan antara pointer dan data non-pointer. Secara efektif, itu berarti menyimpan sedikit ekstra di sepanjang data Anda. Inilah alasannya, misalnya, bilangan bulat OCaml hanya 31 bit pada arsitektur 32-bit dan 63 bit pada arsitektur 64-bit. Aritmatika integer kemudian melibatkan operasi pemindahan ekstra canggung. Bahasa lain (atau tipe data OCaml lainnya) dapat membuang seluruh kata mesin untuk bit ekstra tersebut, sehingga menggunakan 128 bit untuk integer 64-bit. CPU yang dirancang secara native terhadap GC mungkin memiliki bus data 65-bit tetapi aritmatika 64-bit.

Yang mengatakan, banyak bahasa non-fungsional juga memiliki pengumpulan sampah dan dengan demikian akan mendapat keuntungan dari arsitektur masing-masing.

Hal lain yang terlintas dalam pikiran adalah bahwa penggunaan memori FP biasanya jauh lebih tersebar daripada program penting. Terutama karena kurang alami untuk menggunakan array. Karena itu, program-program ini mendapat untung lebih sedikit dari caching potongan memori yang berdekatan. Jadi, CPU FP mungkin menggunakan strategi caching yang berbeda.

berlutut
sumber
1

Itu tidak akan mengubah apa pun atau akan memanfaatkan pengaturan paralel besar seperti di Reduceron dan penggantinya PilGRIM 1 dengan tumpukan besar.

Pernyataan bahwa itu akan mengubah tidak ada yang tampak berani pada awalnya, tetapi karena CPU berurutan, ada proses terjemahan (kompilasi) yang menggunakan perangkat keras yang tersedia untuk memperluas efisiensi. Harus ada arsitektur lain, beberapa operasi akan lebih cepat, beberapa akan memerlukan trik peretasan untuk mempercepatnya.

Arsitektur yang akan membuat perbedaan akan membutuhkan operasi peta dan daftar untuk berjalan lebih cepat (bukan keseluruhan cerita, tetapi cukup untuk menunjukkan efeknya). Tidak ada kemungkinan untuk membuat perangkat keras yang berubah secara dinamis untuk menjalankan daftar secara native, sehingga perangkat ini disimpan dalam memori yang tidak terpakai. Kami tetap berpegang pada representasi array dari beberapa bentuk. Untuk peta, untuk berjalan dalam pengaturan non-sekuensial - kita kembali ke Reduceron. Begitu efektif satu pemrosesan terpusat untuk instruksi berurutan, dan dukungan untuk pemrosesan paralel.

Apa yang mungkin berbeda adalah kemungkinan untuk memuat beberapa fungsi dan menjalankannya tanpa juggling frame - tetapi menambahkan beberapa unit untuk fungsi akan membuat kekacauan dengan mengakses memori.

Menambah jawaban lutut, GC akan bermanfaat untuk dijalankan sebagai coprocessor, itu akan menjadi fitur yang sangat rapi.

1: PilGRIM dijelaskan dengan benar dalam Boeijink A., Hölzenspies PKF, Kuper J. (2011) Memperkenalkan PilGRIM: Sebuah Prosesor untuk Menjalankan Bahasa Fungsional Malas. Dalam: Hage J., Morazán MT (eds) Implementasi dan Aplikasi Bahasa Fungsional. IFL 2010. Catatan Kuliah di Ilmu Komputer, vol 6647. Springer, Berlin, Heidelberg .

Jahat
sumber
"Tidak ada kemungkinan untuk membuat rekursi asli". Bisakah Anda menjelaskan mengapa ini? Tampaknya mengejutkan pada awalnya bagi saya.
user56834
Juga, apakah reduceron sesuatu yang bisa menjadi cpu keras, bukannya berjalan di FPGA?
user56834
Buruk saya, saya maksud rekursi asli , tetapi mungkin tidak relevan. Saya harus sedikit merevisi.
Evil
0

Pertama sedikit lelucon: menjalankan program fungsional 100% tidak pernah dapat melakukan sesuatu yang bermanfaat, cukuplah hanya memiliki instruksi NOP. (Saya buka ini untuk perang api).

Jadi, perlu ada beberapa instruksi penting untuk IO dan dukungan biasa untuk pemrograman imperatif.

Kalau tidak, sebagian tergantung pada bahasa aktual yang digunakan. Dua yang ada di pikiran saya adalah Haskell dan Erlang.

Saya akan Percaya bahwa Haskell dapat mengambil manfaat dari dukungan untuk daftar dan peta. Daftar dapat didukung oleh pemetaan memori perangkat keras tertentu, mengubah daftar yang ditautkan menjadi serangkaian alamat yang berurutan. Elemen pertama mungkin pada alamat n, kedua pada alamat n +1 dan seterusnya. Untuk menghapus elemen pertama dari daftar, Anda cukup mengubah pointer n. Akhirnya, ketika Anda menghapus pointer n semua memori dapat dibebaskan. Peta dapat didukung sebagai array asosiatif - masukkan nilai pencarian dan sistem memori mengembalikan item. Tidak perlu untuk pencarian berulang.

Erlang pada gilirannya dapat mengambil manfaat dari dukungan pesan / proses dan rekursi ekor dengan keadaan penuh. Pesan dan proses dapat didukung dengan berbagai cara, salah satu contoh mungkin memiliki jumlah inti pemrosesan yang sangat besar. Ekor rekursi dapat ditingkatkan oleh pengontrol memori karena mengetahui keadaan dapat disalin jauh lebih cepat, mungkin tidak menyalin sejumlah besar data, melainkan hanya memodifikasi pointer sistem memori.

ghellquist
sumber