« URL と Base64 | メイン | C-0.02 »
2006年01月06日
C - a pseudo-interpreter of the C programming language
Perl や Ruby では、ワンライナーで処理が書けて便利です。でも、なぜか C では書くことができません。仕事上の都合で、小さな処理を C 言語で書く必要があったので、ワンライナーも書くことのできる C 言語のインタプリタ(?)を作ってみました。
ダウンロードして、 /usr/bin にでもコピーすれば、インストール完了です。
2005/01/10 追記: 最新情報は Cインタプリタ アーカイブをご覧ください
使い方は、こんな感じです。
% C -e 'printf("hello world\n");
hello world
% C --help
C - a pseudo interpreter of the C programming language (version 0.01)http://labs.cybozu.co.jp/blog/kazuhoatwork/
Usage: /home/kazuho/bin/C [options] [source_file] [argv]
Example: C -cO2 -e 'printf("hello world\n")'
Options: -c
pass an option to gcc
-iadd an include file
-e expression executes the expression
-h, --help displays this help message
C 言語でワンライナーを書けると、いろんなハッピーがあります。
利点1 - C の関数が利用できる
システムコール等のテストをする際に便利です。
利点2 - Perl の最大100倍速い
スクリプト言語とは、比べ物にならない速度が出ます。たとえば、 fib(40) の計算では、 Perl の約 100 倍の性能を発揮します。
もちろん、すべてのケースで速くなるわけではありませんが。 (むしろ、コンパイル時間のぶん、遅くなるケースも...)
% time perl -e 'sub fib { my $i = $_[0]; $i > 2 ? fib($i-1) + fib($i-2) : 1; } print fib($ARGV[0])."\n";' 40
102334155real 2m41.390s
user 2m34.577s
sys 0m0.077s% time C -cO3 -e 'int fib(int i) { return i > 2 ? fib(i-1) + fib(i-2) : 1; } pr
intf("%d\n", fib(atoi(argv[1])))' 40
102334155real 0m1.843s
user 0m1.618s
sys 0m0.244s%
利点3 - バイナリデータの処理が簡単
多くのスクリプト言語は文字列処理を念頭に開発されているため、バイナリデータの取り扱いが苦手です。でも、 C を使えば、バイナリデータの処理を簡単に書くことができます。
% C -e 'int t, sum = 0; while (fread(&t, sizeof(int), 1, stdin) == 1) sum += t; printf("%d", sum)' < data
利点4 - アーキテクチャに依存しない C プログラムが配布できる
shebang を使うことで、CPU や OS に依存しない C プログラムを書き、配布することができます。たとえば、下の hello.C は、 C が動作する環境なら、どこでも実行することができます。
#! /usr/bin/Cprintf("hello world\n");
自分でも、ネタなのかマジなのか良くわからなくなってきましたが、これで私もバイナリアン 2.0になれるような気がします。
# C が、実は Perl で書かれていることは、秘密です...
投稿者 kazuho : 2006年01月06日 15:20
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/324
このリストは、次のエントリーを参照しています: C - a pseudo-interpreter of the C programming language:
» #!/usr/bin/C でワンライナーを書く from TAKESAKO @ Yet another Cybozu Labs
C - a pseudo-interpreter of the C progra... [続きを読む]
トラックバック時刻: 2006年01月06日 20:34
» Cインタプリタ from As An Engineer, Like A Programmer
http://labs.cybozu.co.jp/blog/kazuho/archives/2006/01/large_c.php http://lab... [続きを読む]
トラックバック時刻: 2006年01月06日 23:35
» C-0.02 from Kazuho@Cybozu Labs
C-0.02 をリリースします。 ダウンロード URL: http://lab... [続きを読む]
トラックバック時刻: 2006年01月10日 16:15
» [Work][Comp] Embedded-C 公開 from こめんと
Fail-Safe C では各種データのサイズ (int とか long とか) や、
OS の各種定数 (SOCK_STREAM とか) は基底にある標... [続きを読む]
トラックバック時刻: 2006年01月27日 23:57
» Cのワンライナー from sh1.2 pyblosxom
C言語のワンライナー"C(らーじしー)"をpythonで実装してみた。 [続きを読む]
トラックバック時刻: 2006年01月29日 00:20
» Cに影響されてJavaでも作りますか・・・ from ナンセンス不定記
目に入っていたけれども、見ていなかったページに、[http://labs.cybozu.co.jp/blog/kazuho/archives/2006/0... [続きを読む]
トラックバック時刻: 2006年02月07日 23:25
コメント
(笑)
僕も同じようなことを考えたことがありました。
誰しも一度は???
日記 2001年11月20日分
http://www.shudo.net/diary/2001nov.html#20011120
投稿者 しゅどう : 2006年01月23日 16:59
簡潔ですばらしいと思います。負けました (笑)
今回の C については必要だったから作ったわけですが、ネタをマジメにできるところが、ラボのいいところだと思っています。
「スクリプト言語」の定義もそうですが、「インタプリタ」の定義も曖昧になってきていますね。Perl とか...
投稿者 kazuho : 2006年01月24日 11:13