Scalaの紹介

この項目は、公式サイト『The Scala Programming Language』上にあるAbout Scala -> Introductionの日本語訳です。不正確な訳、誤りがあればご指摘いただければと思います。なお、このページの原文のバージョンは、2011/05/07のものであり、最新の情報とずれがある可能性がある事にご注意ください。

Scalaの紹介

Scalaは、汎用的なプログラミングのパターンを、簡潔に・エレガントに・そして型安全に表現するための汎用プログラミング言語です。Scalaは、オブジェクト指向の機能と関数型言語の機能をうまく統合しており、Scalaを使う事で、Javaやその他のプログラマの生産性はより向上するでしょう。Scalaのコードサイズは典型的には、同じ機能を実現したJavaのアプリケーションと比べて1/2から1/3程度になります。

ビジネス上、重要な場面でJavaを利用している多くの企業が、開発生産性、アプリケーションのスケーラビリティ、全体的な信頼性を向上させるためにScalaに移行しています。

たとえば、ソーシャルネットワーキングサービスのTwitterでは、Robey Pointerが核となるメッセージキューをRubyからScalaに移行しました。この変更は、急速なペースで向上していく時間辺りのTweet数(オバマ大統領の就任式では、既に、1分辺り5000 Tweet近くに達していました)に対して、操作にかかる時間をスケールさせるために必要なものでした。TwitterのKestrelプロジェクトの背後にRobeyの考えは、ライブジャーナルで開発者達に対して説明されています。ありがたいことに、RobeyはKestrelの簡潔な1500行のScalaコードをオープンソースプロジェクトとして公開してくれました。

多くの最高のプログラマと産業リーダーはScalaに魅力を感じています。彼らの声は、Scalaの本を書いている人々や新しくScalaに入門するJavaプログラマのためのTipsを書き続けている人々(その中には、"エキスパートによるJavaからScalaへの移行の勧め"のようなものもあります)にとって励みになりました(訳注:この辺りの訳は怪しい)。Scalaの公式サイトには、Scalaのチュートリアルから先進的な言語の研究、Scalaのコード例、Scalaをインストールして始める方法まで、様々な文書が揃っています。

Javaとのシームレスな統合

既にあるJavaコードやJavaプログラミングのスキルは完全に再利用できます。ScalaはJVMの上で動作する、つまり、Javaとバイトコードレベルで互換性があるため、既存のJavaライブラリやアプリケーションを完全に利用できます。JavaからScalaを呼ぶことも、ScalaからJavaを呼ぶこともでき、これは両者がシームレスに統合されていることを意味しています。それに加えて、Eclipse, NetBeans, Intellijのような(Javaプログラマにとって)親しみのある開発環境(これらは全てScalaをサポートしています)を利用することもできます。あなた方がその途中まで来ているのなら(訳注:このhalf wayが何を指しているのかよくわからない)、実力のあるScalaプログラマになるのには長い時間はかからないでしょう。

Scalaコンパイラの性能

Scalaコンパイラは実際の製品環境において利用されており、成熟しており、高い信頼性を持っている事が実証されています。Scalaコンパイラを書いたのはMartin Oderskyであり、彼はJavaコンパイラの参照実装(今日、数百万のJavaプログラマが利用している)を書いたことがあり、Java Genericsの共著者でもあります。Scalaコンパイラの出力するバイトコードはJavaコードと同等のパフォーマンスを誇ります。

Scalaのコンセプト

Martin Odersky(EPFLの教授)は、自らJavaの何十万行ものJavaコードを書いた事があり、Javaのプログラマが直面していたフラストレーションをよく意識していました。彼は、アカデミックな研究コミュニティの知識を、Javaプログラマのエクスペリエンスをより良く、楽しくするために適用するというビジョンを持っていました。彼の最初の実用的なステップは、Java Genericsでした。Javaコミュニティは、これを大成功だとみなしています。しかし、彼は、スケーラブルな並行プログラミングモデルを実現するというビジョンのためには、Javaの基本的な構文から変更する必要があると考えていました。ここからYou simply couldn't get there from here. But a deceptively simple shift in syntax gained better uniformity to the object-oriented aspects of Java, and this in turn enabled a natural fusion with functional programming concepts which are critical for tackling concurrency. In 2001 Scala was born.ここまで未訳

Scalaでのプログラミング

Javaプログラマーは、最初はScalaが少し奇妙なように感じるでしょう。しかし、すぐに、Scalaを使えば自分のアイデアを簡潔な方法で、より少ないキーストロークで記述できる事に気づき、楽しめるようになる事でしょう。Scalaは、型推論、全てがオブジェクト、関数の受け渡しなどの多数の機能を持っていますが、不要な文法を入れたりはしていません。経験していくにつれ、多くのユーザは、Scalaが、使い易く、型安全で、ジェネリックなライブラリを作るのを簡単にしてくれる事に気づきます。また、領域特化言語(DSL)を作成するための幅広い機能も提供してくれます。Scalaはプログラマをスケールさせてくれます。学べば学ぶほど、Scalaの奥深さに気づき、より複雑な作業をより簡単にこなせるようになっていきます。Scalaの多面的な様相が、直交したコンセプトの集合をうまく接合している事に気づいたとき、ほとんどのプログラマーは、「あー、なるほど!」と言います。新しい構文を学ぶために少しコストを払うだけで、誰でも、Javaでしていたのと同じくらい簡単に同じ事をするプログラムを書け、その上、着実に問題を解く力を得ることができます(訳注:この部分は若干解釈が難しかったため、うまく訳せていません)。

プログラミング言語の専門家のために、以下にScala言語の技術概要を述べます。

Scalaはオブジェクト指向です

Scalaは全ての値がオブジェクトであるという意味で、純粋なオブジェクト指向言語です。型とオブジェクトの振る舞いはクラスとトレイトによって記述します。クラスはサブクラス化する事で拡張することができます。また、ミックスインベースの合成メカニズムによって、多重継承の綺麗な代替案を提供します。

Scalaは関数型です

Scalaは、全ての関数が値であるという意味で関数型言語でもあります。Scalaには無名関数を定義するための軽量な構文があり、高階関数、ネストした関数、カリー化もあります。Scalaのケースクラスと、組み込みのパターンマッチングによって多くの関数型言語で使われている代数的データ型を定義することができます。その上、Scalaのパターンマッチングは、XMLデータを処理するように拡張することができます。そのとき、右側の残りの列を無視できるような列パターンを使うことができます。この文脈において、内包表記はクエリーを模倣するのに便利です。これらの機能があるため、ScalaはWebサービスのようなアプリケーションを開発するために理想的な言語であると言えます。

Scalaは静的型付けです

Scalaは表現力のある型システムを備えており、抽象化されたものが安全で整然とした形で使われる事を強制します。特に、型システムは以下のような機能をサポートしています:

    • ジェネリックなクラス

    • 変位指定アノテーション

    • 型の上限および下限境界

    • オブジェクトのメンバーとしてのインナークラスと抽象型

    • 合成型

    • 明示的に型付けされた自分自身への参照

    • ビュー

    • 多相メソッド

局所的な型推論は、ユーザが無駄な型情報を付加する必要が無いという意味で、注目に値します。これらの機能を組み合わせることによって、プログラミングの抽象化の安全な再利用と型安全なソフトウェアの拡張の強力な基盤を提供することができます。

Scalaは拡張可能です

実用上、ドメイン固有のアプリケーションを開発するには、しばしばドメイン固有言語が必要になります。Scalaは、新しい言語機構をライブラリとして簡単に追加できるようにするための、ユニークな言語機構の組み合わせを持っています:全てのメソッドは中置演算子および後置演算子として使用することができ、クロージャは必要とされる型に応じて自動的に生成されます(target typing)。この両方の機能を使うことで、マクロのようなメタプログラミング機構や構文の拡張無しに、新しい種類の文を定義できるようになります。