Izinkan saya mengatakan bahwa saya memiliki cukup banyak pengalaman Java, tetapi baru-baru ini menjadi tertarik pada bahasa fungsional. Baru-baru ini saya mulai melihat Scala, yang sepertinya merupakan bahasa yang sangat bagus.
Namun, saya telah membaca tentang kerangka Aktor Scala dalam Pemrograman di Scala , dan ada satu hal yang tidak saya mengerti. Dalam bab 30.4 disebutkan bahwa menggunakan react
daripada receive
memungkinkan untuk menggunakan kembali utas, yang bagus untuk kinerja, karena utas mahal di JVM.
Apakah ini berarti, selama saya ingat untuk menelepon, react
bukan receive
, saya dapat memulai sebanyak mungkin Aktor yang saya suka? Sebelum menemukan Scala, saya telah bermain dengan Erlang, dan penulis Programming Erlang membanggakan tentang pemijahan lebih dari 200.000 proses tanpa mengeluarkan keringat. Saya benci melakukan itu dengan utas Java. Batasan apa yang saya lihat di Scala dibandingkan dengan Erlang (dan Java)?
Juga, bagaimana utas ini digunakan kembali bekerja di Scala? Mari kita asumsikan, untuk kesederhanaan, bahwa saya hanya memiliki satu utas. Akankah semua aktor yang saya mulai berjalan secara berurutan di utas ini, atau apakah akan terjadi semacam peralihan tugas? Misalnya, jika saya memulai dua aktor yang mengirim pesan ping-pong satu sama lain, apakah saya akan mengambil risiko kebuntuan jika mereka dimulai di utas yang sama?
Menurut Programming in Scala , penggunaan aktor menulis react
lebih sulit daripada dengan receive
. Ini terdengar masuk akal, karena react
tidak kembali. Namun, buku ini selanjutnya menunjukkan bagaimana Anda dapat membuat react
loop di dalam menggunakan Actor.loop
. Hasilnya, Anda mendapatkan
loop {
react {
...
}
}
yang, bagi saya, tampak sangat mirip
while (true) {
receive {
...
}
}
yang digunakan sebelumnya dalam buku ini. Namun, buku itu mengatakan bahwa "dalam praktiknya, program membutuhkan setidaknya beberapa receive
". Jadi apa yang saya lewatkan di sini? Apa yang receive
tidak bisa dilakukan yang react
tidak bisa, selain pengembalian? Dan mengapa saya peduli?
Akhirnya, sampai pada inti dari apa yang saya tidak mengerti: buku terus menyebutkan bagaimana penggunaan react
memungkinkan untuk membuang tumpukan panggilan untuk menggunakan kembali utas. Bagaimana cara kerjanya? Mengapa perlu membuang stack panggilan? Dan mengapa stack panggilan bisa dibuang ketika sebuah fungsi diakhiri dengan melemparkan pengecualian ( react
), tetapi tidak ketika itu diakhiri dengan mengembalikan ( receive
)?
Saya mendapat kesan bahwa Programming in Scala telah mengabaikan beberapa masalah utama di sini, yang memalukan, karena jika tidak, ini adalah buku yang sangat bagus.