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
sumber
Jawaban:
Tentu.
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
par
harus 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] par
sebagai mengeksekusia b c
baik 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".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.
sumber
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.
sumber