2015年7月28日火曜日

JavaとRubyの共通点と、相違点について

こんにちは。

これでもか!というくらい、毎週車のホイールを磨いている鷲尾です。
彼女は車内で3DS、私は汗ダラダラでホイールをゴシゴシ。
文句も言わず洗車に付き合ってくれる彼女に感謝です。


さて、前回は機械学習の持つ可能性と、こんなのがあったらどうだろう、という記事を紹介したかと思います。
今回は少し趣向を変え、RubyとJavaの共通点や、書き方の違いなどについて、お話したいと思います。


Ruby(ルビー)とは?
みなさんは、Rubyというプログラミング言語を聞いたことはありますか?
なんとなく聞いたことがあるという方や、バリバリ使っているよという方もいらっしゃると思います。

Rubyとは、まつもとゆきひろ氏(通称:Matz)によって開発された、オブジェクト指向スクリプト言語のことです。インタプリタ言語(※)なので、書いたソースはコンパイルせずに、すぐに実行することが出来ます。

※インタプリタ言語
コンパイル作業が必要なく、ソースファイルをそのまま実行することが出来る言語の種類のこと。速度はコンパイル言語に劣るが、コンパイルする手間が省けるので、コンパイル型言語と比較して開発効率がいいとされている。


■Rubyの特徴
Rubyはオープンソースなので、誰でも無料で利用することが出来ますし、マルチプラットフォームなのでWindows,Linux,Mac OSなど、様々な環境で実行することが出来ます。

以前はあまり知名度が高くなかったRubyですが、現在は様々な企業で自社サイトの開発などに使われる、非常にメジャーな存在になっています。
みなさんも一度は使ったことがあるであろう、レシピサービスを展開するクックパッドのサービスも、Rubyのフレームワーク"Ruby on Rails"を使って開発されています。


■JavaとRuby
オブジェクト指向言語と聞いて初めに思い浮かぶであろうプログラミング言語は、Javaではないでしょうか。Rubyと同じようにオブジェクト指向言語であるJavaは非常に人気があり、様々な場所で使用されています。
また、同じオブジェクト指向言語であるために、言語としての仕様も似ているところがあります。

では、RubyとJavaの共通点、相違点について、見てみましょう。
参考:http://www.atmarkit.co.jp/ait/articles/0803/25/news152.html





◆共通点
クラス定義・継承について
Javaが直接の親クラスは1つしか持てない(単一継承である)ということは有名かと思いますが、実はRubyも1つのクラスは直接の親クラスを1つしか持てません(※)。
また、すべてのクラスの親クラス(暗黙の親クラス)がObjectクラスであるということも共通しています。

※Rubyには、Mix-inという方法があり、これを使うとクラス自体は複数継承することが出来ます。属性の継承は単一クラスのみですが、実装のみを記述したクラスであれば、複数継承することが出来ます。


【クラス定義をする場合】
・Javaのクラス定義
Class クラス名 {

}


・Rubyのクラス定義
Class クラス名 

end

クラス定義に関しては、記述方法もほとんど変わりませんね。Javaの{}が、endに変わっている点くらいかと思います。


【継承をする場合】
・Javaで継承を行うクラス定義
Class クラス名 extends 親クラス名 {

}

・Rubyで継承を行うクラス定義
Class クラス名 親クラス名

end

Javaでは継承を行う際、extendというキーワードが必要です。この親クラスが、継承したクラスから見た「スーパークラス」となります。
Rubyで継承を実装する際は、extendsではなく、"<"を使用します。


演算子・制御文について
JavaもRubyも、C言語に近い体系の演算子を用意しているため、Javaと演算子の内容が近いものが多く、扱いやすいと思います。
またforやwhileといった制御文ですが、こちらも基本的な使い方は似ています。
ただ、Rubyではif文の条件式部分をカッコ()で囲む必要がなかったり、for文が一見すると意味がわかりづらかったりするので、そういった書き方の違いには気をつける必要があります。


・Javaでif文を実現する場合
if  (条件式A) 

else if (条件式B) {

} else {

}


・Rubyでif文を実現する場合
if 条件式A 

elsif 条件式B

end


Javaでいう"else if"は、Rubyでは"elsif"と書きます。"e"がないだけなので、非常に間違えやすいです。JavaからRuby、もしくはRubyからJavaを始めたという方は、最初は気になるかもしれませんが、使い方は基本的に同じなので、問題ないかと思います。

それでは、次に制御文のうちの一つ、"for文"を見てみましょう。


・Javaでのfor文
for (int i = 1 ; i <= 10; i++) {
  System.out.println(i);
}


・Rubyでのfor文
for  i  in 1..10
  puts  i
end

これはだいぶ違いますね!
プログラムとしては、同じ"1~10まで表示する"という内容のものですが、明らかにRubyのほうが少なくてシンプルなコードになっています。
文字数だけみても、Javaは45文字なのに対し、Rubyは19文字しかありません。

このように、Javaと比べて非常に短く書くことが出来るというのも、Rubyの魅力のうちの一つかもしれません。


◆相違点
それでは次は相違点を見てみましょう。
まずは型に関してです。


1.Rubyでは型宣言が不要
Javaエンジニアの皆さんは、"数字の時はint、文字列の場合はString"というように、当たり前のように型宣言をしていると思います。しかしRubyでは型宣言は必要ありません。
Javaでは、コンパイル時に型の整合性をチェックしていますが、インタプリタ言語であるRubyは、実行時に型の整合性をチェックしているのです。

※Rubyでは、プログラム上のリソースは、すべてオブジェクトとして扱われます。そのため、そのオブジェクトには当然ながら型が存在しています。

・Javaの場合
String name = “A-AUTO”;
int number = 50;

・Rubyの場合
name = “A-AUTO”
number = 50


2.メソッドを呼び出す際のカッコ()は省略できる
Javaではメソッドを呼び出す際、hoge.foo()などのように、カッコを付けます。しかしRubyの場合、メソッド呼び出しをする際はカッコを省略できます。
カッコを付けても問題なく動作するため、どうしてもJavaライクにメソッドを呼び出したいという場合は、カッコを付けてもいいかもしれませんね。

・Javaの場合
String name = “a-auto”;
System.out.println(name.toUpperCase());

・Rubyの場合
name = “a-auto”;
puts name.upcase


3.RubyにはJavaでいう"基本データ型"がない
さきほど紹介したように、Rubyではすべての値はオブジェクトとして表現されています。したがって、Rubyの中で「100」と書くと、それは数値オブジェクトである、これに対してメソッドを実行することが出来ます。

数値そのもにメソッドを実行するという感覚は不思議かもしれませんが、慣れていくとあまり気にならないかと思います。

・Javaの場合
String num = new String(100);

・Rubyの場合
num = 100.to_s




4.Rubyでは必ずしもクラスが必要というわけではない
オブジェクト指向言語であるJavaは、どんな小さなプログラムでも、実行するためにはクラスを定義しなければなりません。しかしRubyの場合、自分ではひとつもクラスを定義しなくても、プログラムは動作します。
Rubyでクラスを定義するのは、プログラムコードが複雑化してきたためにまとめるといった場合に使うことが多いかと思います。


・Javaの場合
public class Main {
    public static void main(String[] args) throws Exception {
        System.out.println("a-auto");
    }
}


・Rubyの場合
puts  "a-auto"


同じ実行結果を得るだけでも、コーディング量にここまで大きな差が出ます。
ひとつ文字列を出力するだけでもこの違いなので、全体で見るとRubyのプログラムは非常にコンパクトになりそうですね。

ちなみにRubyでクラスを定義する場合は、以下のように簡単に行うことが出来ます。
class  DspAuto < スーパークラス
 puts “a-auto”
end

ご覧のとおり、処理を"class"と"end"で囲むだけです。なお、Rubyではスーパークラスを省略した場合には暗黙的にObjectクラスがスーパークラスになります。

RubyはJavaと同じようにオブジェクト指向言語ですが、クラス定義をしなくても使えたりと、非常に自由に書くことが出来ます。


5.Rubyではメソッド名に記号が使える
Rubyでは、メソッドに"!"や"?"といった記号をつけることが出来ます。
以下は、真偽値を返すメソッド名に使った場合です。

class  DspAuto
    def dspName?
         true
     end
end

dauto = DspAuto.new
if dauto.dspName?
    puts "true!!"
end

メソッド名に"?"が付いているのはなんだか不思議ですが、もちろん問題なく動作します。

※"?"は、慣用的に真偽値のチェックに使うメソッドに付けることが多いようです。



■所感
いかがでしたでしょうか。なんとなくでも、JavaとRubyの違いをご紹介出来たのではないかと思います。
RubyとJavaは、もともと開発された目的が違い、Javaは"一度かけばどこでも動く"を目的に、Rubyは"プログラミングの楽しさ"を目的として開発されています。
もともとの目的が違うので、Javaと同列で比べるのものではないのかもしれませんが、Rubyはコンソール画面で簡単に動作確認を行えるため、どなたでもとっつきやすい言語なのではないかと思います。

今までプログラミングをしたことがない、したことがあるけどかじる程度にしか触ったことがないという方は、まずはRubyから手を付けてみるのもいいかもしれません。


0 件のコメント:

コメントを投稿