Note

サイト
最近のコメント
 | 

2009-01-20 明日は雨です忘れるな

[] 勝手に補足

最近Adaの解説を書いている人が多い気が。驚くべきことにサンプル数2でも有意な(ry

インドリさん

yamicha.comさん

これ自体は非常に喜ばしいことなのですが、明らかに試しながら書かれているにも関わらず解説口調のため、一度突っ込みたくなると止まらず……というわけで勝手に補足させていただきます。

もう心の中では精一杯応援してます本当ですあとサインください。

インドリさん編。

http://indori.blog32.fc2.com/blog-entry-515.html

なお、文字コードはShift-JISにしてね!絶対ピヨ。

……ええと……いえ、なんでもございません。

cd /d C:\hello.ada

……ええと……いえ、なんでもございません。

http://indori.blog32.fc2.com/blog-entry-556.html

それに、昔のプログラム言語オーバーロードがなかったら型ごとに関数を用意するのは当たり前だったんだ。昨今のプログラミング言語が型を意識せずに関数を使えるのはオーバーロードのお陰ピヨ。

Adaは最初からオーバーロードありました……。

http://indori.blog32.fc2.com/blog-entry-565.html

間違ってもgnatcleanは使用したら駄目ピヨォッ!!

気分的には激しく同意したいのですが、普段自分がボロカスに言っているのを棚に上げて余りにもAdaCoreが可哀想に思えて……。

とりあえず-fとか渡さない限り大丈夫ですよ……gnatcleanはむしろ.exeまで消すので融通が利かず(特定ファイルを残すオプションも無さげ)、また長いコマンドですのでタイプ数も含めて最初からdelとかrm使ったほうが遥かにマシという存在感の無さが哀れなコマンドです。

ああ、環境変数ADA_INCLUDE_PATHでgccのadaincludeディレクトリを指す使い方であればやめた方がいいです……じゃあどうすればいいかというとこれがgccを再ビルドする羽目に……configureで静的にディレクトリ決めうつ作りは心底罪と思います。とりあえずMinGWのやつならC:\mingwに置けばOKです。最悪--RTSで。

http://indori.blog32.fc2.com/blog-entry-588.html

どうやらNum < 0の結果とNumの等価性を判定しようとしているらしい。それで、BooleanとIntegerの型が違うからエラーが発生するというわけ。

まるで比較対象がBoolean型であればOKのような記述ですが、そもそもwhenのとこには定数しか書けませんです。

yamicha.comさん編

http://void.yamicha.com/blog/?mode=view&number=673

Adaのオブジェクト指向システムは後付けであるため、95の時点では少々不自然な書き方をしなければなりませんでしたが、05ではより自然に書けるようになっています。今から習得するならAda 05でしょう。ところが、MinGW付属のツールではAda 95のコンパイラしか手に入りません。したがって、何とか自力でAda 05を入手する必要があります。

この記事が書かれたのって2008年10月ですよね……。

MinGWのでもlibre2.adacore.comのでもAda2005は通りますですよ。

Adaの関数を理解する上で最初に押さえておくべきは、Adaの引数は参照渡しであるという点です。

石川先生、どうぞ。

http://void.yamicha.com/blog/?mode=view&number=675

type TShort is new Integer range -32768 .. 32767;

↑はIntegerの継承。完全に新しい型を作るのは↓です。

type TShort is range -32768 .. 32767;

実装依存の気もしますが継承だと16bitの範囲を指定しても実際にはIntegerと同じ領域が取られる気がしますような気がします違ってたらスミマセン。

http://void.yamicha.com/blog/?mode=view&number=677

サブプログラムがプリミティブになる条件の説明が必要なような……同じpackage内で宣言された、その型(とクラスワイド型)を引数・返値に使うサブプログラムは型のプリミティブとなって継承の時にくっついてきたりドット記法に使えたりまあいろいろです。(←自分で解説する気は無い)

メソッドの1つ目の引数にレコードを取り、2つ目以降の引数に必要な引数を記述します。

1つ目には限定されてないです。2つ目でも3つ目でも返値でもいいです。

http://void.yamicha.com/blog/?mode=view&number=678

Ada 83は当時としては非常に先進的な言語で、最近の多くの言語の機能を先取りしています。Ada 95でオブジェクト指向関連の機能が導入されたとはいえ、Adaの原型は83の時点で完成されていたといえるでしょう。(少なくとも当初は)Cとほぼ完全な互換性を有してはいるものの、ほとんど別物になってしまったC++とは違い、Ada 95はあくまで83の拡張の範囲内に位置しています。

まあ確かにAda95のRationalにはこんな風に書いてます。

こうして完成したAda 95は、実質的には、既存のAda 83アプリケーション上位互換性があります。上位互換性に欠けるのは、病的なまでに特殊な機能の組合せを使ったときで、ほとんど実際に出会うことはないでしょう。もし真の意味で上位互換性に完全を期待すれば、ある種のエラーはそのまま言語に残存するでしょう。不特定多数の要求を満たすこともできないでしょう。第4章でくわしく説明されているとおり、言語を改訂するときには完全な上位互換性を確保することはできないのです。Ada 95を設計するにあたって、既存のAdaプログラムを移行するためにかかるコストを最小限におさえることに細心の注意をはらいました。

http://web.archive.org/web/20020606231107/www.tsujiken.ee.kogakuin.ac.jp/jada95_01.html

しかしAda2005のRationalにはこんな文章が!

対照的にAda95からAda2005への変更は控え目です. Ada95はAda83と互換性がありますがほぼ新言語です. しかしながら, 新言語は常に驚き無慈悲にもとても注意されたデザインが常に熱心に使われるようになるとは限りません.

……

さらなる重要な声明は"技術的に優れた結果を生むために, 利用者への影響が許容できると判断されるとき後方互換性で妥協するのが許可されている"ということです. 言い換えれば互換性について神経質にならないでください.

http://panathenaia.halfmoon.jp/alang/Ada05_rational_00.html ←私が訳しかけて投げ出したやつ

実際with Text_IO;→with Ada.Text_IO;って#include <stdio.h>→#include <cstdio>に匹敵しますよねしませんかそうですか。

−− 実体型

var : Integer;

var : String(1..10);

−− 実体のない型

var : String; -- エラー

実体型ってどこから出た言葉だろう……。単にdiscriminantを持っている(具体的なdiscriminantの値なしには変数宣言できない)型ってだけの話なのに。

yamicha.comさん全体的に専門用語が変です。

type Some is new array(<>) of Integer

こんなとこにつっこむのは野暮すぎると思いつつこれがコンパイル通る文脈って無いですよね。

http://void.yamicha.com/blog/?mode=view&number=681

匿名access constantもありますぜ。

あとまあaccess型についてはスコープとの関係は避けて通れないと思います。内側のaccess型は外に持ち出せないとか、'Unchecked_Accessとか。

AdaのGCの実装は、完全に実装者に一任されています。すなわち、GCのタイミング処理系によって全く異なるのです。これはJavaサードパーティ実装でも同じなのですが、JavaにはまだSystem.gcの逃げ道があるのに比べ、Adaには全く逃げ道がありません。しかも、GNATのGC実装はといえば、プログラムの実行中には全くGCを走らせず、終了時になって全メモリ解放するという極めておざなりなものなのです。

ローカルスコープで宣言した非匿名access型であれば、スコープを抜ける時にその型でnewしたメモリは一掃されることになっています。GNATには未実装ですが……。

GNATでも、Storage_Poolをローカルスコープ内で宣言して、for T'Storage_Pool use...で明示的に結び付けてやれば、同等の効果を得ることができます。

http://void.yamicha.com/blog/?mode=view&number=688

(Ada 83にはこの抜け道すら存在したのか不明です)。

function "+" (...) renames Package_Name."+";でOK。

基底で定義された演算子は必ず継承しなければならないようです。

演算子に限らずその型を返値とするプリミティブな関数は必ずoverrideする必要があります。

http://void.yamicha.com/blog/?mode=view&number=689

Adaにインタフェースが導入されたのは95の時点でしたが

2005から!

synchronized interfaceはlimited interfaceを内包し、task及びprotected interfaceはsynchronized interfaceを内包するようです。

逆では?AがBを内包するってのが抱え込むとかの意味ならA⊇Bですよね。

ふつー内包って[x | x <- [1..5], x > 3]とかを指すみたいです。部分集合とかそういう言葉の方が良いかと。

ところで、ここで気になるのがlimited interfaceとsynchronized interfaceの差異です。

synchronized interfaceはスレッド用の属性とか持ってたりするのでは。

GNATではsynchronized interfaceもtask interfaceもprotected interfaceも平気で普通のレコードにインプリメントできてしまうのですが

そうなのかー。まあGNATだし(ry

これはおそらく、JavaやC#のジェネリッククラスが「カスタマイズを可能にしたクラス」であるのに対し、C++やAdaでは型を与えるたびに実体を作成するようになっているためでしょう。一方、C++にはジェネリックの実体を作成するたびにサイズが増大するデメリットがありますが、Adaにはありません。強力なジェネリックがウリのAdaらしい仕様といえるでしょう。

ふつーに実行ファイルサイズ増大します……。

RMではコード共有タイプの実装も認められてますが、恐らくそんなコンパイラは存在しないというかrepresentationのことを考えたらできないような……。

http://void.yamicha.com/blog/?mode=view&number=690

arr'First..arr'Last

余計な突っ込みですがarr'RangeでOKです。

Javaのtry-catch-finallyと同等

finallyはないです……。

C++の後釜を狙っているらしい某言語に至っては、switchにおいてdefaultを書き忘れても堂々とコンパイルが通り、しかもswitchのcaseに該当する値がなければその場でプログラムが落ちるという最悪の実装となっています。

D……ですよね。Dは……部分範囲型が無いため仕方が無い面もあると思います。部分範囲型無しで全列挙を強制すると悲惨なことに。

それよりDelphiをどうにか(ry

フォールスルーの機能はなさそうですが、そこは仕方ありません。

関数内関数でOK。

tree : Tree_Data := Tree_Data'(10 , 20);

余談ですが型が特定できれば型名要らないです。

tree : Tree_Data := (10, 20);

http://void.yamicha.com/blog/?mode=view&number=704 (2009-03-18追記)

OCamlデータは基本的に値渡しなのですが、そのような言語にこの種の機能が搭載されているのは非常に助かります。同じく関数型であるHaskellにはバリアントがあり、JavaやC#のクラスは参照渡しが標準で、C++はvoid*など反則的なポインタの扱い方ができるとして、Adaは値渡しの上にこのようなスタイルは用いられません。したがって、例えば連想配列などからデータを取り出したいとして、Javaその他ではデータが存在しなければnullを返せるところを、Adaでは例外を投げるしか方法がありません。関数型、特に純粋プログラミングが強制または推奨されている言語では、データが値渡しにされる場合が多いため、これは非常にありがたい機能です。

…(中略)…

モナドを使える方にとっては、実に基本的なコードでしょう。ひとたびNothingとなれば、残り全部がNothingです。OCamlは非純粋関数型言語ですし、例外の機能も備えているため、モナドのような奇策を用いなくても何とかなるのですが、そのような使い方はあまり行わないにしても、少なくともAdaのような苦労をする必要がないのは助かります。

void *(でNULLを返すこと)が有りなのになんでaccess型(でnullを返すこと)は無しなんですかー!!

あとPascal、Adaにはバリアントレコードという機能がありまして(ry

Adaの解説記事について私見

解説記事は正直Ada95と2005のRationalが凄い魔力を持っていますのであれ以上を書くのは無理な気ががが。

C99のRationalも読みましたが普通で面白みはあまりありませんでした。それが普通ですよね。Issuesでの議論の熱さも合わせて、Ada標準化委員会は異常。(誉め言葉)

yamicha.comyamicha.com 2009/03/19 20:44 トラックバックありがとうございます。
現在、かなり赤面しております。発作的にAdaの記事を全部消したくなりましたが、とりあえず言い逃れを。
まず口調ですが、あれは私の癖と言いましょうか、ブログのスタンスが「解説」よりも「記録」に近いので、「でしょうか」「だとみられます」を繰り返すと文章が壊滅してしまい、かといって「である」は開発以外の記事にそぐわない場合があるので、便宜上ああ書いているだけなのです。誤解を招くようでしたら、注意書きを入れなくてはなりますまい。
実はaccessはもっと色々書こうとしていましたが、ブログ自体が半分覚え書きであるため、忘れないうちに他のことも書こうとしたところ、色々書けなくなったという事情があり、また色々な問題からあれ以上の詳細は割愛せざるを得なかったのです。どう書いても文章が分かりづらいので、1段落書いて丸々つぶし、の繰り返しでした。一応記事にしていない分のサンプルコードは残っていますので、後で書こうとも考えているのですが・・・(あの後、これもブログの記事にしようかと、年末辺りに「フォームの送信データ・multipart/form-dataのパースプログラム」なる珍妙なものも書き終えていたのですが、Adaの極端な堅牢さによりソースがあまりに遠回り状態になり、Ada自体の続編記事がお流れになった経緯もあります)。
用語に関しては、申し開きもできません。私の知性の問題もありますが、構成上「掛け算を教える前にルートを教える」状況にならないよう、頭を抱えてひねり出した奇(愚)策の結果なのです。おそらく「すでに習得された方には珍妙に見えるだろう」と考えながら打っていましたが、やはりそう見えましたか。本当に申し訳ない限りです。他の言語についてもそのようなことがたびたびありますが、Adaはガチガチ過ぎるので、このパターンが多くなってしまいました。
ちなみにAdaの記事、書こう書こうと考えていながら後回しになってしまい、それでバージョンに差が出たりしていたのですが、ブログに書くからには責任を持たなくてはなりませんね。こちらの管理者様及び読者の方々には申し訳ない気持ちでいっぱいです。
その点、この記事は私の恥ずべき解説を読んだ方への補足ともなるはずですので、Ada使いを増やす上でも大変重要かと存じます。開発関連の記事は(口調は解説のようでも)半ば覚え書きのつもりで、ローカル上ではクラッシュが不安、かといってサーバーを物置にすると業者に怒られそうだからと記事にしていたのですが、本当に閲覧されている方がいるとなると、私の頭で今後まともなものが書けるかどうか、不安なところではあります。
トラックバックをいただいた上、数々のご指摘感謝いたします。その上Adaなどという右にも左にも使い手がいない言語の同志が見つかり、3度うれしい次第です。

ytqwertyytqwerty 2009/03/24 08:12 わざわざ丁寧なコメントをありがとうございます。
解説よりも覚書に近い旨、了解いたしました。早合点を申し訳ありません。
私のほうも、Adaは完全に趣味ではありますが、それでも自分が気に入っている言語の使い手を見つけると嬉しいもので、またあまり黙ってられない性分なものですから、ついついしゃしゃり出てしまいます。
こうして補足したり話ができたりするのもWebの利点ですので、どうか、「むやみにお遊びを書けないのも苦痛〜」とおっしゃらず、気にせずに続けていただければと思います。
(それに、習得中の覚書というものは案外と助けになります。私もHaskellをやったときhttp://hp.vector.co.jp/authors/VA028375/haskell/log.htmlは偉そうな勘違いを書いては後からdelタグを入れまくってましたが、それが思わずhttp://d.hatena.ne.jp/w_o/20040823#c1093285767のような評をいただいたりもしました)

 | 
カレンダー
2004 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 |
Connection: close