Scalaに関する世界観です。Javaの世界観C(各種言語)も参照のこと。
スケーラブルであることを重視する、オブジェクト指向の関数型言語。Java仮想マシン上で動作する。Twitterのインフラに使われていることで有名。
Scalaの特徴として、「関数型とオブジェクト指向の融和」という点が挙げられる。
Javaよりもさらにオブジェクト指向を強化し、基本型だけを特別扱いとすることを排除してすべての値をオブジェクトとし、ほぼすべての操作をメソッドとする。
また、ほとんどの制御構造は式であり、値を返す。
またミュータブル(可変)のコレクションのほかにイミュータブル(不変)のコレクションがある。
以下にサンプルコードがある。
Scalaについては、公式のツアーを読みましょう。読むととても発想が新しく、とても面白い言語であるということがありありと分かります。
以下続きます。とりあえず僕が読んだのはここまで。
以下はScalaのインストール方法。
このツアーをいくらか読むと、Rustに近いということが分かります。実際、トレイトやミックスインなどはRustにもあります(僕はRustのことをよく知らないので間違っていたら申し訳ない)。ですが、Scalaは基本的にJavaVMの上で動きます。そして、Javaとの相互運用が簡単であるというメリットがあります。たとえば、JavaのライブラリはScalaから簡単に読み込めます。Scalaの標準ライブラリで足りない場合は、Javaのライブラリから機能を使用できます。
また、JavaScriptにコンパイルするScala.jsや、ネイティブの実行ファイルを吐くScala Native(LLVMのバックエンドを用いる)も開発されています。ScalaのライセンスはApache 2.0です。
僕は今から、「一生涯をかけて学ぶ言語」として、Scalaを学ぶつもりです。なんなら、世界中で一番賢いのはScalaではないでしょうか。とても新しい、次世代の価値あるプログラミング言語だと思います。Pythonの勉強が終わった方は、Scalaの勉強をおすすめします。2025-05-29も参照のこと。
2025.05.29-30
以下はScalaに関連する書籍などの詳しい情報。
後日注記:Amazonで以下のScalaの書籍を買いました。コップ本と呼ばれている言語設計者Martin Oderskyの書いたバイブル。これを読んでScalaのエキスパートになりたいです。
2025-05-30、2025-06-03、2025-06-05も参照のこと。
2025.05.30
僕はまだ「Scalaスケーラブルプログラミング第3版」を読み始めたばかりですが、Scalaには面白い点がたくさんあります。
まず、Scalaは静的型付け言語です。変数を宣言する時は、val x : Int = 10のように、変数名に続いてコロン(:)で型を指定します。valは変更されない値に、varは変更される変数に使います。Scalaには型推論があるので、文脈から変数の型が明確である時は、型宣言を省略できます。たとえば、val m = "Hoge"のような場合には、変数が文字列型であることが明確なので、String型を指定する必要はありません。ですが、強制的にその型を使わせたい時は、その型を明示的に指定することもできます。条件分岐はif式、ループはfor式やwhile式、関数はdef、クラスはclassで記述できます。また、シングルトンオブジェクトobjectを使うことで、ひとつしかインスタンスのないオブジェクトを作ることができます。プログラムはobjectによって定義したmain関数から実行されます。
Scalaでは、言語の制御構造そのものを拡張できます。関数における引数の括弧を複数取れるカリー化という機能を使うことで、まるで最初からその制御構造があったかのように、制御構造そのものを作り出せます。if文やfor文のような言語の制御構造を、自分で作り、拡張することができます。そのためには、引数として関数を取るメソッドを作るだけで構いません。
Scalaでは関数リテラルは(引数) => {処理}で表現できるほか、()のないパラメータなし関数というものもあります。また、関数リテラルの中で一度しか使われない引数を使う際にPerlのようなアンダースコア(_)も使えます。たとえば、リストの要素をひとつひとつ順番に比較するような際に、その要素を表すために_が使えます。また、演算子とメソッドは同じものです。
それから、Scalaには進歩したオブジェクト指向があります。そのひとつがトレイトです。トレイトはほかの言語でいうインターフェイスのようなもので、型を作るためにクラスのほかにトレイトが使用できます。トレイトをミックスインすることで、多重継承とはまた違った方法で同じことができます。また、Scalaではクラスの「継承」だけではなく「合成」することもできます。
ほかの面白い点は、Scalaではimportする時に、単に取り込むだけでなく、名前を変えて取り込むことができます。なので、JavaライブラリとScalaライブラリで同じ名前のクラスがあった時は、その名前を変えることで別々のものであると扱うことができます。
また、Javaでは配列の添え字を[]で指定しますが、Scalaでは()で指定します。また、Javaではジェネリクスの型は<>で指定しますが、Scalaでは[]で指定します。またGUIツールキットとしてはSwingが使用できます。コレクションのリテラル表記には、特殊な記号を使うのではなく、配列はArray()、リストはList()、ベクターはVector()、セットはSet()、マップはMap()、イテレータはIterator()と書きます(ただし::は使える)。単純に()とするとタプルになります。
また、オブジェクトのインスタンスを初期化する時は、newの際に{}でプロパティの名前と値を指定できます。newの際に{}を指定すると、クラスやトレイトの型を継承した無名クラスのインスタンスが作成され、{}の中でそのメンバー定義ができます。たとえばnew Label { text = "Hoge" }のようにすると、Labelを作った上でプロパティ名textに値"Hoge"を初期化できます。新しい無名クラスが作られるので、{}の中で新しい変数やメソッドを定義することも可能です。
関数型言語の機能としては、すべての式が値を持つので、関数の引数などに与えられます。また、match式とケースクラスによるパターンマッチはswitch文と同様に(よりスマートに)使用できます。単に複数の型の変数をセットにしたい場合は、クラスを使わなくてもタプルを使うことができます。リストは関数型言語によくあるように::でコンスでき、:::で連結でき、apply()やmap()やzip()も使えます。for文ではyieldやジェネレータも使えます。関数は第一級(ファーストクラス)なので、高階関数(関数を引数として受け取る関数)や関数を返す関数も使えます。
また、Scalaは特別なXMLサポートが組み込まれているので、<hoge></hoge>といったXMLのタグをコードに直接記述できます。JSONのようなほかの言語のパーサーは、言語内DSLというライブラリを継承することで、簡単に実装出来ます。それから、ScalaからたとえばGUIツールキットのSwingを使う場合には、暗黙の型変換という機能を使うことで、普通Swingのコードを書くために必要なたくさんの無駄なコードを書かなくても、関数をクラスに変換できるため、最低限のイベントに応じた関数だけを渡すだけで、GUIのイベント処理を書くことができます。
このように、ScalaにはJavaやLispのような既存の言語をさらに拡張した、面白くて新しい点がたくさんあります。ぜひ、みなさんもScalaを使ってみてください。
2025.06.04
2025.06.06編集
ScalaによるRails風のWebフレームワーク。
Webフレームワークも参照のこと。
ScalaとJavaのためのWebフレームワーク。Java(Webフレームワーク)を参照のこと。
Scala.jsは、Scalaで記述したコードをJavaScriptコードに変換・出力してくれるバックエンド。クライアントもサーバーもScalaで書けるのは一部の人間にはたまらない。
LaminarはScala.js向けに使うことのできるUIフレームワークで、Reactの代わりに使用できる。Reactを使用することも可能。
AltJS/TypeScriptも参照のこと。
2023.06.29
スケーラブルを重視したAltJavaで、Kotlinが登場する以前は「AltJavaの最前線」であるとみなされていた。