HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
1207
tds12HSPのガベージコレクション対応について9解決


tds12

リンク

2016/12/7(Wed) 16:12:03|NO.77465

ガベージコレクション(GC)とHSPについて、
私の考えるGCをランタイムに実装してみました。

https://www.dropbox.com/s/smwuf9p27pr28nd/hsp3gc20161207.zip?dl=0

モジュール型変数の、追加・代入・削除のときに
参照カウンタを加減し、参照カウンタが0のとき
モジュール型変数の解放を行います。
GCに任せるモジュール型変数は、
gcnewmod命令によって追加されます。
引数はnewmodと同じです。
モジュール変数の定義にも違いはありません。
GCに任されたモジュール型変数が代入されると
その変数もGCに任されます。
GCに任されたモジュール型変数を
varuseすると3が返ります。
newmodしたものは従来通りに動作します。
FlexValueを書き換えるものは、
問題が起こる可能性があります。

他の言語のGCは意識して使ったことがないので
合っているのかわかりません。

みなさんにとってGCとはどのようなものですか?
またHSPに実装される場合、どのようなものが
よいと思いますか?

問題点や希望、思い出等を集める雑談スレッドとします。
ある程度まとまればhsp-devMLで提案しようと思います。



この記事に返信する


Y_repeat

リンク

2016/12/7(Wed) 20:19:00|NO.77473

GCは誰か作ってて 結局、不採用でしたよね
自分はRPGツクールでruby書いてる時 こういうデータ削除されたらどうしよう。
と思いながらやってました

でも今回のGC案はGCの対象を選べるみたいで あってもいいのでは?とか思ったりw
でも書いててある前提で書いて 途中でなくなってたらどうしよう?とは思います
(自分でGC対象にしてたとしてもw)

自分でGC対象にしていながら あると思って書いて削除されてた時は
どうするか?解決されないとGC対象にして欲しくないですな
自分GAMEにしろTOOLにしろ大きいの書いたことがないので
GCはいい機能だと思いますが 使わないような
でも自分で選べるなら そういう僕の意見と対立しない気はします



zakki

リンク

2016/12/7(Wed) 21:44:02|NO.77479

fujidigさんの実装はRubyのmark & sweepベースでモジュールのリファレンスを扱えるのが便利そうでしたね。



tds12

リンク

2016/12/7(Wed) 23:21:56|NO.77482

現状の「クローンで参照しているのに消える」のが解消され
気づかず削除されているのは今より減ると考えていますが、
裏技の多いHSPでは何か問題が出るかもしれません。
通常の代入のみなら問題ないと思います。

>fujidigさんの実装はRubyのmark & sweepベースでモジュールのリファレンスを扱えるのが便利そうでしたね。
fujidigさんのopenhsp-gcという実装があったらしいことは知っているのですが、
今となってはソースコードも実行ファイルも見つからず、
私にとっては謎となっています。



掘木

リンク

2016/12/8(Thu) 00:27:01|NO.77483

GCといいますか、C++のshared_ptrに近い感じですかね。

従来は生成時の変数と強力にバインドされていましたから、
swapするだけで黒魔術的なコードを強いられる状況から打開と考えると大きな進化と思います。

実際に落として動作させてみましたが、
どうにもダングリングポインタを生み出していたり、単に置き換えで動かない状況であったりの様子。
(もともとダングリングポインタ生み出していた機能だけあって仕方ないですが)
参照カウンタが思ったように動作していない可能性が高そうです。
あと、delmodの動作仕様のおかげで異様に面倒なことになっていそうです。



おにたま(管理人)

リンク

2016/12/8(Thu) 22:24:51|NO.77509

興味深いご提案、ありがとうございます。
HSPでは、グローバルな変数や固定されたメモリバッファが多いため、通常のスクリプトはGCがそれほど活躍しない印象なのですが、クローンやモジュール変数を多用する場面においては、確かに有効だと思います。
メモリの確保と解放を効率良く行なうという意味では、HSP内部で行なっている変数バッファの管理(strbuf.cpp)も広い意味でのGCにあたるのですが、
大きなメモリ確保(supio.cppのmem_ini)なども含めて、GCが管理して、不要なメモリの解放などは別スレッドで行なうなどの実装にすれば、高速化にはつながりそうです。



tds12

リンク

2016/12/14(Wed) 17:41:44|NO.77574

更新しました。
https://www.dropbox.com/s/l7xm5xqh6bt6f0s/hsp3gc20161214.zip?dl=0

掘木さん、動作確認ありがとうございました。
今回で修正できたと思います。

おにたまさん、返信ありがとうございます。
私のGC対応では、モジュール型変数のみを対象としていて
スクリプト上での効果を期待しています。
内部のC++で書かれた部分での対応については
関係していないので、今回とは少し異なっていそうです。

また、よろしくお願いします。



掘木

リンク

2016/12/17(Sat) 00:29:47|NO.77599

試してみました。

#include "hspgc.hsp" #module test #deffunc chkStr str comment,str expect,str result if ( expect == result ){ mes " ○ " + comment + " : " +expect }else{ mes "[!]" + comment + " : " +result + " ( 期待値 " + expect + " と違う。)" } return #global #module mm1 name #modinit str s name = s return #modcfunc GetName return name #global mes " とりあえず作成" gcnewmod a1,mm1,"A" gcnewmod b1,mm1,"B" chkStr "結果[A]","A",GetName(a1) chkStr "結果[B]","B",GetName(b1) mes " swapしてみる" temp = a1 : a1 = b1 : b1 = temp : delmod temp chkStr "入れ替わった?[B(a)]","B",GetName(a1) chkStr "入れ替わった?[A(b)]","A",GetName(b1) mes " メモリの死活チェック" gcnewmod temp,mm1,"C" gcnewmod temp,mm1,"D" chkStr "変化なし?[B(a)]","B",GetName(a1) chkStr "変化なし?[A(b)]","A",GetName(b1)
うーむ…swapは不可能っぽい?無念。
こちらの環境では死活チェック前にエラー落ちしてしまいましたんでダングリングポインタが
解消しきれていない模様。既存のモジュール機能が何かしらの悪さをしている可能性。



tds12

リンク

2016/12/17(Sat) 14:45:09|NO.77603

ありがとうございます。
修正しました。
https://www.dropbox.com/s/29arbtdisau2kh4/hsp3gc20161217.zip?dl=0



tds12

リンク

2017/6/7(Wed) 18:53:37|NO.80143

すみませんが空投稿です。
更新するつもりはあります。
お許しを。



ONION software Copyright 1997-2018(c) All rights reserved.