【バイリンガルじゃ、もったいない】あなたの好きなフィボナッチはどれ？


いつもお世話になってます。高校生プログラマのdrumathです。今回はフィボナッチ数列についての記事を書かせていただきます。
もしかしたら、今、プログラミングを始めたばかりの人で
「プログラミングを始めたいけど、いったいどの言語から始めればいいのだろう？」と、悩んでらっしゃる方もいると思います。本記事ではC/C++、Java、Python、Ruby、PHP、Perl、JavaScript、CoffeeScriptの8つの言語で同じアルゴリズムを実装してみよう！というものですので、もしかすると言語選択のお手伝いができるかもしれません。
# フィボナッチ数列について
出会いは中学受験のときでした。

```
1,1,2,3,5,8,13,21 ...
```
この後に続く数字は？という問いにはじめは誰もが頭を悩ませるでしょう。正解は34。前の二つの項の和という説明を聞いて、実に算数的で面白さを感じました。しかし、フィボナッチ数列の本当の姿は実に「数学的魅力」にあふれていました。それを知ったのはその2年後、数学ガールを読んでのことでした。ここでは多く語ることはしませんが、フィボナッチ数列は松ぼっくりや黄金比など、自然界のいたるところに存在し、その存在は気高く、美しい。。。
そして、プログラミングの世界でも、初級～中級程度のアルゴリズムで紹介されることがあります。手軽にコードを記述できるので、初心者が達成感を感じることができる良いアルゴリズムの例だと思います。

# いろんな言語でフィボナッチ。
![2016-04-12.png](https://qiita-image-store.s3.amazonaws.com/0/86191/4b740c7c-5974-4755-efde-c716000266fc.png)

さて、本題です。
プログラムとしては、
- フィボナッチ数列を出力する関数（もしくはメソッド）```fibona(num)```を作る
    - 引数```num```に求める項を代入する
    - その項までのフィボナッチ数を標準出力に出力する
- メイン関数でそれを実行する

というプログラムを作ります。

## C/C++
C/C++はC言語という言語と、C++という言語の総称です。C言語は私が初めて触れた言語なので思入れが深いのです。他の言語よりもやや文法が難しく、複雑ですが、処理速度は最速で、最もコンピュータと密接な言語といっても過言ではございません。C++はC言語を拡張して、オブジェクト指向を付け加えた言語です。C言語よりも簡単なコードの記述が可能になり、おもにDirectXのゲームプログラミングなどに用いられます。

まずはC言語から

```c:fibona.c
#include <stdio.h>
void fibona(int num);

int main(void)
{
	fibona(20);
	return 0;
}

void fibona(int num)
{
	int x=1, y=1, i=0, tmp=0;
	while (i < num) {
		printf("%d\n", x);
		tmp=x;
		x=y;
		y+=tmp;
		i++;
	}
}
```

そしてC++

```cpp:fibona.cpp

#include <iostream>

using namespace std;

void fibona(int num);

int main(void)
{
	fibona(20);
	return 0;
}

void fibona(int num)
{
	int x=1,y=1,i=0,tmp=0;
	while (i < num) {
		cout << x << endl;
		tmp=x;
		x=y;
		y+=tmp;
		i++;
	}
}
```

bcc(Borland　C++ Compile)というものを使い、コンパイルしてみると

```shell-session:Console
>bcc32 fibona.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
fibona.c:
Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
>fibona.exe
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## Java言語
JavaはC言語の文法をもとに作られた言語です。Javaという言葉自体は聞いたことがある方もいらっしゃると思います。JavaはJVM（Java Virtual Machine）という仮想マシンの上で動作します。そのためwin機でもMac機でもうごくプログラムができます。主にAndroidプログラミングで用いられます。

```java:fibona.java
public class fibona
{
	public static void main(String[] args) {
		fibonachi(20);
	}

	public static void fibonachi(int num)
	{
		int x=1,y=1,i=0,tmp=0;
		while(i < num){
			System.out.println(x);
			tmp=x;
			x=y;
			y+=tmp;
			i++;
		}
	}
}
```
JavaはVM言語なので、javacコマンドを使いコンパイルします。そうすると```fibona.class```というクラスファイルができます。これをjavaインタプリタで実行します。

```shell-session:Console
>javac fibona.java
>java fibona
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## Python
pythonはオブジェクト指向スクリプト言語です。一行ずつ実行するためデバッグがしやすく、インデントでプログラムを作っていくので、初心者でも読みやすいコードが書けます。守備範囲は広く、人工知能、ビッグデータ、アプリケーションの拡張機能に使われることがあります。

```py:fibona.py
def fibona(num):
	x=1
	y=1
	i=0
	while(i<num):
		print(x)
		(x,y)=(y,x+y)
		i+=1

fibona(20)
```

スクリプト言語なのでPythonコマンドで、すぐ実行できます。ちなみにこれから書いていくプログラムはすべてpythonのようにインタプリタで即時実行できます。

```shell-session:Console
>python fibona.py
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## Ruby
RubyはPythonと同じく、オブジェクト指向スクリプト言語です。開発者は日本人のため、日本語のドキュメントが多く、簡単にコードが記述できます。また、Rubyの哲学として「楽しくプログラミングをする」があり、直観的にプログラムを組むことができます。私が一番愛用している言語でもあります。主にRuby on RailsというフレームワークでWebアプリケーションを作る際に使われることが多いようです。

```rb:fibona.rb
def fibona(num)
	x=1
	y=1
	num.times do
		print "#{x}\n"
		x,y=y,x+y
	end
end

fibona(20)
```
それでは実行してみましょう。

```shell-session:Console
>ruby fibona.rb
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## PHP
phpは主にWebページを作るのに、使われます。```<?　?>```のタグの中にphpのコードを記述することで動的にWebページを作れます。フレームワークにはCakePHPなどがあります。

```php:fibona.php
<?
function fibona($num){
	$x=1;$y=1;$i=0;
	while ($i < $num) {
		echo $x."\n";
		list($x, $y)=array($y, $x+$y);
		$i++;
	}
}

fibona(20);
?>
```

```shell-session:Console
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## Perl
Perlは主にWebCGIとして使われます。Perlは昔からあるオブジェクト指向言語なので、若干ほかの言語にない奇妙な部分があったりするのがまたよいです。

```pl:fibona.pl
sub fibona {
	my($num) = @_;
	$x=1; $y=1; $i=0;
	while ($i < $num) {
		print "$x\n";
		($x, $y)=($y, $x+$y);
		$i++;
	}
}

fibona(20);
```

```shell-session:Console
>perl fibona.pl
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## JavaScript
最近最も盛り上がってる言語のひとつです。Web開発でHTMLの中にスクリプトを書き込める言語です。Windowsのユニバーサルアプリを作ることが出来たり、GitHubの作ったElectronによって.exeや.appなどのネイティブアプリも作れます。
今回はNodeというツールを使ってjsを汎用アプリとしてプログラムをしてみます。

```js:MyFibona.js
var fibona = function(num){
	var x=1;
	var y=1;
	var i=0;

	while (i<num) {
		var tmp;
		console.log(x);
		tmp=x;
		x=y;
		y+=tmp;
		i++;
	}
};

fibona(20);
```

```shell-session:Console
>node MyFibona.js
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

## CoffeeScript
CoffeeScriptはJavaScriptを簡単に記述できる言語です。そのためCoffeeScriptをコンパイルするとJavaScriptのコードが生成されます。

```coffeescript:fibona.coffee
fibona = (num)->
	x=1;y=1;i=0;
	while i<num
		console.log x
		[x,y] = [y,x+y]
		i++

fibona(20)
```

```shell-session:Console
>coffee -c fibona.coffee
```

生成されたコード

```js:fibona.js
// Generated by CoffeeScript 1.10.0
(function() {
  var fibona;

  fibona = function(num) {
    var i, ref, results, x, y;
    x = 1;
    y = 1;
    i = 0;
    results = [];
    while (i < num) {
      console.log(x);
      ref = [y, x + y], x = ref[0], y = ref[1];
      results.push(i++);
    }
    return results;
  };

  fibona(20);

}).call(this);
```

```shell-session:Console
>node fibona.js
1
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
```

# おわりに
どうでしょうか？言語にもいろいろ個性があって面白いですよね。擬人化漫画が出るのもわかります。
新しい言語を習得する時に、なんだか新しい国へ行ったような気分になるんです。その国のルールに従ってコンピュータと話す。前まで私は「プログラミングって理系のすることなのでは？」とおもっていたのですが、「言語」という言葉通り、言語学的な楽しみが沸いてきました。日本語や英語のように学校で習って、テストがあって、宿題やって、、、みたいなことはなく、それらよりも簡単にできるのもまた魅力です。
だからこそ、バイリンガルじゃ、もったいない。