Today アクセスカウンター Yesterday アクセスカウンター

ホワット・ア・ワンダフル・ワールド

私は知識に何ものかを付け加え,また他の人々がより多くのものを付け加える手助けをした --- G.H.ハーディ

全記事一覧 << 2009/06 12345678910111213141516171819202122232425262728293031 2009/08 >>

プロフィール

  • Author:あろは (alohakun)
  • 京都で GCC やデバッガや仮想ハードウェアを開発しているサラリーマン。

    本ブログの内容は,あくまでも個人的な感想や意見であり,会社の意見を代表するものでは一切ありません.

    連絡先 : alohakun ___at___ gmail.com
    mixi : http://mixi.jp/show_friend.pl?id=182927
    twitter : http://twitter.com/alohakun













    あわせて読みたい


    この日記のはてなブックマーク数


    スカウター : ホワット・ア・ワンダフル・ワールド


    Map

FC2カウンター

ブロとも申請フォーム

この人とブロともになる

俺のバカバカバカバカバカ

2006/07/02(日) 19:33:06

本物のプログラマは使い捨てプログラムに Perl を使わない !

Ruby や Python なんてのは,平成生まれの女子供が使うもんだ.ましてや Java や ML なんてのは,オーバーキルも良いところだ.

本物のプログラマは AWK を使う.みんなもっと近代計算機科学を作り上げた三巨人 Aho,Weinberger,Kerninghan に敬意を払いたまえ !

・・・ という小ネタを,Rogue Engineer's Diary / やさぐれ日記 [Modern Compiler Implementation in ML] フローグラフを描いて遊ぶ を見ていたら思いついてしまい,今まで一度も使ったことが無い AWK プログラミングをやってみた.

本当ならば,15 分くらいでプログラムを書き上げて,冒頭の煽り文句の後にネタ文をぐだぐだと書くつもりだったのに・・・

想像以上に,(純) AWK は非力ですた (´・ω・`)

なんと,グループ化した正規表現の後方参照すら使えない.

「Perl かエディタの置換機能を使えば 3 分なのになぁ」 と 20000 回ぐらい思いながら,必死でウェブ上を検索.

ここまで来て現代的スクリプト言語を使ったら負けだ ! I hate Perl という強い意志を貫くんだ !

(さすがだぜ,プロシュート兄貴 ! グレイト・・・ フル・・・ デッ・・・ ド)

気がついたら,一日が終ってました.

あれ,時計の針が,半円くらい回ってるよ・・・ なんで ?

あれれ,僕の日曜日,どこに落っことしちゃったんでちゅかねー,おかちいでちゅねー.

やつを追う前に言っておくッ!
おれは今やつのスタンドをほんのちょっぴりだが体験した
い…いや…体験したというよりはまったく理解を超えていたのだが……

あ…ありのまま 今 起こった事を話すぜ!

「俺は朝風呂に入って,爽やか気分で PC を点け,なにげなく午後の楽しい予定を考えながら Web ブラウジングしていたと思ったらいつのまにか日曜が終っていた」

な… 何を言ってるのか わからねーと思うが おれも何をされたのかわからなかった… 頭がどうにかなりそうだった…

正規表現に嵌まったとか,AWK のサンプルコードがほとんど見つからなかったとか,そんなチャチなもんじゃあ 断じてねえ・・・

もっと恐ろしいものの片鱗を味わったぜ…


キングクリムゾン !!

この世の時間は消し飛び…… そして全ての人間 は、この時間の中で動いた足跡を覚えていないッ! ドッギャアアァァァァァァン!!!

残るのは『結果』だけだ.「GCC の構文解析後の Tree を視覚化する」 という『結果』だけが残る.


なんとか書き上げたものの,超汚いプログラムになっちゃったし・・・ 結局軟弱で近代的な gawk 使っちゃったし・・・ もう身も心もボロボロですよ.死にたい.

AWK は基本的に行指向なので,ファイル丸ごと読みこむ,みたいな処理は (できるのかもしれませんが) 面倒なんですよね.

まぁ,一つの多機能なプログラムを作るよりも,細々としたスクリプトをたくさんつなぎあわせて,一行読みこんで出力して次のフィルタに回して,みたいなツールボックス的パイプライン処理は,UNIX 的なのですが.

今回は,単純に私の力不足ですからねぇ (´д`)

テキトーに改行とか空白とかを整える前処理スクリプト pre.awk.

#! /usr/bin/gawk -f
/^[^;]/{
gsub(/^@/, "~@", $0);
gsub(/( *):( *)/, ":", $0);
print;
}

たぶん効率も最悪.

視覚化には,Graphviz を使っているので,dot 形式に変換するスクリプト treeviz.awk.驚異的に投げやりな,動けばよかろうなのだァァァァーーッ!プログラムで御目汚しすみません 。・゚・(ノД`)・゚・。

#! /usr/bin/gawk -f
BEGIN {RS = "~@"; printf "digraph G {\n node [shape = record];";}
/^[0-9]/{
s = sprintf("%s [label = \"{%s | {", $1, $1);
for(i = 2; i < NF - 1; i++)
s = s sprintf("%s | ", $i);
s = s sprintf("%s}}\"];\n", $i);
$0 = s;
while (/([a-zA-Z]+):@([0-9]+)/){
format = sprintf("<\\1>\\1 \\3\n %s:\\1 -> \\2;", $1);
$0 = gensub(/([a-zA-Z]+):@([0-9]+)(.*)$/, format, "g");
};
printf " %s\n", $0;
}
END {print "}"}

(awk は,ある意味,ヘッドパターンマッチングができるルール型言語)
使い方は,

# テストプログラム
$ cat test.c
int main() {int x = 1 - 1; return x;}

# 生の木構造をダンプ
$ gcc -fdump-tree-original-raw test.c

$ ./pre.awk test.c.t02.original | ./treeviz.awk > tree.dot

$ dot -Tpng tree.dot -o tree.png


するとまぁ,こんな感じの画像が.

gcc_tree


こんなゴミプログラムで人生を浪費してしまった・・・ いろいろおかしいところがありますが,もうやる気が萎えてしまいました.

(なんかつながってないノードとかある.たぶん [a-zA-Z]+ → [a-zA-Z][a-zA-Z0-9]* みたいに,正規表現をちょこっと変えれば OK なはず.でも,そもそも tree-dump の書式がよくわからんから放置)

紫の空を眺めながら,散歩でもしてきます.
残り少ない日曜日の破片を拾い集めながら・・・ ('・c_・` )

このまま,どこか遠く 連れてって くれないか
君は,君こそは 日曜日よりの使者

シャラララ シャララララ シャララーラ シャラララーラ

適当な 嘘を付いてー 誰一人 傷付けない

君は きーみこそはー にちよーーーーーび
よりのーーーーししゃーーーー (↑THE HIGH-LOWS↓)

もう,コンピュータなんて大っ嫌い !!(´Д⊂ヽ
小ネタTB:0CM:6 このエントリーを含むはてなブックマーク | livedoorクリップ livedoorクリップ BuzzurlにブックマークBuzzurlにブックマーク newsing it!
コメント
awkといえば
最近の gwk は XML も処理できるらしいですよ。昨年の LLDN で仕入れた情報で試してませんが。
私も過去には、ごく簡単な処理なら awk で書くこともありましたが、今は Ruby でいーじゃんという気がしました。
向井 #-|2006/07/02(日) 23:31 [ 編集 ]

私も過去には,ごく簡単なデータなら XML で書くこともありましたが,今は S 式でいーじゃんという気がします.

というのは冗談として (すみません)

なるほど・・・ まさか awk がとりあげられていたとは.

http://barshideout.seesaa.net/article/6442274.html

しかも, PostgreSQL なども読みこめるみたいですね.

興味深い情報をありがとうございます.LL 方面には疎いもので (^-^;

awk は,良くも悪くも行指向でパターンマッチ&アクションという点が特徴ですよね.狭い範囲の小粋なツールという気がします.

それを XML とかまで無理に拡げたとしても・・・ という感じも (良く知りませんが)

やっぱり時代は Ruby なんですかね w

Subject: [ruby-list:31499] はじめましてAWK からRuby
http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-list/31499

しかし,時代の流れに逆らって,簡単なことを難しく,難しいことを簡単に解決するのを好んでしまう性分なもので (苦笑)

C++ や Perl のように,高機能になってしまうと,自分一人では把握し切れないので・・・ なんというか,グンニャリしてしまいます (へそ曲がり).

そこをあえて,あれが無いこれが無いと不満をたれつつ,いろいろ試行錯誤しながら awk とか C でがんばるというところに,男の美学と言うか,なんというか (いろいろ間違ってる).

それに,Perl とか Ruby とかは,声の大きい方々が沢山いますから w

私はひっそりと awk マスターへの道を突き進んで行きたいと思います (違

あと,これは余談ですが,awk が XML に行ったような進化の方向性 (UNIX 的テキストベース処理の延長線上の XML) に関連して, Lisp-S 式に対して,マッチ&アクションをするような言語 (つまり ET ) の進化の方向性や応用に関しても,何かヒントがありそうな気がしました.

XMLデータベース開発方法論
http://www.csus4.net/d/2005/06/27/xml-db-method/
あろは #wNX6xxGw|2006/07/03(月) 00:17 [ 編集 ]
gawkをつかっちゃったのなら
gensubを使っていればちょっとは楽にできたと思われ(後方参照できますよん)。
7号 #grGQ8zlQ|2006/07/03(月) 00:45 [ 編集 ]
> 7 号さん
あれ ? 思いっきりつかってますけど (^-^;

(いや・・・ 酷く読みにくいソースですみません・・・ ついついこういう言語を使うと,悪ノリしてしまいます w)

そのための gawk です (キラーン)

というか,gensub 以外は,純 awk に準拠しているつもりなので,思いっきり正規表現が醜くなってます・・・ [a-zA-Z] とか.alnum 使わせてくれー って感じです.

なんせ
http://www.kt.rim.or.jp/~kbk/regex/regex.html#AWK
# .
# *
# +
# ?
# ^
# $
# (regexp)
# [char-list]

これだけですからね w 実にシンプル.

Perl regex (OR emacs regex) に慣れてしまった現代っ子にはつらいですよ w

あんまり GNU 独自拡張は使いたくないのですが,こればっかりは・・・

(そこまで無理して awk らなくてもというツッコミは無しの方向で w まぁ,どうせみんな,make だって,gmake しか使ってないでしょ ?)

http://www.kt.rim.or.jp/~kbk/regex/regex.html#GAWK30
あろは #wNX6xxGw|2006/07/03(月) 11:11 [ 編集 ]
凄いっす
凄いので、まねをさせていただきました。

http://gauc.no-ip.org/wiki.cgi/private?page=Blog%2F2006%2D7%2D4

に書きました。
一応、三賢者の偉業をたたえて、1 つのスクリプトで処理して、古めの awk (One True AWK) でも動作するようにしました。
Rocco #cE2ROyUI|2006/07/04(火) 23:48 [ 編集 ]
> Rocco さん
おお… (感動)

反応していただいて,ありがとうございます ! いろいろ勉強になりました m(_ _)m

私がダラダラとくだらないネタを,稚拙なプログラムを晒してまで書いているのは,エライ人を釣り上げるためなので (笑) まさしく狙い通りでした w

これで,gawk と gensub が無い環境でも安心ですね (gcc があって gawk が無いって,どんな環境 w)
あろは #wNX6xxGw|2006/07/05(水) 12:32 [ 編集 ]
コメントの投稿

管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://alohakun.blog7.fc2.com/tb.php/355-ed711393

最近のコメント

リンク

このブログをリンクに追加する

最近のトラックバック

人生の残り日数

日本人男性の平均寿命は 28700日.

RSSフィード

カテゴリー

Copyright(C) 2006 ホワット・ア・ワンダフル・ワールド All Rights Reserved.
Powered by FC2ブログ. FC2ブログ 一戸建て template designed by 遥かなるわらしべ長者への挑戦.