前回、Data.ByteString.readFile がバッファー不足で作動しなかったが、どうやら Data.ByteString は正格で動作するらしい。つまり、ファイルのデータを一度すべて読み込まなくては次の動作に移れないということだ。
調べてみたら、Data.ByteString.Lazy をインポートすれば遅延評価で動作するのでバッファの問題も起きないのではないかと思って試してみた。 Prelude> import qualified Data.ByteString.Lazy as B Prelude B> B.readFile "hello.exe" >>= print 無限ループに陥ったのではないかというくらい、すべての表示に時間がかかったが、無事バイナリデータを表示することができた。 気になったので dir でファイルを調べてみたら、ソースファイルの hello.hs は 32 バイトなのに、実行ファイルの hello.exe は 1,114,253 バイトもあった。なんで? 2012/12/06 21:45 1,114,253 hello.exe 2012/12/06 21:45 556 hello.hi 2012/12/06 21:45 32 hello.hs 2012/12/06 21:44 25 hello.hs~ 2012/12/06 21:45 1,882 hello.o そこで、hello.exe の最初の 200 バイトを表示したら次のようになった。 Prelude B> do B.readFile "hello.exe" >>= return . (B.take 200) >>= print; putStr Ln "" Loading package bytestring-0.9.2.1 ... linking ... done. Chunk "MZ\144\NUL\ETX\NUL\NUL\NUL\EOT\NUL\NUL\NUL\255\255\NUL\NUL\184\NUL\NUL\NUL\NUL\NUL\NUL\NUL@\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\NUL\128\NUL\NUL\NUL\SO\US\186\SO\NUL\180\t\205!\184\SOHL\205!This program cannot be run in DOS mode.\r\r\n$\NUL\NUL\NUL\NUL\NUL\NUL\NULPE\NUL\NULL\SOH\DC2\NUL\133\147\192P\NUL\152\t\NUL180H\NUL\NUL\224\NUL\a\SOH\v\SOH\STX\DC4\NULb\a\NUL\NULh\t\NUL\NUL>\NUL\NUL`\DC1\NUL\NUL\NUL\DLE\NUL\NUL\NUL\128\a\NUL\NUL\NUL@\NUL\NUL\DLE \NUL\NUL\NUL\STX\NUL\NUL\EOT\NUL\NUL\NUL\SOH\NUL\NUL\NUL" Empty This program cannot be run in DOS mode という文が見える。実行コード以外に色々な情報が埋め込まれているのだろう。それにしても、実行ファイルの大きさが尋常でない。ランタイムルーチンを全部取り込むからだろう。
by tnomura9
| 2012-12-08 08:35
| Haskell
|
Comments(0)
|
カテゴリ
新型コロナウイルス 主インデックス Haskell 記事リスト 圏論記事リスト 考えるということのリスト 考えるということ ラッセルのパラドックス Haskell Prelude Ocaml ボーカロイド 圏論 jQuery デモ HTML Python ツールボックス XAMPP Ruby ubuntu WordPress 脳の話 話のネタ リンク 幸福論 キリスト教 心の話 メモ 電子カルテ Dojo JavaScript C# NetWalker ed と sed HTML Raspberry Pi C 言語 命題論理 以前の記事
最新のトラックバック
最新のコメント
ファン
記事ランキング
ブログジャンル
画像一覧
|
ファン申請 |
||