Hatena::Groupdeusexmachina

OUCH! このページをアンテナに追加 RSSフィード

09/09/29

CからRubyを実行してみるテスト

| 02:48 | CからRubyを実行してみるテスト - OUCH! を含むブックマーク はてなブックマーク - CからRubyを実行してみるテスト - OUCH!

<09/30追記>

 ruby_run()が動いたのでそれを使ったver.をやってみた→CからRubyを実行してみるテストその2

<追記ここまで>

 そのうち、生ハード上でRubyが動くようになったら、ブート時にそのRubyインタプリタを起動させて、ディスクのどっかに入れるRubyソースを実行する事になる。その前段階として、CからどうやってRubyを実行するんだ、というのがありまして。

ちょこちょこネット上を彷徨って調べたのですが、ふと見てみた「Rubyアプリケーションプログラミングオーム社)」に書いてあった……うん……ただちょっと情報が古いが。

あとRubyの中にあるREADME.EXT.jaを読んだんだけど、これも情報が古いんだよな……既にruby_run()がなくなっててruby_run_node()になっているという。名前変わっただけじゃなくて、引数にruby_options(argc, argv)を取るようになってるし。だれかドキュメント……。

閑話休題。下にソースを投げてみる。

#include <string.h>
#include "ruby.h"

int main(int argc, char ** argv) {
	FILE *fp;
	char *buf;
	char src[500];
	src[0]='\0';

	ruby_init();

	fp=fopen("test.rb", "r");

	while( fgets( buf, 100, fp ) != NULL ){
		strcat(src, buf);
	}
	rb_eval_string(src);
	fclose(fp);

	return 0;
}

test.rbの内容をbufで読み込んでsrcにどんどんくっつけていき、最後にrb_eval_string()でsrcを、つまりtest.rbを実行してる。

上で触れたruby_run_node()は使ってないけど、どうせファイルシステムも何もない所で実行するので、最初からソースで実行させるパターンをテストしてみた。だから、実際に読み込む時は別の手段を考える。

で、コンパイル→実行はこうする。ちなみにcygwinでやった。Ubuntuで後から試す時はパス変えないと。

 gcc -I/usr/lib/ruby/1.8/i386-cygwin/ -c test.c
 gcc -o test test.o -L/usr/lib -lruby -ldl -lcrypt -lm
 ./test.exe

とすると、test.rbが実行される。

 しかし、最近Cを読みはするけど全然書かないから、何をどう書けばいいのか完全に失念している……文字列の扱いとかファイル操作とか。これでいいのか本当に……。いかにCに触れてないかがわかるな(笑)元々Cってそんなに好きじゃないし……。