web-dev-qa-db-ja.com

Scalaプログラミング言語の目的は何ですか?

すべての言語は特定の目的のために作成されたと私は考えています。 Scalaは何のために作成されたのですか、それはどの問題を最もよく解決しますか?

40
user68109

Martin Oderskyによる講演 Scalaで言及されていることの1つは、さまざまな問題に対処するために適切にスケーリングする言語であることです。彼は、スケーリングに関する話をしていませんでした。パフォーマンスの意味ですが、言語自体がseemでライブラリを介して拡張できるという意味でそれ:

val lock = new ReentrantReadWriteLock
lock withReadLock {
   //do stuff
}

j.u.cロックを処理するための特別な構文シュガーがあるようです。しかし、これはそうではなく、単にscala言語がのように見えるように見えるように)使用しています。コードはより読みやすく、ね?

特に、scala言語のさまざまな構文解析ルールにより、ドメイン固有の言語(またはDSL)のように見えるライブラリを非常に簡単に作成できます。たとえば、scala-testを見てください。

describe("MyCoolClass") { 
  it("should do cool stuff") {
     val c = new MyCoolClass
     c.prop should be ("cool")
  }
} 

(これにはもっとたくさんの例があります-私は知りました これ 昨日)。 Java JDK7の言語( プロジェクトコイン )でどの新機能が使用されるかについて多くの話があります。これらの機能の多くは、特定の問題Scalaは、少しの煩わしさのための新しいキーワードが必要ないことを意味するいくつかの単純なルールで設計されています。

16
oxbow_lakes

Scalaのもう1つの目標は、functionalobject-の間のギャップを埋めることでした指向型言語です。これには、インスピレーションを得た(つまり、コピーされた)関数型言語が多数含まれています。私は非常に強力な パターンマッチング です actorベースの同時実行フレームワーク および(もちろん)1次および高次関数。

もちろん、あなたの質問は特定の目的があり、私は3つの別々の理由を与えたと言いました。マーティンオデルスキーに聞いてみてください。

13
oxbow_lakes

以前の回答に同意しますが、はじめに Scalaプログラミング言語の概要

Scalaに関する作業は、コンポーネントソフトウェアのより良い言語サポートを開発するための研究努力に由来します。Scala実験で検証したい2つの仮説があります。 。まず、コンポーネントソフトウェアのプログラミング言語は、同じ概念で小さな部分だけでなく大きな部分も記述できるという意味でスケーラブルである必要があると仮定します。あるレベルのコンポーネントでは役立つが他のレベルでは役に立たない可能性があるプリミティブのセット。次に、コンポーネントのスケーラブルなサポートは、オブジェクト指向プログラミングと関数型プログラミングを統合して一般化するプログラミング言語によって提供できると仮定します。型付き言語、そのScalaはインスタンスですが、これらの2つのパラダイムはこれまで大きく分けられていました。(Odersky)

私は個人的にScalaとともにPythonがどの問題をどのように解決するかという点で分類します。顕著な違いと時々の不満はタイプの複雑さです。Scalaの抽象化に同意します複雑で、時には複雑に見えるように見えますが、いくつかの点で:

  1. また、それらはほとんどオプションです。
  2. Scalaのコンパイラーは、循環的な複雑さとコード行がエスカレートするので、無料のテストとドキュメントのようなものです。
  3. 適切に実装されている場合Scalaそうでなければ、一貫性のある一貫したAPIの背後にあるすべての不可能な操作を実行できます。From Scala 2.8 Collections

たとえば、文字列(またはそのバッキングクラスRichString)は、Charのシーケンスと見なすことができますが、一般的なコレクション型ではありません。それにもかかわらず、RichStringを介して文字を文字マップにマッピングすると、次のScala REPLとの相互作用のように、RichStringが生成されます。

scala> "abc" map (x => (x + 1).toChar)
res1: scala.runtime.RichString = bcd

しかし、CharからIntへの関数を文字列に適用するとどうなりますか?その場合、結果として文字列を生成できません。代わりに、Int要素のシーケンスである必要があります。実際、次のようになります。

"abc" map (x => (x + 1))
res2: scala.collection.immutable.Vector[Int] = Vector(98, 99, 100)

そのため、渡された関数引数の結果の型が何であるかに応じて、mapはさまざまな型を生成することがわかります。 (オーデルスキー)

7
Texas

もちろん、元の設計目標のもう1つは、Java仮想マシンで実行され、Javaクラスと完全に相互運用可能な言語を作成することでした。これには(少なくとも)2つの利点があります。

  • jVMの遍在性、安定性、機能、評判を活用できます。 (管理拡張機能、JITコンパイル、高度なガベージコレクションなど)
  • サードパーティと独自のお気に入りのJavaライブラリをすべて使用できます。これが当てはまらない場合、多くの場合(私のものなど)、商業的にScalaを使用することは大きな障害になります。
7
oxbow_lakes

これは機能的であり、アクターを使用しているため(理解しているように、これが間違っている場合はコメントしてください)、ほぼすべてのCPUをスケールアップすることが非常に簡単になります。

そうは言っても、Scalaは新しい言語機能のテストベッドのようなものです。台所の流しに投げ込んで、何が起こるかを見てください。

私の個人的な意見では、3人以上のチームが関与するすべてのアプリについて、コンピューター全体をコーディングするだけでなく、仕事全体が他の人とどのようにやり取りするかが増えるため、非常にシンプルで制限的な構文の言語で生産性が向上します何かします。

追加する人が多いほど、何を説明するのに多くの時間を費やすことになりますか?:意味、または|の違いそして|| 2つのブール値に適用されます(Javaでは、ご存じの人はごくわずかです)。

2
Bill K