GREE勉強会「ニコスクリプト言語の実装と進化〜ActionScript上での言語処理系実装〜」

ドワンゴで去年2ch採用された藤田 俊 君の発表。
こういったプレゼン自体初めてだったそうです。
なのにいきなり大勢の社外の人間の前でやらせるドワンゴの社風が素敵。
とても緊張していたものの、話の内容はちゃんとわかった。


勉強会後の懇親会やハシゴして行ったnipotan nite二次会で言語についての話をしたり、
テレ朝でCGを作っている方とTDDの話をしていたら、
だいぶ刺激を受けたようでえらい元気になっていました。


以下、勉強会まとめ

ニコスクリプトとNiwaScript

3つのモジュール

(上位レイヤ)ScriptPlayer Iroha NSPlayer(下位レイヤ)

  • NSPlayer…NiwaScriptの処理系
  • Iroha…聴き損ねた。ニコスクリプトからNiwaScriptへの変換だっけ?
  • ScriptPlayer…描画を行う

NSPlayer

  1. 動画上での時系列順に計算が行われる
  2. それをもとに各時刻での変数の状態が決定される
  3. 動画再生、シークバーでの移動によって到達した時刻での状態に基づきScriptPlayerが描画する
  • 時系列上の未来の状態は過去の状態に影響を与えないので、シークはプログラミング言語におけるGoToにはならない
  • 新規のニコスクリプトコメント等が入力されると再計算する

バージョンアップと改良

NSPlayer2

特徴

  • 動画の時間に対応したスナップショットを持っている。

デメリット

  • 新しいスナップショットを作るときに前回のをすべてコピーするので重い
  • 時系列全部のスナップショットを持っているのでメモリを食う
  • スナップショット作り直しのコストが大きい(変更があったらそこ以降全部変更するから)
rev1

特徴

  • メモリ全体はコピーせず、変化があった変数とその内容だけ記録
  • 変数の差分を足していくことで、その時刻での状態を構成

デメリット

  • やっぱりスナップショットの作り直しコストは大きい
rev2

特徴

  • rev1+スクリプトの影響を受けた変数のリストを持っておく
  • スナップショット作り直しのときに影響を受けた範囲だけで作り直す
  • NiwaScriptをAVM2のバイトコードに変換して効率を上げる

質疑応答

Q1:自前でパーサを作ったのかActionScriptのeval等で実行しているのか?
A1:evalは使っていない
Q2:各時刻における状態は決定されていなければならないので、ランダム要素は導入不能だと思うがどうか?
A2:ランダム要素は今後も導入しない