複数の言語を混ぜた言語達、(Boo Pythonライクな.net言語)

ども,@nobkzです。

# 複数の言語を混ぜた言語達

そういえば、僕は良く、複数の言語を混ぜたような言語を良く書きます。Clojure(JavaとLispの混血)、Boo(Python、と.netの混血)、Nendo(RubyとLisp)、Nu(Objective-C、Ruby, Lisp)、LFE(Lispと、Erlang)....

この中で、その言語同士の機能が補い合い、むしろ、競合したりして、いろいろおもしろいのですが、今回はその言語の一部を取り上げ、考察していこうと思います。

## 複数の言語を混ぜた言語たちとは?

まず、 前もって言いいたいことは、あくまでも、「複数の言語を混ぜた言語」というのは、明確な定義は無く、僕ひとりが明確に、複数の言語を意識しないといけないと思った言語を選択しただけです。

もっとも、Clojureは個人的には、独自の言語になりつつあると思います。なので、Clojure(JavaとLispの混血)と言いましたが、むしろ、ClojureはClojureであるように印象があるので、「複数の言語を混ぜた」感は薄いです。

もっとも、「複数の言語を混ぜた」というよりも、その「もともと言語の環境を、別の言語で記述できるようにしたもの」と言ったほうが正確かもしれません。

## なぜそういった言語が登場するのか?

なぜ、こういった言語が作られるのでしょうか。理由がいくつかあるとは思いますが、個人的には、こういった理由があると思います。

* 言語の文法や、構文自体が気にくわないが、環境がすばらしいから。
* 自分のお気に入りの言語で、その環境を利用したいから。

## 利点

さて、こういった言語の利点としてはこのようなものが考えられるでしょう。

* 好きな言語に近い構文、文法を利用できる。
* 複数のパラダイムが混り合い、新しい技法が生れる
* 既存の環境の資産が使える

## 欠点

さて、このような、あるしゅ、素直にかかないので、それ相応のリスクもあるでしょう。

* 多機能になり、学習コストが高くなる。また、学習しづらくなる。
* 環境がサポートしていない言語使うというこなので、その言語の保守が続くとは限らない

### 複数の言語を混ぜた言語を紹介

さて、言語を紹介しましょう。

## Boo

個人的には、Boo言語はマイナー言語というより、「メジャー言語ではない」言語と言ったほうが言いとは思うのですが、なぜならUnityでBooのスクリプトが書けてたからです。(今はしらん。)

Booは、.Net FrameworkやMonoなどのCLI環境で動く言語であり、また、Python的な構文の静的型付けのオブジェクト指向言語です。

ここではチュートリアルは上げません。ですが、ググれば一杯でてきますので、特に基本構文の説明はしません。代りに、チュートリアルのページを紹介しておきます。(これは単純にググって、一番さいしょに出てきたページを張りつけただけですが。)

http://www.asahi-net.or.jp/~sy7a-ht/diary/tut_boo.html


### Pythonライクだが、しかし、C#と同様の機能もある

さて、この言語見た目はPythonぽいのです。例として、wikipediaのBooのフィボナッチ数列を出力するプログラムをお見せします。

```boo
def fib():
    a, b = 0L, 1L       #「L」が付いた数は64ビットになる。
    while true:
        yield b
        a, b = b, a + b
 
# 数列の最初の5つの数を出力する。
for index as int, element in zip(range(5), fib()):
    print("${index+1}: ${element}")
```

(http://ja.wikipedia.org/wiki/Boo_%28%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0%E8%A8%80%E8%AA%9E%29)

しかし、C#と似たような機能はあります。たとえば、静的型付けであることが、まず、あるでしょう。

```boo
name as string
name = "nobkz hanada"

age as int
# age = "24" コンパイルエラー
```

また、メソッドオーバーロードもあります。静的型ならではでしょう。

```boo
def plus(x as int, y as int):
	print "int plus"
	return x + y

def plus(x as string, y as string):
	print "string plus"
	return x + y

plus(1,2) 
plus("nobkz","hanada")
```

また、他にも、attributesもありますし、C#の言語機能もあります。


### .netで、DSLを実装するための言語

Boo言語はBoo言語ならではの機能があります。それはマクロです。

Booでやることと言えば、なんと言っても、DSLを作ることでしょう。というか、むしろBooはDSLをつくるための言語だからです。

たとえば、以下のような構文のがあったとしましょう。

```
forward 10
back 20
left 10
right 5
```

さて、意味はすごくシンプルにしましょう。ここでは、単純に,変数x,yの値を操作するだけのDSLにしましょう。つまり、以下のコードに変換することを考えます。

```boo
x += 10
x -= 20
y += 10
y -= 5
```

まぁ、この程度であれば、わざわざ、DSLを作る意味が無いのですが、あくまで説明のためで、実際はもっとしっかりDSL言語のデザインはします。

さて、DSLを実装していきましょう。

```boo
macro forward(f as int):
	yield [|
		x += $f 
	|]

macro back(b as int):
	yield [|
		x -= $b 
	|]

macro left(l as int):
	yield [|
		y += $l 
	|]

macro right(r as int):
	yield [|
		y -= $r
	|]
```

とても簡単ですね。
そして、次のコードがコンパイル、実行が可能です。

```boo
x = 0
y = 0

forward 10
back 20
left 10
right 5

print x
print y

```

出力はこうなります。

```
-10
5
```

### Boo言語まとめ

さて、Booは基本的にPythonライクですが、Pythonの、「短かく書ける」という特徴をうまく活かした言語だと思います。しかし、.netの環境を活かすために、そのための、型付けなどのC#ライクな面を見せてくれます。

また、マクロが強力で、.net上のDSLの構築としては有用な言語だと思います。

しかし、欠点としては、やはり、機能が多くなり学習コストが高くなる面があります。「C#でのように書きたいけど、Booではどう書けば良いのだろうか?」といってググる感じです。また、ドキュメントが不足しているというのも学習コストが高くなる要因でしょう。

# 他の言語の紹介

今日はひとまず、Booのみ。

他の言語はまた、別の機会で。