Ada について話します

はじめに
--------------------------------------------------

技術者といえば最新技術が大好きだ、というのが相場とされています。実際 Qiita のようなところを覗いてみれば、たいがいみんな新しい技術について書いているというわけです。

しかしそこをあえて逆に行って、イニシエの知る人ぞ知る技術について書いても、その手の「らしさ」は成立するものなのかもしれません。つまり技術者は必ずしも新しいものだから好きというわけでもないんじゃないかというわけです。先日たまたま何かの拍子にチーム内で [TRON キーボード](https://commons.wikimedia.org/wiki/File:TRON-Keyboard-Unit-TK1_001-KeysUp.jpg)や[「超漢字」](http://www.chokanji.com/ckv.html)が話題にのぼったのですが、そういういわゆる「ネタ」的な軽い話題にも、やはりどこかに「らしさ」が成立しているように思いました。

といったようなところに端を発し、そこからいろいろな偶然を経て、今回のテーマはプログラミング言語 Ada です。といっても別に詳しいわけではないので、話半分くらいで読んでいただければと思います。

名前のこと
--------------------------------------------------

紹介するまでもなくきっとご存知のことかとはおもいますが、Ada という名前の由来は人名です。エイダ・ラブレイス[^ada_lovelace]──バベッジ[^babbage]の設計した機械式コンピュータである「解析機関[^machine_analytique]」のプログラムを書いた世界最初のプログラマだと言われる女性です。彼女は詩人バイロン[^byron]の娘でもあり、そちらの縁で、文学的にも興味そそるゴシックホラー『フランケンシュタイン』を書いたメアリー・シェリー[^mary_shelley]と親交のあった人でもあります。

ちなみに並列処理で知られる Linda という技術がありますが、こちらはリンダ・ラブレイス[^linda_lovelace]という人が由来だといいます。エイダ・ラブレイスが上述のようにコンピュータにゆかりのある人物であるのに対し、リンダ・ラブレイスはといえば何とポルノ女優。伝説的大ヒット作に出演したので有名だったのだそうです。コンピュータ技術とは何の関係もない方のようですから（憶測ですが）単に「よく知られたラブレイス」というだけでシャレで命名したのかもしれません。

エイダにしろリンダにしろ女性名なので、たとえばプログラマが「俺さ、最近エイダひとすじで」なんて発言すると、それは恋にうかれているのか技術を愛しているのかよくわからないということになりかねません。日本の技術者もプログラミング言語や技術を開発したあかつきには、日本の女性名をつけてみるといいんじゃないでしょうか。というか、そういう類の実例はすでにあります。ただわれわれの流儀では、[Anthy](http://anthy.osdn.jp/) とか [TOMOYO Linux](http://tomoyo.osdn.jp/)[^tomoyo_linux] とかそっち系ですね。もうわれわれはそっちに突っ走ってしまえばいいんだろうなと思います。

Hello world
--------------------------------------------------

前振りが長くなってしまいました。そろそろ Ada のサンプルコードを見ていくことにしましょう。

まずはおなじみ Hello World です。

```ada:hello_world.adb
with Ada.Text_IO;
use Ada.Text_IO;

procedure Hello_World is
begin
   Put_Line ("Hello, world!");
end Hello_World;
```

基本的な記述方法は Pascal によく似ています。
まず目を引くのは何でしょうか。識別子がキャメルケースでもスネークケースでもない独特な書き方になっていることでしょうか。Ada は大文字・小文字を区別しませんので、たとえば `Put_Line` のようなものはいわゆるスネークケースで `put_line` と書くこともできるということになりますが、標準的なマナーとしてはこういう書き方をすることになっています[^ada_mode]。

この書き方はなぜこうなのでしょうか。Ada は高可読性を重視した設計になっているというふうに説明されることがよくあります。ひょっとするとこの記法も高可読性を配慮したということなのかもしれません。考えてみれば、たしかに語の区切りのわかりやすさでいえばもっとも優れているといえなくもない気がします。しかしそういう発想で考えだすと、今度は逆に、他の言語がなぜこういう書き方を採用してこなかったのかが疑問になってきます。やっぱり何か気持ち悪かったのでしょうか。

もうひとつ Pascal とあきらかにちがうのが `end` のあとにも識別子がくることです。この `end` の後の識別子は省略もできます。しかし当然まちがった名前を書くとコンパイルエラーになるので、飾りではありません。これも大きな構造を書いたとき、編集ミスなどのヒューマンエラーを防ぐという意味では一定の価値がありそうにも思えなくはなく、理にかなった工夫である気がします。しかしこれまたやはり他の言語での採用例をあまり見ない気がするのですよね。やっぱり何となくカッコ悪く冗長に見えたのでしょうか。よくも悪くも微妙に独特です。

それから、細かいことですがインデントはスペース 3 つが標準だとのことです。

コンパイルするには
--------------------------------------------------

コンパイラは GCC のひとつである GNAT が入手しやすいかもしれません。Ubuntu や Debian であれば

```
$ sudo apt-get install gnat
```

などでインストールできることでしょう。ソースファイルの拡張子は `adb` を使います。先のサンプルであれば `hello_world.adb` とするのが適切です。`gnat make` あるいは `gnatmake` でコンパイルやリンクができ、実行ファイルを得られます。

```
$ gnat make hello_world.adb
```

パッケージ
--------------------------------------------------

Ada はパッケージを使って名前空間をつくることができます。
われわれにとっては名前空間はもはや常識といっていいと思いますが、これを採用しているのは大規模開発を視野に入れていることの反映と言えるのでしょう。Ada の設計の主眼のひとつには、大規模開発への対応があるのです。

Ada のパッケージは仕様部分と実装部分で構成されます。それぞれをひとつのファイルに書くことも別ファイルに書くこともできます。

仕様部分のほうの拡張子には `ads` を使います。下記の場合は `hello_package.ads` となります。

```ada:hello_package.ads
package Hello_Package is
   procedure Hello_In_Japanese;
end Hello_Package;
```

実装部分は拡張子を `adb` とします。つまり `hello_package.adb` です。

```ada:hello_package.adb
with Ada.Text_IO;

package body Hello_Package is
   procedure Hello_In_Japanese is
   begin
      Ada.Text_IO.Put_Line ("こんにちは");
   end Hello_In_Japanese;
end Hello_Package;
```

そして、このパッケージを使うメインプログラムを書き……

```ada:hello.adb
with Hello_Package;

procedure Hello is
begin
   Hello_Package.Hello_In_Japanese;
end Hello;
```

コンパイルします。コンパイルはとてもお手軽です。これは大変すばらしい。

```
$ gnatmake hello.adb
```

さいごに
--------------------------------------------------

簡単なサンプルしか紹介できませんでしたが、Qiita の記事としては長くなってしまったので、このあたりでいったん筆を擱こうと思います。Ada は機能の豊富な言語で、たとえば

* オブジェクト指向
* ジェネリクス
* 並行処理
* 契約プログラミング

といったようなよく目にしている機能をけっこう備えており、なかなか興味惹かれる言語だといってよいでしょう。Ada は航空機の制御系などで使われているらしい、広く実用されている言語でもあり、堅実性には一定の評価があるのではないかとも考えられます[^real_programmer]。われわれの目からすると、機能性よりもそちらの堅実性の面、たとえば長期の保守に耐えうる高信頼性、高可読性を目指して実装されたであろうさまざまな工夫といった、ある意味 Web 系技術者がふだんつかっている言語の対極を指向しているともいえそうな性質こそ、ひととおり見ておきたいと思わせるものなのかもしれません。

以上、いかがでしたでしょうか。来る 2017 年は Ada の年になりそうですね（そんなわけない

-----

[^ada_lovelace]: Ada Lovelace（1815-1852）「エイダ・ラブレス」とも。
[^babbage]: Charles Babbage（1791-1871）
[^machine_analytique]: the Analytical Engine
[^byron]: “Lord Byron”（1788-1824）
[^mary_shelley]: Mary Shelley（1797-1851）「シェリー夫人」とも。
[^linda_lovelace]: Linda Lovelace（1949-2002）2013年に彼女の伝記映画『ラヴレース』も制作されている
[^tomoyo_linux]: 命名については[こちら](http://i-love.sakura.ne.jp/tomoyo/)を参照
[^ada_mode]: Emacs の Ada mode では、自動的にこの記法に変換されます。
[^real_programmer]: 「本物のプログラマは Pascal を使わない」というネタもあることから、Pascal 風言語より C 風言語のほうが実用性が高いと見なされがちなところはあるかもしれませんが、実際のところはわからないのかもしれませんね。