« 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
-i add 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
102334155

real 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
102334155

real 0m1.843s
user 0m1.618s
sys 0m0.244s

%

利点3 - バイナリデータの処理が簡単

 多くのスクリプト言語は文字列処理を念頭に開発されているため、バイナリデータの取り扱いが苦手です。でも、 C を使えば、バイナリデータの処理を簡単に書くことができます。

例: int32 の合計値を計算する
% 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 が動作する環境なら、どこでも実行することができます。

hello.C
#! /usr/bin/C

printf("hello world\n");

 自分でも、ネタなのかマジなのか良くわからなくなってきましたが、これで私もバイナリアン 2.0になれるような気がします。
# C が、実は Perl で書かれていることは、秘密です...

※※※ C インタプリタの最新の情報は、C アーカイブ をご覧ください ※※※

投稿者 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