JavaでのScalaのスケーラビリティ


9

私はScalaがJavaよりも並行性をうまく処理するという記事を読みました。

http://www.theserverside.com/feature/Solving-the-Scalability-Paradox-with-Scala-Clojure-and-Groovy

...スケーラビリティの制限は、特にJavaプログラミング言語自体に限定されますが、Javaプラットフォーム全体の制限ではありません...

Javaのスケーラビリティの問題は新しい発見ではありません。実際、これらの問題に対処するために多くの作業が行われ、最も成功したプロジェクトの2つはScalaとClojureという名前のプログラミング言語です...

... Scalaは、Java言語の問題のあるスレッドとロックパラダイムを回避する方法を見つけています...

これはどのようにして可能ですか?Scalaは、JavaからScalaにすべてのスレッドとロックの問題をもたらすJavaのコアライブラリを使用していませんか?

回答:


16

まあ、もちろんそうです。Javaは、Cで記述されたJVMによって提供されるすべてのインフラストラクチャを再利用し、最終的にはマシンコードで実行されます。

開発者がアプリケーションを拡張できるようにする目的は、より強力な能力を提供することではありません。アセンブラには、ハードウェアで可能なすべての機能が備わっており、言語でこれ以上の機能を提供することはできません。実際、高階言語の全体の要点は、プログラマーがそれらで実行できることを制限することです。それは恐ろしいように聞こえますが、素晴らしい、正しく、効率的なコードを書く際のボトルネックは計算モデルではありません。機械のために書かれたプログラムを理解しなければならないのは、人々の頭脳です。経験から、複雑な計算問題の理論的に最適なソリューションを理解するのに十分なほどスマートではないことがわかっています。私たちはそれを見たとしても、おそらくそれさえも認識しないでしょう。

具体的な例では、この記事はおそらく、Scalaがより高いレベルのライブラリと概念を提供することを意味します。これにより、開発者は並行性の観点から問題を簡単に理解できるため、Javaで直接コーディングするよりも優れたスケーラビリティが得られます(またはC、またはアセンブラー)でした。Scalaが完全にJava仮想マシン上で実行されるという事実と矛盾しません。JVMは、あらゆる種類のきちんとしたものを、JVMなしで可能なものよりも簡単に書くことができる美しい発明です。さらに複雑なことを簡単にするフレームワークやライブラリも含まれます。すごいですね。


2
高次言語は制限以上のことを行います。それらは抽象化も可能にします-アセンブラはハードウェアのすべての能力を持っていますが、それを抽象化することはほとんどできません。この特定のケースでは、Scalaが行うことは、50%の制限、50%の抽象化です。
ダニエルC.ソブラル

1
@ダニエル-抽象化は価値があるが、確かに抽象化は制限の1つの形態にすぎないことに同意しますか?具体的なインスタンスの特定の詳細を削除し、一般的な概念のみを保持するという意味では?ウィキペディアは次のように述べています:「抽象化は概念または観察可能な現象の情報内容を減らすことによって形成される可能性があります」
mikera '19

5

ライブラリのサポートの問題です。Javaは低レベルのスレッド構成を使用して並行性を表現します(これは並行性の世界のアセンブリ言語に似ています)。java.util.concurrentパッケージによって提供されるサポートを使用したり、BrianのGoetzのテクニック(Java Concurrency in Practice)をフォローしたりするなど、これらの上にスケーラブルなソリューションを構築するために使用できるライブラリとテクニックはたくさんあります。Scalaは、Akkaフレームワーク(現在はJavaでも使用可能)のようなものを導入するのに役立ちました。これらは、これらの優れたプラクティスとライブラリーサポートのいくつかを組み込んでいます。それは、Javaが言語に追いつけなかったと言っているわけではありません(並列コレクションなど)。

また、Javaのオブジェクトもデフォルトで変更可能であり、効果的に不変にするためには、いくつかの重要な知識が必要です。Scalaは不変のオブジェクトを簡単に作成できると評判


2

Scalaは、JavaからScalaにすべてのスレッドとロックの問題をもたらすJavaのコアライブラリを使用していませんか?

そうですね、Scalaでロックを行うと、同じ問題に直面することになります。ただし要点は、Scalaがこの問題をより安全に処理する抽象化を提供するため、想定されていないことです。

現在、Scalaは本当に役立つ2つのことを行います。それらの1つはアクターモデルです。これは、Scalaがライブラリとして提供する、並行性パターンと考えることができます。あなたがJavaプログラマーであるなら、私はあなたに行くことを勧めます AkkaのサイトにアクセスしてJavaに関するものを確認。これは、Scalaの現在のアクターライブラリを置き換えるライブラリであり、Javaから使用できます。

Scalaが2番目に役立つのは、不変のデータ構造を使用することです。Javaが不変のデータ構造を使用するのを妨げるものは何もありません- Stringたとえば、それ自体は不変です!不変のデータ構造影響を受けません、スレッドが変更できないため、同時実行性の問題にれることはありません。

エージェントとstm(どちらもAkkaから入手可能)やラッチ(Javaから入手可能)など、完全なソリューションを構成するためにこれらに追加されるものがあります。

さて、私が言ったように、上記の2つはJavaで実行できます。AkkaはJavaで使用でき、Javaで不変のデータ構造を作成できます(またはそれらを提供するライブラリから使用できます)。ただし、Javaは高次の型もクロージャやファーストクラスの関数もサポートしていないため、このようなものを使用するのは面倒です。

そのため、プログラマーはそれを実行できます、Javaでは通常、そのようなコードの記述は非常に冗長であるため(つまり、Javaの標準よりはるかに多いため)、プログラマーはそうしません。


0

参照記事の主な考えは次のとおりです。

スケーラビリティの制限は特にJavaプログラミング言語自体に限定されますが、Javaプラットフォーム全体の制限ではありません。実際、基盤となるJavaプラットフォームを適切に利用するようにプログラムが作成されている場合、線形のスケーラビリティは問題になりません。

大規模なスケーラビリティが必要な場合は、ScalaやClojureなどの周辺JVM言語をいつでも利用できます

私はこれに同意できません。ScalaのようなJVM言語を使用すると、次のことがわかります。

  1. 特定のランタイムサポートを使用する。このサポートには、Javaプログラムから直接アクセスできます。

  2. 特定の構文。簡潔な式を使用して、ランタイムサポートへのアクセスを容易にし、エラーが発生しにくくします。これは真実であり、純粋なJavaでの記述はより冗長であり、より多くの規律を必要としますが、ギャップはそれほど劇的ではありません。

つまり、Actorモデルを使用しているため、ScalaはJavaよりも並行性をうまく処理します。アクターモデルはJavaでうまく使用できます。Javaには、Akka(Scalaで使用)を含むいくつかのアクターライブラリがあるため、Scalaへの切り替えは必須ではありません。

ピュアJavaを介してアクターモデルを使用することには、独自の利点があります。

  • より簡単なデバッグ
  • 使用するアクターライブラリをカスタマイズする可能性。これは、ライブラリがコンパクトで理解可能な場合に特に当てはまります。これは、次のようなものです:df4j
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.