最近話題で出ていたスクリプト言語との感覚的な比較を云々。
※以下のコードはエラーチェックなどを全く行っていません。
・Lua(luabind)でのHello, World!
Luaは言わずと知れた組み込みスクリプトの代表格ですね。
各所で用いられ、また、その群を抜いた速度も特徴の一つです。
実際に組み込もうと思えばLua単体よりも
luabindなどのラッパーを用いることに成るでしょう。
というのも、グルーコードを手動で書くのはなかなかに大変だからです。
luabindならばTMPの活用でほぼスタックやらを意識しなくて済みます。
個人的感想
オフトピック
結構扱いやすいですが、
コメントが『--』で始まる。配列添え字の開始が『1』。
など、わりと癖のある言語のように感じます。
プログラマ以外がスクリプティングをする際には後者は良い点なのかもしれませんが、
しっかりと意識していなければ予期せぬバグに見舞われることに成るかもしれません。
コメントが『--』で始まる。配列添え字の開始が『1』。
など、わりと癖のある言語のように感じます。
プログラマ以外がスクリプティングをする際には後者は良い点なのかもしれませんが、
しっかりと意識していなければ予期せぬバグに見舞われることに成るかもしれません。
#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との比較を公開してらっしゃるので、
参考にしてみるのもいいでしょう。
更に、ほとんどの組み込み言語と違い、ソースコードがヘッダーのみで構成されているため、
ライブラリのリンクが必要ありません。
ヘッダーをインクルードするだけです。
個人的感想
オフトピック
驚きの簡素さです。
スクリプトの読み込みは、
なまのスクリプトではなく、
予めコンパイルしておいたものを読み込むことによって処理を軽減できるはずです。
・JavaScript(v8)でのHello, World!
本題のv8です。
言わずと知れたあのJavaScriptをC++に組み込めます。
正直昨日今日手を出したばかりなので、細かいことは書きません。書けません。
v8自体の情報が少なく、さらに、出回っているものの多くが古い情報なので、
最新版でコンパイルしようと思ってもエラーが出ます。
print系の関数が標準では存在しない(?)ので、バインドすることにしました。
js.js main.cpp
#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言語にしぼりました。(本当にしぼれているのかは不明)
風呂敷を広げ過ぎて収集がつかなくなりそうなので、
今回は、使ったことのある+たまに使う+興味があった 3言語にしぼりました。(本当にしぼれているのかは不明)