今回紹介するのは、Java VM上で動く関数型言語Scalaです。Scalaは、プログラミング言語別年収ランキング2018(記事)でも、第二位にランキングしていることから分かる通り、実用性の高いプログラミング言語で、大手企業が採用する例も増えています。今回は、次に学ぶべき将来性のある言語Scalaについて見ていきましょう。

Scalaの特徴

Scala最大の特徴は、Java VMで動くということでしょう。Javaの上位互換言語であり、JavaのライブラリをScalaから利用することができます。膨大なJavaの資産をそのまま活用できるというのが大きな利点の一つです。そして、大抵の場面で、Javaよりも簡潔に記述できます。

そして、Scalaは関数型言語です。関数型言語とは、従来の手続き型プログラミングとは一線を画しており、複数の式を関数の適応によって組み合わせていくプログラミングスタイルで開発を行います。例えて言うなら、文章を書くのではなく、数式を組み合わせて記述する雰囲気に近い感じでプログラムを作っていきます。

また、Scalaはオブジェクト指向言語です。「オブジェクト指向」とは、オブジェクト(モノ)を中心としたプログラミング手法です。データや値に加えて関数もオブジェクトとして扱います。これは、Javaのオブジェクト指向をさらに推し進めた感じです。このように、関数型言語でありオブジェクト指向言語でもあるというのは、Scalaの優れた点で、両手法を緊密に連携して利用できます。

他にも、Scalaは静的型付けの関数型言語であるためを行うため、コンパイル時点でのエラー検出が容易です。また、型推論の機能があるため、自動で変数の型を補ってくれます。さらに、遅延評価や、traitクラス、パターンマッチ、XMLを直接プログラム内に記述可能などなど、先進的で便利な機能をたくさん利用できます。

ただし、機能が豊富であり、一般的な開発者にそれほど馴染みのない関数型プログラミングを採用していることから、学習コストが高いと言われています。2018年の時点では、学習コストが原因でエンジアの採用が難しく、給与が高く設定される理由となっているようです。逆に言えば、企業側としても、向学心のあるエンジニアを選んで採用できると言えるでしょう。Scalaを利用している企業ですが、有名なところでは、米のTwitterやLinkedInなどです。国内の企業でも、ドワンゴ、GMOメディアなどなど、多くの企業が、Scalaを使い始めています。

Scalaを試してみよう

それでは、実際にScalaを試してみましょう。ScalaをローカルPCにインストールする場合には、先にJava(JDK)の8以降をインストールしておく必要があります。その上で、Scalaをインストールします。

その際、Scalaのインストールには、いくつかの方法があります。一つの方法は、Scalaのインストーラーを利用することで、こちらのページよりScalaのインストーラーを入手して、インストールします。

もう一つの方法は、パッケージマネージャーを利用して、コマンドからScalaをインストールする方法です。ここでは、OSごとにパッケージマネージャーを利用する方法を紹介します。

macOSの場合

macOSでは、パッケージマネージャーのHomebrewを利用します。ターミナルを起動し、以下のコマンドを実行すると、sbtというScalaのビルドツールをインストールできます。

brew install sbt


Windowsの場合

Windowsの場合も、Windows用パッケージマネージャーのchocolateyを使うと手軽にインストールできます。

なお、chocolateyをインストールするには、こちらのページよりインストールに必要なコードをコピーして、管理者権限で起動したコマンドプロンプトに貼り付けて実行します。

chocolateyのインストールが終わったら、PowerShellを起動して、以下のコマンドを実行しましょう。

choco install sbt

共通

Scalaのプログラムをコンパイルし、実行するには、最初に作業用のディレクトリを作ります。そして、そこにScalaのプログラムを配置します。ここでは、Hello.scalaという名前にしました。そこに、以下のScalaのプログラムを記述しましょう。

object Hello {
  def main(args: Array[String]) = {
    println("Hello, World!")
  }
}

その上で、コマンドラインを起動し、以下のようにsbtコマンドを実行します。初回起動時には、Scalaのコンパイルや実行に必要なライブラリ一式がダウンロードされるので少し時間がかかります。

sbt

起動を確認したら、以下のように、runと入力してみましょう。すると、以下のようにコンパイルと実行が行われ、結果が画面に表示されます。

  • プログラムが実行されたところ

    プログラムが実行されたところ

プログラムを確認してみましょう。オブジェクトHelloの定義を行い、printlnを使ってHello, World!というメッセージを出力するプログラムです。オブジェクト内に、mainメソッドを定義すると、それが最初に実行されます。また、文字列を表示するには、println関数が使えます。Javaに似ているようで、Javaよりも簡潔に記述できるという雰囲気があります。

ScalaでFizzBuzz問題を解いてみる

それでは、もっと、Scalaの雰囲気を感じるために、FizzBuzz問題を解いてみましょう。この問題は、本連載で何度も例題として持ち出しているものです。

FizzBuzzとは、1から100までの数字を出力するのですが、3の倍数の時「Fizz」、5の倍数の時「Buzz」、3と5の倍数の時「FizzBuzz」と表示するものです。

以下のプログラムを、FizzBuzz.scalaという名前で保存しましょう。

// FizzBuzzオブジェクトの定義
object FizzBuzz {
  // mainメソッドの定義 --- (*1)
  def main(args: Array[String]) = {
    (1 to 100).map(fizzbuzz).foreach(println)
  }
  // fizzbuzzメソッドの定義 --- (*2)
  def fizzbuzz(i: Int): String = {
    if (i % 3 == 0 && i % 5 == 0) {
      "FizzBuzz"
    } else if (i % 3 == 0) {
      "Fizz"
    } else if (i % 5 == 0) {
      "Buzz"
    } else {
      i.toString
    }
  }
}

そして、コマンドラインより、sbtコマンドを実行し、runと入力して実行しましょう。すると、以下のように表示されます。

  • FizzBuzzを実行したところ

    FizzBuzzを実行したところ

プログラムを確認してみましょう。(*1)の部分では、mainメソッドの定義を行います。ここでは、最初に、1から100までの要素を、mapメソッドを使ってfizzbuzzメソッドを呼び出します。次いで、foreachメソッドを使って、先ほどのfizzbuzzメソッドの呼び出し結果を順にprintlnで出力します。なお、mapメソッドは、リストや配列などに備わっているメソッドで、引数に指定した関数に対して、リストの要素を適用します。

それから、(*2)の部分では、if構文を使って、3と5で割り切れる場合は、"FizzBuzz"を、3で割り切れる場合は"Fizz"、5で割り切れる場合は"Buzz"、その他は、数値そのものを返すようにしています。

まとめ

以上、今回は、Scalaについて紹介しました。ここでは、軽く雰囲気を紹介しただけなので、関数型言語の面白さなどは、それほど伝わらなかったかもしれません。ですから、興味を持った皆さんは、引き続き、Scalaについて調べてみるとよいでしょう。まだまだ多くの人は、関数型言語に馴染みがないので、Scalaで関数型言語に慣れるなら、エンジニアとして一歩先へ進むことができますし、関数型言語で得た知識を、いろいろな場面で役立てることができるでしょう。

自由型プログラマー。くじらはんどにて、プログラミングの楽しさを伝える活動をしている。代表作に、日本語プログラミング言語「なでしこ」 、テキスト音楽「サクラ」など。2001年オンラインソフト大賞入賞、2005年IPAスーパークリエイター認定、2010年 OSS貢献者章受賞。技術書も多く執筆している。