更新 : 2007 年 11 月
アプリケーションを UNIX から Windows に移行するには、いくつかの方法があります。
UNIX ライブラリを使用して UNIX から Win32 にアプリケーションを移植する。
UNIX から Win32 に直接アプリケーションを移植する。
POSIX サブシステムを使って Windows 上で UNIX アプリケーションを実行する。
UNIX ライブラリ
通常、UNIX プログラマが検討する 1 つの方法として、サードパーティの UNIX 形式のライブラリを使用して、UNIX コードを Win32 実行可能コードとしてコンパイルする方法があります。この処理には、数種類の市販ライブラリと少なくとも 1 つのパブリック ドメイン ライブラリを使用できます。アプリケーションによっては、この方法が有効です。これらの移植ライブラリの利点は、最初の移植作業を最小限にできることです。ただし、アプリケーションを直接 Win32 に移植する方が、通常は処理が早くなりより多くの機能を使用できるため、競争力のあるソフトウェア製品を作るうえでは有利です。Windows のパワーをさらに引き出すために Win32 を呼び出す場合でも、アプリケーションが UNIX シェルの外に出るのは不便です。
UNIX から Visual C++ への移行を移植およびサポートするための Microsoft およびサードパーティのリソースを次に示します。
UNIX の移行ガイド
『UNIX Custom Application Migration Guide』には、UNIX から Win32 環境へのコードの移行に関するテクニカル ヘルプが記載されています。
https://go.microsoft.com/fwlink/?LinkId=95428
『UNIX Migration Project Guide』は、UNIX から Win32 への多くのプロジェクトの移行に関する高度なヘルプを提供することで、『UNIX Custom Application Migration Guide』を補足します。このガイドには、プロジェクトの移行の各段階で考慮する必要がある問題についてのアドバイスが記載されています。このガイドは、次の Web サイトからダウンロードできます。
https://go.microsoft.com/fwlink/?linkid=20012
Microsoft Windows Services for UNIX (SFU)
Microsoft Windows Services for UNIX (SFU) には、既存の UNIX ベースの環境に Windows を統合するための、あらゆるプラットフォーム間のサービスが用意されています。Services for UNIX には、ファイル共有、リモート アクセスと管理、パスワードの同期、共通ディレクトリの管理、共通のユーティリティ セット、およびシェルが用意されています。
InteropSystems.com
http://www.interopsystems.com/
UNIX から Win32 への移植をサポートするソフトウェアを提供する企業に関するサードパーティのサイトです。
C++ Boost Web サイト
http://boost.sourceforge.net/regression-logs/
http://boost.sourceforge.net/boost-build2/
UNIX アプリケーションの Win32 への直接的な移植
もう 1 つの方法として、UNIX アプリケーションを直接 Win32 に移植する方法があります。ANSI C/C++ ライブラリと市販の C コンパイラ ライブラリを使用していれば、UNIX アプリケーションが依存する従来のシステム コールの多くを Win32 アプリケーションでも使用できます。
Win32 コンソール API は UNIX の stdio モデルをまねたものであり、また UNIX のカーソルにも Win32 コンソール API を使うバージョンがあるため、stdio ベースのアプリケーションの出力モデルを変更する必要はありません。詳細については、「SetConsoleCursorPosition」を参照してください。
Berkeley ソケット ベースのアプリケーションは、ほとんど変更せずに Win32 アプリケーションとして動作します。Windows ソケット インターフェイスは BSD ソケットとの移植性を考慮してデザインされており、WinSock 仕様の導入部分にはわずかの変更だけが記載されています。
Windows は DCE 準拠の RPC をサポートするため、RPC ベースのアプリケーションは簡単に使用できます。「RPC Functions」を参照してください。
最も大きな相違点の 1 つがプロセス モデルです。UNIX には fork がありますが、Win32 にはありません。Win32 では、fork の代わりにコード ベースで CreateProcess と CreateThread の 2 つの API のいずれかを使用できます。自身の複数のコピーを作成する UNIX アプリケーションは、複数のプロセス、または複数のスレッドを持つ単一のプロセスを持つように、Win32 で作成し直すことができます。複数のプロセスを使用する場合は、IPC の複数のメソッドを使用してプロセス間で通信できます。また、fork で提供される機能が必要な場合は、IPC の複数のメソッドを使用して新しいプロセスのコードとデータを更新し、親プロセスと同じ状態にすることもできます。IPC の詳細については、「プロセス間通信」を参照してください。
Windows と UNIX のグラフィカル モデルも大きく異なります。UNIX は X Window System GUI を使用するのに対して、Windows は GDI を使用します。概念は似ていますが、X API と GDI API との単純なマッピングはありません。ただし、OpenGL サポートを UNIX OpenGL ベースのアプリケーションの移行に利用することはできます。また Windows 用の X クライアントと X サーバーがあります。GDI については、「デバイス コンテキスト」を参照してください。
多くの CGI アプリケーションを含む基本的な UNIX アプリケーションは、Windows で動作する Visual C++ に簡単に移植できます。open、fopen、read、write などの関数は、Visual C++ ランタイム ライブラリで使用できます。また、C UNIX API と Win32 API の間には、open と CreateFile、read と ReadFile、write と WriteFile、ioctl と DeviceIOControl、close と CloseFile などのように一対一の対応があります。
Windows POSIX サブシステム
UNIX プログラマが確認するもう 1 つのオプションは、Windows POSIX サブシステムです。ただし、このサブシステムは、Windows NT が作成されたときに標準化されていた POSIX 1003.1 だけをサポートしています。それ以後、ほとんどのアプリケーションが Win32 に変換されたため、このサブシステムを拡張する必要性が薄れました。1003.1 システムは、1003.2 の機能やネットワーク サポートなどを含んでいないため、それらの機能を必要とするアプリケーションには使用できません。Windows POSIX サブシステムで動作するアプリケーションは、メモリ マップト ファイル、ネットワーク、グラフィックスなどの Win32 アプリケーションで使用できる Windows の機能にアクセスできません。VI、LS、GREP などのアプリケーションが Windows POSIX サブシステムの主なターゲットです。