そしてついにFreeBSD4クロスコンパイラ

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=14626

------- Additional Comment #7 From Andrew Pinski 2004-03-18 19:23 [reply] -------
You cannot use "make gnatlib_and_tools" on a cross compiler, use "make cross-gnattools" and "make
gnatlib" to build a cross Ada compiler.

おーい、そんなことはどこにも書いてなかったぞー。
で、最終的な手順です。

$ cd /usr/src/
$ tar jxf /cygdrive/.../gcc-3.4.2.tar.bz2
$ cd ../gcc-3.4.2/
$ ./configure --enable-languages=c,ada --prefix=/usr/ --target=i386-pc-freebsd4 --host=i686-pc-cygwin
$ make all
$ cd gcc
$ make gnatlib
$ make cross-gnattools
$ cd ..
$ make install

で、クロス版gnatmakeとかは"gcc"というコマンドがクロス版gccということを前提に動いているみたいですので、そのままではうまくいきません。まあコマンド名をオーバーライドする方法なんていくらでもあるんでしょうが…。

with Ada.Text_IO;
procedure Test is
  use Ada.Text_IO;
begin
  Put("content-type: text/html"); New_Line;
  New_Line;
  Put("<html>Hell World</html>"); New_Line;
end;

を、gnatlink -vとかやってどんなコマンドを実行すればいいのかを教えてもらってgcci386-pc-freebsd4-gccに置き換えて

i386-pc-freebsd4-gcc -c test.adb
i386-pc-freebsd4-gnatbind -x test.ali
i386-pc-freebsd4-gcc -c -gnatA -gnatWb -gnatiw -gnatws b~test.adb
i386-pc-freebsd4-gcc b~test.o ./test.o -o test.exe -L./ -L/usr/lib/gcc/i386-pc-freebsd4/3.4.2/adalib/ /usr/lib/gcc/i386-pc-freebsd4/3.4.2/adalib/libgnat.a

できたtest.exeをtest.cgiにリネームしてアップロードして実行可能属性を付けて
http://f22.aaa.livedoor.jp/~qwerty/private/gcc/test.cgi
うごいたー!!

AdaによるCGIの優位性

http://www.wikiroom.com/sakurai/?D%B8%C0%B8%EC%A4%CB%A4%E8%A4%EBCGI%A4%CE%CD%A5%B0%CC%C0%AD

今回も相当参考にさせていただきましたid:h_sakuraiさんのWikiから盗作で。ごめんなさいごめんなさいごめんなさい。

ヒアドキュメントな文字列定義が…できない

できません、面倒です(キッパリ)

ネィティブ言語なので起動が高速。perlの10倍は速いだろう(ベンチマークが必要)

gdcとバックエンドは同じgccですので当然同じことが言えます。

正規表現がGNAT.Regexpとして一応用意されてはいるが、簡単に文字列操作とはいかない。

GNAT.Regexpもマッチを判定するだけの機能しか持ってないし…。

高機能な文字列処理関数群がありません。

まず無制約配列とUnbounded_Stringの使い分けが手間ですからねー。ライブラリの文字列関数も貧弱ですしねー。素のCよりはマシという程度です。95年の規格というのを考えたら仕方ないのかもしれませんが。一部変わったライブラリも見かけますが、使い方がわかりません(__

JVM向けのコンパイラがありながらJavaには似ても似つかずスクリプト言語のような感覚はかけらもありません。

複雑で単機能なライブラリはスクリプト言語で書くような感覚でCGIを書くことが不可能です。そのため、Cに近い感覚でがりがり書いていくしかありません。本来のAdaの用途から書き捨てよりは大きなアプリケーションに向いてると思われます。コンパイル速度が遅いのもスクリプト言語から遠くイライラする要因でしょう。
えーと、その、言語が厳しいので、コンパイル通ればまず実行時に落ちたりはしないというのがありまして、サーバーではデバッグが困難ですのでその点は安心感があるかも。

ハッシュを言語仕様にもっていません。

…もっていません。

コンパイルが低速。

C++といい勝負かもです。DやDelphiなんかとは比較にもなりません。

文字列操作メソッドを…メソッドって何?

実行時バインディング(仮想関数呼び出し)であってもドット記法は使いませんので全て通常の関数呼出しの形で統一した記法ができます。つまりどういうことかというとA.B().C()…みたいに連鎖が気軽に書けません。

個人レベルで作成したCGIを困難にクロスコンパイルして無料サイトで利用できる。

私はクロスコンパイラをバイナリ配布するつもりはないので…。た、たぶん上記手順でやれば問題ないですよ、ええ。
現在確認しているサーバは(aaacafe freebsd)です。

終了時のみガーベジコレクションによる、メモリ管理。

GNATのガーベジコレクションは終了時にしか動きませんが、対話型アプリやメモリを大量使用するものならともかくCGIにはそれで充分です。

ソケットライブラリがGNAT.Socketとして用意されています。

私は使ったことはありませんが。

高速チャット、ゲームCGI、大型掲示板どころかCGI全般に向いていない。

こんな言語がCGIに向いててたまるかこのやろー(--;

サーブレット的なアプリケーションフレームワークが研究されている…かもしれない。

いや、その、私は知りませんが、歴史のある言語で利用者もDより多そうだからあの、あるかも、ないかも。

古い言語だが多分日本ではフロンティアである。

既にコンパイラは安定どころかその辺の商用コンパイラを凌いでいると思われます。エラーメッセージもやたら親切ですし。日本で使う人がいないというだけでしょう。とりあえず、Adaで書かれたCGIは皆無にちかいので、作ればAda言語界で有名になれるかもしれないが、日本にはAda言語界そのものが存在しないかもしれない…。

問題点

書く気にもならないぐらい山積み。
では何故Dを使わなかったのかといいますと、各所で有名なdelegateバグを私は確実に踏みそうなのと、Windows2000+AN HTTPDdmdCGIとの組み合わせでPOST発行時に確実に落ちてくれましたので多分dmdのメモリ管理には相性問題を起こすような潜在的バグがあるのかも…AN HTTPDのほうかも知れませんが無気味でしたので避けとくに越したことはないかなー…(へたれ)

aaacafeで動作!

ようやくここまで到達!
binmodeを取り除いたりWin32依存部分*1を全部コメントアウトしたり程度の修正で動きました!

http://f22.aaa.livedoor.jp/~qwerty/private/vampire/vampire.cgi

自作自演村は私がデバッグで自作自演していた村、果てしなきデバッグ村はリアル知人を巻き込んでデバッグしていた村です。さりえるさんありがとうございました&これからもお願いします(^^;
ルールを弄りながらやってましたのでこれら既存の村は一貫性が無い部分が多々あります。
テスト村@トリプルエースは、動かないのも寂しいのでとりあえず作っておきました。興味があるかたはご自由にどうぞ。…転送量過多などで私がaaacafeから追い出されてしまわない程度にって心配はするだけ馬鹿らしい気もしますね。さて身内用にもうひとつ用意するか…。
ソースはMr.Fに指摘された「自覚」ルールに決着がついたら出すようにします。
もしルールに関する意見などありましたら一行掲示板のほうへいただけたら嬉しいです。(ログオンしないと書けませんが)

*1:"__cdecl"を通してくれないのはWin32依存部分と言うのだろうか