九条の会 2020/05/17 12:00

メモリの軛から離れ、まず紙に書こう(ブロマガでエミリアさん用コラム)

このメルマガは、エミリア氏のci-en
https://ci-en.dlsite.com/creator/1091
へ投稿したコラムです(ログ)
*後々感想ブログに載せる製品版感想の下書きはここに置かないが、コラム的なのは転載するのだ


数週前くらいにエミ長(エミなが、エミリアが何か賢しこめの事を言った時はこの扱いになる)
が、ウディタでは取り扱えるデータ構造が甘い、これからはHSPやなどと断じていたが、
自分も10年前にHSPで鱗補集機なんて物のを作り、
当時窓の杜に、万雷の拍手で持って取り上げられた身。

“目から鱗”と思ったことを記録・蓄積「鱗捕集機」
https://forest.watch.impress.co.jp/docs/serial/okiniiri/341924.html

「九条ちゃんはなんや、もう構造体とかはやったんか?(*HSPは構造体を取り扱えない事を調べた上で言う)」
などと遠い親戚のじじい風にエミリアを詰め、
日頃の鬱憤を晴らすなどしていたし、
ウディタのDBはある意味でHSPのデータ構造よりは優れてる気もするがなあ、などとは思うのだが、
それはさておき、データ構造である。
コイツが甘ければプログラムのフローにて肩代わりする部分が増え、
結果的にコードは冗長になりエラーも増えるという事が、111も少しずつ痛感して来ているのである。

最近は(最近でも)
[7つの世界 7つの言語]
https://www.amazon.co.jp/7つの言語-7つの世界-Bruce-Tate/dp/4274068579

のPrologの章を読んでいて、これは1972年という昔の人工知能ブームの頃に作られたプログラム言語だからか、
最近の傾向とはちょっち違う、
具体的には推論ベースだという。
すなわち、正しく定義されたデータがあり、そのデータに適応するルールさえ書いて
結果を聞けば、後はコンピューターが返答して来るのだという。
そこには論理学の様なベースがあって……、要は

・AはBである
・BはCである

ここに問う、今定義したDは、Bであると言えるのか? などとね。

こんな単純な関係であれば人間でも即時に把握できるだろうけど、
この○○は○○である式であっても、これが100くらい超えると人間は全然判断できなくなり、
そこでPrologに聞いてみると、あ、そうなるの? みたいな意外な結果が帰って来て面白い、という次第らしい。

なんだか凄そうだが、「データベースに(条件を絞り込む)問い合わせを行う、SQLに近い考え」みたいな風にも書かれていて、
あ、なるほどね、と頷いたり。
(*ニコニコのコメントも、ブログの記事も、たぶんTwitterの1ツイートも、webの重要なデータは
ほぼぜんぶDBに格納され、それをSQL系のあれこれで候補を絞り込んで表示している)

事ほど左様にプログラムにとってデータをどう扱うかは一つの大きな関心事だし、
ゲームなどにとっても極論、データ、データこそが重要だ、という
ネコリア(エミリアを可愛がりたい時に出現する概念)の結論も、なるほど、分からなくはねえわな。

そんな折に111は(ブックオフで手に入れた)

SoftWareDesing 2017年12月
https://gihyo.jp/magazine/SD/archive/2017/201712

を読んでいたのだよ、この号は題して「ITエンジニアと数学」なのだが、
そこで目を引かれたのがなんだかオカルトみたいな話、
「読むだけで終わらせず、紙にちゃんと書くこと」
であった。
書く事で実際、理解度が全然違って来るらしい。
数千年前から今まで、常に文明の先端であり続ける数学、
現代をもってしても昔となんら変わらぬ「紙とペン」が重要とは。

そして最近IT界隈ではナウイと評判の? 関数型言語などにも触れていたのだが、
ここも衝撃であった、
関数型言語なんて全然最新じゃねえ、
それは我ら数学が何百年前に通った道を、ただ不自由なコンピューター上でやりよるだけじゃ、と。

……要は思考というものが脳から生み出され、生み出されるが故に
人間の肉という牢獄に閉じ込められてるようにだ、
制約から放たれ、極めて純粋に「思考」に近い物こそが一番貴いのだ、
その点で言ったらプログラム言語などは、まぁ他と比べて関数型言語は幾らかマシだが、まぁみそっかす。
数学こそがオリジンであり純粋、絶対的に上。
というスタンスであったのだ。

これはかなり衝撃であって、だってコンピューターの方が
紙とペンよりもパッと見、絶対最先端ぽいじゃないですか。
でも違う、コンピューターの方がずっと「有限」であると。
プログラム言語は、制限を設けなければコンピュータのアーキテクト上、どうしても互換性が取れないだろう、
だが、こと自分が紙の上に書く限りは、圧倒的に自由なのだ。
(より”空想的”と言えるかも知れない……)

なんてことはない、例えばプログラム言語に言う、Intという数値型は大体20億くらいが扱える最大値だし、
仮にその上のlong型なんてのも、最大値は9223372036854775807まで。

こんな20桁の数字など、ノート上に1を書いて、そのお尻に0を書き連ねていけば、すぐに追い越せるものだし、
もっと小さい話、1を0で割ってごらん、出来ないだろう?
どうして出来ないか分かるかい?
それは「数学」がそう決めたからだよ。コンピューターでは無く。

そのただただ「空想」加減に、プログラム言語は追い付けなかったりするのだ……

ウウム、つまりそれはこういう事だろう、
”計算”ならコンピューターが速い、
だが”想像(の果ての、定義?)”なら、人間の頭の方が遙かに自由である。
これは一般的な認識に合う気がする。

……で遠大な話からまた手元に戻るのだが、
さて、エミ長が問題にしている「データ構造」は、”計算”か”定義”か、という事なんだよ。

定義されたデータを実際に処理させるのは、CPUにやらせるとしてもだ、
その前、どういうのが良いのかな……と考える段には人間こそが最強なんじゃねえのか。

いやゴメン、思わずエミリア氏に説教する形を取ったのだけど、これはここ一ヶ月の自問自答だったのだ。
ここ一月、既存コードのリファクタリングに頭がパンパンになってた111、
とにかく”徹底しなければ”と思っていたのは、
データ構造を外部に全て切り離す、切り離さなければ、という事であった。
経験から、これは変更や保守しやすいプログラムになる、と。
確かに途中までは良かった。
だが今では完全にやり過ぎではなにか、どこかから、データにしなくても良いものまで
含み始めたのではないか? その暗中模索に居たのだ

ある時、111の頭に色々な知識が去来しては錯綜する

データとフロー、
「型はイイが、型付けはイタイ」(このコラムで二ヶ月前に書いたこと)

Rubyの作者である、まつもとゆきひろ氏が割とカンファレンスなどで
静的言語方面の機能を期待されながらも(そっちの方がビジネス規模はでかいので、望まれやすい)
あくまで動的言語の力を信じ、軽妙さというものの力を信じる態度。

動的言語には、やはりそれをやる理由があるはず。
いつからそんな拗ねた態度になりやがった?
動的言語という一つの世界、そのちからを、しんじろよ!
(もっと分かり易い例えで言うと、日本語は主語が無くても成立する分、分かりづらい、
不完全な言語である、などと主に英語属から言われたりするが、
では日本語は英語より劣った言語なのか?
日本語の得意なところ、日本語でしか表現できない所があるのではないか?
逆にこの世に、全ての長所をカバーする言語などという物はあるのか? という感じだ)

大体そういうデータを徹底的に切り離すってのは静的言語……、Javaとかと相性良いと思うんだよ。
相性良いって事は、そういう機能も備わっているんだろ。
でも俺がやってるJavaScriptは動的言語で、
動的にも関わらず、”固定されたまま”が特徴であるデータ構造に固執する、これは悪手じゃないのか?
動的……とは。
プログラムがコンパイルに入った段階ではまだ確定されない、という事で、
つまり”コードが動きやすい”という事なのだ、即ちプログラム・フローの方が得意なのではないか。
時にプログラムのコードがデータを示す時もある、
言語ごとの制約を考えると、あながちそれを嫌った物では無い。
要は塩梅次第ではないのか。
全てをデータだか、コードだか……どちらかに徹底しなければと堅くなってる事が視野狭窄、
プログラムをあかん物にしているのではないか。
全てを理想通りにはやり切れず、ただその時々の、比較的スマートなやり方があるだけでは?

データ構造を外部に持った方が保守しやすいという”基本”があったとしても、
もし同じ構造をプログラムなら、10分の1くらいの短さで記述できるとしたら。
これもケースバイケースよ、って話だ。


結局、最近自分がゲーム制作でやってるのは、
「あ、ここは”想像”の部分だな」と思ったら、まずノートに構造なり、設計なりをペンで書く、
とにかく書くのだ、という事です。

どういう画面構成で、その一つ一つのボタンなどのパーツにどういう関数を設定して、
その結果データ構造にどう作用し、どういう構造が相応しいのか。
これをかなり意識してやってみると、
そもそもなんで、俺はあのコードという狭っ苦しい物に睨めっこして考えていたのだ、
肉という軛があったなあ、
紙に好きに書いて消せる(あるいは残す)方がずっと安心だし自由だ、と割と上手く行ってる気配を覚えるのでした。

結局色々考えて一周、普通やんけ……と思われるかもですが、
これは結構大きな、キテる感がありまして。
というのは、より良い物を作ろうと堅く考えて動けなくなるのは下策、
でも何も考えずにやるのも深みが無い、
とどのつまり、考え抜いた後に適度に脱力した、軽い考えに至る。
これが一番良い気がするんだな。

世の職人とか、「要するに、こういう事だな」を分かる為に、
だいぶ苦労してる所があるのじゃないの。

割とこれは良い状態なんじゃないか。
結局リファクタリングは止めてイチから制作してますが、
今作ってるものが年内に完成できたら、これは目に見えて、自分としては成功な、軽妙さを得たと言えると思う。

こんな事を一つ一つ見付けて、ゲーム制作を捗るようにしていこうとしてる。
何もかも遅いな君は……、でも進んでいる。

この記事が良かったらチップを贈って支援しましょう!

チップを贈るにはユーザー登録が必要です。チップについてはこちら

月別アーカイブ

限定特典から探す

記事を検索