指向性メモ::2008-12-10

ページ情報
制作日
2008-12-10T07:38:57+09:00
最終更新日
2008-12-10T10:04:51+09:00

Adaの参考書

Created:
2008-12-10T07:38:57+09:00

Ada学習者のためにおすすめの日本語参考書をご紹介しよう。

まずは、「Ada 入門/和訳規約」(H.レッドガード著 ; 上条史彦 ほか 訳、産業図書)である。表紙を開くと最初に目に入る日本語版への序の一説をまずはご紹介したい。

Ada言語は新しく,かつ開発途上にあるため,固定された姿にはなっていない.

奥付には昭和58年と書いてある。西暦で言うと1983年である。驚くべき事に、英語版の原著が書かれたのはさらに遡って1981年になる。

内容はといえば、第1章に簡単な言語の説明があり、残りの半分以上のページはRMの和訳になっている。Ada83のRMが日本語で読めるという意味ではとても貴重な資料と言えるかもしれない。説明自体は本当に基本的な事のみに絞られている。概要をつかむだけならば十分な内容だが、詳しく勉強しようと思っている読者には少々物足りないかもしれない。

ところで参考書はすべて図書館にあったものを借りてきたものなのだが(なにせ今や絶版になっていない教科書は存在しない)、付属のカードを見る限り、歴史あるこの本を借りた人間は私の前には2人しかいなかったようだ。

さて、次は「Adaプログラミング」(石畑清, 疋田輝雄著、岩波書店、ISBN 4000076884)である。この本はなかなかおすすめだ。必要な情報がコンパクトにまとまっているので、すでにほかの言語を習得済みの読者ならばこの1冊でAdaについてよく理解できると思う。ただし、標準ライブラリやPragmaなどの言語環境についてはほとんど触れられていないので(まえがきに書かれている通りだ)、実際にコードを書く際にはほかのリファレンスが必要になるだろう。発行は1986年だ。

3冊目、「ADA : 言語とプログラミング方法論」(David A.Watt[ほか著] ; 藤田昭平, 細谷僚一監訳、丸善、ISBN 4621034529)はとても分厚い。620ページもあって表紙が堅いので盾と同時に武器としても使える。武器として使う場合は重量を利用した打撃だけでなく、とても鋭利な四隅の角うまく活用すると良いだろう。内容は「Adaプログラミング」とあまり変わらないのだが、説明が非常に丁重で、前提知識が不足している初心者に向いていると言える。また、演習問題がかなり充実しているので、授業で使うのにいいかもしれない。ある程度知識のある読者は適当に読み飛ばしながら読むのがいいだろう。この本だけなんと平成2年、西暦言えば1990年代に発行されている。手元で見つかった範囲では唯一の平成、かつ90年代の本である。

ほかにも何冊か発見したので現在取り寄せ中である。追って報告したい。

Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2008/12/10/073857

Adaの定数の話

Created:
2008-12-10T10:04:51+09:00

Cだと#defineするような、ハードコーディングしてメモリに直接乗せたくないような定数ってAdaでどうやって書くの? というお話。もっと言うと普遍整数型と数値宣言とconstって中でどうなってるのよという話。

まずはCで書いてみる。メモリに定数を乗っけるコード。

main() {
  int x = 17;
  int v = x;
  return v;
}

gcc -S -O0で最適化されていないアセンブラを吐いてみる。重要そうなところだけを抜き出すとこんな感じ。

main:
.LFB2:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movl	$17, -8(%rbp)
	movl	-8(%rbp), %eax
	movl	%eax, -4(%rbp)
	movl	-4(%rbp), %eax
	leave
	ret

次に同じコードをAdaで書いてみる。

function Integer_Test_Normal return Integer is
   X : Integer := 17;
   V : Integer;
begin
   V := X;
   return V;
end Integer_Test_Normal;
_ada_integer_test_normal:
.LFB3:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movl	$17, -8(%rbp)
	movl	$17, -4(%rbp)
	movl	$17, %eax
	leave
	ret

いきなり予想外の結果に。XVに17が直接代入されている。何でだろう。

ためしに、宣言部で初期化するのをやめてみる。

function Integer_Test_Normal return Integer is
   X : Integer;
   V : Integer;
begin
   X := 17;
   V := X;
   return V;
end Integer_Test_Normal;

しかし結果変わらず。フロントエンドがなんかしてるのかもしれない。まぁ変数が二つちゃんと出来てるのはわかるからいいや。

つぎに、17を#defineしてみる。

#define X 17
main() {
  int v = X;
  return v;
}

コンパイルするとこんな感じ。変数が1個になってる。

main:
.LFB2:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movl	$17, -4(%rbp)
	movl	-4(%rbp), %eax
	leave
	ret

さて、Adaで同じように書くにはどうするべきか。とりあえず普遍整数で行ってみよう。

function Integer_Test_Universal return Integer is
   X : constant := 17;
   V : Integer;
begin
   V := X;
   return V;
end Integer_Test_Universal;
_ada_integer_test_universal:
.LFB3:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movl	$17, -4(%rbp)
	movl	$17, %eax
	leave
	ret

お、良さそうな感じ(相変わらず代入してないのが気になるけど)。次は普通のconstantで実験。

function Integer_Test_Constant return Integer is
   X : constant Integer := 17;
   V : Integer;
begin
   V := X;
   return V;
end Integer_Test_Constant;
_ada_integer_test_constant:
.LFB3:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movl	$17, -8(%rbp)
	movl	$17, -4(%rbp)
	movl	$17, %eax
	leave
	ret

予想通り、変数2つ。というのも、Adaのconstantは単に2回目の代入が出来ない変数なので、値自体は実行時に決まる事を考えればこうなるでしょう。

というわけで、#defineの代わりは普遍整数を使うのがいいようだ。しかし、整数以外の値を定数にしたい場合はどうしたものだろう。

ついでにもうちょっと実験。数値宣言した型のconstだとどうなるのかな。

function Integer_Test_Range return Integer is
   type X_Range is range 17 .. 17;
   X : constant X_Range := 17;
   V : Integer;
begin
   V := Integer(X);
   return V;
end Integer_Test_Range;
_ada_integer_test_range:
.LFB3:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movb	$17, -5(%rbp)
	movl	$17, -4(%rbp)
	movl	$17, %eax
	leave
	ret

まぁ、そりゃそうか、という結果ですね。それにしても、アセンブリで見ると数値宣言がメモリ領域をちゃんと計算してくれているのがわかりますね。まぁ、そうなってないとIntegerすらろくに使えなくなっちゃうので当然ですが。というのも、Integerは計算機が計算しやすい大きさの数値宣言があらかじめ定義されてるだけなんですね。

俺は40bitの符号無し整数が欲しいんだよ、って時は適当に作れちゃいますよ。

procedure Integer_Test_Range40 is
   type Unsigned_Intger40 is range 0 .. 2 ** 40;
   X : constant Unsigned_Intger40 := 17;
begin
   null;
end Integer_Test_Range40;
_ada_integer_test_range40:
.LFB3:
	pushq	%rbp
.LCFI0:
	movq	%rsp, %rbp
.LCFI1:
	movq	$17, -8(%rbp)
	leave
	ret

内部的には64bitになってますね。内部表現説を使うにしてもprimitiveの場合2のpowerじゃないといけないので32bitの次は必然的に64bitになるわけですね。

Comments
0
Trackbacks
0
PermaLink
http://yudai.arielworks.com/memo/2008/12/10/100451
連絡先、リンク、転載や複製などについては『サイト案内』をご覧ください。Powered by HIMMEL

I ♥ Validator