2010年8月26日木曜日

AWKプログラムを速く動かす方法 - AWK

AWKプログラムを動かす
お気に入りのAWKプログラムを毎日実行していて、「もう少し速く動かしたいなあ」と思った事はありませんか。
その時には、次のような方法を使う事が出来そうです。


**** 手順
** 書き方を工夫する方法
o AWKにとって無駄な処理が少なくなるように書くと、概ね速くなります。
o 処理系によっては、得意な処理や不得意な処理があります。ですので、特定の処理系に特化して高速化する事も出来ます。
   + 例えば、文字列の連結について、Gawk on Windows 3.1.7では sprintfよりも値を並べる方が速かったです
   + 特定の処理系に特化する方法は、将来のバージョンでも有効とは限りません。

** 時間のかかる部分だけ、他のプログラムを呼び出す方法
o 遅い部分を、その処理が得意なプログラムや言語に任せてしまう方法です。
o 大きく分けて、2種類の方法があります。
o バッチファイル(Windows)やスクリプトから、AWKと他のプログラムを別々に呼び出す方法
   + お手軽なのは、AWKの実行結果をファイルに保存してから、別プログラムにファイルを渡す方法です。
      + 途中でファイルが出来ますので、一部分だけ実行する事も簡単に出来ます。
   + AWKで、他のプログラムを呼び出すバッチファイルを作る事も出来ます。
   + パイプを使って、AWKの処理結果を他のプログラムに渡す事も出来ます。
o AWKの内部から、他のプログラムを実行する方法
   + getline関数を使う方法と、system関数を使う方法があります。

** 速いAWK処理系を使う
o おそらく、mawk系が最速です。日本語を扱う場合は、mawk32が有名です。
   + mawk32の入手方法は「Windows版gawk, mawkを入手する方法
o Gawkから移行する場合、3点に注意します。
   + 文字列操作関数は、1バイトを1文字として数えます。日本語を使う場合は要注意です。
   + 数値計算関数に「有効範囲の限界に近い値」や「想定外の値」を渡すと、強制終了する事があります。
        + 詳しくは「数値計算関数使用時の注意点まとめ
   + Gawkの便利機能や各種文字コード対応機能は、使えなくなります。

** AWKから他言語に、ソースコードを移植する
o 自分で書き換える他、変換補助ツールも出ていました。
o AWK to Perl (a2p) / C (awkaなど) / C++ (An AWK to C++ Translator) を見かけました。
o 詳しくは、「AWKプログラムを他の言語に変換する方法。AWK to Perl, C, C++


**** メモ
o 高速化する事で、処理が分かり難くなる事があります。そのような時は、高速化する利点と欠点を考えて、良くなる方法を検討します。


==
関連ページ:
    ▼AWKプログラムを動かす
    ▼AWKプログラムを書く
    ▼AWK
    ▼制作メモ
    > ▼AWKプログラムを書く
(2010年9月11日追加。参考リンク2点)

AWKプログラムを他の言語に変換する方法。AWK to Perl, C, C++ - AWK

AWKを入手する
「AWKプログラムを、もう少し速くしたいなあ」と思った時、プログラムを他言語に変換してしまう荒業もあります。
to_dkでは試していませんが、AWKについてWeb検索した時に見かけた、他言語への変換ツールや、変換補助ツールについて纏めました。

o 他にもあるかもしれません。見かけた時に追加します。
o 興味のある方はWeb検索。


**** AWKプログラムを他言語に変換するツール
o 配布ページは、全て英語ページでした。
o でも、Web検索すると、日本語で説明しているページが見つかると思います。

** AWK to Perl
o a2p
   + Perlの一部として配布されています。
   + CGIが利用可能なレンタルサーバーには、既に入っているかもしれません。

** AWK to C++
o An AWK to C++ Translator (POSTSCRIPT)
   + (2011年7月現在、リンクが切れているみたいです。)
   + ▽Brian Kernighanのホームページからのダウンロードは、リンクが切れているみたいです。
   + Brian Kernighanさんは、AWKの開発者の1人です。
   + 目的のリンクは、ページの下の方にあります。An AWK to C++ Translator (POSTSCRIPT)

** AWK to C
o ▽Awka for Windows
   + Windows版Awkaの実行ファイルを入手出来ます。
o ▽Awka
   + Awka本家です。ソースコードの提供ですので、自分でビルドして使います。
o その他、活動停止中で、FTPや他の方の改造版を入手する事が出来るものもありました。
   + awkcc -- 現在は、保守されていないみたいです。
   + awk2c -- 現在は、保守されていないみたいです。

o 情報源は ▽comp.lang.awk FAQです。(英語です)
   + ツール使用時の注意事項も、ちらっと書いてありました。
   + 短い文章ですので、英語が苦手な方も、何となく分かると思います。


**** メモ
o 各ツールが変換する時、特定のAWK処理系を想定しているみたいです。
   + ツール想定外の処理系用に作ったAWKプログラムを変換する場合、変換前後に手作業が入る事になると予想します。
o C言語や C++ が使える方は、ソースコードを自分で変換した方が速くなりそうな雰囲気です。
   + 変換ツールは、型を置き換える部分の変換が弱いみたいです。


==
関連ページ:
    ▼AWKを入手する
    ▼AWK
    ▼制作メモ
    > Windows版AWKの配布元一覧(awk, mawk, Gawk)
    AWK本家のホームページの場所
    ▼AWKプログラムを動かす
(2011年7月27日追加。Awka for Windows)