從 UNIX 移植到 Win32
更新:2007 年 11 月
將應用程式從 UNIX 移轉至 Windows 時,有幾個選擇:
使用 UNIX 程式庫將應用程式從 UNIX 移植到 Win32
將應用程式從 UNIX 原生地移植到 Win32
使用 POSIX 子系統,在 Windows 中執行 UNIX 應用程式
UNIX 程式庫
UNIX 程式設計人員通常會考慮的一個選項是使用協力廠商類似 UNIX 的程式庫,讓他們的 UNIX 程式碼編譯成 Win32 可執行檔。許多商用 (且至少有一個免費公用的版本) 程式庫可以做這件事。這是某些應用程式的另一種選擇。這些移植程式庫的優點是可以最少的精力達成初始移植。對於競爭軟體產品而言,主要缺點則是應用程式的原生 Win32 移植通常會比較快而且無疑地具有較多的功能。如果需要讓 Win32 呼叫能從 Windows 獲得更多的功能,應用程式必須因此捨棄 UNIX Shell,可能是很麻煩的。
下列清單提供 Microsoft 和協力廠商資源,能夠移植並支援 UNIX 移轉至 Visual C++:
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》。手冊針對專案移轉的每個階段所應考量的問題,提出了建議。手冊可從以下網站下載:
https://go.microsoft.com/fwlink/?linkid=20012
Microsoft Windows Services for UNIX (SFU)
Microsoft Windows Services for UNIX (SFU) 針對將 Windows 整合至現有的 UNIX 架構環境,提供了全方位的跨平台服務。Services for UNIX 提供檔案共用、遠端存取和管理、密碼同步處理、通用目錄管理、通用公用程式集和 Shell。
InteropSystems.com
http://www.interopsystems.com/
公司的協力廠商網站會提供支援移植 UNIX 至 Win32 的軟體。
C++ Boost 網站
http://boost.sourceforge.net/regression-logs/
http://boost.sourceforge.net/boost-build2/
直接將 UNIX 應用程式移植至 Win32
另一個選項是直接將 UNIX 應用程式移植至 Win32。使用 ANSI C/C++ 程式庫和商用 C 編譯器程式庫,UNIX 應用程式所依賴的許多傳統系統呼叫都可以用於 Win32 應用程式中。
不需要更改 stdio 架構應用程式的輸出模型,因為 Win32 主控台 (Console) API 模擬 stdio 模型,且存在的 curses 版本會使用 Win32 主控台 API。如需詳細資訊,請參閱 SetConsoleCursorPosition。
Berkeley Socket 架構應用程式只需少許變更就可以當成 Win32 應用程式來使用。Windows Sockets 介面是為了 BSD 通訊端的移植性而設計的,只需 WinSock 規格的簡介章節裡已經指出的極少變更部分。
Windows 支援符合 DCE 標準的 RPC,因此 RPC 架構的應用程式都很容易使用。請參閱 RPC 函式。
大規模差異中的其中一項是處理序模型。UNIX 有 fork;Win32 沒有。根據 fork 和程式碼基底的用法,Win32 的兩個可用 API 為:CreateProcess 和 CreateThread。自我產生 (Fork) 多個本身複本的 UNIX 應用程式可以在 Win32 裡再現,以便擁有多處理序或具有多執行緒 (Multi-Thread) 的單一處理序。如果是使用多處理序,多種 IPC 方法可以用於處理序間的通訊 (而且在 fork 提供的功能是必要時,也許會更新新處理序的程式碼和資料,讓它像其父代 (Parent))。如需 IPC 的詳細資訊,請參閱處理序之間通訊。
Windows 和 UNIX 圖形模型差異極大。UNIX 使用 X Window 系統 GUI,而 Windows 使用 GDI。雖然在概念上類似,但是 X API 和 GDI API 之間沒有簡單的對應。然而,OpenGL 支援可以用來轉移 UNIX OpenGL 架構應用程式。而且有 Windows 的 X 用戶端和 X 伺服器。如需 GDI 的詳細資訊,請參閱裝置內容。
基本的 UNIX 應用程式 (包含許多 CGI 應用程式) 應該都很容易移植至在 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 程式設計人員會考慮的另一個選擇是 Windows POSIX 子系統。然而,它只支援 POSIX 1003.1,這是在 Windows NT 建立時唯一標準化的 POSIX 版本。從這之後,對於擴充這個子系統的需求很少,因為大多數的應用程式已經轉換到 Win32。完整功能的應用程式對 1003.1 系統不感興趣,因為它功能不多 (例如在 1003.2 裡擁有的、網路支援等等)。在 Windows POSIX 子系統下執行的全功能應用程式無法存取 Win32 應用程式可用的 Windows 功能,例如記憶體對應檔、網路和圖形。應用程式 (例如 VI、LS 和 GREP) 都是 Windows POSIX 子系統的主要目標。