2007年11月23日

Haskellで作るエミュレータ(その7)

 P.ドラッカーの本に、面白いことが書いてある。350年前のモダン主義はデカルト的な考え方。デカルトの世界では、全ては等式でつながれて自由に移項できる。これに対して、ポストモダンの世界では、いろいろなことは非可逆で、移項はできない。

 この記述を見て、Haskellは、すべてを等式(定義)で書く。数学のように。再帰的な定義を使うことで、物事をスマートに解決できる。つまり、P.ドラッカー風にいうと、モダンの世界はHaskellに向いていると言えるだろう。

 それに対して、ポストモダンの世界では、すべてが不可逆。つまり、入出力が、非同期になるようなシステムは、(すべての入出力を記憶する以外は)可逆にはなり得ない。システムが十分に複雑であれば、これは、ほとんど不可逆と考えても、差支えないだろう。

 こういった問題を解決するために、Haskellでは、モナドという仕組みを用意している。Lispだと、prognみたいなもの。これによって、副作用というか、シーケンシャルな動きも書けるようになる。というように考えると、Haskell(関数型プログラミング)はモダンで、ポストモダンに対応するには、モナドが必要ということか?
posted by Jay at 19:05| 東京 ????| Comment(0) | TrackBack(0) | 開発記

2007年11月04日

最近読んだ本(2007年9月、10月)

ダ・ヴィンチ・コード(上中下)・(新潮文庫) (文庫)
フェルマーの最終定理 (新潮文庫) (文庫)
暗号解読(新潮文庫)(上下) (文庫)
ビッグバン宇宙論 (上下)(単行本)
偽装請負―格差社会の労働現場 (新書)
墜落の夏―日航123便事故全記録 (新潮文庫)
posted by Jay at 11:27| 東京 ????| Comment(0) | TrackBack(0) | 日記

2007年10月17日

Haskellで作るエミュレータ(その6)

 HaskellでBFインタプリタを作ろう企画、第5回目です。ソースのお化粧が終わったので、リリースします。

□HaskellによるBFインタプリタ実装
http://infones.up.seesaa.net/image/bf.hs

 さて、Haskell企画で、次になにをやろうか、思案中です。簡単に思いつくのが、Haskellでエミュレータを作ろう的な企画でしょうか。しかし、すでにGameBoyエミュレータを、Haskellで書いている人がいました。

□OmegaGB
http://www.mutantlemon.com/omegagb/

 そこで、少しソース(Cpu.hs)を読んでみると、do記法(モナド?)の嵐で、「これじゃ、手続き型言語と変わらない(関数型言語使う意味ないじゃん)」という印象でした。Haskellでも、モナドを使えば、手続き型言語風に、エミュレータを書けそうな気がします(というか、OmegaGBは書けることを実証している)。

 ただ、それだと関数型言語を使う意味がないので、モナド抜きで、エミュレータを書くことに挑戦するのかなと考えています。結構、敷居高いけど。たぶん、新しい構成法を生み出さないとだめな気がします。
posted by Jay at 22:05| 東京 ????| Comment(0) | TrackBack(0) | 開発記

2007年10月13日

移植されました!?(Rockbox編)

□nes rockbox
http://www.geocities.com/tm_lockheart/

InfoNESを、Rockboxに移植しましたという連絡を受けました。正確にいうと、「InfoNESは、GPL2ですか?」という質問を受けました。

□Rockbox
http://ja.wikipedia.org/wiki/Rockbox

Rockboxというのは、MP3プレイヤで動作するオープンソースファームのようです。
posted by Jay at 18:09| 東京 ????| Comment(0) | TrackBack(0) | 移植記

2007年10月07日

Haskellで作るエミュレータ(その5)

 HaskellでBFインタプリタを作ろう企画、第4回目です。前回、うまく動作しなかった素数を求めるBFスクリプトを動かしてみました。今回は、BFスクリプトをソースに埋め込んで、ghcでコンパイルして、実行しました。すると、2、3分して、回答が表示されました。
$ ghc Bf.hs
$ date ; main ; date
Sun Oct 7 19:41:40 2007
97 89 83 79 73 71 67 61 59 53 47 43 41 37 31 29 23 19 17 13 11 07 05 03 02
Sun Oct 7 19:43:48 2007

 これで、BFインタプリタとしての動作は、ほぼ問題ないレベルだと思います。ただ、インタプリタのため、性能的には、いまいちですが。

<参考>

□brainf*ck でマジメに素数探索
http://labs.cybozu.co.jp/blog/kazuho/archives/2006/06/bf_prime.php
posted by Jay at 19:48| 東京 ????| Comment(0) | TrackBack(0) | 開発記

2007年09月30日

Haskellで作るエミュレータ(その4)

 HaskellでBFインタープリタを作ろう企画、第3回目です。まず、お化粧として、(コード, 入力)を入力して、(出力)を出力する関数bfを書きました。
*Main> bf (">+++++++++[<++++++++>-]<.>+++++++[<++++>-]<+.+++++++..+++.[-]>++++++++[<++++>-]<.>+++++++++++[<+++++>-]<.>++++++++[<+++>-]<.+++.------.--------.[-]>++++++++[<++++>-]<+.[-]++++++++++.", "")
"Hello World!\n"

 また、一桁の計算機のコードを実行すると、問題なく動きました。
*Main> bf ( ",>>,<, >>++++++[<<-------->>-] +++++[<-------->-]<--- >+<[[-]>-< <[<->-]> ]>[-< <[<+>-]> >]< <<. ", "7+2")
"9"

 ただ、素数を求めるコードを入力すると、止まったようになってしまいました。性能的な問題なのか、機能的な問題なのか、次回に向けて、完成度を上げていきたいと思います。

<参考>

□brainf*ck で計算機
http://labs.cybozu.co.jp/blog/kazuho/archives/2006/06/bfcalc.php

□brainf*ck でマジメに素数探索
http://labs.cybozu.co.jp/blog/kazuho/archives/2006/06/bf_prime.php
posted by Jay at 22:39| 東京 ??| Comment(0) | TrackBack(0) | 開発記

2007年09月24日

Haskellで作るエミュレータ(その3)

 前回のHaskellでBFインタプリタを作ってみよう企画、第2回目です。前回は、構文木を作るところまでを書きました。例えば、以下のように動作するparse関数を書きました。
*Main> parse "<>[,.]+-"
[Decp,Incp,While [Geta,Puta],Inca,Deca]

 今回は、その構文木を入力して、実際に動作するインタプリタを書きました。例えば、以下のように動作します。
*Main> bfi (parse "[,+.>]", ['0','0','0','\NUL'], 0, "HAL", "")
([],"IBM\NUL",3,"","IBM")

 ここで、入出力されている結果(状態)は、(構文木, 配列, ポインタ, 入力, 出力)で、一式でその時点での状態を表しています。bfi関数は、その状態を入力すると、構文木から命令を1つ取り出して実行し、再帰的にbfi関数を呼ぶようになっています。

 もう少し、お化粧をしてから、リリースしたいと思います。

<参考>

□Haskell で brainfuck
http://d.hatena.ne.jp/propella/20070422/p2
posted by Jay at 08:01| 東京 ?J| Comment(0) | TrackBack(0) | 開発記

2007年09月17日

Haskellで作るエミュレータ(その2)

 本シリーズですが、Haskellがややこしすぎて、かなりテンション下がっていました。ただ、本日、アクアウォーキング中に、いろいろ考えてみました。

 まず、Haskellで、エミュレータを作ったときの性能等々は、知りたいのですが、フル機能で実装すると、時間がかかるという問題があります。そこで、以前から興味を持っていた、BrainF*ck(以下、単にBF)のインタプリタを実装してみることにしました。

 □BF言語仕様(Wikipedia)
 http://ja.wikipedia.org/wiki/Brainfuck

 Schemeの実装を参考にして、まず、ソースを読み込んで、構文木を作るまでを実装しました。Schemeそのままでは、うまくいかないので、'['と']'の扱いで試行錯誤しました。よく分からないけど、うまく動いたみたいで、昔のCommon Lisp的な不安感を抱え、本日の作業を終了しました。

 関係ないですが、9/22 or 10/4に、Engadget Japanでオフミがあるらしいです。

<参考>

 □Scheme:Brainfuck
 http://practical-scheme.net/wiliki/wiliki.cgi?Scheme%3ABrainfuck

 □CプログラマのためのHaskell入門
 http://www.kt.rim.or.jp/~kbk/haskell-intro/intro.html

 □お知らせ:Engadgetオフライン 開催予定
 http://japanese.engadget.com/2007/09/15/engadget-meetup
posted by Jay at 23:40| 東京 ????| Comment(0) | TrackBack(0) | 開発記

2007年09月09日

Haskellで作るエミュレータ(その1)

 最近、世間で話題になっているHaskellの勉強をはじめてみました。エミュレータとか、仮想マシンとかを、容易に開発できるなら、うれしいなというのが動機です。

 しかし、モナディウスというグラディウスクローンをHaskellで開発した例では、作者も述べている通り、Haskellで開発する必然性は、感じられませんでした。そう考えると、エミュレータについても、Haskellである必然性は低いのかなと思っています。

 よくよく調べた結果としては、Haskellを使うと、旧AI的な領域では、生産性の向上が見込めそうです。逆にいうと、それ以外の領域では、別の言語を使うほうがよいのかもしれません。

 以下、参考にした文書です。

[1] Haskell のお勉強
http://www.shido.info/hs/

 まず、この文書が、一番分かりやすいです。他のオブジェクト指向言語を理解している人であれば、無理なく理解できると思います。

[2] Monadius
http://www.geocities.jp/takascience/haskell/monadius_ja.html

 「あまり考えて書いてないので、関数型言語といいながら中身はほとんど古き悪しきステートマシンです。 決してソースを見て、模範的なHaskellのコードだと思わないように(誰も思わない)。 」(上記より引用)とあるように、Haskellとゲームという適用領域が、マッチしていなのではないかと思われます。

[3] なぜ関数プログラミングは重要か
http://www.sampou.org/haskell/article/whyfp.html

 Haskellとは関係なく、関数型言語の背景を理解することができます。最後に、ミニマックス法に触れていることからも、旧AI的な領域を対象にしていることが伺えます。

[4] Haskellプログラミング(情報処理学会)
http://www.ipsj.or.jp/07editj/promenade/index.html

 以前、情報処理学会の会誌に、Haskellの解説が連載されていました。上記より、PDFが取れます。しかし、和田先生の難解な解説(ごめんなさい)は、読むと余計混乱するかもしれないです。
posted by Jay at 23:42| 東京 ????| Comment(0) | TrackBack(0) | 開発記

2007年09月06日

移植されました!?(iPhone編)(その3)

□NES.app: Advanced Nintendo Emulator for iPhone


NES.appの作者からメール。「DPCMチャネルが、ちゃんと動いてない」という内容。「前のことなので忘れた」と返信すると、「あなたの計算は間違っていたので、直しました」とキレられる。

「盗人猛々しくとは、まさにこのこと」とか思いながら、軽くスルー。いま得られる情報は、当時より正確なんでしょうけど。しかし、バグを直してくれたみたいなので、COREとしても、有用なのかも。
posted by Jay at 23:38| 東京 ?J| Comment(0) | TrackBack(0) | 移植記