v8忘れ書き他

nil
記事: 428
登録日時: 14年前

v8忘れ書き他

投稿記事 by nil » 12年前

以前その存在を知った時から気になっていたv8エンジンを触ってみたので、その備忘録ついでに、
最近話題で出ていたスクリプト言語との感覚的な比較を云々。

※以下のコードはエラーチェックなどを全く行っていません。

・Lua(luabind)でのHello, World!
Luaは言わずと知れた組み込みスクリプトの代表格ですね。
各所で用いられ、また、その群を抜いた速度も特徴の一つです。

実際に組み込もうと思えばLua単体よりも
luabindなどのラッパーを用いることに成るでしょう。
というのも、グルーコードを手動で書くのはなかなかに大変だからです。
luabindならばTMPの活用でほぼスタックやらを意識しなくて済みます。

個人的感想
オフトピック
結構扱いやすいですが、
コメントが『--』で始まる。配列添え字の開始が『1』。
など、わりと癖のある言語のように感じます。
プログラマ以外がスクリプティングをする際には後者は良い点なのかもしれませんが、
しっかりと意識していなければ予期せぬバグに見舞われることに成るかもしれません。
lua.lua

CODE:

print "Hello, Lua World!";
main.cpp

CODE:

#include 
#include 

#pragma comment(lib, "lua5.1.lib")

#ifdef _DEBUG
	#pragma comment(lib, "luabind_mtd")
#else
	#pragma comment(lib, "luabind_mt")
#endif

int main() {
	lua_State* luaState = lua_open();
	luaL_openlibs(luaState);
	luabind::open(luaState);

	luaL_dofile(luaState, "lua.lua");

	lua_close(luaState);
}
わりと簡素であります。
配布時にはDLLを同梱する必要があるので注意ですね。

・PSLでのHello, World!
PSLとは純日本製のスクリプト言語です。
知名度自体は未だに低いですが、扱いやすく、
また、(当たり前ですが)ドキュメントや言語仕様などが日本語で書かれているので、取っ付き易いです。
クラスも扱えます。

また、製作者のSilicaさん自身が、PSLを組み込んで作ったSTGのソースコード(の一部)や、
Lua,Xtalとの比較を公開してらっしゃるので、
参考にしてみるのもいいでしょう。

更に、ほとんどの組み込み言語と違い、ソースコードがヘッダーのみで構成されているため、
ライブラリのリンクが必要ありません。
ヘッダーをインクルードするだけです。

個人的感想
オフトピック
関数やクラスの定義に(functionやclassといった)、予約語が不要なのが特徴ですね。

CODE:

// 関数例
hoge(i){
    i += 1;
    return i;
}

// クラス例
classname{
    int i = 1;
    int j = 2;
    func(){
        return i + j;
    }
}
非常に簡素です。

Luaと比べ、コルーチンも使い易いです。

バインドしたクラスオブジェクトをPSL関数の引数に渡すような処理は苦手なように感じられました。
psl.psl

CODE:

print("Hello, PSL World!\n");
main.cpp

CODE:

#include 

int main() {
	using namespace PSL;

	PSLVM psl;
	psl.loadScript("psl.psl");
	psl.run();
}
たったこれだけです。
驚きの簡素さです。

スクリプトの読み込みは、
なまのスクリプトではなく、
予めコンパイルしておいたものを読み込むことによって処理を軽減できるはずです。

・JavaScript(v8)でのHello, World!
本題のv8です。
言わずと知れたあのJavaScriptをC++に組み込めます。
正直昨日今日手を出したばかりなので、細かいことは書きません。書けません。

v8自体の情報が少なく、さらに、出回っているものの多くが古い情報なので、
最新版でコンパイルしようと思ってもエラーが出ます。

print系の関数が標準では存在しない(?)ので、バインドすることにしました。

js.js

CODE:

print("Hello, JS World!");
main.cpp

CODE:

#include 
#include 
#include 

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "winmm.lib")

#ifdef _DEBUG
	#pragma comment(lib, "v8_base_d.lib")
	#pragma comment(lib, "v8_nosnapshot_d.lib")
#else
	#pragma comment(lib, "v8_base.lib")
	#pragma comment(lib, "v8_nosnapshot.lib")
#endif

void print(const v8::FunctionCallbackInfo& args){
	puts(*v8::String::AsciiValue(args[0]));
}

int main() {
	using namespace std;
	using namespace v8;

	//	スクリプトの読み込み
	ifstream ifs("js.js");
	string str;
	string buf;
	while(getline(ifs, buf)){
		str += buf+'\n';
	}

	//	カレントアイソレートの取得
	Isolate* isolate = Isolate::GetCurrent();
	
	//	ハンドルスコープの作成
	HandleScope handleScope(isolate);
	
	//	関数のバインド
	Handle global = ObjectTemplate::New();
	global->Set("print", FunctionTemplate::New(print));
	
	//	コンテキストの作成
	Handle context = Context::New(isolate, nullptr, global);
	
	//	?
	Persistent persistentContext(isolate, context);
	
	//	コンテキストスコープの作成
	Context::Scope context_scope(context);

	//	ソースコードをv8::Stringに変換
	Handle source = String::New(str.c_str());
	
	//	ソースコードをコンパイル
	Handle script = Script::Compile(source);
	
	//	実行
	script->Run();
	
	//	終了処理
	persistentContext.Dispose();
}
オフトピック
本当は、XtalやRuby、Python、Squirrelなんかにも触れたかったのですが、
風呂敷を広げ過ぎて収集がつかなくなりそうなので、
今回は、使ったことのある+たまに使う+興味があった 3言語にしぼりました。(本当にしぼれているのかは不明)
最後に編集したユーザー nil on 2013年9月01日(日) 21:54 [ 編集 6 回目 ]

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前

Re: v8忘れ書き他

投稿記事 by h2so5 » 12年前

mruby もありますよ

CODE:

#include 
#include 
#include 

static mrb_value
mrb_print(mrb_state *mrb, mrb_value self)
{
  char *str = NULL;
  mrb_get_args(mrb, "z", &str);
  puts(str);
  return mrb_nil_value();
}

int main()
{
  mrb_state *mrb = mrb_open();
  mrb_define_method(mrb, mrb->kernel_module, "print", mrb_print, ARGS_REQ(1));
  mrb_load_string(mrb, " print 'Hello, world!' ");
  mrb_close(mrb);
  return 0;
}

nil
記事: 428
登録日時: 14年前

Re: v8忘れ書き他

投稿記事 by nil » 12年前

mrbは初耳だったのですが、
C++組み込みに特化したRubyってところですか。

そういえば、最近では、組み込みでもRubyが使われているところがある、なども聞いたことがありますね。

アバター
h2so5
副管理人
記事: 2212
登録日時: 15年前

Re: v8忘れ書き他

投稿記事 by h2so5 » 12年前

mrubyは組込み用の軽量RubyでC言語でも使えます。