はじめに
最近自分の中でScalaという言語が熱い。RubyやPython等のスクリプト言語や、JavaやC#等現在のエンタープライズ領域を支える言語、HaskellやErlangといった関数型言語もある。そんなにいっぱいいい言語がある中で、なぜ今Scalaなんだろう? そんな理由を解説してみたいと思います。
Rubyの生産性
ここ数年LLブームで、とりわけ日本でのRuby人気は目覚ましいものがあります。実は筆者もRubyはとてもお気に入りです。最初に触り始めた頃は、「Rubyはいいよ」という話だったので勉強がてら小さなサンプルを作って遊んでいたのですが、その頃は「楽しいな」「気持ちいい言語だな」という程度であまり熱心にやっていませんでした。なぜなら私は「仕事で使える」ということを非常に重視するタイプだからです。
その認識が一変したのがRubyによるWebアプリケーション開発のプラットフォームであるRuby on Railsを触り始めて、そのアーキテクチャの凄さと楽ちんさを体感してからです。
生産性がJavaのWebアプリケーション場合と比べて「10倍」と宣伝されており、私は「どうせ自動生成やろ。眉つばもええところや」と思っていました。
しかし、実際に触ってみると確かに10倍かどうかは怪しいかもしれませんが、少なくともJavaの一般的なWebアプリケーション構築する時に比べて、圧倒的に生産性がいいのは間違いないと思いました。しかも生産性がいい理由は一見自動生成に見えますが、そうでなはいのです。
その理由は、「言語のパワー」でした。Ruby on RailsはJavaCoCの思想ももちろん生産性に大きく寄与していますが、JavaやC#では絶対にあり得ないことがRubyではいとも簡単にできてしまいます。例えばRuby on Railsで「社員」のメンテナンスに関するモデル部分は下記のコードだけで済んでしまいます。
class Employee < ActiveRecord::Base end
たったこれだけで、例えば、社員(Employee)の登録なら、
employee = Employee.new
employee.name = "山田"
employee.salary = 500
employee.save
とすると、データベースのemployees表にSQLが発行されてデータースにname="山田"、salary=500というデータが保存されます。社員表に存在する項目名すらコーディングしていません。確かにこれはすごい生産性です。
さらに、給料が500円の人のリストを得るには、
employees = Employee.find_by_salary(500)
でOKです。フレームワークを作った人には、最初からEmployeeクラスにsalaryという項目があるかなんて分かるはずがありません。
動的言語と静的言語
これは、Rubyの持つ「動的な言語」としての性質だったり、強力なメタプログラミングの性質によるものです。Rubyではクラスやオブジェクトに対して、フレームワークが後付けで属性を追加したり、メソッドを追加したりすることができます。
例えば先のfind_by_salary(500)では、Rubyのクラスを実行すると、メソッドが見つからない場合はmethod_missingというメソッドが呼ばれます(この例ではスーパークラスの中に書いてあります)。このmethod_missingの中で、今呼ばれたメソッドは「find_by_salaryで引数は500」というのを判断できます。
この情報と自分のクラス名(Employee)を複数型に変換して、salary=500という条件をつけてSQLを組み立てて発行すればそれでOKという感じだと思います(実際にActiveRecordがそうなのかは知りませんが、少なくともRubyの文法では上記のようなことが可能です)。
こういったことはJavaやC#といった「静的型付けの言語」ではできません。こういう「魔術」のようなことが使えるため、RubyやPythonといった「動的型付けの言語」は「静的型付けの言語」に比べて圧倒的に簡潔に、人間の感覚からしても自然な記述でプログラムを書くことができるようになります。
余談ですが、筆者の同僚でSmalltalkで仕事をしていた人がいるのですが、彼は、
JavaがSmalltalkの後に出てきて、それを仕事にしたとき「退化した」と思った
と言っていました。Smalltalkは動的型付けの言語ですが、Javaはこのような柔軟性が無く、たくさんのコードを書かなくてはいけません。最近はJavaでも簡潔にかけるフレームワークが多くでていますが、もともとある「言語のパワー」は動的な言語と比較するとやはり弱いと思います。
その他のメリットとしては、余分な事をコーディングしなくてもいいので、コードの「本質部分」だけを記述すればいい感覚で、初心者にもとても優しくなります。
以前、筆者はプログラムの経験があまりない人に、JavaのWebプログラミングの本を渡して「サンプルを作ってみて」と言い、2週間後に「どうだった?」と聞いてみると「難しくて歯がたちませんでした」と言われたことがありますが、Ruby on Railsの本を渡すと1時間も立たないうちに、最初のWEB-DBプログラムをコーディングして動かしていました。
自分でプログラムを作る時もRubyの「楽ちんさ」に慣れてしまうと、JavaやC#は素晴らしいIDEのサポートがあるのにもかかわらず、どうしても「JavaやC#は面倒くさいし、時間がむっちゃかかる」という感覚に今はなっています。ちょうど、Javaに慣れた後にC++を触ったときに「めんどくさい」と思った感覚に似ています。