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のイベント処理を書くことができます。暗黙の型変換とは、たとえばDouble型からInt型への型変換がどこかで起きた際に、型が変換できないとエラーを出すのではなく、Double型を引数にとってInt型を返すような関数がimplicitキーワードと一緒に宣言されていた場合、自動的にその関数を適用して型変換をする機能です。なので、イベント関数を引数として渡し、ActionListenerを戻り値として返す、型を自動的に変換するためのimplicit関数を書くこともできるのです。
このように、ScalaにはJavaやLispのような既存の言語をさらに拡張した、面白くて新しい点がたくさんあります。ぜひ、みなさんもScalaを使ってみてください。
2025.06.04
2025.06.06編集
2025.06.09-10編集
2025.07.14編集
並列処理を参照のこと。
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
まず、間違いなく言えることは、プログラミング言語を学ぶなら、Scalaを学ばなければ損だということです。
Scalaは、Javaをベースにしながら、オブジェクト指向と関数型をどちらも取り入れ、バランスよく、そしてシンプルに両立させた、素晴らしい言語です。
Scalaがあると、JavaやPythonを学ぶ必要はありません。Scalaのほうがはるかに賢いために、JavaやPythonなどを学ぶ必要それ自体がなくなってしまうのです。
Java、Perl、PHP、Python、Ruby、JavaScriptなどのさまざまな実用言語を、いつまでも学んでいるのは間違っています。Scalaを学ぶことで、それらの言語を学ぶ必要がなくなり、プログラミング言語を幅広く知ること自体の意味がなくなってしまいます。すなわち、「Scalaさえ学べばほかは全部要らない」となってしまうのです。
ですが、問題があるとしたら、Scalaは実用性が乏しいということです。
確かに、AltJavaとしてJavaVMの上で動くScalaは、RustやGolangのような本当に独自の世界で勝負する言語よりは、実用性が高いでしょう。ですが、それでも、Scalaで書かれた既存のコードは少なく、PythonやRubyのように、モジュールやライブラリを導入するだけで、何も自分で書かなくても使うだけでプログラミングができる言語ほど、既存の資産がありません(Scalaからでも使えるJavaコードは除く)。そして、Scalaの分かる技術者も少なく、「これってなんの言語で書かれているの?分からないからCかJavaで書いてちょうだい」と言われてしまうのです。
Scalaコードは基本的にJavaVMの上で動きますが、これは利点でもあり欠点でもあります。既存のJava資産が再利用できるという便利さもありますが、JavaVMがなければScalaアプリケーションが動かないという意味でもあります。Scalaアプリケーションを使おうと思ったユーザーにとって、事前にJavaVMを導入するという、本来必要のないはずの手間や労力が必要となります。また、かつてのJavaのベンダーだったSun MicrosystemsはOracleに買収されましたが、OracleによってJavaは有料化の方針が出ており、Scalaにとっては危うい風が吹いています。Oracleがいつまでも信用ができるとも限りません。
そのように、Scalaという言語は、賢い代わり実用性が乏しいと言えます。実用性を考えるのであれば、C/C++の勉強が必要です。結局、プログラミング言語を学ぶなら、C/C++は避けては通れないのです。
2025.07.14
スケーラブルを重視したAltJavaで、Kotlinが登場する以前は「AltJavaの最前線」であるとみなされていた。