ADVエンジンとDSLについての考察

言語内外DSLについての説明もされていたので、ついでに。 セーブロードの煩雑な処理とセーブポイントの管理のため、言語外DSLを適用したとのこと。
0
中田吉法 @ynakata

@naokitakahashi 「言語内DSL」というと、元になるプログラミング言語があったときに、その言語の構文等をそのまま利用しつつ、記法・関数類を追加することで目的特化言語を作り上げていくようなスタイルのことを指しますね。RubyベースのビルドツールRakeとかが例です。

2011-12-20 15:59:57
end_NTak @end_NTak

@ynakata む、するとスクリプト言語の上で別のスクリプト言語を実装して走らせるのは言語内DSLとは違うんですかね。ちょっと間違って理解してたかも。

2011-12-20 16:00:57
中田吉法 @ynakata

@naokitakahashi はい。元言語とDSL構文が混ざったものを実行する場合が「言語内DSL」ですね。元言語でスクリプトエンジンを作り、その上でDSLを動かす場合は「言語外DSL」と言います。

2011-12-20 16:02:46
end_NTak @end_NTak

訂正。言語内DSLの理解ちょっと間違ってたかも。LuaでBASICインタプリタを実装するようなのは言語内DSLとは言わないかもしれない。

2011-12-20 16:01:54
end_NTak @end_NTak

こういうのは「言語外DSL」というらしいです。んー、削除して訂正しようかなあ。

2011-12-20 16:04:27
end_NTak @end_NTak

せっかく教えてもらったのと、twitterとはいえ間違った情報残しちゃまずいと思うので、削除して訂正することにします。ついでにちょい考察書き足し。

2011-12-20 16:05:59
end_NTak @end_NTak

(訂正再投稿)こういうシナリオ演出とシステム記述の二重構造のスクリプト言語は、ADVのゲームエンジンでは昔から使われてきたわけだけど(吉里吉里とか)、最近は「DSL」(ドメイン特化言語)というらしい。

2011-12-20 16:18:29
end_NTak @end_NTak

ところで、DSLの文法とスクリプト言語を行ったりきたりしていると文法の把握が大変なんだよね。たとえば今やってるのは旧スタイルのBASICとLuaだから、IF文の最後のENDのあるなしとかでたまにミスる。ちなみにC++を触るときはLuaと混じってTHENか{}かでミスるw

2011-12-20 16:18:49
中田吉法 @ynakata

LISPはその言語仕様ゆえ、普通に使うだけでどんどん言語内DSLを拡張しながらプログラミングしていく、というスタイルに行き着かざるを得ないという点で特異的な言語です。Luaは言語実装が薄く理解しやすいので拡張Luaを作りやすい、というところにメリットがあります。

2011-12-20 16:04:44
中田吉法 @ynakata

言語内DSLは、しばしばシームレスな(文法の)拡張を行うために裏側で数々のトリッキーな実装を行わざるを得なくなって、拡張機能部に余人が手を出せなくなる、という弊害が発生すると思っている。

2011-12-20 16:18:20
end_NTak @end_NTak

俺はともかく世間の非プログラマのユーザがこの二重開発をできるかは微妙だなあ。DSLとしてはちょっとリッチすぎたのかもしれない。BASICは。とはいえアセンブラじゃ足りないし、LISPじゃユーザがついてこない。難しいなあ。

2011-12-20 16:19:08
end_NTak @end_NTak

DSLには言語内DSL(ホスト言語そのものの構文拡張でDSLを実装しているもの)と、言語外DSL(ホスト言語で書かれたプログラムがDSLのコードを実行するもの)があって、SGEの実装は後者だが、なぜこうしたかというとホスト言語であるLuaにはセーブポイントの管理機能がないから。

2011-12-20 16:19:58
end_NTak @end_NTak

ADVエンジンで必要になるセーブ/ロードの煩雑な処理、セーブポイントの管理を自動化するために、そういう設計のスクリプト言語が必要であり、すると言語内DSLでは無理だった。それさえなければ単にむき出しのLuaか、BASICとLuaのトランスレータでよかったので楽だったのだが。

2011-12-20 16:22:12
end_NTak @end_NTak

いや、どっちかというとLuaがリッチすぎるという話かもしれないが。ただ、このリッチさに助けられてる面はもちろん大きいから仕方がない。しかし商業で俺がスクリプトを請け負ってやってる分にはなんの問題もないのだが、一般公開用にはこの構造の多重性は敷居の高さにつながるかもなあ。

2011-12-20 16:25:37
end_NTak @end_NTak

シナリオ命令のほうをシンプルなたとえばHTMLっぽいのにしてインタフェースはプログラマがLuaで書くって実装もありえたのだが、NScripterの使われ方を見ている限りでは、インターフェイスまで非プログラマが弄れる言語でないといけないので、ある程度の汎用性はやはりいるなと。

2011-12-20 16:32:12
end_NTak @end_NTak

すると、やはりBASICの完成度を高めて、ほとんどの需要はBASICでコードを書けば足りるようなものにしておく必要があることになるなあ。まあ、この方針で開発すれば出来そうだが。独立性が高くて速度が必要な、たとえばミニゲームなどのモジュールを組むときにLuaに戻る程度か。

2011-12-20 16:34:29
end_NTak @end_NTak

スクリプト言語でインタプリタなんて遅いんじゃないか、とお思いの方もいらっしゃるかもしれませんが、たぶんLuaコードによる構文解析とNScripterの構文解析と比べたら、SGEのほうが少し早いかもしれないくらいだ。Luaが速いのもあるがむしろNScripterの構文解析が遅い。

2011-12-20 16:38:46
end_NTak @end_NTak

もっとも、今のマシンで構文解析の速度が問題になってしまうようなコードをそもそもインタプリタで組むべきではないけども。バイトコピーのために何万のループをまわすみたいなコード書かない限りまず関係ないし、そういうことをしたいならC++で書かれた関数を呼び出すべき。

2011-12-20 16:41:10