将棋ベーシック改におけるnewの扱いが大雑把な件

UIエンジニアはメモリの確保newとメモリの開放deleteを常にセットで意識せねばならない。

これは俺がプログラマになった1998年頃に市販のマシンのメモリが128MB程度で、それを超えたメモリはOSの機能でページファイルとしてHDDに書き込まれたからである。

UIと言っても基本はマウスで扱える画面のこと。黒い画面に字の出るCUIベースのシステムをウインドウズのように画面をマウスポインタで操るGUIに書き換えていくことはその次代に大企業の内製システムをパッケージソフトとして顧客のパソコンで使えるようにしてゆく工程において必須の仕事でありながら、C言語の機能だけでなくOSであるWindowsAPIなどを利用するのが通例で、専門性の高い仕事であった。

パソコンが使える人にはCUIで片付く仕事でも、パッケージにして売るとなると画面にいかなる操作を加えられてもパソコンがおかしくならないように堅牢性が求められる。従って、一度出せば用が済む画面でも出したり消したりされることを考えると、出す時に確保したメモリは画面を消す時に解放して、お客さんがポチポチと画面をいじって遊んでいるだけでパソコンのメモリを食いつぶしてHDDまで満杯にしてしまうようなソフトは許されなかったのである。

そんなことのためにnewとdeleteが操作に別々に対応していても把握しきれるプログラムの仕事というのは大変に難儀であった。

しかし時は2015年。俺の使っていたlenovoのWindowsVistaのマシンで遊びで作ったのが将棋ベーシックである。この頃になるとVBが進化して、VCによる綿密なメモリ管理をしなくても適当に作ったら動くものが出来るようになっていたのだ。実はWindows95のVB5あたりでもそうなのだが、システムを作り込むにはメモリや計算速度の面で不安はあった。今でも将棋の強さだけで比べると最新のソフトよりは弱い将棋ベーシック改ではあるが、多くのソフトがエンジン部のみでUIをフリーソフトの将棋所に頼っている現状、UI部分をVBで3日程度で作れたのは開発におけるVBの生産性の高さを示すのに有用であったと考えている。

それが、そのままVBで思考エンジンを実験的に作ってみて、VBの機能を全て知らないままガベージコレクタに頼ってnewした指し手クラスをdelete(VBなので正確にはDispose)しないまま放っていたら、本体が50KB台なのに計算を走らせるとマシンのメモリをすべて使うようなプログラムになっている。

これはもしかしたら計算中にメモリを食いつぶしてHDDのページファイルへの書き込みが起こっているから終盤に重くなるのではと思ってみたのが今日のこと。まあ、フォーム1個のアプリでxボタンで消せばメモリは全て解放されるのであるが、これを将棋の指し手探索が終わるたびに指し手で確保したメモリをちゃんと解放するように修正できたら、もっと快適に相手の指し手が速く返ってくるアプリになるかなと考えている。

しかし、会社業務でもないしお客さんからクレームが付いたわけでもない。しかもAI将棋トーナメントでの戦績とかもあんまり変わらないだろうと思っている。それなのにわざわざメモリ解放の地獄のようなデバッグに取り組むのは我ながらマゾい仕事だなと思ってためらっている。

まあ、マシンをハイスペックに買い換えるとお金がかかるので、このマシンに合わせた最適化をして遊ぶのと、PS5の時代なのにPS2マヴカプ2で新しいコンボを探して遊ぶのと、ぜんぜん違うことではあるけど、何らかの親和性を感じたりするのであった。


🄫1999-2023 id:karmen