最新

おおいわのこめんと (2009-07)


2009-07-01

[Comp] [Security] PGP 鍵更新

1年ほど前にいろいろ考えて OpenPGP の新しい鍵を作った のですが、そろそろ自分の設定した「1024bit 旧鍵の引退日時」まで半年となったので、 自分の署名に使うデフォルト鍵を 新しい 3072bit の鍵 (ID 440546B5) に切り替えた。 というわけで、皆さんお手数ですがこの 新しい鍵を 鍵リングに加えて下さるようお願いします。 旧鍵は 2010年1月1日 に無効になりますが、それまで僕宛メールの暗号化には引き続き使えます。

新鍵には旧鍵で署名がある他、おそらく今現在でネット上の皆さんにとっての「おおいわは誰?」という実在認識で 一番強固なのは多分「産総研の大岩」だろう*1ということで、職場の個人用Webサーバから「HTTPSで」 取れるようにしてあるので、安全な方法で確認して入手して下さい。

*1 東大とか昔いたサークルとかはともかく、oiwa.jp で実在の僕とリンクしている人は少ないと思うんですよね。肝心の oiwa.jp について確認のしようがほとんど無いですし。一応 Mozilla Firefox だったら HTTPS でこの記述を確認することはできますが、所詮 Class 1 なので本人認証はされてません。基本的にこのサーバの暗号化は自分用+αなので。以前 Class 3 取ろうとしたんですけど、個人で取ろうとすると強固に「個人」の連絡先と結び付いちゃってやりづらかったんですよね。


2009-07-09

[Work] 開発中

Fail-Safe C の実行速度を向上させる方法を考えて悩む

当然ながら静的解析で頑張って性能あげる方法を思いつく

実装方針を考えて論文の Future Work に書く

「でも実装めんどくさいなぁ」(他にも trade-off があって悩ましい)

PLDI に論文が通ったのでダブリンに行く

人の発表を聞く

「前のより大分実装が楽な最適化のアイディアを思いつく」

日本に帰ってくる

いない間に積み上がった仕事に追われる

やっと合間を見つけて実装に取り掛かってみる

「前に実装を手抜き思いつきでやったところが構造悪くてうまく解析できねぇ……」

解析なしで実装してみる

やっぱり思うように効果が出ない

「やっぱり実装直すしかないかー」←いまここ

というわけで、PLDI の発表が終わってコードを派手に書き換えられる状態 (多少手元のコードが一時的に動かなくても構わない状態)になったので、 新しく手元ブランチを切って実装のリファクタリングを始めている。

今のFail-Safe Cのコードは、前半は割としっかり考えて実装してあるのだが、 後半はまぁ D 論書くために突貫で実装しなきゃいけなかったと言うのもあって、 実行時のコードの方(安全性の保証手法)はちゃんと設計したけど、 コンパイラ本体の実装の方は結構場あたり的なコードになってしまっている。

現在の後半部分の実装は、せっかく一度 SSA(単一代入)変換したコードを、 内部データ構造上非SSA形式に戻してからコードの変換をかけていて、そのせいで

  • 変換段階のコードで値の分岐/合流が正確に追えないため、 せっかく前段階でSSAに変換しているのに解析にほとんど使えない
  • 次の段階の出力Cコード生成が「SSAを中途半端に崩したコード」を 仮定していて美しくないうえ、 他にもいろいろと dirty でその場限りの細工が入っていて 入力コードへの隠れた前提条件が山ほどあり、 ちょっと間違えるとすぐ正しくないコードを吐くため メンテ性が著しく悪い

といった状態になっている。さらに、突貫工事で実装したこの変換フェーズでは 出力で使う内部関数の名前がべたべたと埋め込まれていて、 見通しが良くないうえに64ビット対応の障害にもなっている (ソースからは書き換えの必要な範囲がうまく見通せない)など、問題山積状態。

これは、コード変換の途中で条件分岐命令を挿入した時にSSA形式が壊れ、 出力に同一変数への複数代入や Goto のある命令列を許さざるをえなかった のが大きな理由の1つ。あとは、 SSA の状態で全部解析しておけば、あとは逆変換時にその情報をもっていって 変換フェーズで使えば十分だろう、という前提で実装したのが甘かったところでもある。 今回は変換フェーズで増えた一時変数を使い、そこで解析しながら 同時にコード書き換えないといけないので、今の設計ではちょっとまずい。 まぁ前から自分でもいらいらしていたところなので、 えいやっとこの機会に書き換えてしまおう、というわけ。

Fail-Safe C の内部には何段階もの中間言語があって、最も初期の実装で IL0, IL1 があり、前回の公開直前のリファクタリングで SSA 変換の部分を 新中間言語 IL2 に置き換えたところなので、今回はまず とりあえず新しい中間言語 IL3 のスケルトンを作って、 今の出力変換フェーズの出力先をその言語に書き換えている。 *1

以前と大きく違うのは、ここ数年の実装で動作テスト環境が非常に充実して、 大抵の実装誤りでは make test が通らないような状態になったので、 今回はコードが動く状態をできるだけ維持しながら、make test で 壊れていない事を確認しつつ書き換えを進めている。 ちょうど道路の改良工事のように、少しずつ新しいバイパス道路を作っては 旧道に迂回路で繋げて、流れは常に維持しているような感じ。 コードの規模が大きくなっているため、一度バグを作り込むと直すのが大変そうなので、 迂回路工事の分だけ表面上の実装量が増えても、 トータルで効率が高くなるだろう、という判断。精神的にもそのほうが楽だし。 全部が新道 IL3 に置き換わると、大分流れが良くなるはず。

あとは、「型チェックが通れば正しいプログラムになっている」 (間違えていたら型が合わなくなる)ような書き方をできるだけして、 OCaml のコンパイラの型チェッカを高機能な「書き換え箇所検索機能」 として使ういつも通りのやりかたでサクサクと作業中。 ついでに、64ビット化を想定して型情報の取り回しも少しずつ改善している。

とゆーわけで、このリファクタは多分1月もあれば終わるんじゃないかな、 と思っている。実際に性能が上がるかどうかは全部やってみないと判らない *2けど、 64ビット対応のためのコンパイラ側の準備はこれでほぼ整うはず。

[Misc] おみやげ (?)

せっかくダブリンに行ったわけなので、欧州っぽいお土産を買ってきたいなー、 と思って、早く終わった ISMM の最終日に買い出しに行ってきましたよ。

DS のゲーム 欧州版

……ちゅーわけで、欧州版のゲーム2本。

まず左側は、日本だと「リズム天国ゴールド」という名前で販売されている 音楽をネタにしたリズム感育成ゲームのローカライズ版。 日本語版ももうあと数個でパーフェクトというくらいまで遊んだゲームですが、海外版は 歌唱のある曲は全部吹替えてあるそうなので、 せっかくだから英語版だけじゃつまらないしな、と欧州版を買ってきました。 もっとも、英国/アイルランドで販売されているのは、パッケージは英語のみ、 中のソフトは英語・フランス語・ドイツ語の3カ国語に対応した版のようです。 日本では末尾が "-JPN" となっている型番は、パッケージは "-UKV", ROM は "-EUU" に なっていました。Wikipedia その他によると、他にイタリア語とスペイン語にも 対応があるそうなので、それぞれの地域では別の ROM になっているということなのでしょう。

DS は(少なくとも旧 DS/DSLite 対応ソフトには)リージョン制約がかかっていないので サクッと開けて遊んでみましたが、日本語版とはまたちょっと雰囲気が変わって楽しいですね。 歌詞とゲームが連動しているところがあるのですが、3か国語とも結構頑張ってうまく訳してあります。 ただ、DSi は本体言語が日本語固定(ゲームは英語になる)になってしまうので、 フランス語とドイツ語で遊ぶために古い初代 DS を引っ張り出してきました。

右側は、「ポケモンダッシュ」ですね。 こちらのパッケージの型番は「-FHUG」になっているのですが、 これは France/Holland/UK/Germany ですかねぇ。パッケージはこの4カ国語表記になってます。 ソフト自体は5か国語対応のようです (型番は -EUR)。 ちなみにまだプレイしていないです (^^;

*1 問題の分岐の部分はとりあえず構造化 if 命令(SSA 上は1命令扱いの 特殊命令)を入れて解決しているが、 もう少し汎用性がある方法が思いついたら変えたいところではある。

*2 だめなら諦めて前の面倒臭い方法に着手するけど、その作業にも どっちみちこのリファクタは必要なので、無駄になる事はない。


大岩 寛 (おおいわ ゆたか) <yutaka@oiwa.jp.nospam ... remove .nospam> .

Copyright © 2005-2014 Yutaka OIWA. All rights reserved.
Posted comments and trackbacks are copyrighted by their respective posters.

記事の内容について (Disclaimer / Terms and Conditions)