【Lua】組み込み系言語総合 その2【Squirrel】
at TECH
[前50を表示]
500:デフォルトの名無しさん
09/11/23 18:23:45
HSPスレに逝けよ
501:デフォルトの名無しさん
09/11/23 21:35:31
とりあえず、この本みてみて、何とかなるか考えてみたら。
スクリプト言語による効率的ゲーム開発 C/C++へのLua組込み実践
URLリンク(www.amazon.co.jp)
サポートページ
URLリンク(lua.mine.nu)
どうなんだろうなあ。
502:デフォルトの名無しさん
09/11/23 21:46:36
URLリンク(en.wikipedia.org)
Luaでルーチンいじれるゲームとかゲームエンジンとかあるけど
日本語の資料があんまりないと思う
503:デフォルトの名無しさん
09/11/24 10:46:49
Lua for Windows: A batteries included Lua installation on Windows.
URLリンク(luaforwindows.luaforge.net)
これいっこダウンロードしてインストールすれば、
GUI から OpenGL から DB 接続までなんでもはじめから入ってるよ。
ウィンドウ作る程度なら、サンプルそのまま使える。
504:デフォルトの名無しさん
09/11/25 07:48:34
Pawn始める人への組み込みメモ(修正版)
// .amxファイル(コンパイル済みPawnバイナリ)を実行するための最小コード。
// 必要ファイル: amx.c/h amxaux.c/h amxcons.c/h amxcore.c osdefs.h
#include "amx.h"
#include "amxaux.h"
#include <stdio.h>
AMX_NATIVE_INFO console_Natives[];
AMX_NATIVE_INFO core_Natives[];
int main(int argc, char *argv[]) {
AMX amx;
cell ret = 0;
if (aux_LoadProgram(&amx, "test.amx", NULL) != AMX_ERR_NONE) exit(1);
if (amx_Register(&amx, console_Natives, -1)) exit(1);
if (amx_Register(&amx, core_Natives, -1)) exit(1);
if (amx_Exec(&amx, &ret, AMX_EXEC_MAIN)) exit(1);
printf("%ld\n", (long)ret);
aux_FreeProgram(&amx);
return 0;
}
505:デフォルトの名無しさん
09/11/25 07:49:39
// Pawnコンパイラの最小プロジェクト
// 必要ファイル: libpawnc.c lstring.c/h memfile.c/h sc1.c〜sc7.c sc.h sc5.scp sc7.scp scexpand.c sci18n.c sclist.c scmemfil.c scstate.c scvars.c svnrev.h
// それに加えて ../amx でアクセスできる場所に osdefs.h amxdbg.h が必要
// 実行時にsc1.cのsetconfig()あたりでNULLエラーが発生するなら[プロジェクトの設定->構成プロパティ->全般->文字セット]でUnicodeを無効にしておく
#include "sc.h"
int main(int argc, char *argv[])
{
return pc_compile(argc, argv);
}
506:デフォルトの名無しさん
09/11/25 14:11:52
luabindを使っていて気になったのですが、
//cpp
struct A {
int x;
};
A *ptr;
A& ref() { return *ptr; };
A a;
luabind::module(L) [
luabind::def("ref", &ref),
luabind::class_<A>("A")
.def_readwrite("x", &A::x)
];
];
--lua
v = ref()
v.x = 1 --参照なのでC側のaにアクセスできる
クラスのインスタンスの参照を渡すときに、上の様に一度staticかglobalな変数
(上の場合ptr)を経由させる方法しか思いつかなかったのですが、ダイレクトに
渡す方法は無いものでしょうか?
507:506
09/11/25 14:14:17
訂正
A a;
ptr = &a;
luabind::module(L) [
luabind::def("ref", &ref),
luabind::class_<A>("A")
.def_readwrite("x", &A::x)
];
508:デフォルトの名無しさん
09/11/25 17:56:07
Lua詳しくないんでアレだが、lua_pushlightuserdataではダメなの?
509:デフォルトの名無しさん
09/11/26 09:43:19
Luaで実行状態を全部ファイルに保存して、また復帰するようなことは可能ですか?
510:デフォルトの名無しさん
09/11/26 10:10:30
>>509
Lua側でioで記録、読み込みするコード書くしかないかも
511:デフォルトの名無しさん
09/11/26 10:18:51
Smalltalkなら可能です
512:デフォルトの名無しさん
09/11/26 11:32:21
>>509
言語機能としてはないので、無理やりやることになる。
一応こういうのはあるけど、安定してるかどうかは不明。
URLリンク(lua-users.org)
513:デフォルトの名無しさん
09/11/26 13:19:28
>>508
試してみましたが、luabindではligthuserdataではなくuserdataを使用して
独自の型ID等を付加してチェックしているようで、無理でした。
luabindのソースを追ってみたところ、luabind::detail::convert_to_luaで
C++側の変数の参照をluaのスタックに積めることが分かったので、
これでどこかのテーブルに置くとか引数で渡すとかの方法が使えそうです。
luabindのドキュメントにもサンプルにも、こういったスタックを使う方法が
記載されていないので、本来の使い方とは違う気もしますが。
514:デフォルトの名無しさん
09/11/26 13:24:32
>>513
通常、スクリプトにはC++クラス型のインスタンスのポインタを渡してポインタで操作させる。
C++の参照はC++固有の機能なので他の言語では使えないと考えたほうがいい。
別の変数に代入した瞬間(参照で無く実体のコピーとして)にコピーコンストラクタが発動したって文句言えないぞ。
まあバインダがエラー吐いてコンパイルの段階で失敗すると思うが。
515:デフォルトの名無しさん
09/11/26 13:29:57
休止モードを呼び出せばいいんだよ。
516:デフォルトの名無しさん
09/11/26 14:09:30
>>514
bind側に参照を渡した場合は、ポインタに変換して管理してるみたいですね。
517:デフォルトの名無しさん
09/11/27 08:47:27
>>510 >>512
ありがとうございます。
Pluto調べてみます。
518:デフォルトの名無しさん
09/11/28 09:36:22
LuaでGUIムリだろと思ってたら、意外とバインダが出てくるもんだなw
お前ら優しすぎw
519:デフォルトの名無しさん
09/11/28 10:21:52
小学生に方程式ムリだろと思ってたら、意外と鶴亀算が出てくるようなもんだな
520:デフォルトの名無しさん
09/11/28 11:31:33
最近はメインループのかなりの部分まで組み込みスクリプトで作っちゃうのが主流になりつつあるのかな。
521:デフォルトの名無しさん
09/11/28 12:02:53
Luaだと入力補完のあるエディタが無いから
逆にやり難いと感じる俺
522:デフォルトの名無しさん
09/11/28 12:11:48
>>520
大半を組み込み言語化した結果、パフォーマンスの壁にぶちあたって
機能分離可能なところはどんどんC++化していく、ってのが定番だとオモ
サンプル:俺
523:デフォルトの名無しさん
09/11/28 12:45:05
まあ通常、動的(型付け)言語はネイティブコードと比べて10倍以上は遅いからな。
オレもスクリプトでゲーム開発環境を一通り書き上げたところだが、
60フレームまわしたらそれだけで意外にCPU食ってしまうので、ちと困ってる。
最低ラインがPentium 4 2.4GHzくらいになった。
524:デフォルトの名無しさん
09/11/28 14:49:37
JIT付き静的型付けスクリプト言語
穴場だから誰か作れば
有名になれるかもよ
525:デフォルトの名無しさん
09/11/28 15:10:52
>>524
すでにあるっちゅうねん。
.NET Framework向けだがな。
526:デフォルトの名無しさん
09/11/28 15:54:13
>>.NET Framework向けだがな。
駄目じゃん
527:デフォルトの名無しさん
09/11/28 16:18:55
作りたいと本気で思ってる俺が来ましたよ
もし作るならスクリプトで定義したクラスのインスタンスがC++から簡単に作れて、マルチスレッドとか使って同時に複数のインスタンスを参照してもおかしくならない仕様にしたいな
528:デフォルトの名無しさん
09/11/28 16:46:03
つAngelScriptJIT
ただしやり方は不明。
529:デフォルトの名無しさん
09/11/28 18:52:02
LuaJIT ってなかったっけ?
530:デフォルトの名無しさん
09/11/28 19:09:51
Luaは静的じゃないでしょ
531:デフォルトの名無しさん
09/11/28 19:18:30
ああごめん、静的を見落としてた
532:デフォルトの名無しさん
09/11/29 13:59:21
luaのlua_pcallのerrfncが呼ばれたときに、元のエラーメッセージとは
別にソースファイル名、行番号を収集する場合なんですが、
lua_getstackのレベル指定で、1から++しながら順にたどって
最初にcurrentlineの値が-1以外になったレベルがソースファイルの
階層と判断して問題ないでしょうか?
533:デフォルトの名無しさん
09/11/29 15:45:53
メンバアクセスの:と.ってどう違うの?
534:デフォルトの名無しさん
09/11/29 17:27:09
.が通常のメンバアクセスで、:でアクセスする場合は
v.(v ,〜 に展開される。
例: v:open(arg) -> v.open(v, arg)
535:デフォルトの名無しさん
09/11/29 17:53:43
d
536:デフォルトの名無しさん
09/11/29 18:04:12
>>17 問題1
使用言語: R
f <- function (n) {substr("abcdefghijklmnopqrstuvwxyz",1,n)}
> f(6)
[1] "abcdef"
> f(30)
[1] "abcdefghijklmnopqrstuvwxyz"
537:デフォルトの名無しさん
09/11/29 18:06:04
すみません。
書くところを間違えました。
ごめんなさい。
538:デフォルトの名無しさん
09/11/29 18:06:48
聞かれてないけどついでに補足すると.は[]に展開される
v:member(arg) -> v.member(v, arg) -> v[menbe](v, arg)
539:デフォルトの名無しさん
09/11/29 18:09:23
v['menber'](v, arg)
540:デフォルトの名無しさん
09/11/29 18:17:00
へー
じゃあメンバアクセスのたびにマップ検索してんのか
遅くならないのかな
541:デフォルトの名無しさん
09/11/29 18:28:37
空想具現化プログラミングというところから落としたlua5_1_3_Win32_mbenc_a2.zipを展開したところbin2c5.1.exeにウイルス検知ソフトが反応したんですが、これは大丈夫なんでしょうか?
542:デフォルトの名無しさん
09/11/29 18:31:42
>>540
そりゃ勿論遅いだろうさ
543:デフォルトの名無しさん
09/11/29 18:41:44
メンバだけの話じゃないだろうし。
変数名からなにから全ての識別子の判定で毎回どこかのテーブル見てるはず。
544:デフォルトの名無しさん
09/11/29 18:59:47
>>541
カスペルスキー系の誤検出のはず。
bin2cとか別に普段使うものでもないから削除しておいても良いかと。
545:デフォルトの名無しさん
09/11/29 19:20:09
>>543
ローカル変数は実行時はテーブル見ない。例えば、
local a = b * c + d
を
local a = b * c
a = a + d
に変えても速さは変わらない。
546:デフォルトの名無しさん
09/11/29 19:37:56
>>544
ありがとうございます安心しました
547:デフォルトの名無しさん
09/11/29 23:33:25
静的型付けならPawnいかがかな?
548:デフォルトの名無しさん
09/11/30 22:05:16
ちょっと確認したいんですが
lua_registerで登録した関数を呼び出すときには新しいスタックが毎回生成される、したがって
Glue関数内部ではlua_gettopでスタックの数を確認する必要なしにスタックの1番目が最初の引数、2番目が・・・としてよい
同様に、返り値もスタックの1番目が最初の返り値、二番目が・・・としてよい(何も考えずにスタッククリアして返り値を積めばいい)
これは正しいですか?
549:デフォルトの名無しさん
09/12/01 00:52:46
うむ
550:デフォルトの名無しさん
09/12/01 06:17:28
>>524
ActionScript 3.0 がそっちのほうを目指しているんじゃないかな。
いちおう Flex SDK はオープンソースらしいから、
自分のプログラムに組み込むこともできるかも。
>>540
Lua Performance Tips
URLリンク(www.lua.org)
for i = 1, 1000000 do
local x = math.sin(i)
end
runs 30% slower than this one:
local sin = math.sin
for i = 1, 1000000 do
local x = sin(i)
end
551:デフォルトの名無しさん
09/12/01 21:46:34
Luaについて質問です。
10進数で書かれた文字列、たとえば「\130\160\130\162\130\164」は
Lua上で「あいう」となりますが、外部ファイルに記述したものを
io.linesで取り出したものだと、コード列が返ってきてしまいます。
これを通常の文字列に変換したものとして使いたいのですが、どうしたらいいのでしょうか。
552:デフォルトの名無しさん
09/12/01 21:50:08
>>549
ありがとうございます
553:デフォルトの名無しさん
09/12/01 22:20:40
>>551
多分C側でバイナリに変換しないとダメじゃないだろうか。
Luaの標準ライブラリでももしかしたら出来るかもしれないが、
Cの方がてっとり早いだろう。
554:デフォルトの名無しさん
09/12/01 23:27:17
SquirrelのほうがLuaよりゲーム向けなんかな?
どっちも知識なしだったらSqから勉強でいいのだろうか
555:デフォルトの名無しさん
09/12/01 23:54:06
>>554
どちらも汎用スクリプトだから処理系単体ではどちらがよりゲーム向けということはない。
周辺ライブラリやバインダの入手性や使い勝手の差はあると思うけど。
556:デフォルトの名無しさん
09/12/02 01:51:00
>>554
速度がLua>Sqで結構大差あったりするんで
Wikipedia項目リンク
のLuaとの違いに強い魅力を感じるんでなければLuaがオススメ。
特に知識なしなら、Luaのほうが日本語資料が充実してるんで勉強しやすいかと思う。
557:デフォルトの名無しさん
09/12/02 02:00:16
lua は文法がな……
558:デフォルトの名無しさん
09/12/02 08:15:39
日本語は文法がな・・・
559:デフォルトの名無しさん
09/12/02 09:41:13
AngelScript|Д゚)ジー
560:デフォルトの名無しさん
09/12/02 11:48:28
>>551
loadstring をつかえばできるよ。
local str = "\130\160\130\162\130\164" -- io.lines で取り出した文字列
local decode = loadstring("return \"" .. str .. "\"")
print(decode())
561:デフォルトの名無しさん
09/12/02 15:29:08
>>449
コンパイラがOSロケールに依存してるから英語にしましょうなんて愉快すぎるわ
他のロケール依存アプリ全部道連れにする方法なんぞ万人に薦められんだろ
562:デフォルトの名無しさん
09/12/02 16:39:37
問題が起こるのはShiftJISを決めうちして作っている一部の馬鹿アプリだけだろ。
なぜ全部とか間抜けな話になるのか、頭の悪い奴の考えはさっぱり分からん。
563:デフォルトの名無しさん
09/12/02 16:40:53
バカアプリの代表が Visual Studio って話じゃないのん?
564:デフォルトの名無しさん
09/12/02 18:39:01
そんな事よりお前ら、GameMonkeyについて語るんだ。
565:デフォルトの名無しさん
09/12/02 18:47:34
winアプリにスクリプト組み込む場合、メッセージ(WM)処理どうしてる?
自分はマルチスレッドにしてるんだけど、WM_CLOSE受けたときに
スクリプトが走ってたら、スレッド他殺していいものなのかどうか。
566:デフォルトの名無しさん
09/12/02 18:57:22
保存したいデータがあるかどうかで判断しね?
567:デフォルトの名無しさん
09/12/02 19:00:15
データ保存しない場合はどんなタイミングで落としても問題無いってこと?
568:デフォルトの名無しさん
09/12/02 19:16:24
スクリプトを複数スレッドで別々に動かす状況がわからんな…
Luaだと、Lua_yieldでスクリプトの処理を一時停止させて次のスクリプト、という感じではダメなの?
569:デフォルトの名無しさん
09/12/02 19:43:49
それだとスクリプト書く側に停止を意識させないとダメですよね?
570:デフォルトの名無しさん
09/12/02 22:23:10
スクリプト側にメインループを置いて処理してるの?
571:デフォルトの名無しさん
09/12/03 00:38:27
winmainでメッセージループ、別スレッドでスクリプト。
スクリプトは入力待ち(マウス等)で関数無いで停止することがあって、
その間にメッセージループ側にWM_CLOSEとか来た場合にどうやって
終了させるかで色々迷っている、と。
スクリプトで割り込みを意識するような書き方は手間なので、
スレッドごと落とせると楽なんだけど、lua_Stateってスレッドごと
落とした後にlua_closeに渡して大丈夫なのか?ってのが疑問な
わけですよ。
lua_call系にステップ実行があると良かったんですがね。
ステップ数も指定できたりするのが。
572:デフォルトの名無しさん
09/12/03 09:26:27
>>571
スレッドを強制終了したら、基本的に何が起こってるか不明というか
たとえばガベコレの途中だったりしたら(その他でもあらゆる不明な原因で)
異常な状態になるからやめたほうが良い。
手段としては、別スレッドのほうの処理をコルーチンで構成しておいて、
コルーチンがyieldしたタイミングでコルーチン呼び出し側のコードで
終了チェックするようにする。
あとウエイトが絡む関数については、待ちループで終了チェックをするようにして、
終了フラグが立っていたらyieldを起こすようにする。
とかそんな感じじゃないの。
573:デフォルトの名無しさん
09/12/03 09:30:46
>>571
無限ループ防止という観点では、デバッグフックで1行実行ごとに関数呼ばせて、
その中でカウンターアップしていって、カウンターが一定の数になったらyieldとかいう手もある。はず。
574:デフォルトの名無しさん
09/12/03 11:24:54
スクリプト側の待ちループの中でlua_yieldを呼び出すグルー関数を呼びだすようにしておき、
メッセージ処理の待ちの間、具体的には
MSG *lpMes=&m_Msg;
ZeroMemory( lpMes, sizeof(MSG) );
while(lpMes->message!=WM_QUIT)
{
if(PeekMessage(lpMes,NULL,0,0,PM_REMOVE))
{
TranslateMessage(lpMes);
DispatchMessage(lpMes);
} else {
〜〜〜
}
}
の、〜〜〜の部分で1回目はlua_call、2回目以降はlua_resumeでスクリプトを呼び出せばいいような気がする。
575:デフォルトの名無しさん
09/12/03 11:28:06
>>565
他のスレッドはいきなり殺したらあかんでしょ。
メインスレッドからフラグたてて、よしなに自殺
576:デフォルトの名無しさん
09/12/03 11:29:49
てか、この辺のマルチスレッドの話ことってLua関係なくないか?
577:デフォルトの名無しさん
09/12/03 11:44:10
>>571
(before)
入力待ち(マウス等)で関数内で停止する
(after)
yieldを使い、外で停止する
入力が来たらresumeで関数内に戻る
WM_CLOSEが来たらresumeしないまま終了
578:デフォルトの名無しさん
09/12/03 12:59:28
lua関係ないよな。普通にC++だけで書いてても全く同じだ。
まあ、lua (ないしは squirrel) なら、yield のタイミングで同期を
とるようなコードにしておくのが無難ってのはその通りだと思われ
579:デフォルトの名無しさん
09/12/03 20:42:03
>>573
なるほど、それならステップ実行できますね。
>>他のレスくれた方々
具体的に書いた例だとマルチスレッドになってるけど、根本は
WindowsでLua使うときにメッセージ処理をどうしてるかって話ですから。
避けて通れないだろうから、実際に組み込んでる方々はどう対処してるかが
気になったもので。
580:デフォルトの名無しさん
09/12/03 22:32:02
>>579
シングルスレッドモデルで組んであれば処理の流れ的に問題になるようなことは別にない
あとはオブジェクトをどう管理してるかの問題。
ウインドウのインスタンスを lua 配下にしてある(生成もlua側から)なら、それぞれのウインドウの
メッセージ処理部から、lua でのインスタンスの適当なメソッド (onCloseとか) をイベント的に callback
させて閉じるかどうかをスクリプト側に判定させればいいだろう
ウインドウのインスタンスがグローバルなら、lua 側も同様に
グローバルメソッドをイベントとして呼び出して判定させるように組めばいい
581:デフォルトの名無しさん
09/12/04 18:14:29
Luaのスタックとか文法とかにいまいち馴染めないからエンゼルスクリプトをやってみようかと思ったが日本語資料がなさすぎて泣いた
582:デフォルトの名無しさん
09/12/04 18:28:07
>エンゼルスクリプト
なんか可愛いな
583:デフォルトの名無しさん
09/12/04 18:39:34
つ英文マニュアル
結構読みやすいよ。
あと、WIPのtest_featureに入ってるサンプルもわかりやすい。
584:デフォルトの名無しさん
09/12/04 20:37:59
エンゼルスクリプトって速度どれくらい?
585:デフォルトの名無しさん
09/12/04 21:19:06
>>584
>>347
586:デフォルトの名無しさん
09/12/04 21:19:32
>>584
>>347
587:デフォルトの名無しさん
09/12/04 21:20:21
おい、結婚するか
588:デフォルトの名無しさん
09/12/04 21:46:45
そうだな。結婚すると良いよ。
589:デフォルトの名無しさん
09/12/04 21:49:36
じゃあ俺が息子になろわ
590:551
09/12/04 21:52:36
>>553,560
回答が遅くなってすみません。
>>560さんの方法で望みの動作になりました。
お二方とも、本当にありがとうございました。
591:デフォルトの名無しさん
09/12/04 23:34:54
>>581
tolua++を使えばいいと思います。
URLリンク(lua.mine.nu)
592:デフォルトの名無しさん
09/12/04 23:36:01
日本語資料が無いから辛いと書いてるのにそんなの勧めるなよw
593:デフォルトの名無しさん
09/12/04 23:46:07
Pawn何で人気ないん?
594:デフォルトの名無しさん
09/12/04 23:49:03
Luaの入門書読み終わったけどユーザーデータについてあんまし書いてなかったぜ
ポインタ渡せないとオブジェクトの操作ができないジャマイカ
595:デフォルトの名無しさん
09/12/04 23:49:50
Luaの入門書ってどれのこと?
596:デフォルトの名無しさん
09/12/05 00:06:50
入門Luaプログラミングというやつなんだけど、ちょろっと1Pくらいしか説明がなくてわかりにくかった
597:デフォルトの名無しさん
09/12/05 00:21:15
luaといえば、下の二つのスクリプトを順に実行すると、
--a.lua
local v = 1
local function f()
print(v)
end
fv = f
--b.lua
fv()
結果
1
感じになるんだが、関数の実体もガベコレされてるのかな?
関数内で使ってるlocal変数もコピーかリファレンスを持つことになると?
598:デフォルトの名無しさん
09/12/05 00:32:19
>>597
Luaはよく知らないが、単にグローバル変数を
2つのスクリプトで共有してるだけなんじゃね?
599:デフォルトの名無しさん
09/12/05 05:19:56
>>597
fv が f をつかんでいる間はつねに f のなかから v が参照可能だよ。
Lua の関数も参照されなくなればもちろんガベコレされる。
> 関数内で使ってるlocal変数もコピーかリファレンスを持つことになると?
Lua ではこういう変数のことを upvalue と呼んでますが、
必要に応じてスタックからヒープへコピーされるみたい。
URLリンク(www.lua.org)
ここにある The implementation of Lua 5.0 っていう論文に、
イラストつきで説明があります。
600:デフォルトの名無しさん
09/12/05 06:44:46
>>599
完全な回答をありがとう。凄くすっきりしました。
この辺の仕様はとても良くできてるなと思いますね。
601:デフォルトの名無しさん
09/12/05 07:34:58
closureみたいなもん?
602:デフォルトの名無しさん
09/12/05 08:39:50
>>601
そう。レキシカルクロージャです。
603:デフォルトの名無しさん
09/12/05 11:28:25
すっきりとした仕様だね。
Schemeライクというか。
604:デフォルトの名無しさん
09/12/05 12:22:26
squirrel だと同等のものは「Free variables」と呼ばれててこちらは対象の明示指定が必要だね
605:デフォルトの名無しさん
09/12/05 14:12:22
未踏ユースにLua高速化が採択されているんですね。
スクリプト言語Luaの高速化と省メモリ化 (2009年度上期未踏ユース)
URLリンク(www.ipa.go.jp)
hogelog/lua (ソースコード)
URLリンク(github.com)
[lua]記事一覧 - hogeなlog (開発者ブログ)
URLリンク(d.hatena.ne.jp)
606:デフォルトの名無しさん
09/12/05 15:06:08
>>605
エエー、あんな古臭い言語を今更高速化するのが予算つくのか。
LuaJITだってあるのに。
607:デフォルトの名無しさん
09/12/05 15:20:44
ヒント: 電気通信大学
608:デフォルトの名無しさん
09/12/05 17:15:48
>>606
ところがLuaJITのGCにはあんま手が入ってはいないんだ。
609:デフォルトの名無しさん
09/12/05 17:41:58
こんなんで採択されるのかよw
ローカルなスクリプト言語
高速化してたら切りが無いぞ
610:デフォルトの名無しさん
09/12/05 17:43:19
本家と連絡取らずにやってるんなら残念な結果になる可能性が高い気がする。
611:デフォルトの名無しさん
09/12/05 17:45:53
よーしじゃあパパAngelScriptを高速化しちゃうぞー
612:デフォルトの名無しさん
09/12/05 17:56:48
C言語そのままスクリプトにしたようなのってありますか?
613:デフォルトの名無しさん
09/12/05 18:10:43
>>612
文法のことならSquirrelとかPythonがある程度近いと思うがそのまんまってのはたぶんない
614:デフォルトの名無しさん
09/12/05 18:14:43
>>612 URLリンク(csl.sourceforge.net)
615:デフォルトの名無しさん
09/12/05 18:17:18
>>612
C++だけど、CINT
616:デフォルトの名無しさん
09/12/05 23:16:35
クロージャとコルーチンさえあればもうCでいい気がしてきた俺には十分魅力的だなぁCINTわ
617:デフォルトの名無しさん
09/12/06 08:17:06
CINTにクロージャとかコルーチンとかあったか?
618:デフォルトの名無しさん
09/12/06 08:25:09
>>616
それだったらGoのほうがいいんじゃ。
619:デフォルトの名無しさん
09/12/06 11:33:15
Cっぽい文法ならAngelScriptでいいじゃない
620:デフォルトの名無しさん
09/12/07 11:25:54
pawnとgoとgamemonkeyのスルーっぷりw
621:デフォルトの名無しさん
09/12/07 11:32:15
C言語みたいなプログラム書きにくい言語でスクリプト記述したいとか、どんなマゾよ?
622:デフォルトの名無しさん
09/12/07 11:34:23
世の中、なにか一つ習得するとそれにしがみつくのが習性という猫もいるんだ。
623:デフォルトの名無しさん
09/12/07 17:37:44
>>621
これってたまに見かけるが、Cってそんなに書きにくいか?
624:デフォルトの名無しさん
09/12/07 17:49:32
>>623
慣れだよ
625:デフォルトの名無しさん
09/12/07 17:56:34
Cの書きにくさは、資源管理(malloc/free)がプログラマ任せであることや、
文字列操作がめんどいことにあって、構文や文法自体はそんなに書きにくくは
ないよね。Cが書きにくいなら、JavaがあそこまでCを引き継いだような仕様には
なってないと思う。
# でもまぁCが書きにくいと主張する人は、JavaはCから書きにくさを継承したと
# 主張するか。
626:デフォルトの名無しさん
09/12/07 18:04:16
Cの書きにくさ
・クロージャがない
・ガベージコレクションがない
・メモリアクセス保護がない
・文字列型がない
・というかコレクション型が一切ない
・というかforeachがない
・せめてイテレータくらい付けて
・関数オブジェクトの定義が面倒(定義と関数ポインタの扱いが別)
・というかファーストオブジェクトになってない
とまあ、仮にオブジェクト指向でなかったとしてもこれくらいあるわけだ。
627:デフォルトの名無しさん
09/12/07 18:06:45
アセンブラに比べたら格段に書きやすい
628:デフォルトの名無しさん
09/12/07 18:10:14
あー複雑な型の宣言や定義の構文は魔境入ってるかw
629:デフォルトの名無しさん
09/12/07 20:04:32
Cは40年近く前に出来た化石言語だからな。
当時のスペックのコンピュータで動かすためにキモイ仕様にしてるから書きづらくて当然。
630:デフォルトの名無しさん
09/12/07 21:35:50
ネイティブ系ではテンプレートの便利さに触れると、C++以外の言語を受け付けなくなるよ。
631:デフォルトの名無しさん
09/12/07 21:57:19
>>630
ふーん……。
D言語とかOCamlとかHaskellは触ってみたことあるの?
632:デフォルトの名無しさん
09/12/07 22:09:32
臭いものに蓋をするのがITの正道
蓋をしないネイティブ系・組み込み系は邪道だな
633:デフォルトの名無しさん
09/12/07 23:16:45
なでしこやろうぜ!
634:デフォルトの名無しさん
09/12/07 23:20:52
>>632
怖いものみたさor言われるままに蓋を開けて
自分の足を撃つのがITの正道
635:デフォルトの名無しさん
09/12/08 12:43:40
>>630
テンプレートでほら、関数型言語っぽいプログラミングも可能になる!!!
とか言われてもぶっちゃけあれキモいんだけど実際のところどうなの?
636:デフォルトの名無しさん
09/12/08 12:51:44
boost spiritとかboost lambdaは、使う使わないは別として、
キモいと思わない人はいないんじゃないかと。
637:デフォルトの名無しさん
09/12/08 13:51:30
C++をメインで使ってるけど、ぶっちゃけDirectXやライブラリの対応が
いいネイティブの別言語ができたらそっちに乗り換える。
638:デフォルトの名無しさん
09/12/08 13:57:23
>>637
そういうのは、ラッパーライブラリひとつで解決できる話なのさー。(他言語対応)
ただし動作検証用のコードは一部C++で用意しとかないといけないと思うが。
639:デフォルトの名無しさん
09/12/08 14:01:28
その使い勝手のいいラッパーが無いという話をしているんだろう。
640:デフォルトの名無しさん
09/12/08 15:47:16
boost::lambdaを使いこなしてない奴はC++を理解していない(キリッ
641:デフォルトの名無しさん
09/12/08 20:17:26
>>636
あれはその、なんていうかキモかわいい。
642:デフォルトの名無しさん
09/12/08 21:15:09
Brainf**kやろうぜ!
643:デフォルトの名無しさん
09/12/08 21:42:40
コンパイルにかかる時間が可愛くなさすぎる。
644:デフォルトの名無しさん
09/12/08 21:54:01
その視点で見るとGoは実に可愛らしい
645:デフォルトの名無しさん
09/12/09 05:14:24
Goって組み込めるの?
646:デフォルトの名無しさん
09/12/09 08:05:54
\ l´⌒\⌒\ \\ \
\ ヽ ) ) \\ \\
( \ \∩___∩ \\
\ \ ⌒⌒| ノ ヽ \\
\ \ / ● ● ト、\ \\\
\ Y | ( _●_) ミ\ \\\
\ / 彡、_ |∪| ノ \ \\\
(____)―ヽノ' ヽ  ̄ ̄ ヽ\\
\, j l l .l }
Lua! l (_ノノノノ
647:デフォルトの名無しさん
09/12/09 11:00:26
>>637-638
お前、なにかよさげなライブラリある度にラッパー作ってたDelphi使いの俺をなめるなよ。
さすがにもう嫌になってDelphi使ってないわ(´・ω・`) 昔は良い言語だったんだが
648:デフォルトの名無しさん
09/12/11 09:36:15
ああ、次はDelphi用Lua、Delphi用Squirrel、Delphi用AngelScriptだ…
649:デフォルトの名無しさん
09/12/12 02:30:59
ぶった斬りすいません
luaでテキストから文字を読み込んで使いたいのですが、
そのあとに文字入力のために同じ関数(io.read)を使うと文字入力できなくなってしまいます。
文字読み込みのio.readと、キーボード入力のio.readの区別をつけるにはどうすればいいのでしょうか?
よろしくお願いします。
650:デフォルトの名無しさん
09/12/12 02:34:20
>>649
651:デフォルトの名無しさん
09/12/12 05:21:19
テキストってテキストファイルのこと?
それとも標準入力?
652:>>649
09/12/12 21:22:55
>>651
レスありがとうございます。
テキストファイルから文字を取り出してluaの配列に入れています。
653:デフォルトの名無しさん
09/12/14 14:27:50
>>504-505
これってコンパイル済み(.amx)ではなくて
普通のPawnファイル(.p)も実行出来ます?
654:デフォルトの名無しさん
09/12/14 15:13:42
と思ったらPawnはコンパイル済みのしか実行出来ないみたいですね
スレ汚しすみません
655:デフォルトの名無しさん
09/12/14 19:25:17
656:デフォルトの名無しさん
09/12/14 19:26:52
Luaファイルって、配布するときに隠すことできる?
Cの組み込みで使おうと思っているのだけれど、Cはコンパイルすれば自動的にソースは見えなくなってくれるからおk。
けど、Luaファイルで記述した部分がもろばれになってしまうので、どうにかならないかなぁということです。
657:デフォルトの名無しさん
09/12/14 19:43:00
隠すというのがコンパイル後のバイナリでOKというなら、Luaもバイナリ出力することができるよ。
658:656
09/12/14 20:47:13
まじか。
URLリンク(blog.dlixia.com)
こんな感じなのか。
なんとなくだけど、Luaは簡単にリバースエンジニアリングできそうな予感がするな。。。
まぁ及第点はあるよね、きっと。
ありがとう!
659:デフォルトの名無しさん
09/12/14 23:07:40
javascriptを組み込んだらいいんじゃね?
ユーザー多いし、資料多いし。
って思ったら、処理系実装が軒並みLGPLとかMPLとか・・・・
660:デフォルトの名無しさん
09/12/15 00:00:39
スクリプト言語から離れるが、自作のファイルアーカイブクラスでメモリにスクリプトやコンパイル後のバイナリを読み込み、
そのメモリの内容をコンパイル、もしくはバイナリ読み込みするようにすればいいと思う。
661:デフォルトの名無しさん
09/12/15 00:34:42
>>659
CRIScriptとかはどうなんだ?
BSD風ライセンスらしいが
662:デフォルトの名無しさん
09/12/15 00:35:06
さげわすれた・・・・
663:デフォルトの名無しさん
09/12/15 02:36:52
CRIScriptね。
どうなんだろ、使用感を聞いたことがない。
あれ、主開発者がApple行っちゃったけど大丈夫かな、CRIなのにww
いや、すごく期待はしてるんだよ
664:デフォルトの名無しさん
09/12/15 03:14:13
SpiderMonkeyかな
665:デフォルトの名無しさん
09/12/15 05:28:35
>>652
はじめ言っていることが良くわからなかったんだけど、いまわかった。
URLリンク(www.lua.org)
When called with a file name, (略), and sets its handle as the default input file.
つまりいちど io.read でファイルを読み込むとデフォルト入力ファイルが変更されるので、
それ以降は io.read では同じファイルをさらに読み込もうとするみたい。
標準入力(キーボード)から読み込みたいときは、
io.stdin:read() を使えば良いんじゃないかな?
666:デフォルトの名無しさん
09/12/15 10:54:38
あー、もう!Pawn性能いいから組み込もうとしたけど
ソース汚くて処理系によってはエラー続出で修正必須、もうやだ
int main(int argc, char *argv[])
{
extern AMX_NATIVE_INFO console_Natives[];
extern AMX_NATIVE_INFO core_Natives[];
extern AMX_NATIVE_INFO string_Natives[];
AMX amx;
cell ret = 0;
if (aux_LoadProgram(&amx, "test.amx", NULL) != AMX_ERR_NONE) exit(1);
if (amx_Register(&amx, console_Natives, -1)) exit(1);
if (amx_Register(&amx, core_Natives, -1)) exit(1);
if (amx_Register(&amx, string_Natives, -1)) exit(1);
if (amx_Exec(&amx, &ret, AMX_EXEC_MAIN)) exit(1);
printf("%ld\n", (long)ret);
aux_FreeProgram(&amx);
return 0;
}
悪銭苦闘しながらもコンパイラ、amx 実行側のビルド完了まで行ったから試しに
サンプルコード(examples/cards.p) をコンパイルして実行してみたけど
aux_LoadProgram のところでメモリエラー起きて落ちる
もうPawn意味が分からない、資料少なすぎ助けて・・・・
667:デフォルトの名無しさん
09/12/15 10:57:56
追記
Pawn ファイルで include <###> をしていない物は正常に実行出来た
668:デフォルトの名無しさん
09/12/15 12:14:25
ドキュメントが全てpdfだったり、インストールが実行形式だったり
変なところで敷居上げてる気はするな
敷居を下げる配慮をした結果なのだろうとは思うが
669:デフォルトの名無しさん
09/12/15 12:47:31
PawnはFloat使おうとして挫折した。なんで組み込み型じゃないんだよ。。。。
670:デフォルトの名無しさん
09/12/15 14:54:37
スレタイにある「Squirrel」の読みはアメリカ英語で「スクワール」で、
イギリス英語だと「スクウィール」のようです。
671:デフォルトの名無しさん
09/12/15 15:21:23
Luaのライブラリを最小限のサイズにしたいのだけど
削っても動作に影響ないファイルとかあります?
672:デフォルトの名無しさん
09/12/15 16:48:46
>>671
パーサー部分は削った?
参考→Lua書庫内etc/noparser.c
673:デフォルトの名無しさん
09/12/15 17:42:19
最近Squirrelを始めた者です。
今、C++のクラスをバインドしているんですが、分からないことになりました。
あるクラスAがあってそのクラスのインスタンスからgetB()でクラスBのインスタンスを取得できるとします。
で、そこまでは
a<-A();
b<-a.getB();
とすることでbには[instance]が入っているのを確認できました。クラスBもバインド済みです。
しかし、そこからbにたいしてBのメンバを呼ぼうと思っても呼び出せません。以下がエラーです。
AN ERROR HAS OCCURED [the index 'draw' does not exist]
バインドするときに戻り値が何型であるかを設定する方法があるんでしょうか?
674:デフォルトの名無しさん
09/12/15 20:37:30
バインドの方法がおかしいんだろう。クラスインスタンスを返す場合は、その返したいクラスに対して sq_createinstance
して squirrel のインスタンスとしての構造を作ったものに sq_setinstanceup したものを返す必要があるんだがそうしてるかい?
675:デフォルトの名無しさん
09/12/15 21:07:46
>>674
してませんでした。> createinstance
使い方が分からん・・・
676:デフォルトの名無しさん
09/12/15 22:40:50
こんなコードにしてみましたが、違うんでしょうね・・・。だって、動かなかったですしね・・・。
static SQInteger bitmap_getgraphics(HSQUIRRELVM v){
Bitmap *b;
sq_getinstanceup(v,1,(SQUserPointer*)&b,0);
sq_setinstanceup(v,1,&b->getGraphics() );
sq_createinstance(v,1);
return 1;
}
677:デフォルトの名無しさん
09/12/15 23:30:53
Cの組み込みでLuaって速度的にどれぐらい出る?
ゲーム作ってるんだけど、1fps≒16msの間にpcall呼びまくったりしても大丈夫かな。
ざっと3000回ぐらい。
678:デフォルトの名無しさん
09/12/15 23:43:58
ソース読んでたけど、よくわからん?
sq_getclassでクラスをスタックに
sq_createinstanceでそのクラスのインスタンスを作成し、スタックへ
sq_setinstanceupでユーザーポインタをインスタンスにセット
と思ったんだが、最初のsq_getclassでどうやれば返り値のクラスを取得できるんだ・・・
679:デフォルトの名無しさん
09/12/15 23:56:21
bzr
680:デフォルトの名無しさん
09/12/15 23:57:02
間違えたぜ
681:デフォルトの名無しさん
09/12/16 01:05:04
>>678
主要なバインダには該当コードあるんだからそれを探して読もうよ。
sq_getclass はインスタンスのクラスを取得するもの。sq_createinstance をする場合に
参照するクラスはあらかじめわかってるんだから、C側で参照を保持しておくか、
あるいは global から名前指定しで取り出して使う
682:デフォルトの名無しさん
09/12/16 10:10:40
>>672
それはどうやれば良いですか?
noparser.c でググったのだけど
ファイルサイズが削れるだけの説明ばかりで
683:デフォルトの名無しさん
09/12/16 14:42:20
>>670
PCのスペックも環境も書いてないのにそんな話しても無駄だが、
最近のPCで本当にただpcall呼ぶだけなら3000回くらい平気じゃないかね。
684:デフォルトの名無しさん
09/12/16 14:43:41
>>682
コンパイル済みのスクリプトしか読ませないの前提でパーサ削除しろって話じゃないかね。
685:デフォルトの名無しさん
09/12/16 17:03:32
今更だと思うけど、luaとsquirrelのスピード測ってみたんで貼っておく
(CentOS 5.3 64bit)
処理内容の擬似コードは
ans=0
for(i = 0..10000) { ans+=i;}
for(i = 0..10000) { ans-=i;}
これを更に10000回
lua 5.1.4 10000 times ( 3.176293)
squirrel 3.0 10000 times ( 8.569499)
ruby 1.9.1 10000 times ( 20.318498)
cpp 10000 times ( 0.197799)
squirrelも十分速いと思うけど、lua速え、ルbywww
ちなみに組み込んだ際の処理系サイズ
lua 188k
squirrel 371k
ruby 5.2M
686:デフォルトの名無しさん
09/12/16 17:10:52
意味無いことを
687:デフォルトの名無しさん
09/12/16 17:18:42
下手をすると、Cでは変数が後で利用されていないと、
最適化でごっそり無かったことにされるから気をつけろ。
688:デフォルトの名無しさん
09/12/16 17:33:31
コンパイル時に計算済ませていきなり即値代入して終了とかな。
689:デフォルトの名無しさん
09/12/16 17:44:46
>>687
あるあるww
最初測ったら0秒だったよ
今回はLuaの1/15くらいだからこんなもんでしょ
あと、rubyをコケにしてるような書き方になってしまった
あれは便利さ重視だからスピードは二の次
rubyユーザーごめん
引き合いに出したのは、自分がよく使ってて、一応組み込めるから。
690:デフォルトの名無しさん
09/12/16 17:48:38
オブジェクト生成するからな。
とにかく意味が無い例であるのはたしか。
691:デフォルトの名無しさん
09/12/16 20:15:55
>>676
たぶんこんな感じかな。テストしてないので動作するか分からないけど
static SQInteger bitmap_getgraphics(HSQUIRRELVM v){
Bitmap *b;
//Bitmapのポインタを得る
//Bitmap_tagはBitmapクラスを登録したときのタイプタグ
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&b,(SQUserPointer)Bitmap_typetag))) return 0;
//Bクラスのインスタンスの作成
//B_handleはBクラスを登録したときのハンドル
sq_pushobject(v,B_handle);
sq_createinstance(v,sq_gettop(v));
sq_remove(v,-2);
sq_setinstanceup(v,-1,&b->getGraphics());
return 1;
}
BitmapとBのクラスはすでに登録されているものとしします。
ちなみにクラス登録時はこんな感じ
//クラス登録
//class_nameにクラス名
sq_pushstring(v, class_name, -1);
sq_newclass(v, SQFalse);
//クラスハンドルの獲得
//class_handleに用意したクラスハンドルへのポインタ
sq_getstackobj(v,-1,class_handle);
//クラスハンドルタグの設定
//class_tagにクラスのタイプタグ
sq_settypetag(v,-1,class_tag);
692:デフォルトの名無しさん
09/12/16 20:57:00
>>691
作りにもよるけどたいていは sq_setreleasehok 処理も必要
693:デフォルトの名無しさん
09/12/16 21:08:29
>>692
ん?sq_setreleasehookってコンストラクタの中じゃないの?
694:デフォルトの名無しさん
09/12/16 21:46:22
>>693
sq_createinstance はまさに構築済みの C++オブジェクトをラップして返すために
あるもので、squirrel のコンストラクタをよばない。
普通のコンストラクタは中で C++のインスタンスを new してるから、
呼んでしまうと余分なC++インスタンスがつくられる上に、さらに
別のインスタンスを sq_setinstanceup した時点でリークしちゃうからね。
で、よばれないから、たいていコンストラクタでやってるはずの
sq_setreleasehook は別途必要になる
695:デフォルトの名無しさん
09/12/16 22:27:12
>>694
おおっ、なるほどな。
良く見たら自分のメモリ開放できてなかったわ^^;)
696:デフォルトの名無しさん
09/12/17 00:22:06
>>691うおぉぉぉ 本当にありがとうございます!しかし、こんな風に書くとは全く思ってませんでした・・・
勉強になりました。が、Squirrelは使いづらいなと思いました・・・。
>>694
ちなみにですが、691にはどんな追記をすればいいんでしょうか?
自分は下のようにやったんですが、プログラム終了時にあぼんいたしました。
Bitmap *b;
if(SQ_FAILED(sq_getinstanceup(v,1,(SQUserPointer*)&b,(SQUserPointer)&SQBitmap)))return 0;//環境オブジェクトからBitmap*を取得
sq_pushobject(v,SQGraphics.getSQClass());//Graphicsクラスのクラスハンドルをスタックに乗せる
sq_createinstance(v,sq_gettop(v));//そのクラスのインスタンスを作成(Graphics自体のインスタンスは作られない)
sq_setreleasehook(v,-1,graphics_releasehook);//一番上のインスタンスに解放関数を持たせる?わからない
sq_remove(v,-2);//クラスハンドルを削除している?
sq_setinstanceup(v,-1,&b->getGraphics() );//実際にインスタンスにGraphics*をセットする
なんか、他の部分も怖くなってきました。リファレンスだけじゃわかりませんね。
697:デフォルトの名無しさん
09/12/17 00:34:19
>>685-689
Rubyて感覚的には30分走らせる代わりに10分でコード書く。C言語は1時間でコードかくかわりに1分で走らせるとか、比喩があったなw
698:デフォルトの名無しさん
09/12/17 09:54:34
C言語と30年戦う代わりに1年で味方につけるべきだったな。
699:デフォルトの名無しさん
09/12/17 10:16:12
AngelScript|Д゚)ジー
700:デフォルトの名無しさん
09/12/17 11:05:57
>>696
記述自体はそれであってるけど、sq_setreleasehook するのは sq_setinstanceup が成功したのを確認した後でしょう。
終了時あぼんは、そりゃどっかプログラムが悪いんだろうとしか言えない。
その b->getGraphics() でとった Graphics が勝手に独自に解放されて大丈夫な構造で作られて
ないのなら setreleasehook してはダメ、って、&つけてるってことはメンバ変数か。それはダメかも
C++で管理を単純化するために、親が責任もって解放してるので、子オブジェクトは
ポインタ参照したあともそのまま放置したのでOK、という書き方は実際よくあって、
そういったものをsquirrel に移すときは、子オブジェクトにポインタ渡してオブジェクトとして
作るけど sq_setreleasehook はしないという書き方にする必要がもちろんある。
親が先に死んだ状態で子をさわるとポインタ腐ってるのでクラッシュするけど
それはそういうもの。squirrel は機構は提供してくれるけど、自動で判断してくれるわけでは
ないから、あくまで C++ 的に破綻しないように注意して書く必要がある。
そういうのいやならオブジェクトを全体的にリファレンスカウント
方式とかで管理するようにするしかない。
そして循環参照トラップにはまるw
701:デフォルトの名無しさん
09/12/17 11:44:13
循環参照嫌うなら弱参照系ないしはGCの実装が必要
もっとも、squirrel 自体がリファレンスカウントもGCも弱参照ももってるから、
既存ライブラリを持ってくるのではなく最初から書くのなら、C++ 側を
squirrelの機構にべったりのっかるように書くという考え方もある。
個別のオブジェクトはごく単純にバインドするようにして、C++ 側でオブジェクトの親子構造を持つ場合は、
C++そのもののポインタではなく、squirrel のオブジェクトを一旦作ってそれを HSQOBJECT で持つようにする。
さらには、配列や辞書が必要なら、STL とかを使うのではなく、squirrel の array / dictionary を使う。
C++ 側で元のオブジェクトを参照する場合にも squirrel の機構を経由する必要があるので一手間増えるけど、
squirrel に値を返す時は持ってる HSQOBJECT を sq_pushobject するだけになるからとても簡単になるし、
オブジェクトの寿命管理も squirrel 側になるから、いつ誰が破棄しても安心
702:デフォルトの名無しさん
09/12/17 14:23:49
>>700
あー、やっぱり、新しくインスタンス作ってるんじゃないんならsetreleasehookはいらないんですね。
なんか中で気持ち悪いことやっててGraphicsインスタンス作ったつもりはないのに解放関数与えないとダメなのかと思いました。
(ソース読んだ限りではそういう記述が無かったので、疑問には思ってましたが・・・)
あとは、終了時あぼんの原因を探れば動きそうです。ありがとうございました。
ていうかBCC5.5ってテンプレートが弱いからSqPlusとか使えないんですね・・・。メチ不便
703:デフォルトの名無しさん
09/12/18 15:54:55
xtalの新verが出てる。
デバッガー早くできるといいな。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4274日前に更新/247 KB
担当:undef