ActivePerl の perlcc は Win32 的にまだまだ使い物にならん2006年11月22日 12時21分27秒

ちょっと前まで、ActivePerlperlcc -c して生成した C コードはコンパイルすら通らなかった (エラー出してたのは Perl/lib/CORE/win32.h だけど) のに比べれば、最新版の 5.8.8.819 はコンパイルが通るだけマシにはなっているが、それでもまだまだ以下の問題が存在する模様。。。

  • perlcc を -c オプションをつけずに実行すると、MS-VC++ コンパイラコマンドである cl.exe を使ってコンパイルを実行しようとするが、Visual C++ 2005 Express Edition 日本語版を使用する場合、Win32 SDK のライブラリの場所がコンパイラオプションに渡されておらず、perlcc コマンドに -L オプションを指定してもうまく認識されない。(軽微な問題: -c オプションを用いて C ソースを生成する手順で回避可能)
  • perlcc -c では Makefile が生成されない為、ビルドの構成を自分で書かなければならない。(軽微な問題: 一度書けばそのまま使いまわせるので作業の自動化に支障はない)
  • BCC32 では Perl/lib/CORE/win32.h のコンパイルが (相変わらず) 通らない。(深刻な問題: C ソースは MS-VC++ のみに対して調整されているか、またはそもそもちゃんと整理されていない)
  • Perl の for 構文で、配列値がレキシカル変数に引き渡されない。例えば、以下のプログラムを Perl で実行すると、
    $var = 0;
    for my $d (1..10) { $var += $d }
    print "var: $var\n";
    
    以下のように出力されるが、
    var: 55
    
    これを perlcc -c で C ソース化し、VC++ にてビルドした実行形式ファイルを実行すると、以下のように出力される。
    var: 0
    
    for 構文の変数をグローバル変数にすればこの問題は回避されるが、
    $var = 0;
    for $d (1..10) { $var += $d }   # $d の my 宣言をやめる
    print "var: $var\n";
    
    こんな仕様は Perl5 的にお話にならない。ちなみに、
    $var = 0;
    @arr = 1..10;
    for my $d (@arr) { $var += $d }     # ループを配列変数で回す
    print "var: $var\n";
    
    とすると、アプリケーションエラーで落ちるプログラムを生成することができる。(重大な問題: だめだこりゃ)

こいつがちゃんと動くようになってくれれば、生成された実行形式に perl58.dll を添付すれば Perl を入れていない Windows マシンでも動かせるプログラムを配布できるようになり、実用上 VB 程度には魅力的になるのでゆるーく期待しているんだが、こんな初歩的な部分でバグを出しているようでは道のりは遠そうだ。なんだかなぁ。。。

コメント

コメントをどうぞ

※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。

※投稿には管理者が設定した質問に答える必要があります。

名前:
メールアドレス:
URL:
次の質問に答えてください:
おいらがやっている会社の名前をひらがな4文字で。

コメント:

トラックバック

このエントリのトラックバックURL: http://harapeko.asablo.jp/blog/2006/11/22/964430/tb

※なお、送られたトラックバックはブログの管理者が確認するまで公開されません。