Scala(プログラミング言語)

ウィキペディアから、無料の百科事典
ナビゲーションにジャンプ 検索にジャンプ
Scala
Scala-full-color.svg
パラダイムマルチパラダイム同時機能的命令型オブジェクト指向
によって設計されたマーティン・オーダスキー
デベロッパーÉcolePolytechniqueFédéraledeLausanneのプログラミング手法研究所
初登場2004年1月20日; 18年前 (2004-01-20
安定リリース
3.1.0 [1] ウィキデータでこれを編集する / 2021年10月18日; 4ヶ月前 (2021年10月18日
プレビューリリース
3.1.1-RC1 [2] ウィキデータでこれを編集する / 2021年10月18日; 4ヶ月前 (2021年10月18日
規律の入力推測された、静的な強い構造的な
実装言語Scala
プラットホームJava仮想マシン(JVM)
JavaScriptScala.js
LLVMScala Native)(実験的)
ライセンスApache 2.0 [3]
ファイル名拡張子.scala、.sc
Webサイトwww .scala-lang .org
に影響を受けた
Common Lisp[4] EiffelErlangF#Haskell[5] Java[6] OCaml[6] OzPizza[7] Scheme[6] SmalltalkStandard ML [6]
影響を受ける
セイロンチゼルファントムF#コトリンラッソレッドフリックス
  • ウィキブックスのScala

Scala/ ˈskɑːlɑː / SKAH -lah [ 8]は、オブジェクト指向プログラミング関数型プログラミングの両方をサポートする、静的に型付けされた強力汎用プログラミング言語です。簡潔になるように設計されており[9]、Scalaの設計上の決定の多くは、Javaに対する批判に対処することを目的としています。[7]

ScalaソースコードはJavaバイトコードにコンパイルしてJava仮想マシン(JVM)で実行できます。ScalaはJavaとの言語相互運用性を提供するため、いずれかの言語で記述されたライブラリをScalaまたはJavaコードで直接参照できます。[10] Javaと同様に、Scalaはオブジェクト指向であり、言語Cに類似したcurly-braceと呼ばれる構文を使用しますScala 3以降、ブロックを構造化するためにオフサイドルール(インデント)を使用するオプションもあり、その使用をお勧めします。マーティン・オーダスキーこれはScala3で導入された最も生産的な変更であることが判明したと述べています。[11]

Javaとは異なり、Scalaには、カリー化、不変性遅延評価パターンマッチングなど、 SchemeStandard MLHaskellなどの関数型プログラミング言語の多くの機能がありますまた、代数的データ型共変性と反変性、高次(ただし、上位型ではない)、および匿名型をサポートする高度な型システムも備えていますJavaには存在しないScalaの他の機能には、演算子のオーバーロード、オプションのパラメーター、名前付きパラメーターが含まれます、および生の文字列逆に、ScalaにないJavaの機能はチェックされた例外であり、これは物議を醸していることが証明されています。[12]

Scalaという名前は、スケーラブル言語のかばん語であり、ユーザーの要求に応じて成長するように設計されていることを意味します。[13]

歴史

Scalaの設計は、2001年にMartinOderskyによるÉcolePolytechniqueFédéraledeLausanne (EPFL )スイスローザンヌ)で始まりました。関数型プログラミングとペトリネットのアイデアを組み合わせたプログラミング言語であるFunnelの研究に続きました。[14] Oderskyは、以前はGeneric Java、およびSunのJavaコンパイラであるjavacに取り組んでいました。[14]

2003年後半の内部リリースの後、Scalaは2004年の初めにJavaプラットフォーム公開されました[15] [7] [14] [16] 2番目のバージョン(v2.0)は2006年3月に続きました。[7]

2011年1月17日、Scalaチームは、欧州研究会議から230万ユーロを超える5年間の研究助成金を獲得しました[17] 2011年5月12日、Oderskyと共同研究者は、Scalaに商業的サポート、トレーニング、サービスを提供する会社であるTypesafe Inc.(後にLightbend Inc.に改名)を立ち上げました。Typesafeは、2011年にGreylockPartnersから300万ドルの投資を受けました[18] [19] [20] [21]

プラットフォームとライセンス

ScalaはJavaプラットフォームJava仮想マシン)で実行され、既存のJavaプログラムと互換性があります。[15] Androidアプリケーションは通常Javaで記述され、パッケージ化されるとJavaバイトコードからDalvikバイトコードに変換されるため(インストール時にネイティブマシンコードにさらに変換される場合があります)、ScalaのJava互換性により、Android開発に最適です。機能的なアプローチが推奨されます。[22]

コンパイラとライブラリを含むリファレンスScalaソフトウェアディストリビューションは、Apacheライセンスの下でリリースされています。[23]

他のコンパイラとターゲット

Scala.jsは、JavaScriptにコンパイルされるScalaコンパイラーであり、WebブラウザーまたはNode.jsで実行できるScalaプログラムを作成できるようにします[24] 2013年から開発中のコンパイラは、2015年には実験的ではなくなったと発表されました(v0.6)。バージョンv1.0.0-M1は2018年6月にリリースされ、バージョン1.1.1は2020年9月にリリースされました。[25]

Scala Nativeは、 LLVMコンパイラインフラストラクチャを対象として、 Boehmガベージコレクタを使用する軽量のマネージドランタイムを使用する実行可能コードを作成するScalaコンパイラです。このプロジェクトはDenysShabalinが主導し、2017年3月14日に最初のリリース0.1をリリースしました。ScalaNativeの開発は、JVMのジャストインタイムコンパイルよりも高速で、コードを作成し、ネイティブルーチンを直接呼び出す機能も提供します。[26] [27]

.NETFrameworkとその共通言語ランタイムを対象とするリファレンスScalaコンパイラは2004年6月にリリースされましたが[14]、2012年に正式に廃止されました。[28]

「HelloWorld」の例

Scalaで記述されたHelloWorld プログラムの形式は次のとおりです。

 オブジェクト HelloWorld  Appを拡張します { 
   println "Hello、World!" 
 }

Java用のスタンドアロンのHelloWorldアプリケーションとは異なり、クラス宣言はなく、静的であると宣言されるものはありません。代わりに、 objectキーワードで 作成されシングルトンオブジェクトが使用されます。

プログラムがファイルHelloWorld.scalaに保存されている場合、ユーザーは次のコマンドを使用してプログラムをコンパイルします。

$ scalac HelloWorld.scala

で実行します

$ scala HelloWorld

これは、Javaコードをコンパイルして実行するプロセスに似ています。実際、Scalaのコンパイルおよび実行モデルはJavaのモデルと同じであり、 ApacheAntなどのJavaビルドツールと互換性があります

「HelloWorld」Scalaプログラムの短いバージョンは次のとおりです。

println "Hello、World!" 

Scalaには、インタラクティブなシェルとスクリプトのサポートが含まれています。[29]という名前のファイルに保存されHelloWorld2.scala、次のコマンドを使用してスクリプトとして実行できます。

$ scala HelloWorld2.scala

オプション-eを使用して、コマンドをScalaインタープリターに直接入力することもできます。

$ scala -e'println( "Hello、World!") '

式はREPLにインタラクティブに入力できます

$ scala
 Scala 2.12.2(Java HotSpot(TM)64ビットサーバーVM、Java 1.8.0_131)へようこそ。
評価用の式を入力します。または:helpを試してください。

scala> List(1、2、3).map(x => x * x)
res0:List [Int] = List(1、4、9)

scala>

基本例

次の例は、JavaとScalaの構文の違いを示しています。関数mathFunctionは整数を取り、それを2乗し、その数値の立方根をその数値の自然対数に追加して、結果を返します(つまり、):

// Java:
int  mathFunction int  num  { 
    int  numSquare  =  num * num ; 
    return  int  Math .cbrt numSquare + Math .log numSquare ; } 
      

// Scala:Javaからの直接変換

//インポートは必要ありません; scala.math 
//すでに `math`としてインポートされています
defmathFunction  num Int   Int  =  { 
  var  numSquare  Int  =  num * num 
  return  math .cbrt numSquare + math .log numSquare asInstanceOf [ Int ] }  
    

// Scala:より慣用的
//型推論を使用し、 `return`ステートメントを省略し、
//` toInt`メソッドを使用し、numSquareを不変と宣言します

 数学をインポートします。_ 
def  mathFunction num  Int  =  { 
  val  numSquare  =  num * num 
  cbrt numSquare  +  log numSquare ))。toInt 
}

このコードの構文上の違いは次のとおりです。

  • Scalaはステートメントを終了するためにセミコロンを必要としません。
  • 値の型は大文字になります:Int, Double, Booleanの代わりにint, double, boolean
  • パラメータとリターンのタイプは、Cのように先行するのではなく、 Pascalのように続きます。
  • メソッドの前には。を付ける必要がありますdef
  • ローカル変数またはクラス変数の前には、 val不変変数を示す)またはvar可変変数を示す)を付ける必要があります。
  • 関数ではreturn演算子は不要です(許可されていますが)。最後に実行されたステートメントまたは式の値は、通常、関数の値です。
  • Javaキャスト演算子の代わりに(Type) foo、Scalaは、、またはfoo.asInstanceOf[Type]などの特殊な関数を使用します。toDoubletoInt
  • Javaの代わりにimport foo.*;、Scalaはを使用しimport foo._ます。
  • 関数またはメソッドfoo()は、単にfoo;として呼び出すこともできます。メソッドthread.send(signo)は、単にthread send signo;として呼び出すこともできます。メソッドfoo.toString()は、と同じように呼び出すこともできますfoo toString

これらの構文緩和は、ドメイン固有言語のサポートを可能にするように設計されています。

その他の基本的な構文上の違い:

  • 配列参照は、関数呼び出しのように記述されます。たとえば、ではありませarray(i)array[i](Scalaの内部では、前者は参照を返すarray.apply(i)に展開されます)
  • ジェネリック型はList[String]、Javaではなくegとして記述されますList<String>
  • 疑似型の代わりにvoid、Scalaには実際のシングルトンクラス Unitがあります(以下を参照)。

クラスの例

次の例では、JavaとScalaのクラスの定義を対比しています。

// Java:
public  class  Point  { 
  private  final  double  x  y ;

  public  Point final  double  x  final  double  y  { 
    this x  =  x ; 
    これy  =  y ; 
  }

  public  Point 
    final  double  x  final  double  y 
    final  boolean  addToGrid 
   { 
    this x  y );

    if  addToGrid 
      grid addToGrid this ); 
  }

  public  Point  { 
    this 0.0、0.0  ; }
  

  public  double  getX () { 
    return  x ; 
  }

  public  double  getY () { 
    return  y ; 
  }

  double  distanceToPoint final  Point  other  { 
    return  distanceBetweenPoints x  y 
      other .x other .y ; _ } 
  

  プライベート 静的 グリッド グリッド = 新しい ポイント();

  static  double  distanceBetweenPoints 
      final  double  x1  final  double  y1 
      final  double  x2  final  double  y2 
   { 
    returnMath  _ hypot x1 - x2 y1 - y2 ); } }     
  

// Scala
クラス Point 
    val  x  Double  val  y  Double 
    a ​​ddToGrid  Boolean  =  false 
 { 
  importPoint  _

  if  addToGrid 
    grid addToGrid this 

  def  this  =  this 0.0、0.0 _ 

  def  distanceToPoint other  Point  = 
    distanceBetweenPoints x  y  other .x other .y } _ _ 


object  Point  { 
  private  val  grid  =  new  Point ()

  def  distanceBetweenPoints x1  Double  y1  Double 
      x2  Double  y2  Double  =  { 
    math hypot x1  -  x2  y1  -  y2 
  } 
}

上記のコードは、JavaとScalaのクラスの処理の概念的な違いのいくつかを示しています。

  • Scalaには静的変数やメソッドはありません。代わりに、シングルトンオブジェクトがあります。これは、基本的に1つのインスタンスのみを持つクラスです。シングルトンオブジェクトは、objectの代わりにを使用して宣言されますclass静的変数とメソッドは、クラス名と同じ名前のシングルトンオブジェクトに配置するのが一般的です。これは、コンパニオンオブジェクトと呼ばれます。[15](シングルトンオブジェクトの基礎となるクラスが$追加されています。したがって、class Fooコンパニオンオブジェクトの場合、内部にコンパニオンオブジェクトのコードを含むobject Fooクラスがあり、このクラスの1つのオブジェクトがシングルトンパターンを使用して作成されます。)Foo$
  • コンストラクターパラメーターの代わりに、Scalaには、関数のパラメーターと同様に、クラスに配置されるクラスパラメーターがありますvalまたは修飾子を使用して宣言するとvar、フィールドも同じ名前で定義され、クラスパラメーターから自動的に初期化されます。(内部では、パブリックフィールドへの外部アクセスは、常に自動的に作成されるアクセサー(ゲッター)メソッドとミューテーター(セッター)メソッドを経由します。アクセサー関数はフィールドと同じ名前であるため、上記の例では不要です。アクセサメソッドを明示的に宣言します。)Javaの場合と同様に、代替コンストラクタも宣言できることに注意してください。(メンバー変数の初期化以外の)デフォルトのコンストラクターに入るコードは、クラスレベルで直接入ります。
  • Scalaのデフォルトの可視性はですpublic

機能(Javaを参照)

ScalaにはJavaC#と同じコンパイルモデルがあります。つまり、コンパイルと動的クラスの読み込みが別々になっているため、ScalaコードはJavaライブラリを呼び出すことができます。

Scalaの動作特性はJavaと同じです。Scalaコンパイラーは、Javaコンパイラーによって生成されたものとほぼ同じバイトコードを生成します。[15]実際、Scalaコードは、特定のコンストラクター操作を除いて、読み取り可能なJavaコードに逆コンパイルできます。Java仮想マシン(JVM)にとって、ScalaコードとJavaコードは区別できません。唯一の違いは、1つの追加のランタイムライブラリですscala-library.jar[30]

Scalaは、Javaと比較して多数の機能を追加し、式と型の基礎となるモデルにいくつかの基本的な違いがあります。これにより、言語が理論的にクリーンになり、Javaのいくつかのコーナーケースが排除されます。Scalaの観点からは、Scalaに追加されたいくつかの機能がC#でも利用できるため、これは実際に重要です。

構文の柔軟性

上記のように、ScalaはJavaと比較して構文上の柔軟性がかなりあります。以下にいくつかの例を示します。

  • セミコロンは不要です。通常はこの位置に配置できないトークンで開始または終了する場合、または閉じられていない括弧または括弧がある場合、行は自動的に結合されます。
  • 中置演算子として任意のメソッドを使用できます。たとえば"%d apples".format(num)、と"%d apples" format numは同等です。実際、関数名は任意の記号のシーケンスで構成できるため、算術演算子は他のメソッドと同じよう+<<扱われます(特別に処理する必要のある括弧、角かっこ、中かっこなどのいくつかの例外を除きます)。このようなシンボル名のメソッドが受ける唯一の特別な扱いは、優先順位の処理に関するものです。
  • メソッドapplyupdate構文の短い形式があります。foo()—ここで、は値(シングルトンfooオブジェクトまたはクラスインスタンス)—は、の略で、はのfoo.apply()foo() = 42ですfoo.update(42)同様に、は、foo(42)の略でfoo.apply(42)foo(4) = 2はの略ですfoo.update(4, 2)これはコレクションクラスに使用され、 STMセルなどの他の多くの場合に拡張されます。
  • def foo = 42Scalaは、no-parens()メソッドとempty-parens( )メソッドを区別しdef foo() = 42ます。empty-parensメソッドを呼び出す場合、括弧を省略できます。これは、この区別を知らないJavaライブラリを呼び出す場合に役立ちます。たとえば、foo.toStringの代わりにを使用しfoo.toString()ます。慣例により、メソッドは副作用を実行するときに空の親で定義する必要があります
  • コロン()で終わるメソッド名:は、左側に引数、右側にレシーバーを想定しています。たとえば、は、結果と視覚的に対応する最初の形式(最初の要素4と2番目の要素2のリスト)と4 :: 2 :: Nil同じです。Nil.::(2).::(4)
  • クラス本体変数は、個別のゲッターメソッドとセッターメソッドとして透過的に実装できます。の場合trait FooLike { var bar: Int }、実装はですコールサイトは引き続き簡潔に使用できますobject Foo extends FooLike { private var x = 0; def bar = x; def bar_=(value: Int) { x = value }} } }foo.bar = 42
  • メソッド呼び出しでは、括弧の代わりに中括弧を使用できます。これにより、新しい制御構造の純粋なライブラリ実装が可能になります。[31]たとえば、言語で定義されたキーワードのbreakable { ... if (...) break() ... }ように見えますが、実際にはサンク引数breakableを取るメソッドにすぎません。サンクまたは関数を使用するメソッドは、多くの場合、これらを2番目のパラメーターリストに配置し、括弧と中括弧の構文を混在させることができます。はと同じです。中括弧のバリアントを使用すると、式を複数の行にまたがることができます。Vector.fill(4) { math.random }Vector.fill(4)(math.random)
  • mapFor-expressions(さらに下で説明)は、、、flatMapなどのモナディックメソッドを定義する任意のタイプに対応できますfilter

これら自体は疑わしい選択のように思われるかもしれませんが、まとめると、コンパイラーを拡張することなく、ドメイン固有言語をScalaで定義できるようにするという目的を果たします。たとえば、アクターにメッセージを送信するためのErlangactor ! messageの特別な構文、つまり、言語拡張を必要とせずにScalaライブラリーに実装できます(そして実装されます)。

統一型システム

intJavaは、プリミティブ型(egとboolean)と参照型(任意のクラス)を明確に区別します。参照型のみが継承スキームの一部であり、から派生しjava.lang.Objectます。Scalaでは、すべての型が最上位クラスを継承しAny、その直接の子は( andAnyValなどの値型)と(Javaのような参照型)です。これは、プリミティブ型とボックス型( vs.など)のJavaの区別がScalaには存在しないことを意味します。ボクシングとアンボクシングはユーザーに対して完全に透過的です。Scala 2.10では、ユーザーが新しい値型を定義できます。 IntBooleanAnyRefintInteger

For-expressions

イテレータをループするためのJavaの「foreachfor 」ループの代わりに、Scalaには-expressionsがあります。これは、Haskellなどの言語のリスト内包表記、またはPythonのリスト内包表記とジェネレータ式の組み合わせに似ています。キーワードを使用したfor-expressionsを使用すると、既存のコレクションを反復処理して新しいコレクションを生成し、同じタイプの新しいコレクションを返すことができます。それらはコンパイラによって一連のおよび呼び出しに変換されます。が使用されていない場合、コードはに変換することにより、命令型ループに近似します。 yieldmapflatMapfilteryieldforeach

簡単な例は次のとおりです。

val  s  =  for  x  <  -1〜25  if x * x > 50 yield 2 * x _  _      

それを実行した結果は次のベクトルです:

Vector(16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50)

1 to 25(式は特別な構文ではないことに注意してください。このメソッドは、標準のScalaライブラリで、新しいメソッドを既存の型に追加できる 暗黙の変換[32]toと呼ばれる手法を使用して、整数の拡張メソッドとして定義されています。)

マップ上での反復のより複雑な例は次のとおりです。

//一連のツイートで言及されたTwitterユーザーを指定するマップを指定し、
//各ユーザーが言及された回数、//既知の政治家のマップでユーザーを検索し、 
//民主主義者のみを示す新しいマップを返します
政治家(文字列ではなくオブジェクトとして)。
val  dem_mentions  =  for  { 
    言及  <- 言及
    アカウント          <- アカウントアカウントの場合は言及を取得しますparty == "Democratic" } yield account times
       
     )。

(mention, times) <- mentionsパターンマッチングの例です(以下を参照)。マップを反復処理すると、Key-Valueタプルのセットが返され、パターンマッチングにより、タプルをキーと値の個別の変数に簡単に分解できます。同様に、理解の結果もKey-Valueタプルを返します。これは、(変数からの)ソースオブジェクトがマップであるため、自動的にマップに組み込まれmentionsます。代わりに、リスト、セット、配列、またはその他のタプルのコレクションを保持している場合mentions、上記とまったく同じコードを使用すると、同じタイプの新しいコレクションが生成されることに注意してください。

機能的傾向

Javaで利用可能なすべてのオブジェクト指向機能をサポートする(そして実際には、さまざまな方法でそれらを拡張する)一方で、Scalaは、関数型プログラミング言語でのみ通常見られる多数の機能も提供します。これらの機能を組み合わせることで、Scalaプログラムをほぼ完全に機能的なスタイルで記述できるようになり、機能的なスタイルとオブジェクト指向のスタイルを混在させることもできます。

例は次のとおりです。

すべてが表現です

CやJavaとは異なりますが、 Lispなどの言語に似ていますが、Scalaはステートメントとを区別しませんすべてのステートメントは、実際には何らかの値に評価される式です。voidCまたはJavaで返されると宣言される関数、およびそのようなステートメントwhileが論理的に値を返さない関数は、Scalaで、その型のオブジェクトが1つだけUnitあるシングルトン型である型を返すと見なされます。まったく返されない関数と演算子(たとえば、throw演算子または例外を使用して常に非ローカルで終了する関数)は、論理的に戻り型Nothingを持ちます。これは、オブジェクトを含まない特殊な型です。つまり、ボトムタイプ、つまり、考えられるすべてのタイプのサブクラス。(これにより、型Nothingはすべての型と互換性があり、型推論が正しく機能するようになります。)[33]

同様に、if-then-else「ステートメント」は実際には式であり、値、つまり2つのブランチの1つを評価した結果を生成します。これは、そのようなコードのブロックを式が必要な場所に挿入できることを意味し、Scala での三項演算子の必要性を排除します。

// Java:
int  hexDigit  =  x  > =  10   x  +  'A'  -  10   x  +  ' 0 ' ;
// Scala:
val  hexDigit  =  if  x  > =  10  x  +  ' A'  -  10  else  x  +  ' 0 '

同様の理由で、returnScalaではステートメントは不要であり、実際には推奨されていません。Lispの場合と同様に、コードブロックの最後の式はそのコードブロックの値であり、コードブロックが関数の本体である場合は、関数によって返されます。

すべての関数が式であることを明確にするために、戻るメソッドでさえUnit等号で記述されています

def  printValue x  String ): Unit  =  { 
  println "I ate a%s" .format x 
}

または同等に(型推論を使用し、不要な中括弧を省略して):

def  printValue x  String  =  println "I ate a%s"  format  x 

型推論

型推論により、変数の型、関数の戻り値、およびその他の多くの式は、コンパイラーが推測できるため、通常は省略できます。例としては、val x = "foo"(不変定数または不変オブジェクトの場合)またはvar x = 1.5(後で値を変更できる変数の場合)があります。HaskellML、およびその他のより純粋関数型言語で使用されるよりグローバルなHindley-Milnerアルゴリズムとは対照的に、Scalaの型推論は本質的にローカルです。これは、オブジェクト指向プログラミングを容易にするために行われます。その結果、特定の型(特に、関数パラメーター、および再帰関数の戻り型) を宣言する必要があります。

def  formatApples x  Int  =  "私は%d個のリンゴを食べました" フォーマットx 

または(再帰関数に対して宣言された戻り型を使用)

def 階乗x  Int  Int  = 
  if  x  ==  0 
    1 
  else 
    x *階乗x  --1  

匿名関数

Scalaでは、関数はオブジェクトであり、無名関数を指定するための便利な構文があります。例として、x => x < 21つのパラメーターを持つ関数を指定する式があります。この式は、引数を比較して2未満かどうかを確認します。これはLisp形式と同等(lambda (x) (< x 2))です。x型も戻り型も明示的に指定する必要はなく、通常は型推論によって推論できることに注意してくださいただし、明示的に指定することもできます。たとえば、as(x: Int) => x < 2または(x: Int) => (x < 2): Boolean

匿名関数は、囲んでいる関数の環境で字句的に利用可能な変数を自動的にキャプチャするという点で、真のクロージャとして動作します。これらの変数は、囲んでいる関数が戻った後でも使用可能であり、Javaの匿名内部クラスの場合とは異なり、 finalとして宣言する必要はありません。(そのような変数が可変である場合は変更することも可能であり、変更された値は次に匿名関数が呼び出されたときに使用可能になります。)

さらに短い形式の無名関数は、プレースホルダー変数を使用します。たとえば、次のようになります。

list map { x => sqrt(x) }

より簡潔に書くことができます

list map { sqrt(_) }

あるいは

list map sqrt

不変性

Scalaは、不変変数と可変変数の区別を強制します。可変変数はキーワードを使用してvar宣言され、不変値はキーワードを使用して宣言されますvalキーワードを使用して宣言された変数は、Javaでキーワードvalを使用して宣言された変数を再割り当てできないのと同じ方法で再割り当てすることはできません。は浅く不変であるだけです。つまり、valによって参照されるオブジェクトは、それ自体が不変であることが保証されていません。 finalval

ただし、慣例により不変クラスが推奨されており、Scala標準ライブラリは不変コレクションクラスの豊富なセットを提供します。Scalaは、ほとんどのコレクションクラスの可変および不変のバリアントを提供し、可変バージョンが明示的にインポートされない限り、不変バージョンが常に使用されます。[34] 不変のバリアントは永続的なデータ構造であり、古いオブジェクトを破壊的に更新するのではなく、常に古いオブジェクトの更新されたコピーを返します。この例は、不変のリンクリストです。ここで、要素をリストに追加するには、要素とリストテールへの参照で構成される新しいリストノードを返します。リストに要素を追加するには、古いリストのすべての要素を新しい要素のみを含む新しいリストに追加する必要があります。同様に、リストの中央に要素を挿入すると、リストの前半がコピーされますが、リストの後半への参照は保持されます。これは構造共有と呼ばれます。これにより、非常に簡単な同時実行が可能になります。共有オブジェクトが変更されることがないため、ロックは必要ありません。[35]

怠惰な(厳密ではない)評価

デフォルトでは、評価は厳密(「熱心」)です。言い換えれば、Scalaは、必要に応じてではなく、利用可能になるとすぐに式を評価します。ただし、キーワードを使用して変数を非厳密( "lazy")として宣言することは可能ですlazy。つまり、変数の値を生成するコードは、変数が最初に参照されるまで評価されません。さまざまなタイプの非厳密なコレクション(タイプStream、非厳密なリンクリストなど)も存在し、任意のコレクションを非厳密にすることができます。view方法。非厳密なコレクションは、サーバーで生成されたデータのようなものに適切なセマンティックフィットを提供します。この場合、コードを評価してリストの後半の要素を生成します(これにより、サーバーへの要求がトリガーされ、場合によってはWeb上の別の場所に配置されます)。要素が実際に必要なときに発生します。

末尾再帰

関数型プログラミング言語は通常、スタックオーバーフローの問題なしに再帰を広範囲に使用できるように末尾呼び出しの最適化を提供します。Javaバイトコードの制限により、JVMでの末尾呼び出しの最適化が複雑になります。一般に、末尾呼び出しで自分自身を呼び出す関数は最適化できますが、相互再帰関数は最適化できません。回避策としてトランポリンが提案されています。[36]トランポリンのサポートは、Scala 2.8.0(2010年7月14日リリース)以降、オブジェクトとともにScalaライブラリによって提供されています。関数にはオプションで注釈を付けることができます。その場合、末尾再帰でない限り、関数はコンパイルされません。[37]scala.util.control.TailCalls@tailrec

ケースクラスとパターンマッチング

Scalaにはパターンマッチングのサポートが組み込まれています。これは、 switchステートメントのより洗練された拡張可能なバージョンと考えることができ、任意のデータ型(整数、ブール値、文字列などの単純な型ではなく)を一致させることができます。ネスト。ケースクラスと呼ばれる特別なタイプのクラスが提供されます。これには、パターンマッチングの自動サポートが含まれ、代数的データ型のモデル化に使用できます。多くの関数型プログラミング言語で使用されます。(Scalaの観点からは、ケースクラスは、コンパイラーが手動で提供できる特定の動作を自動的に追加する通常のクラスです。たとえば、詳細な比較とハッシュを提供するメソッドの定義、コンストラクターでのケースクラスの破棄などです。パターンマッチング中のパラメータ。)

パターンマッチングを使用したクイックソートアルゴリズム の定義の例は次のとおりです。

def  qsort list  List [ Int ]): List [ Int ]  =  list  match  { 
  case  Nil  =>  Nil 
  case ピボット ::  tail  => 
    val  smaller  rest  =  tail パーティション_  < ピボット
    qsort 小さい ::: ピボット ::  qsort 残り
}

ここでの考え方は、リストをピボット未満の要素とそれ以下の要素に分割し、各部分を再帰的に並べ替え、その間のピボットと一緒に結果を貼り付けることです。これは、マージソートおよびその他の高速ソートアルゴリズム と同じ分割統治戦略を使用します。

演算子は、matchに格納されているオブジェクトのパターンマッチングを行うために使用されlistます。case式は、一致するかどうかを確認するために順番に試行され、最初の一致によって結果が決まります。この場合、Nilはリテラルオブジェクトにのみ一致しますNilが、pivot :: tail空でないリストに一致し、同時に指定されたパターンに従ってリストを分解しますこの場合、関連付けられたコードはpivot、リストの先頭を保持するという名前のローカル変数と、リストtailの末尾を保持する別の変数にアクセスできます。これらの変数は読み取り専用であり、LispおよびScheme の演算子を使用して確立された変数バインディングと意味的に非常に似ていることに注意してください。let

パターンマッチングは、ローカル変数宣言でも発生します。この場合、toの呼び出しの戻り値はtail.partitionタプルこの場合は2つのリスト)です。(タプルは、リストなどの他のタイプのコンテナーとは異なり、常に固定サイズであり、要素は異なるタイプにすることができます。ただし、ここでは両方とも同じです。)パターンマッチングは、タプル。

フォームは、プレースホルダー変数を使用した無名関数_ < pivotの宣言です。匿名関数に関する上記のセクションを参照してください。

リスト演算子::(LispとSchemeのように、リストの先頭に要素を追加しますcons)と:::(LispとSchemeのように2つのリストを一緒に追加しますappend)の両方が表示されます。外観にもかかわらず、これらの演算子のどちらにも「組み込み」はありません。上記のように、任意の記号の文字列を関数名として使用でき、オブジェクトに適用されるメソッドは、ピリオドや括弧なしで「中置」スタイルで記述できます。書かれた上記の行:

qsort(smaller) ::: pivot :: qsort(rest)

このように書くこともできます:

qsort(rest).::(pivot).:::(qsort(smaller))

より標準的なメソッド呼び出し表記。(コロンで終わるメソッドは右結合であり、右側のオブジェクトにバインドされます。)

部分関数

上記のパターンマッチングの例では、match演算子の本体は部分関数であり、 switchステートメントcaseの本体と同様に、最初の一致する式が優先される一連の式で構成されています。部分関数は、ステートメント の例外処理部分でも使用されます。try

try  { 
  ... 
}  catch  { 
  case  nfe NumberFormatException  =>  {  println nfe );  リスト0  } 
  case  _  =>  Nil 
}

最後に、部分関数は単独で使用でき、それを呼び出した結果は、それをmatch上書きするのと同じです。たとえば、クイックソートの以前のコードは次のように記述できます。

val  qsort  リスト[ Int ]  => リスト[ Int ]  =  {
  ケース Nil  =>  Nil
  ケース ピボット ::  tail  => 
    val  smaller  rest  =  tail パーティション_  < ピボット
    qsort 小さい ::: ピボット ::  qsort 残り
}

ここでは、整数のリストから整数のリストまでの関数を型とする読み取り専用変数が宣言され、それを部分関数にバインドします。(部分関数の単一のパラメーターが明示的に宣言または名前付けされることはないことに注意してください。)ただし、通常の関数であるかのように、この変数を正確に呼び出すことができます。

scala >  qsort List 6、2、5、9 res32 List [ Int ] = List 2、5、6、9 _ _ _ _ _ _ _ _ _ _ _
      

オブジェクト指向の拡張機能

Scalaは、すべての値がオブジェクトであるという意味で、純粋なオブジェクト指向言語です。オブジェクトのデータ型と動作は、クラス特性によって記述されます。クラスの抽象化は、多重継承の問題を回避するために、サブクラス化と柔軟なミックスインベースの構成メカニズムによって拡張されます。

トレイトは、JavaのインターフェースをScalaで置き換えたものです。8未満のバージョンのJavaのインターフェースは厳しく制限されており、抽象関数宣言のみを含めることができます。これにより、インターフェイスに便利なメソッドを提供するのは厄介であり(すべての実装で同じメソッドを再実装する必要があります)、公開されたインターフェイスを下位互換性のある方法で拡張することは不可能であるという批判があります。トレイトは常にクラスと混合されるため、トレイトは通常の抽象クラスのほぼすべての機能を備え、クラスパラメーター(ScalaはJavaのコンストラクターパラメーターに相当)のみを欠いているという点でミックスインクラスに似ています。Thesuper演算子はトレイトで特別に動作し、継承に加えて合成を使用してトレイトをチェーンできるようにします。次の例は、単純なウィンドウシステムです。

抽象 クラス Window  { 
  //抽象
  defdraw  }


class  SimpleWindow  extends  Window  { 
  def  draw () { 
    println "in SimpleWindow" 
    //基本的なウィンドウを描画します
  } 
}

特性 WindowDecoration  Window  {  }を拡張します

特性 Horizo  ​​ntalScrollbarDecorationextends  WindowDecoration  { //親
  関数は抽象であるため、「super()」が機能するには//ここで「抽象オーバーライド」が必要です。
  具体的であれば、定期的な「オーバーライド」で十分です。
  抽象 オーバーライド defdraw  (){ println "inホリゾンタルスクロールバーデコレーション" super draw ()//水平スクロールバーを描画する} } 
    
    
    
  


trait  VerticalScrollbarDecoration  extends  WindowDecoration  { 
  abstract  override  def  draw () { 
    println "in VerticalScrollbarDecoration" 
    super draw ()
    //垂直スクロールバーを描画する
  } 
}

特性 TitleDecoration  WindowDecorationを拡張し ます{ 
  abstractoverride  def draw (){ println "in TitleDecoration" super draw ()//タイトルバーを描画します} }   
    
    
    
  

変数は次のように宣言できます。

val  mywin  = 新しい SimpleWindow  VerticalScrollbarDecoration  Horizo ​​ntalScrollbarDecoration  TitleDecoration

呼び出しの結果mywin.draw()は次のとおりです。

 SimpleWindow
 VerticalScrollbarDecorationHorizo ​​ntalScrollbarDecoration
TitleDecoration 
 

言い換えると、への呼び出しは、draw最初に(最後に混合された特性)のコードを実行しTitleDecoration、次に(呼び出しを介して)他の混合された特性を介して、最終的にはのコードsuper()スレッドバックされます。お互いに。これはデコレータパターンに似ていますが、親ウィンドウを明示的にカプセル化する必要がなく、実装が変更されていない関数を明示的に転送する必要がなく、エンティティ関係の実行時の初期化に依存する必要がないため、より簡潔でエラーが発生しにくくなります。 。他の言語では、実装継承の長い線形チェーンを使用して、コンパイル時に同様の効果を実現できます。Window、ただし、Scalaと比較すると、ミックスインの可能な組み合わせごとに1つの線形継承チェーンを宣言する必要があるという欠点があります。

表現型システム

Scalaには、抽象化の安全で一貫性のある使用を主に強制する表現力豊かな静的型システムが装備されています。ただし、型システムは健全ではありません。[38]特に、型システムは以下をサポートします。

Scalaは使用によってタイプを推測することができます。これにより、ほとんどの静的型宣言はオプションになります。コンパイラエラーが必要性を示さない限り、静的型を明示的に宣言する必要はありません。実際には、コードを明確にするために、いくつかの静的型宣言が含まれています。

タイプエンリッチメント

「enrichmylibrary」 [ 39]( 2006年MartinOderskyによって「pimpmylibrary」呼ばれていた) [ 32]として知られる、Scalaの一般的な手法。 41])、既存のタイプに追加されたかのように新しいメソッドを使用できるようにします。これは、拡張メソッドのC#の概念に似ていますが、メソッドの追加に限定されず、たとえば、新しいインターフェイスの実装に使用できるため、より強力です。Scalaでは、この手法には暗黙的な変換の宣言が含まれますメソッドを「受け取る」タイプから、元のタイプをラップして追加のメソッドを提供する新しいタイプ(通常はクラス)へ。特定の型のメソッドが見つからない場合、コンパイラーは、問題のメソッドを提供する型への適用可能な暗黙の変換を自動的に検索します。

この手法により、アドオンライブラリを使用して既存のクラスに新しいメソッドを追加できるため、アドオンライブラリをインポートするコードのみが新しい機能を取得し、他のすべてのコードは影響を受けません。

Int次の例は、メソッドisEvenisOdd: を使用した型の強化を示しています。

オブジェクト MyExtensions  {
  暗黙 のクラス IntPredicates i  Int  { 
    def  isEven  =  i   2  ==  0 
    def  isOdd   =  isEven 
  } 
}

 MyExtensionsをインポートします_ //スコープ  4に暗黙のエンリッチメントをもたらし
ます。isEven //-> true  

のメンバーをインポートすると、MyExtensions拡張クラスへの暗黙的な変換がIntPredicatesスコープに組み込まれます。[42]

並行性

Scalaの標準ライブラリには、標準のJava同時実行APIに加えて、futuresとpromiseのサポートが含まれています。当初は、アクターモデルのサポートも含まれていました。これは、 LightbendIncによって作成された別個のオープンソースプラットフォームAkka [43]として利用可能になりました。Akkaアクターは、分散するか、ソフトウェアトランザクショナルメモリトランザクショナル)と組み合わせることができますチャネルベースのメッセージパッシングのための代替のCommunicationSequentive Process (CSP)実装は、Communicating Scala Objects [44]または単にJCSPを介しものです。

アクターは、メールボックスを持つスレッドインスタンスのようなものです。これは、メッセージを受信するメソッドをsystem.actorOfオーバーライドし、 (感嘆符)メソッドを使用してメッセージを送信することで作成できます。[45] 次の例は、メッセージを受信して​​印刷できるEchoServerを示しています。 receive!

val  echoServer  = アクター新しい Act  {
  になる { 
    casemsg  => println "echo" + msg  } } echoServer "やあ"   
  

  

Scalaには、バージョン2.9.0以降、標準ライブラリに統合された 並列コレクション[46]の形式でのデータ並列プログラミングのサポートも組み込まれています。

次の例は、並列コレクションを使用してパフォーマンスを向上させる方法を示しています。[47]

val  urls  =  List "https://scala-lang.org"  "https://github.com/scala/scala" 

def  fromURL url  String  =  scala io ソースfromURL url 
  getLines ()。mkString "\ n" 

val  t  = システムcurrentTimeMillis ()
urls パーmap fromURL _ )) // parはコレクションの並列実装を返します
println " time:"  +  System .currentTimeMillis --t  +  "ms "   

Futures and Promise、アクターのサポート、データの並列処理に加えて、Scalaはソフトウェアトランザクショナルメモリとイベントストリームを使用した非同期プログラミングもサポートしています。[48]

クラスターコンピューティング

Scalaで書かれた最もよく知られているオープンソースのクラスターコンピューティングソリューションはApacheSparkです。さらに、Sparkやその他のストリーム処理テクノロジーで人気 のあるパブリッシュ/サブスクライブメッセージキューであるApacheKafkaはScalaで記述されています。

テスト

Scalaでコードをテストする方法はいくつかあります。ScalaTestは複数のテストスタイルをサポートし、Javaベースのテストフレームワークと統合できます。[49] ScalaCheckは、HaskellのQuickCheckに似たライブラリです。[50] specs2は、実行可能ソフトウェア仕様を作成するためのライブラリです。[51] ScalaMockは、高次関数とカリー化関数のテストをサポートします。[52] JUnitTestNGは、Javaで記述された一般的なテストフレームワークです。

バージョン

バージョン リリース済み 特徴
1.0.0-b2 [53] 2003年12月8日
1.1.0-b1 [53] 2004年2月19日
  • scala.Enumeration
  • Scalaライセンスが改訂されたBSDライセンスに変更されました
1.1.1 [53] 2004年3月23日
  • Java静的内部クラスのサポート
  • Iterable、Array、xml.Elem、Bufferに対するライブラリクラスの改善
1.2.0 [53] 2004年6月9日
  • ビュー
  • XMLリテラル(「近い将来削除され、XML文字列補間に置き換えられる」[54]
1.3.0 [53] 2004年9月16日
  • Microsoft.NETのサポート
  • メソッドクロージャ
  • パラメータなしのメソッドの型構文がから[] Tに変更されました=> T
1.4.0 [53] 2005年6月20日
  • 属性
  • matchキーワードはmatchメソッドを置き換えます
  • ランタイムタイプの実験的サポート
2.0 [55] 2006年3月12日
  • コンパイラはScalaで完全に書き直されました
  • Javaジェネリックの実験的サポート
  • implicitrequiresキーワード
  • matchキーワードは中置のみ許可
  • withextends接続詞は、句の後にのみ許可されます
  • セミコロンの代わりに改行をステートメント区切り文字として使用できます
  • シーケンスパターンのみに制限された正規表現の一致パターン
  • 内包表記は、値とパターンの定義を認めます
  • クラスパラメータの前にvalまたはvarを付けることができます
  • プライベートビジビリティには修飾子があります
2.1.0 [53] 2006年3月17日
  • Scalaディストリビューションに統合されたsbazツール
  • matchキーワードはmatchメソッドを置き換えます
  • ランタイムタイプの実験的サポート
2.1.8 [56] 2006年8月23日
  • 保護された可視性には修飾子があります
  • クラスのプライベートメンバーは、クラスのコンパニオンモジュールから参照でき、その逆も可能です。
  • 一般化された暗黙のルックアップ
  • シングルトンタイプの場合、型付きパターンマッチが強化されます
2.3.0 [57] 2006年11月23日
  • 戻る関数Unitは、戻りタイプを明示的に指定する必要はありません
  • 型変数と型は、パターンマッチングで区別されます
  • AllAllRef名前を変更しましNothingNull
2.4.0 [58] 2007年3月9日
  • privateおよび修飾子は修飾子protectedを受け入れます[this]
  • タプルは丸括弧で書くことができます
  • クラスのプライマリコンストラクターをプライベートまたは保護としてマークできるようになりました
  • 属性が新しい構文の注釈に変更されました
  • 自己エイリアス
  • 演算子は代入と組み合わせることができます
2.5.0 [59] 2007年5月2日
  • 型パラメーターと抽象型メンバーは、型コンストラクターを抽象化することもできます
  • オブジェクトのフィールドは、親コンストラクターが呼び出される前に初期化できます
  • 内包表記の構文変更
  • 暗黙の無名関数(パラメーターにアンダースコアを使用)
  • あらゆるアーティをサポートするために拡張された無名関数のパターンマッチング
2.6.0 [60] 2007年7月27日
  • 存在型
  • 怠惰な値
  • 構造タイプ
2.7.0 [61] 2008年2月7日
  • デフォルトでサポートされているJava汎用タイプ
  • ケースクラスの機能が拡張されました
2.8.0 [62] 2010年7月14日
  • コレクションタイプの共通の、統一された、包括的なフレームワークを改訂します。
  • タイプスペシャライゼーション
  • 名前付きおよびデフォルトの引数
  • パッケージオブジェクト
  • 改善された注釈
2.9.0 [63] 2011年5月12日
  • 並列コレクション
  • スレッドセーフな特性が特性Appに置き換わるApplication
  • DelayedInit特性
  • Java相互運用性の改善
2.10 [64] 2013年1月4日
  • 値クラス[65]
  • 暗黙のクラス[66]
  • 文字列補間[67]
  • 未来と約束[68]
  • DynamicおよびapplyDynamic [69]
  • 依存メソッドタイプ:
    • def identity(x: AnyRef): x.type = x // the return type says we return exactly what we got
  • ASMに基づく新しいバイトコードエミッタ:
    • JDK 1.5、1.6、1.7をターゲットにできます
    • デフォルトで1.6バイトコードを出力します
    • 古い1.5バックエンドは非推奨です
  • 新しいパターンマッチャー:ゼロから書き直して、より堅牢なコードを生成します(指数関数的な爆発はもうありません)
    • コードの生成と分析が独立しました(後者は-Xno-patmat-analysisでオフにできます)
  • Scaladocの改善
    • 暗黙的(-暗黙的フラグ)
    • ダイアグラム(-diagramsフラグ、graphvizが必要)
    • グループ(-groups)
  • モジュール化された言語機能[70]
  • 並列コレクション[71]は、カスタムスレッドプールで構成できるようになりました
  • Akka俳優は現在ディストリビューションの一部です
    • scala.actorsは非推奨になり、akkaの実装がディストリビューションに含まれるようになりました。
  • パフォーマンスの向上
    • より高速なインライン
    • Range#sumはO(1)になりました
  • ForkJoinライブラリの更新
  • 不変のTreeSet / TreeMapの修正
  • PartialFunctionsの改善
  • の追加 ???およびNotImplementedError
  • 拡張メソッド用のIsTraversableOnce + IsTraversableLike型クラスの追加
  • 非推奨とクリーンアップ
  • 浮動小数点と8進数のリテラル構文の非推奨
  • scala.dbcを削除しました

実験的特徴

  • Scalaリフレクション[72]
  • マクロ[73]
2.10.2 [74] 2013年6月6日
2.10.3 [75] 2013年10月1日
2.10.4 [76] 2014年3月18日
2.10.5 [77] 2015年3月5日
2.11.0 [78] 2014年4月21日
  • コレクションのパフォーマンスの向上
  • コンパイラのパフォーマンスの向上
2.11.1 [79] 2014年5月20日
2.11.2 [80] 2014年7月22日
2.11.4 [81] 2014年10月31日
2.11.5 [82] 2015年1月8日
2.11.6 [83] 2015年3月5日
2.11.7 [84] 2015年6月23日
2.11.8 [85] 2016年3月8日
2.11.11 [86] 2017年4月18日
2.11.12 [87] 2017年11月13日
2.12.0 [88] 2016年11月3日
2.12.1 [89] 2016年12月5日
2.12.2 [90] 2017年4月18日
2.12.3 [91] 2017年7月26日
2.12.4 [92] 2017年10月17日
2.12.5 [93] 2018年3月15日
2.12.6 [94] 2018年4月27日
2.12.7 [95] 2018年9月27日
2.12.8 [96] 2018年12月4日
  • ライセンスがApachev2.0に変更された最初のScala2.12リリース
2.12.9 [97] 2019年8月5日
2.12.10 [98] 2019年9月10日
2.12.11 [99] 2020年3月16日
2.12.12 [100] 2020年7月13日
2.12.13 [101] 2021年1月12日
2.13.0 [102] 2019年6月11日
  • 再設計された標準コレクションライブラリ
  • リテラルタイプ
  • 部分型統一
  • 名前による暗黙の
  • コンパイラの最適化
2.13.1 [103] 2019年9月18日
2.13.2 [104] 2020年4月22日
2.13.3 [105] 2020年6月25日
2.13.4 [106] 2020年11月19日
2.13.5 [107] 2021年2月22日
3.0.0 [108] 2021年5月13日

他のJVM言語との比較

Scalaは、JVMを使用する他の2つのプログラミング言語であるGroovyClojureとよく比較されます。これらの言語間の実質的な違いは、型システム、各言語がオブジェクト指向および関数型プログラミングをサポートする範囲、およびJavaの構文との類似性に存在します。

Scalaは静的に型付けされますが、GroovyとClojureは両方とも動的に型付けされます。これにより、型システムがより複雑で理解しにくくなりますが、コンパイル時にほとんどすべての[38]型エラーをキャッチできるため、実行が大幅に高速化されます。対照的に、動的型付けは、プログラムの正確性を確認するためにより多くのテストを必要とし、したがって、プログラミングの柔軟性と単純さを高めるために、一般的に遅くなります。速度の違いに関して、GroovyとClojureの現在のバージョンでは、オプションの型注釈を使用して、型が実質的に静的である場合にプログラムが動的型付けのオーバーヘッドを回避できるようにします。このオーバーヘッドは、 invokedynamicで拡張された最新バージョンのJVMを使用する場合にさらに削減されます。動的に型付けされた引数で定義されたメソッドの命令。これらの進歩により、静的型付けと動的型付けの間の速度のギャップが減少しますが、実行効率が非常に重要な場合は、Scalaのような静的型付け言語が依然として推奨されます。

プログラミングパラダイムに関して、ScalaはJavaのオブジェクト指向モデルを継承し、さまざまな方法で拡張します。Groovyは、オブジェクト指向でもありますが、冗長性を減らすことに重点を置いています。Clojureでは、オブジェクト指向プログラミングは重要視されておらず、関数型プログラミングが言語の主な強みです。Scalaには、 Haskellのような高度な関数型言語に見られる機能を含む多くの関数型プログラミング機能もあり、開発者が2つのパラダイム、またはより頻繁にはそれらの組み合わせを選択できるように、2つのパラダイムを不可知論的にしようとします。

Javaとの構文の類似性に関しては、Groovyの場合と同様に、ScalaはJavaの構文の多くを継承します。一方、Clojureは、外観と哲学の両方が異なるLisp構文に従います。ただし、Scalaの学習は、その多くの高度な機能のために難しいと考えられています。これはGroovyには当てはまりませんが、主にスクリプト言語として設計されているため、機能が豊富な言語でもあります。[要出典]

採用

言語ランキング

2021年の時点で、Clojure、Groovy、Kotlin、ScalaなどのJVMベースの言語は、通常は上位3位にランクされている元のJava言語[109] [110]よりも大幅に人気が低く、同時に進化しています。時間。

言語チュートリアルの検索を追跡するプログラミング言語インデックスの人気[111]は、Scalaを2018年4月にわずかな下降傾向で15位、2021年1月に17位にランク付けしました。これにより、ScalaはJavaおよびKotlinに次いで3番目に人気のあるJVMベースの言語になります。 、12位。

プログラミング言語の人気のTIOBEインデックス[110]は、インターネット検索エンジンのランキングと同様の出版物のカウントを使用して、言語の人気を決定します。2021年9月現在、31位にScalaが表示されています。このランキングでは、ScalaはHaskell(38位)とErlangを上回っていますが、Go(14位)、Swift(15位)、Perl(19位)を下回っています。

GitHubプロジェクトの数とStackOverflowでの質問に基づいてランキングを確立する、RedMonkプログラミング言語ランキングScalaで14位にランクされています。[109]ここで、Scalaは、 GoPowerShellHaskellの前、 SwiftObjective-CTypescriptRの後ろにある第2層の言語グループ内に配置されています。

さまざまなJava関連のトピックについて5160人の開発者からデータを収集したJavaの状態調査[112]の2018年版では、ScalaはJVMでの代替言語の使用に関して3番目に位置しています。調査の前年版と比較して、代替JVM言語でのScalaの使用は28.4%から21.5%に減少し、Kotlinに追い抜かれました。Kotlinは2017年の11.4%から2018年には28.8%に増加しました。

2013年にScalaがバージョン2.10であったとき、ThoughtWorks Technology Radarは、上級技術者のグループの意見に基づく年2回のレポートであり、[113]その言語とフレームワークのカテゴリーでScalaの採用を推奨しました。[114] 2014年7月に、この評価はより具体的になり、現在は「Scala、良い部分」に言及しています。これは、「Scalaをうまく使用するには、言語を研究し、非常に強い意見を持っている必要があります。パーツはあなたにぴったりで、Scalaの独自の定義を作成します。良いパーツです。」[115]

会社

  • 2009年4月、Twitterは、バックエンドの大部分をRubyからScalaに切り替え、残りを変換することを意図していると発表しました。[116]
  • GiltはScalaとPlayFrameworkを使用しています。[117]
  • FoursquareはScalaとLiftを使用しています。[118]
  • CourseraはScalaとPlayFrameworkを使用しています。[119]
  • Apple Inc.は、JavaおよびPlayフレームワークとともに、特定のチームでScalaを使用しています。[120] [121]
  • ガーディアン紙のトラフィックの多いウェブサイトguardian.co.uk [122]は、2011年4月にJavaからScalaに切り替えることを発表しました。[123] [124]
  • New York Timesは、2014年に、内部コンテンツ管理システムBlackbeardがScala、Akka、およびPlayを使用して構築されていることを明らかにしました。[125]
  • Huffington Post新聞は、2013年にコンテンツ配信システムAthenaの一部としてScalaを採用し始めました。 [126]
  • スイスの銀行UBSは、Scalaを一般的な本番環境で使用することを承認しました。[127]
  • LinkedInは、Scalatraマイクロフレームワークを使用して SignalAPIを強化しています。[128]
  • MeetupはリアルタイムAPIにフィルタリングされていないツールキットを使用しています。[129]
  • Milkは、パブリックAPIとリアルタイムの更新にUnfilteredツールキット、Scala、Akkaを使用していることを忘れないでください。[130]
  • Verizonは、Scalaを使用して「次世代フレームワーク」を作成しようとしています。[131]
  • Airbnbは、JavaとScalaで記述されたオープンソースの機械学習ソフトウェア「Aerosolve」を開発しています。[132]
  • Zalandoは、テクノロジースタックをJavaからScala andPlayに移行しました。[133]
  • SoundCloudはバックエンドにScalaを使用し、Finagle(マイクロサービス)、[134] Scalding、Spark(データ処理)などのテクノロジーを採用しています。[135]
  • Databricksは、 ApacheSparkビッグデータプラットフォームにScalaを使用しています。
  • Morgan Stanleyは、財務および資産関連のプロジェクトでScalaを幅広く使用しています。[136]
  • GoogleAlphabetInc。には、主にFirebase [137]やNestなどの買収が原因でScalaを使用するチームがあります。[138]
  • Walmart Canadaは、バックエンドプラットフォームにScalaを使用しています。[139]
  • Duolingoは、レッスンを生成するバックエンドモジュールにScalaを使用しています。[140]
  • HMRCは、多くの英国政府の税務申請にScalaを使用しています。[141]
  • M1 Financeは、バックエンドプラットフォームにScalaを使用しています。[142]

批評

2015年3月、Twitter Raffi Krikorianのプラットフォームエンジニアリンググループの元VPは、学習曲線のために2011年にはScalaを選択しなかったと述べました[143]同じ月、LinkedInのSVPであるKevin Scottは、「Scalaへの依存を最小限に抑える」という決定を表明しました。[144] 2011年11月、Yammerは、新しいチームメンバーの学習曲線や、Scalaコンパイラのあるバージョンから次のバージョンへの非互換性などの理由でScalaから離れました。[145]

も参照してください

  • sbt、Scalaプロジェクトで広く使用されているビルドツール
  • 遊ぶ!、ScalaをサポートするオープンソースのWebアプリケーションフレームワーク
  • Akka、並行および分散アプリケーションを構築するためのオープンソースツールキット
  • Chiselは、ハードウェアの設計と生成に使用されるScala上に構築されたオープンソース言語です。[146]

参考文献

  1. ^ https://github.com/lampepfl/dotty/releases/tag/3.1.0
  2. ^ https://github.com/lampepfl/dotty/releases/tag/3.1.1-RC1
  3. ^ 「通知ファイル」GitHub2019-01-24 2019年12月4日取得
  4. ^ 「Scalaマクロ」
  5. ^ フォーガス、マイケル(2010年8月6日)。"MartinOdersky take(5)toList"より多くのパラメディックを送信します。2012年2月9日取得
  6. ^ a b c d Odersky、Martin(2006年1月11日)。「スカラ実験-コンポーネントシステムにより良い言語サポートを提供できますか?」(PDF)2016年6月22日取得
  7. ^ a b c d Odersky、Martin; etal。(2006)。「Scalaプログラミング言語の概要」(PDF)(第2版)。ÉcolePolytechniqueFédéraledeLausanne(EPFL)。2020-07-09のオリジナルからアーカイブ(PDF) 。
  8. ^ Odersky、Martin(2008)。Scalaでのプログラミングカリフォルニア州マウンテンビュー:Artima。p。3. ISBN 97809815316012014年6月12日取得
  9. ^ ポトビン、パスカル; マリオのボンジャ(2015年9月24日)。エリクソンで開発されたIMSDSLコンピュータサイエンスの講義ノート。7916。arXiv 1509.07326_ 土井10.1007 / 978-3-642-38911-5ISBN 978-3-642-38910-8S2CID1214469 _
  10. ^ 「よくある質問:Javaの相互運用性」Scala-lang.org 2015年2月6日取得
  11. ^ マーティンオーダスキー(2020年6月17日)。Martin Odersky:Scala 3アップデート(ビデオ)。YouTube。イベントは36:35–45:08に発生します。2021年12月21日にオリジナルからアーカイブされました2021-04-24を取得
  12. ^ フリーゼン、ジェフ(2016年11月16日)。「チェックされた例外は良いですか悪いですか?」JavaWorld 2018年8月28日取得
  13. ^ ロヴェルド、クリストス(2010)。Scalaのステップ:オブジェクト関数型プログラミング入門ケンブリッジ大学出版局p。xiii。ISBN 97811394909482014年7月31日取得
  14. ^ a b c d Odersky、Martin(2006年6月9日)。「Scalaの簡単な歴史」Artima.com
  15. ^ a b c d Odersky、M。; Rompf、T。(2014)。「関数型プログラミングとオブジェクト指向プログラミングをScalaと統合する」ACMの通信57(4):76。doi10.1145 / 2591013
  16. ^ Martin Odersky、「Scala言語仕様バージョン2.7」
  17. ^ 「ScalaチームがERC助成金を獲得」2015年7月4日取得
  18. ^ 「Scalaの商用サポート」2011-05-12 2011年8月18日取得
  19. ^ 「Typesafeに投資した理由:最新のアプリケーションには最新のツールが必要」2011-05-12 2018年5月8日取得
  20. ^ 「オープンソースのScalaは商業的な支持を得ています」2011-05-12 2011年10月9日取得
  21. ^ 「クラウドコンピューティングのパイオニアであるMartinOderskyは、彼の新会社Typesafeを締めくくりました」2011-05-12 2011年8月24日取得
  22. ^ 「Android上のScala」2016年6月8日取得
  23. ^ 「Scala2.12.8が利用可能になりました!」2018-12-04 2018年12月9日取得
  24. ^ 「ScalaJsはもはや実験的ではありません| Scalaプログラミング言語」Scala-lang.org 2015年10月28日取得
  25. ^ 「リリース・scala-js / Scala-js」GitHub
  26. ^ オキアミ、ポール(2017年3月15日)。「縮小されたScalaバリアントはJVMとの関係を断ち切ります」InfoWorld2017年3月21日取得
  27. ^ オキアミ、ポール(2016-05-11)。「Scala言語はベアメタルに近づきます」InfoWorld
  28. ^ .netバックエンドを消去しました。paulpによる・プルリクエスト#1718・scala / scala・GitHubGithub.com(2012-12-05)。2013-11-02に取得。
  29. ^ 「Scala入門」Scala-lang.org2008年7月15日2014年7月31日取得
  30. ^ 「家」Blog.lostlake.org。2010年8月31日にオリジナルからアーカイブされました2013年6月25日取得
  31. ^ Scalaの組み込みの制御構造(再実装など)ifまたはwhile再実装できない。これらの制限を取り除くことを目的とした研究プロジェクト、Scala-Virtualizedがあります:Adriaan Moors、Tiark Rompf、Philipp Haller、MartinOdersky。Scala-仮想化部分評価とプログラム操作に関するACMSIGPLAN 2012ワークショップの議事録、117–120。2012年7月。
  32. ^ a b "Pimp myLibrary"Artima.com。2006-10-09 2013年6月25日取得
  33. ^ 「表現| Scala2.13」scala-lang.org 2021-05-24を取得
  34. ^ 「可変および不変のコレクション-Scalaドキュメント」2020年4月30日取得
  35. ^ 「コレクション-具体的な不変のコレクションクラス-Scalaドキュメント」2015年7月4日取得
  36. ^ Dougherty、リッチ。「RichDoughertyのブログ」2015年7月4日取得
  37. ^ 「TailCalls-Scala標準ライブラリAPI(Scaladoc)2.10.2-scala.util.control.TailCalls」Scala-lang.org 2013年6月25日取得
  38. ^ a b 「JavaとScalaの型システムは健全ではない」(PDF)
  39. ^ Giarrusso、Paolo G.(2013)。「モジュール性と速度のためにコレクションクエリを具体化してください!」アスペクト指向ソフトウェア開発に関する第12回年次国際会議の議事録ACM。arXiv1210.6284Bibcode2012arXiv1210.6284Gpimp-my-libraryパターンとも呼ばれます
  40. ^ ギルバート、クリント(2011-11-15)。「Scalaが企業の世界で成功するための最優先事項は何ですか(scalaで議論する必要がありますか?)」Scala-lang.org 2019年5月8日取得
  41. ^ 「Scalaライブラリを「強化」または「ポン引き」する必要がありますか?」stackexchange.com2013年6月17日2016年4月15日取得
  42. ^ メソッド拡張をより簡潔にするために、暗黙のクラスがScala2.10で導入されました。これは、メソッドを追加するのと同じimplicit def IntPredicate(i: Int) = new IntPredicate(i)です。このクラスは、Scala 2.10でも導入された、implicit class IntPredicates(val i: Int) extends AnyVal { ... }いわゆる値クラスを生成するとして定義することもできます次に、コンパイラーは実際のインスタンス化を排除し、代わりに静的メソッドを生成して、拡張メソッドに実質的にパフォーマンスのオーバーヘッドがないようにします。
  43. ^ Akkaとは何ですか?、Akkaオンラインドキュメント
  44. ^ Sufrin、Bernard(2008)。「Scalaオブジェクトの通信」。ウェルチでは、PH; Stepney、S。; Polack、FAC; バーンズ、FRM; マキューアン、AA; Stiles、GS; Broenink、JF; サンプソン、AT(編)。Communicating Process Architectures 2008:WoTUG-31(PDF)ISBN  978-1586039073
  45. ^ ヤン、ケイ。「Scalaツアー」2015年7月4日取得
  46. ^ 「Parallelcollections-概要-Scalaドキュメント」Docs.scala-lang.org 2013年6月25日取得
  47. ^ ヤン、ケイ。「Scalaツアー」2015年7月4日取得
  48. ^ Scala 、Aleksandar Prokopec、PacktPublishingでの同時プログラミングの学習
  49. ^ Kops、Micha(2013-01-13)。「ScalaTestの簡単な紹介」hascode.com 2014年11月7日取得
  50. ^ Nilsson、Rickard(2008-11-17)。「ScalaCheck1.5」Scala-lang.org 2014年11月7日取得
  51. ^ 「ScalaとPlayFrameworkを使用してWebアプリケーションを構築する」workwithplay.com2013-05-22 2014年11月7日取得
  52. ^ 肉屋、ポール(2012-06-04)。「ScalaMock3.0プレビューリリース」paulbutcher.com 2014年11月7日取得
  53. ^ a b c d e fg 「 Scala 変更履歴」Scala-lang.org2007-10-09にオリジナルからアーカイブされました。
  54. ^ 「削除:XMLリテラル」dotty.epfl.ch 2021-03-05を取得しました。
  55. ^ 「バージョン2.0での変更(2006年3月12日)」Scala-lang.org2006-03-12 2014年11月7日取得
  56. ^ 「バージョン2.1.8での変更(2006年8月23日)」Scala-lang.org2006-08-23 2014年11月7日取得
  57. ^ 「バージョン2.3.0(2006年11月23日)での変更」Scala-lang.org2006-11-23 2014年11月7日取得
  58. ^ 「バージョン2.4.0での変更(2007年3月9日)」Scala-lang.org2007-03-09 2014年11月7日取得
  59. ^ 「バージョン2.5での変更(2007年5月2日)」Scala-lang.org2007-05-02 2014年11月7日取得
  60. ^ 「バージョン2.6での変更(2007年7月27日)」Scala-lang.org2007-06-27 2014年11月7日取得
  61. ^ 「バージョン2.7.0(2008年2月7日)での変更」Scala-lang.org2008-02-07 2014年11月7日取得
  62. ^ 「バージョン2.8.0での変更(2010年7月14日)」Scala-lang.org2010-07-10 2014年11月7日取得
  63. ^ 「バージョン2.9.0(2011年5月12日)での変更」Scala-lang.org2011-05-12 2014年11月7日取得
  64. ^ 「バージョン2.10.0での変更」Scala-lang.org2013-01-04 2014年11月7日取得
  65. ^ ハラ、マーク。「バリュークラスとユニバーサル特性」Scala-lang.org 2014年11月7日取得
  66. ^ スエレス、ジョシュ。「SIP-13-暗黙のクラス」Scala-lang.org 2014年11月7日取得
  67. ^ スエレス、ジョシュ。「文字列補間」Scala-lang.org 2014年11月7日取得
  68. ^ ハラー、フィリップ; プロコペック、アレクサンダー。「未来と約束」Scala-lang.org 2014年11月7日取得
  69. ^ 「SIP-17-タイプダイナミック」Scala-lang.org 2014年11月7日取得
  70. ^ 「SIP-18-言語機能のモジュール化」Scala-lang.org 2014年11月7日取得
  71. ^ Prokopec、Aleksandar; ミラー、ヘザー。「パラレルコレクション」Scala-lang.org 2014年11月7日取得
  72. ^ ミラー、ヘザー; ビルマコ、ユージーン。「反射の概要」Scala-lang.org 2014年11月7日取得
  73. ^ ビルマコ、ユージーン。「Defマクロ」Scala-lang.org 2014年11月7日取得
  74. ^ 「Scala2.10.2が利用可能になりました!」Scala-lang.org2013-06-06。2014年11月8日にオリジナルからアーカイブされまし2014年11月7日取得
  75. ^ 「Scala2.10.3が利用可能になりました!」Scala-lang.org2013-10-01。2014年11月8日にオリジナルからアーカイブされまし2014年11月7日取得
  76. ^ 「Scala2.10.4が利用可能になりました!」Scala-lang.org2014-03-18 2015年1月7日取得
  77. ^ 「Scala2.10.5が利用可能になりました!」Scala-lang.org2015-03-04 2015年3月23日取得
  78. ^ 「Scala2.11.0が利用可能になりました!」Scala-lang.org2014-04-21 2014年11月7日取得
  79. ^ 「Scala2.11.1が利用可能になりました!」Scala-lang.org2014-05-20 2014年11月7日取得
  80. ^ 「Scala2.11.2が利用可能になりました!」Scala-lang.org2014-07-22 2014年11月7日取得
  81. ^ 「Scala2.11.4が利用可能になりました!」Scala-lang.org2014-10-30 2014年11月7日取得
  82. ^ 「Scala2.11.5が利用可能になりました!」Scala-lang.org2015-01-08 2015年1月22日取得
  83. ^ 「Scala2.11.6が利用可能になりました!」Scala-lang.org2015-03-05 2015年3月12日取得
  84. ^ 「Scala2.11.7が利用可能になりました!」Scala-lang.org2015-06-23 2015年7月3日取得
  85. ^ 「Scala2.11.8が利用可能になりました!」Scala-lang.org2016-03-08 2016年3月9日取得
  86. ^ 「3つの新しいリリースとより多くのGitHubの良さ!」Scala-lang.org2017-04-18 2017年4月19日取得
  87. ^ 「セキュリティアップデート:2.12.4、2.11.12、2.10.7(CVE-2017-15288)」Scala-lang.org2017-11-13 2018年5月4日取得
  88. ^ 「Scala2.12.0が利用可能になりました!」Scala-lang.org2016-11-03 2017年1月8日取得
  89. ^ 「Scala2.12.1が利用可能になりました!」Scala-lang.org2016-12-05 2017年1月8日取得
  90. ^ 「3つの新しいリリースとより多くのGitHubの良さ!」Scala-lang.org2017-04-18 2017年4月19日取得
  91. ^ 「Scala2.12.3が利用可能になりました!」Scala-lang.org2017-07-26 2017年8月16日取得
  92. ^ 「Scala2.12.4が利用可能になりました!」Scala-lang.org2017-10-18 2017年10月26日取得
  93. ^ 「Scala2.12.5が利用可能になりました!」Scala-lang.org2018-03-15 2018年3月20日取得
  94. ^ 「Scala2.12.6が利用可能になりました!」Scala-lang.org2018-04-27 2018年5月4日取得
  95. ^ 「Scala2.12.7が利用可能になりました!」Scala-lang.org2018-09-27 2018年10月9日取得
  96. ^ 「Scala2.12.8が利用可能になりました!」Scala-lang.org2018-12-04 2018年12月9日取得
  97. ^ 「Scala2.12.9が利用可能になりました!」Scala-lang.org2019-08-05 2021-01-20を取得
  98. ^ 「Scala2.12.10が利用可能になりました!」Scala-lang.org2019-09-10 2021-01-20を取得
  99. ^ 「Scala2.12.11が利用可能になりました!」Scala-lang.org2020-03-16 2021-01-20を取得
  100. ^ 「Scala2.12.12が利用可能になりました!」Scala-lang.org2020-07-13 2021-01-20を取得
  101. ^ 「Scala2.12.13が利用可能になりました!」Scala-lang.org2021-01-12 2021-01-20を取得
  102. ^ 「Scala2.13.0が利用可能になりました!」Scala-lang.org2019-06-11 2018年6月17日取得
  103. ^ 「Scala2.13.1が利用可能になりました!」Scala-lang.org2019-09-18 2021-01-20を取得
  104. ^ 「Scala2.13.2が利用可能になりました!」Scala-lang.org2020-04-22 2021-01-20を取得
  105. ^ 「Scala2.13.3が利用可能になりました!」Scala-lang.org2020-06-25 2021-01-20を取得
  106. ^ 「Scala2.13.4が利用可能になりました!」Scala-lang.org2020-11-19 2021-01-20を取得
  107. ^ 「Scala2.13.5が利用可能になりました!」Scala-lang.org2021-02-22 2021-02-26を取得
  108. ^ 「Scala3はここにあります!」Scala-lang.org2021-05-14 2021-05-26を取得
  109. ^ a b O'Grady、スティーブン(2021年3月1日)。「RedMonkプログラミング言語ランキング:2021年1月」RedMonk
  110. ^ a b "2021年5月のTIOBEインデックス1"
  111. ^ 「プログラミング言語インデックスの人気」
  112. ^ 「2018年のJavaの状態」
  113. ^ 「ThoughtWorksテクノロジーレーダーFAQ」
  114. ^ 「ThoughtWorksテクノロジーレーダー2013年5月」(PDF)
  115. ^ 「Scala、良い部分」
  116. ^ グリーン、ケイト(2009年4月1日)。「Twitterの成長の秘訣、新しいWebプログラミング言語が会社の人気の高まりにどのように対応しているか」テクノロジーレビューMIT 2009年4月6日取得
  117. ^ 「PlayFramework、GiltGroupeでのAkkaとScala」ライトベンド。2013年7月15日2016年7月16日取得
  118. ^ 「Scala、Lift、そして未来」2016年1月13日にオリジナルからアーカイブされました2015年7月4日取得
  119. ^ 「CourseraでScalaが大好きな理由」コーセラエンジニアリング2015年7月4日取得
  120. ^ 「ツイッターのアップルエンジニアリング首相ジャロッドイラクサ」JarrodNettles 2016年3月11日取得
  121. ^ 「Appleでの30のScala求人」アルビンアレクサンダー2016年3月11日取得
  122. ^ David Reid&Tania Teixeira(2010年2月26日)。「人々はオンラインニュースにお金を払う準備ができていますか?」BBC 2010年2月28日取得
  123. ^ 「JavaからScalaへのガーディアンの切り替え」ハイゼオンライン2011-04-05 2011年4月5日取得
  124. ^ 「Guardian.co.ukJavaからScalaへの切り替え」InfoQ.com。2011-04-04 2011年4月5日取得
  125. ^ ロイ、スーマン; スンダレサン、クリシュナ(2014-05-13)。「黒ひげの構築:Play、Scala、Akkaを利用したシンジケーションシステム」ニューヨークタイムズ2014年7月20日取得
  126. ^ Pavley、ジョン(2013-08-11)。「SneakPeek:HuffPostがニュースルームにリアルタイムコラボレーションをもたらします」ハフィントンポスト2014年7月20日取得
  127. ^ ビンストック、アンドリュー(2011-07-14)。「ScalaのMartinOderskyへのインタビュー」ドブ博士の日記2012年2月10日取得
  128. ^ Synodinos、Dionysios G.(2010-10-11)。「LinkedInSignal:Scala、JRuby、Voldemortのケーススタディ」InfoQ
  129. ^ 「実際のMeetupはリアルタイムAPIに値する」
  130. ^ 「リアルタイム更新はRememberTheMilkウェブアプリにやってくる」
  131. ^ 「シニアスカラエンジニア」2014年8月18日取得
  132. ^ ノヴェット、ヨルダン(2015-06-04)。「Airbnbはオープンソースの機械学習ソフトウェアパッケージであるAerosolveを発表しました」2016年3月9日取得
  133. ^ Kops、Alexander(2015-12-14)。「ZalandoTech:3か月以内にJavaからScalaへ」2016年3月9日取得
  134. ^ カルサド、フィル(2014-06-13)。「SoundCloudでの製品の構築—パートIII:ScalaとFinagleのマイクロサービス」2016年3月9日取得
  135. ^ 「顧客のケーススタディ:SoundCloud」コンカレント株式会社2014-11-18 2016年3月9日取得
  136. ^ Morgan StanleyのScala(ビデオ)。スキルの問題。2015-12-03 2016年3月11日取得
  137. ^ グレッグソルティス(2015-12-03)。SF Scala、Greg Soltis:Scalaの高性能サービス(ビデオ)。スキルの問題。2021年12月21日にオリジナルからアーカイブされました2016年3月11日取得
  138. ^ リーMighdoll。「NestでのScalaジョブ」2016年3月11日取得
  139. ^ ヌルン。「Nurunはウォルマートカナダで再設計されたトランザクションプラットフォームを開始します」2013年12月11日取得
  140. ^ Horie、AndréK。(2017-01-31)。「DuolingoのエンジンをScalaで書き直す」2017年2月3日取得
  141. ^ 「HMRCGitHubリポジトリ」GitHub
  142. ^ リヴィウ、オレ・ザサドニー、GDG。「ScalaCon。ScalaeXchangeとScalaDaysによってもたらされた一連の仮想会議」ScalaCon。ScalaeXchangeとScalaDaysによってもたらされた一連の仮想会議2021-05-30を取得
  143. ^ クリコリアン、ラフィ(2015年3月17日)。O'Reilly Software Architecture Conference 2015完全なビデオ編集:オンザフライでの再設計-Raffi Krikorian-パート3(ビデオ)。オライリーメディア。イベントは4:57に発生します。2016年3月8日取得私が4年前に違ったやり方でやったのは、Javaを使用し、この書き直しの一部としてScalaを使用しなかったことです。[...]エンジニアが完全に生産的になり、Scalaコードを作成するまでには、2か月かかります。
  144. ^ スコット、ケビン(2015年3月11日)。「LinkedInはScalaを排除していますか?」quora.com 2016年1月25日取得
  145. ^ ヘイル、コーダ(2011年11月29日)。「残りの物語」codahale.com 2013年11月7日取得
  146. ^ 「Chisel:Scala組み込み言語でのハードウェアの構築」カリフォルニア大学バークレー校APSIRE 2020年5月27日取得

さらに読む