2

scala は MultiThread 用に設計されているが、実際には汎用目的であると言っているのを聞いたり見たりしています。

そして、「問題は、Java でクラスをスレッドセーフにすることはできますが (自分が何をしているのかわかっていれば)、Scala ではそれを簡単かつ自然に行うことができるということです。」

そして実際、AKKA と Lift は scala で記述されています (実際には Java と scala)。

しかし、java は、java.util.concurrent の新しいパッケージによって、この面でも改善されました。では、AKKA と Lift はなぜ JAVA で生まれなかったのでしょうか。

たぶん、scala は Java を C のように見せると言うでしょう :-)

誰でもこれについてより深い洞察やより深い考えを伝えることができますか?

JAVAとscalaを混在させることができるという事実を知っています。Scala は Java コードをシームレスに呼び出すことができます。だから、Javaが持っているものは、scalaもそうです。

しかし、さまざまな文法に関係なく、Java がまだ行っていないことを実際に改善する scala は何ですか?

Actors/Agents などの一部のデザインだけですか? (アクター/エージェントはマルチスレッドのすべての問題を解決できないことに注意してください。)

それとも、scala コンパイラーと関数型言語文法の採用は、本当に重要であり、Java よりも役立つのでしょうか?

scala が XText を採用できるようになるというニュースを耳にしました。XText を活用してスレッド ロジックを記述できるようにするには、これが正しいかどうかはわかりません。

Scala は複数の言語が混在しているように見えますが、このアプローチを使用すると、この側面の問題をより拡張して解決できますか?

アップデート

さまざまな角度から素晴らしい回答をありがとうございます。それらはすべて非常に優れていると思います。どちら側に立っていても構いません。

編集

以下のトピック (SO で 1 年前) は、同様のことについて尋ねていました。「建設的な」結論は非常に似ています。でも、今回は新しいポイントが出てきているのかもしれません。参考までに。

関連している:

実際、私は誰かがこの質問にまったく新しい角度で答えて、私の心を啓発し、これまで知らなかったアイデアを提供できることに非常に興味があります.

しかし、建設的ではないため閉鎖されています。:-)

4

3 に答える 3

6

私はこの分野の専門家ではありませんが、Scala は (少なくとも部分的には) 関数型プログラミング言語ですが、Java はそうではありません (必須です)。関数型プログラミングの特徴の 1 つは、(「自然な」方法で) 副作用を回避することです。

一方、スレッド セーフとは、副作用 (つまり、異なるスレッドが同じオブジェクト/メモリの一部/他のリソースを同時に変更すること) を回避することです。

于 2011-08-20T12:37:56.350 に答える
3

今日のように、複数のスレッドでの作業に関して、ScalaはJavaよりもはるかに悪いと思います。

言語仕様は、スレッドセーフなコードを作成するために信頼できるいくつかの本当に重要なことを定義していません。

たとえば、複数のスレッドを操作する場合、finalインスタンスフィールドは非常に特殊であることに注意してください。オブジェクトが競合状態で公開されている場合でも、コンストラクターの完了後、すべてのスレッドに初期値が表示されることが保証されています。

Scalaは、がフィールドvalにコンパイルされることを保証しません。final通常はそうですが、スペックに明確に記載されていないため、当然のこととは言えません。したがって、Javaには存在しない定型的な同期コードを作成するか、スレッドセーフが保証されていないコードを作成します(コンパイラーがvalsをfinalフィールドにマッピングし続けることを期待します)。

于 2011-08-20T13:22:20.240 に答える
2

実際の言語の問題ではなく、並行プログラミングを容易にする原則を適用することについてもっと言えます。たとえば、何も共有しない、メッセージパッシング、不変オブジェクト、副作用のない関数などです。ScalaはFP言語ではありません。それは最も厳密な意味ですが、機能的なプログラミング手法へのアクセスを提供します。

フレームワーク(言語ではない)の一部であるアクター/リアクターのような抽象化により、開発者はスレッドとクリティカルセクションの同期を直接処理できるようになります。さらに:2.9.x以降、並列コレクションはライブラリに直接含まれています。

于 2011-08-20T14:37:18.557 に答える