まず、Javaの経験は豊富ですが、関数型言語に興味を持つようになったのはつい最近のことです。最近、Scalaを検討し始めました。Scalaはとてもいい言語のようです。
ただし、「Scalaでのプログラミング」でScalaのActorフレームワークについて読んでいますが、理解できないことが1つあります。30.4章では、react
代わりにreceive
を使用するとスレッドを再利用できるようになると述べています。これは、JVMではスレッドが高価であるため、パフォーマンスに優れています。
これは、のreact
代わりに呼び出すことを覚えている限り、receive
好きなだけアクターを開始できることを意味しますか?Scalaを発見する前は、Erlangで遊んでおり、Programming Erlangの作者は200,000を超えるプロセスをスポーンさせずに生み出したことを誇りに思っています。Javaスレッドでそれを行うのは嫌です。Erlang(およびJava)と比較して、Scalaではどのような制限を見ていますか?
また、このスレッドの再利用はScalaでどのように機能しますか?簡単にするために、スレッドが1つしかないと仮定します。私が開始するすべてのアクターはこのスレッドで順次実行されますか、それとも何らかのタスク切り替えが行われますか?たとえば、メッセージを互いにピンポンする2つのアクターを開始した場合、それらが同じスレッドで開始された場合、デッドロックの危険がありますか?
Scalaのプログラミングによると、使用するアクターの作成はを使用する場合react
よりも困難ですreceive
。react
戻らないので、これはもっともらしく聞こえます。ただし、この本では、をreact
使用してループ内に配置する方法を示していますActor.loop
。結果として、
loop {
react {
...
}
}
私にとって、これは
while (true) {
receive {
...
}
}
これは本の前半で使用されています。それでも、本は「実際には、プログラムには少なくとも数個が必要になる」と述べていreceive
ます。だから私はここで何が欠けていますか?返す以外に、receive
それreact
ができないことは何ですか?そして、なぜ私は気にしますか?
最後に、私が理解していないことの核心にたどり着きます。この本ではreact
、スレッドを再利用するためにコールスタックを破棄することがどのように可能になるかについて、本が繰り返し言及しています。それはどのように機能しますか?呼び出しスタックを破棄する必要があるのはなぜですか?そして、関数が例外(react
)をスローすることによって終了したときにコールスタックが破棄されるのはなぜreceive
ですか?
『Scalaでのプログラミング』は、ここでの主要な問題のいくつかにつまづいているように思えますが、それは残念です。