Apakah mungkin untuk bahasa pemrograman berbasis stack menjadi bersamaan?

14

Saya telah membaca tentang bahasa pemrograman berbasis stack, seperti FORTH dan Cat , dan tampaknya mengingat sifatnya, mereka hanya dapat menjalankan satu tindakan pada satu waktu terlepas dari paradigma mereka (FORTH sangat penting sedangkan Cat berfungsi).

Bahasa imperatif akan memodifikasi tumpukan, dan bahasa murni fungsional, seperti Joy , akan mengembalikan tumpukan baru, tetapi intinya adalah bahwa hanya satu tumpukan digunakan pada suatu waktu.

Jadi, dapatkah bahasa pemrograman berbasis stack menjadi bersamaan? Bisakah mereka mencapai konkurensi dengan menggunakan banyak tumpukan pada saat yang sama atau serupa?

Apakah mungkin untuk menerapkan evaluasi malas dalam bahasa pemrograman berbasis stack?

Harap perbaiki saya jika saya salah paham tentang bahasa dan konsep yang disebutkan di atas

Armando H.
sumber
5
Bagaimana bisa setiap bahasa imperatif menjadi bersamaan?
Bergi
Apakah maksud Anda konkurensi (yang tidak terlalu sulit untuk dicapai, cukup gunakan beberapa utas berjalan dengan tumpukan independen ditambah memori bersama) atau paralelisme?
Daniel Jour
@DanielJour jika saya mengerti dengan baik, paralelisme berarti eksekusi simultan sedangkan konkurensi berarti eksekusi independen, jadi, ya, maksud saya konkurensi. Bisakah Anda menguraikan lebih lanjut tentang tumpukan independen untuk setiap utas?
Armando H.

Jawaban:

16

Jadi, dapatkah bahasa pemrograman berbasis stack menjadi bersamaan?

Tentu.

Bisakah mereka mencapai konkurensi dengan menggunakan banyak tumpukan pada saat yang sama atau serupa?

Sudah untuk bahasa normal multi-threading biasanya berarti memiliki beberapa tumpukan "panggilan". Akan sangat alami untuk memberikan setiap utas tumpukan data sendiri. Akan sangat mudah untuk memiliki aktor, misalnya, yang tubuhnya diimplementasikan oleh kode dalam bahasa berbasis stack. Paralelisme eksplisit penjelasan ala GHC parharus cukup jelas. Masalah utama dengan menjalankan hal-hal secara paralel adalah bahwa Anda tidak tahu apa efek tumpukan kode sampai Anda menjalankannya. Namun, menggunakan sintaks suka-Joy, orang bisa membayangkan [a b c] parsebagai mengeksekusia b cbaik terhadap tumpukan kosong atau salinan tumpukan dan hanya menjaga elemen paling atas tumpukan selesai (atau mendorong beberapa nilai dummy jika tumpukan kosong). Anda bisa membayangkan variasi. Paralelisme implisit akan lebih sulit dilakukan secara naif dibandingkan dengan, katakanlah, bahasa yang murni fungsional, tetapi tentu saja dapat dilakukan juga. Kode yang dikompilasi dari kombinator yang ditentukan pengguna seringkali tidak terlalu berbeda dari kode "normal".

Apakah mungkin untuk menerapkan evaluasi malas dalam bahasa pemrograman berbasis stack?

Efek tumpukan yang tidak diketahui lagi merupakan bagian yang sulit. Jika Anda merancang bahasa sedemikian rupa sehingga semua efek tumpukan dapat ditentukan secara statis, maka itu tidak terlalu menantang. Jika Anda memiliki kemalasan yang eksplisit, maka itu juga tampaknya relatif mudah dan akan terlihat seperti kutipan dan i. Satu bahasa yang menyebut dirinya sendiri sebagai bahasa konkatatif yang malas tampaknya melakukan campuran dari kedua pendekatan di atas dari apa yang bisa saya katakan. Saya tidak benar-benar melihat bagaimana bahasa konkatatif malas secara implisit akan bekerja dalam menghadapi efek tumpukan dinamis, setidaknya tidak dengan cara yang dapat digunakan secara samar-samar, tetapi itu mungkin hanya kurangnya imajinasi pada bagian saya.

Secara kebetulan, tidak jarang bahasa berbasis tumpukan memiliki banyak tumpukan, misalnya Forth memiliki tumpukan data dan tumpukan kembali yang juga digunakan untuk menempatkan data sewenang-wenang.

Derek Elkins meninggalkan SE
sumber
8

Saya tahu sedikit tentang FORTH jadi saya akan membatasi diri untuk itu. Ini adalah bahasa tingkat rendah, memberi Anda akses programmer ke semua sumber daya perangkat keras. Jadi Anda bisa melakukan apa pun yang Anda suka.

Konkurensi

Untuk memiliki program paralel (sunting: digunakan untuk mengatakan program konkuren nyata), Anda memerlukan setidaknya dua unit eksekusi (CPU-s). Agak sepele untuk mengimplementasikan kata dalam FORTH yang mengatakan, sebagai contoh, "jalankan kata ini pada prosesor 2 menggunakan dua argumen ini". Kata akan mengalokasikan dua tumpukan yang diperlukan pada prosesor 2 dan mulai menjalankan kata. Anda perlu membatasi diri Anda dalam konstruksi apa yang dapat Anda gunakan dalam program itu.

Jika jumlah program bersamaan lebih besar dari jumlah unit eksekusi Anda akan pergi untuk program "pseudo parallell". Pada dasarnya ada dua cara untuk melakukan itu: coroutine atau preemptive multitasking. Bagaimanapun juga adalah mungkin (tidak mudah, tetapi dijelaskan dengan baik dalam literatur) bagaimana mencapai hal ini dan FORTH memungkinkan Anda untuk mengakses semua hal tingkat rendah yang Anda butuhkan.

Evaluasi malas

Tentu saja Anda dapat melakukan ini dalam FORTH seperti pada hampir semua bahasa pemrograman. Itu tidak akan seanggun atau "built-in" seperti di katakanlah Haskell. Saya akan menggunakan contoh yang sangat naif.

Idenya adalah Anda mendefinisikan "fungsi" (digunakan secara longgar di sini) yang mengembalikan serangkaian hal. Salah satu contohnya adalah fungsi yang mengembalikan semua bilangan bulat. Anda kemudian melakukan operasi pada set ini dan ketika Anda selesai memberikan hasilnya. Sebagai contoh, Anda mungkin ingin menjumlahkan semua bilangan bulat hingga jumlahnya lebih besar dari 1000. Evaluasi yang tidak malas pertama-tama akan mengalokasikan semua bilangan bulat sebagai himpunan, yang tidak mungkin karena ada jumlah bilangan bulat yang tak terbatas. Kemudian akan mulai bekerja pada set ini. Implementasi yang malas akan memiliki cara "beri saya nilai berikutnya dalam set". Melakukan ini benar-benar hanya membutuhkan satu variabel di funktion "nilai terakhir memberi".

Haskell melakukan hal-hal seperti ini. Tentu saja menangani situasi yang lebih rumit tetapi idenya sama. Ini menutup evaluasi dengan cara yang memungkinkan Anda sebagai programmer untuk berkonsentrasi pada masalah, bukan pada bagaimana menyelesaikannya.

ghellquist
sumber
4
"Untuk memiliki program konkuren yang nyata, Anda memerlukan setidaknya dua unit eksekusi". Ini hanyalah masalah implementasi. Dari perspektif bahasa pemrograman, hampir tidak ada perbedaan antara dua utas yang berjalan pada satu CPU atau dua. Dalam arti tertentu, setiap utas dapat dianggap sebagai 'unit eksekusi' sendiri.
Kadal diskrit
1
Terkadang, detail penerapan harus dipertimbangkan. Salah satu contoh adalah ketika berinteraksi dengan dunia nyata di luar komputer nyata. Dalam waktu nyata yang sulit, karena "jawaban benar terlambat salah", waktunya mungkin berbeda ketika Anda membandingkan berjalan pada dua unit pengeksekusian dengan berjalan yang terpaku pada satu unit.
ghellquist
Terkadang kita melakukannya. Namun, saya ragu ini adalah kasus seperti itu. Misalnya, pertanyaannya tidak menyebutkan persyaratan penjadwalan waktu nyata.
Kadal diskrit
3
"Concurrency"! = "Parallelism". Beberapa utas yang berjalan pada mesin CPU tunggal dapat dikatakan berjalan bersamaan satu sama lain, meskipun tidak ada pemrosesan paralel yang terjadi.
Solomon Slow
Poin yang diambil tentang concurrency vs parallells. Saya akan mengubah teks.
ghellquist