最近、私の周りでもScalaに関する話題が増えてきました。Twitterやブログ、技術系のニュースサイトでは毎日のようにScalaに関連する話を見かけます。
また、筆者が現在携わっているプロジェクトでも実際にScalaを用いて開発しています。いままではJavaで開発をすることが多かったのですが、それよりも簡潔で柔軟性のある記述が可能であり、Scalaでの開発は非常に生産性が高いと感じています。
本連載は、Scalaの特徴を紹介し、基本構文や関数、クラスなど、Scalaの基本的な機能について解説していきます。何らかのプログラミング言語を学んだことがあり、プログラミングの基本的なことが分かる人を対象としています。特に言語は問いませんが、オブジェクト指向言語の経験者であれば理解がしやすいと思います。
連載第1回の本稿では、Scalaが持つ特徴を紹介し、開発を始めるための準備から最初のScalaプログラムの実行までを紹介します。
「Scala」とは、標準のJavaプラットフォーム上で動作できるプログラミング言語です。2003年ごろに登場した比較的新しい言語ですが、すでにTwitterやFoursquare、LinkedInでの採用実績もあります。国内でもいくつかの採用事例があるようです。
名前のScala(スカラ)とは、「スケーラブル(拡張可能)な言語」を意味しています。ScalaはJavaのGenerics(ジェネリック型)の設計などにも関わった、スイス連邦工科大学(EPFL)のMartin Odersky(マーティン・オーダスキー)教授によって設計・開発されました。
教授によると、Scala言語開発の動機として、以下の2つがあるとされています(Wikpediaより引用)。
開発の動機にあるとおり、Scalaは小さいスクリプト用途から大規模システムで使用する言語としての用途まで、多様なニーズに応えられるようになっています。そして、その拡張性を実現するために、「オブジェクト指向言語と関数型言語の概念を結合している」という特徴を持っています。
また、Scala公式サイトでのScalaの紹介文では、最初に以下のように述べられています(Scala公式サイトより引用)。
Scala is a general purpose programming language designed to express common programming patterns in a concise,
elegant, and type-safe way. It smoothly integrates features of object-oriented and functional languages,
enabling Java and other programmers to be more productive.
Code sizes are typically reduced by a factor of two to three when compared to an equivalent Java application.
その日本語訳です(プログラミング言語Scala 日本語情報サイトより引用)。
Scalaは、汎用的なプログラミングのパターンを、簡潔に・エレガントに・そして型安全に表現するための汎用プログラミング言語です。
Scalaは、オブジェクト指向の機能と関数型言語の機能をうまく統合しており、Scalaを使うことで、Javaやその他のプログラマの生産性はより向上するでしょう。
Scalaのコードサイズは典型的には、同じ機能を実現したJavaのアプリケーションと比べて2分の1〜3分の1程度です。
「オブジェクト指向、関数型言語の機能を統合することでより簡潔にコードの記述ができ、生産性が向上する」と述べています。
ここで1つ例を見てみましょう。下記のコードは、「引数で渡された文字列のリストのうち第2引数で指定した長さ以上の要素をすべて大文字に変換し、その要素を関数内部で新しく定義したリストに追加して返す」関数をJavaで記述したものです。
public List filterNames(List<String> names, int len) { List<String> result = new ArrayList(); for (String name : names) { if (name.length() >= len) { result.add(name.toUpperCase()); } } return result; }
リストをループで回し、要素ごとに長さをチェックして条件に合った要素を関数内部で定義したリストに追加しています。
同じ処理をScalaで記述すると、こうなります。
def filterNames(list: List[String], len: Int) = list.filter(_.length() >= len).map(_.toUpperCase)
渡されたリストを長さ(len)でフィルタリングし、結果のリストの要素ごとにすべて大文字に変換したリストを返します。いかがでしょうか? 確かに、Javaのコードよりもだいぶ少ないコード量になっています。
これは極めて簡単な例ではありますが、Scalaだと簡潔で分かりやすいコードを書けることが分かります。
Scalaは以下のような特徴を持っています。さまざまな機能を持っていますが、Scalaだけが持つ特殊な機能というのはあまりなく、既存のプログラミング言語から良いところを取り入れ、うまくバランスを取っていると思います。
Scalaは純粋な「オブジェクト指向」言語です。すべての値は「オブジェクト」であり、すべての操作は「メソッド」です。
Javaのint型やdouble型のようなプリミティブ型は存在しません。例えば、Scalaで「1+2」というコードは、「Intクラス(値は1)の『+』という名前のメソッドに引数2を渡す」という意味です。
また、Scalaではオブジェクト指向を実現するためにクラスベースの継承と「ミックスイン合成」をサポートしています。
「ミックスイン合成」とは「トレイト」(Rubyでいう「モジュール」、Javaでいえば「実装を持てるインターフェイスのようなもの」)を用いて、1つのクラスに対して複数の実装を持つ機能を合わせられることです。
「関数型プログラミング」という単語は、最近よく聞くキーワードかもしれません。これは簡単にいうと、副作用(データの内部状態を変更すること)を持たない「関数」を使用してプログラムを構築するプログラミング手法です。
関数型プログラミングの利点として、「関数が自己完結しており“状態”がないため、可読性や保守性、テスト、リファクタリングが容易になる」というメリットがあります。
Scalaでは、関数を「ファーストクラス」として扱います。つまり、「整数や文字列などと同じように、関数を引数や戻り値にできる」ということです。
また、「定数」(val)や「不変コレクション」を使用してプログラミング可能です(※変数(var)や可変コレクションを使用しても構いません)。
このような特徴を持っているため、表現力が上がり簡潔な記述できます。
オブジェクト指向と関数型プログラミングは対立する概念ではなく、Scalaではそれぞれが相乗して簡潔な記述と柔軟性を実現しています。
「静的型付け」とは、変数や関数があらかじめ決められたデータ型を処理するように厳密な記述を要求するプログラミング言語の特性です。
Scalaは静的な型付けの言語なので、安全に抽象化が可能な型システムを持っています。そのため、型に起因するエラーは実行時でなくコンパイル時に存在が分かります。
「静的型付けだと、型の記述でプログラムが冗長になるのでは?」と思う方もいるかもしれません。しかし、Scalaでは型推論によって型の記述を省略でき、簡潔な表現を可能にしています。
Scalaのソースファイルをコンパイルすると、JVM(Java仮想マシン)のバイトコードになります。Java仮想マシン上で動作するため、ScalaからJavaのメソッドやフィールドも呼び出せますし、逆も可能です。
つまり、既存の豊富なJavaライブラリをそのまま活用できます(※一部例外はあります)。
現在はCPUのマルチコア化(1つのプロセッサに複数のプロセッサ・コアを封入した技術)が当たり前になっています。Javaで並列処理を行う際は、java.lang.Threadクラスやjava.util.concurrentパッケージを使用して並列処理を実現します。
Scalaでは、マルチコアを意識して効率良く並列処理を行うための「Actor」と呼ばれるライブラリを持っています。これは「アクターモデル」に基づいたライブラリで、アクター同士がメッセージを送り合って処理を行うプログラミングモデルです。
さらにScala 2.9からは、並列処理対応のコレクション(palallel collection)が使用可能になりました。これは、コレクションを並列化し、おのおののスレッドで実行する処理が簡単に記述できます。
次ページでは、Scalaをインストールしてみましょう。
Copyright © ITmedia, Inc. All Rights Reserved.