cygwin1.dllって何!? RogueとかのWindows用実行ファイルに同梱されている「cygwin1.dllって何!?」という質 問が複数寄せられましたので、簡単なお返事をしておこうかと思います。 「cygwin1.dll(*1)」及び「cyggcc_s-1.dll(*2)」「cygncurses-10.dll(*2)」は、これら のプログラム(Windows版のみ)を実行するために必要なファイルで、プログラムと同じ フォルダ、もしくは「C:\Windows\System32」フォルダに存在する必要があります。な お、「C:\Windows\System32」フォルダにコピーしてある場合は、複数のプログラムから 共用可能です(この場合、プログラムフォルダにあるものは消してもらっても構いませ ん)。 (*1) Rogue Clone III(p) / Rogue 5.4(新版) / XRogue 8.0(新版)同梱 (*2) Rogue 5.4(新版) / XRogue 8.0(新版)同梱 他のアプリでも「このアプリの実行には、NetFramework3.5が必要です」とか「MFC 4.2が 必要です」等と言ってくるものがありますが、それと同じ趣旨のファイルです。 多くのプログラムが使いそうな汎用的なプログラムモジュール(パーツ)で、しかもファ イルサイズが大きいものは、いちいち個々のプログラムが内蔵しているとプログラムサイ ズが大きくなるばかりです。こういったモジュールを一纏めにしておいて、必要なプログ ラムがそれを読みだして使うようにすれば、一つ一つのプログラムを小さくすることがで きますし、バグも出にくく保守性も良くなります。こういった目的でこれらの「~.dll」 ファイルがあるのだと考えてください。「dll」とは「Dynamic Link Library」の略で、 実行ファイルに組み込むのではなく、「実行時に直接リンクして使う」ものという意味で す。     ◇ ◇ ◇ さて、ここからはもっと詳しく知りたい方のための情報です。 dllファイルの名前にもなっている「Cygwin(*3)」ですが、端的に言うと「Windows上で擬 似Linux環境を作る物」です。コマンドライン上がまるでLinuxという環境になり、Linux のコマンド群がそのまま使えたり(*4)します。 (*3) ttp://cygwin.com/index.html (*4) インストール次第で、X-Windowを起動することも可能です。 「それって、エミュレータじゃないのか!?」と言う声も出てきそうですが、残念ながら違 います。 説明のために、Windowsマシン上での話とします。エミュレータは、Windowsマシン上に Windows以外のOSもしくはゲーム機など別マシンの環境を作り上げてしまうことにより、 そこで実行するために作られたプログラムを、そのまま(*5)Windowsマシンで実行してし まうためのものです。 (*5) 「そのまま」と書きましたが、実際にはメディアの違いなどの物理的な理由で、そ のまま持ってくることは不可能な状況もあります。そのような場合には、メディアを変 換するということもあります。例えば、ゲーム機などでROMカートリッジを用いるもの の場合、Windowsマシンにそれを差し込むスロットはありませんから、本当の意味で 「そのまま」持ってくることはできません。まあ、カートリッジを挿す部分を自作して しまう猛者もいるようには聞いていますが。普通は、ROMの内容をファイル化したもの を読ませるというような手段は必要になってきます。しかしこの場合においても、プロ グラムそのものにはノータッチでメディアが変わっただけであることには変わりありま せん。 Cygwinは、こういった仕組みで動作している訳ではありません。それ故、Linuxのプログ ラムを持ってきても全く動作しません。ではどういう仕組みになっているのでしょうか。 Cygwinは単にLinuxと同等の環境を作ることだけを行います。バイナリレベルでそのまま 互換性を持たせている訳ではないので、Linuxのプログラムを持ってきてそのまま動かせ はしません。Cygwinには、Linux同等の動作をするコマンドやシェル、コンパイル・実行 環境があれば良いのです。つまり、「ls」でファイルリストが出て、「cat」で内容を表 示、「less」はページャ、「gcc」や「make」でコンパイル・実行、こういったことが出 来れば良い訳です。それを行うプログラム群そのものはWindows上実行可能なプログラム 群なのですが、動作は全くLinuxの端末を触っているのと同じ見た目になっていればよ い、それがCygwinの動作なのです。 Linuxでは、プログラムを実行可能ファイルそのものを持ってきて動作させるというより は、ソースプログラムを持ってきて自分でコンパイル・インストールして使うという方法 があります。Cygwinは、この「Linux用ソースプログラムを持ってきて、それをコンパイ ル・インストールして使える」環境を与えてくれます。まあ、一言でLinuxと言っても星 の数ほどありますので、全てのLinux用ソースプログラムがそのまま使える訳ではありま せんが、簡単なソースならほとんど手直しをせずに実行に持っていくことも可能です。 で、コンパイルされたプログラムは、「Cygwinによる擬似Linux環境で動作するWindowsプ ログラム」になります。という事で、できたプログラムはWindowsプログラムなので、 Cygwinを起動しておかなくても実行可能なプログラム(*6)となります。ややこしいです が。 (*6) ただし、LinuxとWindowsの根本的な違いによる部分は、プログラムの方で対応を考 えておかないと動きません。例えば、LinuxとWindowsでディレクトリ(フォルダ)構成 は大きく異なります。Linuxでは全て「/」の下にツリーが作られますが、Windowsでは ドライブ単位がベースなので「C:\」「D:\」……と言ったところの下にツリーが作られ ます。構造も違えば区切り文字も違います(Linuxは「/」、Windowsでは「\」)ので、 それらをきちんと考慮したプログラムにしておかないと動作しないのは当たり前と言え ます。CygwinはこういったLinux的な部分も再現してくれていますので、Windows上で Cygwinなしに動作させる場合にはプログラムを作る側が対応策を考える必要が出てきま す。ちなみに、Cygwin上、Windowsのフォルダは次のように扱われます。デフォルトの インストールを行った場合ですが、「C:\cygwin\」がCygwin上の「/」になり、通常 Cygwinの動作に必要と思われるディレクトリ・ファイルは全てこの下に配置されていま す。ホームディレクトリは「/home/{Windowsのログイン名}/」で、Windows上は 「C:\cygwin\home\{Windowsのログイン名}\」です。直に「D:\」やら「E:\」やらにア クセスしたい場合、「/cygdrive/d/」とか「/cygdrive/e/」に割り振られていますの で、通常Windows上アクセスできるドライブには普通にアクセスが可能です。 私がこのCygwin環境を使おうと思ったのには、ちゃんとした理由があります。 元々RogueはUNIX上で生まれたプログラムです。RogueはUNIX上のC言語(かなり古典的で はありますが)で書かれている訳で、これをUNIXライクなOSであるLinuxに持ってくるの はそんなに難しいことではありません。しかし、Windowsに持ってくるには、プログラム のかなりの部分の修正が必要になってきます。 UNIX、Linux上のC言語、「gcc」は比較的標準的なものです。が、Windows上のC言語とい うと「Visual C++」一択(これはCのプログラムもコンパイル・ビルドできます)なので すが、かなりWindowsに特化したものという印象で、Windowsの世界では一般的になってい るものの、C言語の世界全体から言うとあまり標準的ではないC言語という感じです。 WindowsがOSとしてのシェアが大きいので当然Visual C++のシェアも大きくなっています が、C言語の世界全体からみると色々「??」な事は多いです。 私はRogueを「保守・管理」していくことが大事だと考えています。極力オリジナルソー スを触らずに、オリジナルそのままに近いものをいつまでも遊べるようにしておくことが 重要です。そのためには、Linux、Windowsの違いを吸収してくれるCygwinのような環境 は、無用とも言える管理の手間をかなり低減してくれる非常にありがたいものと言えま す。Cygwinの方でWindows上で擬似Linux環境を作るという作業をしてくれるわけですか ら、その辺りはそっちに任せておいて、私はRogueがLinux(とそれによく似たCygwin)環 境で動作できるように保守していくだけでよくなります。手間が少なくなれば、保守に起 因するバグも出にくくなります。 Cygwinを用いる欠点はというと、前述の「cygwin1.dll / cyggcc_s-1.dll / cygncurses-10.dll」が必要になることです。とりわけ「cygwin1.dll」はファイルサイズ が大きいです。本当は2,666,500バイトもある巨大なものなのですが、UPXで強制圧縮して 1,171,972バイトに圧縮してあります。とはいえ、Cygwinを使うプログラムで全て共用で きるものですから、1つのプログラム単位で考える(dllのサイズを使うプログラムの数で 割る)と大したことはありませんし、メリットのほうが大きいと考えこの路線で行くこと にしました。