1993年から Windows は POSIX 準拠だという話

## はじめに

Windows NT は最初のバージョンから POSIX 準拠です。当時の **POSIX で標準化されていた POSIX API を実装**しており **NIST が POSIX 準拠であると認めています**。その資料も公開されています。

https://e-words.jp/w/NIST.html

> NIST（National Institute of Standards and Technology）とは、アメリカ合衆国の連邦政府機関の一つで、科学技術に関連する標準についての研究などを行う機関。主に度量衡や計測・計量についての標準を管理したり、関連する科学研究や技術開発を推進している。1988年に前身のNBS（National Bureau of Standards：国立標準局）から改組された。

いつの間にやら某所の Windows に関する POSIX の説明があまりにも酷いデタラメな内容に書き換えられていたので、ここに「1993年から Windows は POSIX 準拠である」という証拠を永久に残そうと思います。

↓ デタラメな内容

> Microsoft Windows自体はPOSIX準拠ではない。
> 
> MS-DOSおよびWindows 3.xから派生したWindows 9x系に限らず、DECのVMSから派生したWindows NT系も含め、Microsoft Windows自体はPOSIX準拠ではなく、コマンドやAPIにPOSIX互換性はない。
> 
> Windowsにサブシステムをインストールすることで、マシンにPOSIX互換環境を追加することができるが、サブシステムだけがPOSIX準拠というだけで、Windows自体はPOSIX準拠にはならない。VMwareやVirtualBoxなどを使って仮想環境のサンドボックスにPOSIX準拠のゲストOSをインストールしても、ホストOSであるWindows自体はPOSIX準拠にならない。

**正しい情報を知りたい方は英語版を参照しましょう**。比較してみるとどれだけ日本語版の内容が偏り間違っているかだけではなく、情報が古く抜け落ちているかがわかります。あんなものを参考にしてはいけません。

余談ですが、DEC の VMS は 1992 年に OpenVMS と名前を変えたときに POSIX に準拠したようです。なぜ余談かと言うと Windows NT は VMS から全く派生してないからです。見た目もコマンドもぜんぜん違う別会社（競合他社）の製品でソースコードは一切使われているわけがないのに何をどう見て派生したと勘違いしちゃったんですか？

関連記事 [米国政府「POSIX準拠がシステムの導入要件」が撤回されたのは2000年だという話](https://qiita.com/ko1nksm/items/3a452ebcf09f6e8b5ecc)


Windows の POSIX 対応については以下の記事がより詳しかったです。

- [MicrosoftとUnixのお話](https://qiita.com/sutton/items/5b2b7e2e57b674abe4f5)

## Windows NT は 1993 年に POSIX 準拠と認められた

Windows NT の最初のバージョンは 3.1 です。Windows NT 3.1 は 1988 年に開発が始まり、1993 年にリリースされました。バージョン番号がいきなり 3.1 なのは NT 系ではない Windows 3.x に対応してのものです。Windows NT 3.1 は POSIX 準拠です。[こちら（NT 4.0 のリソースキットの内容っぽい）](https://web.archive.org/web/20071219035322/http://www.microsoft.com/technet/archive/ntwrkstn/reskit/poscomp.mspx?mfr=true) には Windows NT の POSIX 対応の詳細が記載されています。

Microsoft がなぜ Windows NT を POSIX 準拠にしたのかというと、当時 POSIX 準拠は米国政府のコンピュータシステムの導入条件になっていたからです。これは FIPS 151-1/151-2 で定められています。ちなみに **POSIX 準拠が米国政府のコンピュータシステムの導入条件だったのは 2000 年に撤回**されています。昔と違って多数の Unix があるわけでもなく POSIX なんて気にしなくなったんでしょうね。

以下は「詳解UNIXプログラミング 第3版」からの引用です。

> 　FIPS は Federal Information Processing Standard の略です。米国政府が公表し、コンピュータシステムの政府調達に使われます。FIPS 151-1 (1989年4月) は、IEEE 規格 1003.1-1988 と ANSI C 規格草案に基づいています。これに IEEE 規格 1003.1-1990 に基づいた FIPS 151-2 (1993年5月) が続きます。FIPS 151-2 では、POSIX.1 でオプションとした機能の一部を必須としています。これらのオプション機能は POSIX.1-2001 では必須機能となっています。
> 　POSIX.1 FIPS の効果は、POSIX.1 準拠のコンピュータシステムを米国政府に販売したいベンダにたいして POSIX.1 の一部オプション機能のサポートを要求することでした。POSIX.1 FIPS は撤回されたので、本書ではこれ以上言及しません。

FIPS 151-1/151-2 に準拠しているかは NIST （米国国立標準技術研究所）がテストしています。

[Testing Laboratories and Validated Products for NIST POSIX (FIPS 151-2)](https://www.itl.nist.gov/div897/ctg/posix/finalreg4.htm)

テスト結果は公表されています。[ここから公開文書を検索](https://www.nist.gov/publications/search?k=%22VALIDATED+PRODUCTS+LIST%22&t=&a=&ps=All&n=&d%5Bmin%5D=&d%5Bmax%5D=)できます。最終版はなさそうですが、下記の文書が目的のもののようです。

- NIST
  - [VALIDATED PRODUCTS LIST 1991 No. 4](https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir4690.pdf) (PDF)
  - [VALIDATED PRODUCTS LIST 1995 No. 4](https://nvlpubs.nist.gov/nistpubs/Legacy/IR/nistir5731.pdf) (PDF)

ちなみに米国 Amazon で本としても出版されているようです。2018 年と比較的最近出版されているようなので、古い情報をサルベージした感じでしょうか？ 本の中身は見ていませんが、タイトルから上記の PDF と同等の内容でしょう。

- Amazon
  - [Validated Products List, 1991, Vol. 4: Programming Languages, Database Language Sql, Graphics, Gosip, Posix (Classic Reprint) Hardcover – August 24, 2018](https://amazon.com/dp/0364817968/)
  - [Validated Products List, 1995, Vol. 1: Programming Languages, Database Language Sql, Graphics, Posix, Computer Security (Classic Reprint) Paperback – August 24, 2018](https://www.amazon.com/dp/036442303X)

Microsoft に関する製品としては、以下の番号が該当します。

> Microsoft Corporation 151-2MSC001, 151-2MSC002, 151-2MSC003, 151-2MSC004, 151-2MSC005, 151-2MSC006, 151-2MSC007, 151-2MSC008, 151-2MSC009, 151-2MSC010, 151-2MSC011, 151-2MSC012, 151-2MSC013, 151-2MSC014, 151-2MSC015, 151-2MSC016, 151-2MSC017, 151-2MSC018, 151-2MSC019, 151-2MSC020, 151-2MSC021, 151-2MSC022, 151-2MSC023, 151-2MSC024

上記のリストは PDF の中身ではなく上に書いた「Testing Laboratories and Validated Products for NIST POSIX (FIPS 151-2)」（1997年版）のリンク先に書かれているものです。公開されている PDF は少し古いため 151-2MSC021 までしか記載されていません。

> 151-2MSC001 Issued: 04/12/94 Type: Cooperating Hosted
Product Supplier: **Microsoft Corporation**
　Product: **Microsoft Windows NT POSX Subsystem Version 3.1**
　　PCD: Microsoft Windows NT POSIX Subsystem POSIX Conformance Document
　　　GTI - NOT Provided by Product MC - NOT Provided by Product
　　　MFS - NOT Provided by Product AP - NOT Provided by Product
Computer Hardware Supplier: Olivetti 
Computer Hardware Product: M700-10
Host & Development Operating System Supplier: Microsoft Corporation
　Host & Development Operating System: Windows NT Version 3.1
C Compiler: Microsoft® C Centaur Optimizing Compiler Version 8.00.081
APTL 100342 Mindcraft, Inc.

このような感じで、以下の POSX Subsystem を搭載したシステムがテストに合格していることが記載されています。情報は見つかりませんでしたが、151-2MSC022, 151-2MSC023, 151-2MSC024 はおそらく NT 4.0 のものではないかと思います。

- Microsoft Windows NT POSX Subsystem Version 3.1
- Microsoft Windows NT POSIX Subsystem Version 3.5
- Microsoft Windows NT POSIX Subsystem Version 3.5.1

FIPS 151-1/151-2 準拠の条件が POSIX に準拠することなので、Windows NT は最初のバージョンから POSIX に準拠していることは明らかです。

ちなみに、FIPS 151-2 が 2000年2月25日に撤回されたことは、以下の文書に書かれています。

[Withdrawn FIPS Listed by Number Updated 12/15/16](https://www.nist.gov/system/files/documents/2016/12/15/withdrawn_fips_by_numerical_order_index.pdf)

| FIPS NO | TITLE | DATE OF PUBLICATION | DATE WITHDRAWN | FEDERAL REGISTER CITATION VOLUME/PAGE |
| - | - | - | - | - |
| 151-2 | Portable Operating System Interface (POSIX) System Application Program Interface [C Language] (ISO/IEC 9945-1:1990) | 93 May 12 | 00 Feb 25 |  65FR/10050 | 

## POSIX API は最初の Windows NT から実装され、POSIX コマンドは後から追加された

FIPS 151-1 が要求する POSIX.1-1988、FIPS 151-2 が要求する POSIX.1-1990 には **POSIX コマンドは含まれません**。POSIX シェルと POSIX コマンドが標準化されたのは POSIX.2-1992 です。確かに初期の Windows NT の POSIX サブシステムには POSIX コマンドはありませんでしたが、Windows NT は FIPS 151-2 が要求している POSIX のバージョンに準拠したと言うだけのことです。POSIX.1-1990 にはスレッドもソケットも含まれていません。

Windows NT のリリースが 1993 年なので頑張れば POSIX.2-1992 に対応できたもしれませんが、FIPS が要求していなかったので対応する理由はなかったのでしょう。したがって **初期の Windows NT**には POSIX コマンドは含まれていませんでした。

**POSIX コマンドはのちの Services for UNIX (SFU) や Subsystem for UNIX-based Applications (SUA, Interix) で追加されました**。

https://en.wikipedia.org/wiki/Windows_Services_for_UNIX

https://en.wikipedia.org/wiki/Subsystem_for_UNIX-based_Applications

> The complete installation of Interix included (at version 3.5):
> 
> - Over 350 Unix utilities such as vi, ksh, csh, ls, cat, awk, grep, kill, etc.
> - A complete set of manual pages for utilities and APIs
> - GCC 3.3 compiler, includes and libraries
> - A cc/c89-like wrapper for Microsoft Visual Studio command-line C/C++ compiler
> - GNU Debugger
> - X11 client applications and libraries (no X server included, though third party servers were available)
> - Has Unix "root" capabilities (i.e. setuid files)
> - Has pthreads, shared libraries, DSOs, job control, signals, sockets, shared memory

## POSIX API の数は最初のバージョンから大きく増えた

POSIX は 1988 年に誕生してから規格が改定するたびに機能が大きく増えています。以下の PDF に移植可能な機能の数が書かれていますが、POSIX.1-1990 の時点では POSIX API の数はわずか 199 個しかありません。それが SUSv3 (POSIX.1-2001) の時点で POSIX API の数は（XSH だけで）1123 個まで増えています。

https://www.opengroup.org/austin/docs/austin_278.pdf

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54918/7a356268-d605-68df-a33b-eaa43d775c25.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/54918/413c1538-fe28-2810-0d8d-828a3bc68e4a.png)

初期の Windows NT と Unix との移植性は、低かったかもしれませんが、それは初期の POSIX API の数が少なかったからであり、つまり **Windows NT と Unix の間だけではなく、各 Unix の間で POSIX の移植性は十分に高くなかった**ことを意味しています。

POSIX は実際の Unix の中から移植可能と認められるものを標準化したものなので、必然的に すべての Unix の機能（多数の便利な移植性がない機能がある）よりも、POSIX の機能の数は少なくなります。現在は POSIX.1-1988 の頃に比べて大きく増えましたが、それでも実際の Unix / Linux の実装が持っている機能の数よりも POSIX の機能の数は少ないのです。POSIX だけでは、現実の Unix / Linux 互換の仕様としては不十分な上 Unix / Linux の性能を引き出すことは出来ません。これは元から POSIX がそういうものなのです。**POSIX とは「POSIX の範囲でできる程度のことなら POSIX に従って作れば移植性がある」ぐらいの意味**です。

## POSIX 準拠は Windows NT の必須要件だった
 
https://atmarkit.itmedia.co.jp/fwin2k/bookpreview/insidewin4/insidewin4_04.html

> ■POSIXサブシステム
> 
> 　POSIXはPortable Operating System Interface based on UNIXの略語で、UNIXスタイルオペレーティングシステムの国際標準仕様の集合を指しています。POSIX標準仕様を策定することにより、各開発ベンダーにUNIXスタイルのインターフェイスの実装が期待されました。実装されたインターフェイスを使用している限り、アプリケーションはあるシステムから他のシステムに簡単に移植できることになります。
> 
> 　Windowsは、多数のPOSIX標準仕様の中の1つである、POSIX.1を実装しています。この仕様は、正式にはISO/IEC 9945-1:1990、あるいはIEEE POSIX仕様1003.1-1990という名称を持っています。ここで注意してもらいたいのは、Windowsは数ある仕様の中で、このPOSIX.1だけを実装しているにすぎないことです。このPOSIX.1仕様は、米国政府が1980年代半ばから後半に定めていた調達基準を満たすために作成されました。米国NIST（National Institute of Standardsand Technology）は連邦情報処理仕様（FIPS：Federal Information ProcessingStandard）151-2を策定し、その中でPOSIX.1準拠を定めました。WindowsNT 3.5、3.51、および4は公式のテストに合格し、FIPS 151-2認定を受けています。
> 
> 　POSIX.1準拠はWindows必須の開発条件ですから、設計段階から、POSIX.1仕様は基本システムサポートとして実装されることが決まっていました（たとえば、fork関数はWindowsエグゼキュティブに、ハードファイルリンクサポートはWindowsファイルシステムにそれぞれ実装されました）。しかし、POSIX.1仕様は、サービスの一部（プロセス制御、プロセス間通信、単純なキャラクタセルI/Oなど）をサポート必須として定めているだけですから、Windows 2000に実装されているPOSIXサブシステムは完全なプログラミング環境というわけではありません。また、アプリケーション内ではサブシステム境界をまたぐような呼び出しは許可されていないため、POSIXアプリケーションはPOSIX.1が定義しているサービスセットを呼び出せるだけとなります。これでは、Windows上で動作するPOSIXプログラムは、スレッドやウィンドウを作成できないだけではなく、リモートプロシージャコール（RPC）やソケットを使用することもできません。
> 
> 　このような制限は緩和される必要があります。Microsoftは、Windows Services for UNIXと呼ばれる製品を出荷し、制限の回避を目指しました。この製品は、ほぼ2000個に上るUNIX関数と300種類のUNIXライクなツールやユーティリティを提供する、拡張版POSIXサブシステムです。製品の詳細については、www.microsoft.com/windows/sfu/を参照してください。
> 
> 　拡張版POSIXサブシステムを使用すると、UNIXアプリケーションのWindowsへの移植が簡単になります。しかし、プログラムはあくまでもPOSIX バイナリとしてリンクされますから、Windows関数を直接呼び出すことはできません。UNIXアプリケーションのWindowsへの移植ができ、かつ、Windows関数を直接呼び出すためには、MKSツールキットという専用パッケージを導入する必要があります。このパッケージは、Mortice Kern Systems（www.mkssoftware.com）から販売されています。パッケージを使用すれば、UNIXアプリケーションをその環境でWindows実行ファイルとしてリビルドできます。

## サブシステムをインストールすればPOSIX互換環境になる

**Windows にサブシステムをインストールすれば POSIX 互換環境になるのだから、紛れもなく POSIX 準拠**です。サブシステムは Windows の一部です。そもそも Windows NT カーネルにとっては Win32 だって Win64 だってサブシステムです。（なんとなく初期の Windows NT は POSIX サブシステムが組み込まれておりデフォルトで有効だったのではないかと思うのですが詳細は知りません）

一体 POSIX のどこにサブシステムのインストールで POSIX 互換環境を作ってはダメと書いているのでしょうか？ どこに仮想環境で POSIX 準拠のゲスト OS をインストールして POSIX 互換環境を作ってはダメと書いているのでしょうか？

例えば Linux は POSIX API の一部を GNU libc で提供していますが、GNU libc で POSIX 準拠環境を作っているから、Linux 自体は POSIX 準拠ではないとでも言うつもりでしょうか。

Windows が公式にサポートしているのあれば、それはすべて「Windows 自体」です。追加のサブシステムが有料だろうが関係ありません。そもそも商用 Unix システムは有料です。

POSIX サブシステムはその後、Services for UNIX (SFU) や Subsystem for UNIX-based Applications (SUA) に変化しました。Windows 8.1 では削除されましたが、それ以前の例えば Windows 7 などのサポートは続いており、そのサポート期間の間に Windows Subsystem for Linux (WSL) が登場しました。Windows 8.1 という特定のバージョンに POSIX 準拠機能はありませんでしたが、POSIX 準拠環境のサポートが途切れたことはありません。

**POSIX は OS の作り方を規定していません**。POSIX 準拠の条件は POSIX に準拠するインターフェースを持っているかどうかです。**WSL を使って POSIX 準拠インターフェースを持たせたとしても構いません**。OS の中身はどうだっていいのだから、中身が Windows でも何ら問題ありません。

## Windows も Linux も BSD系Unix も POSIX の認証を取っていない

POSIX の認証を取っていないのと POSIX 準拠とは別の話です。

現在の Windows は POSIX の認証を取っていませんが、それと同じように**ほぼすべての Linux と BSD 系 Unix は POSIX の認証を取っていません**。したがって POSIX の認証を取っていないから POSIX 準拠ではないという定義にするのであれば、Linux や BSD 系 Unix は POSIX 準拠ではないということになります。

現在 [POSIX の認証](http://get.posixcertified.ieee.org/register.html)を取っているのは以下の OS だけです。

- INTEGRITY 10.0 / 5.0 / PC / 11 （独自のリアルタイムOSらしい（[参照](https://en.wikipedia.org/wiki/Integrity_(operating_system))））

[UNIX の認証](https://www.opengroup.org/openbrand/register/
)は POSIX 準拠が条件の一つなので、これらも含めます。

- Apple Inc.
  - **[UNIX 03]** macOS version 14.0 Ventura on Apple silicon-based Mac computers
  - **[UNIX 03]** macOS version 14.0 Ventura on Intel-based Mac computers
- IBM Corporation
  - **[UNIX 95]** z/OS V2R1 or later
  - **[UNIX 95]** z/OS 3.1 or later
  - **[UNIX 03]** AIX 5L for POWER V5.3 dated 7-2006 or later
  - **[UNIX 03]** AIX 6 Operating System V6.1.2 with SP1 or later
  - **[UNIX 03]** AIX version 7, at either 7.1 TL5 (or later) or 7.2 TL2 (or later)
  - **[UNIX V7]** AIX version 7, at 7.2 TL5 (or later)
- Hewlett Packard Enterprise
  - **[UNIX 03]** HP-UX 11i V3 Release B.11.31
- The SCO Group, Inc.
  - **[UNIX 93]** SCO OpenServer Release 5 and OpenServer Release 6
  - **[UNIX 95]** UnixWare ® 7.1.3 and later

**参考** 過去に Unix の認定を受けていたが認定の更新をやめたもの

- Oracle Corporation（[2020年１月まで](https://web.archive.org/web/20200111125333/http://www.opengroup.org/openbrand/register/)）
  - **[UNIX 98]** Solaris 9
  - **[UNIX 03]** Solaris 10 Operating System
  - **[UNIX V7]** Oracle Solaris 11.4 and later
- Huawei Technology Co., Ltd （2016年9月から[2022年9月まで](https://web.archive.org/web/20220915071935/https://www.opengroup.org/openbrand/register/)） 
  - **[UNIX 03]** Huawei EulerOS 2.0 (UNIX 認定を取った Linux として話題になった)

POSIX の改定バージョン（以下は大規模なもののみ）と、UNIXの認証（Single Unix Specification）のバージョンの対応は以下のとおりです。

| POSIX          | SUS               | 補足 |
| -------------- | ----------------- | - |
| POSIX.1-1988   |                   | C 言語インターフェース  |
| POSIX.1-1990   |                   | |
| POSIX.2-1992   |                   | シェルとコマンド |
| POSIX.1-1996   | SUSv1 (UNIX 95)   | Issue 4 |
|                | SUSv2 (UNIX 98)   | Issue 5 |
|                |                   | |
| POSIX.1-2001   | SUSv3 (UNIX 03)   | Issue 6 POSIX.1/POSIX.2/SUS 統合版 |
| POSIX.1-2008   | SUSv4 (UNIX V7)   | Issue 7 |
| POSIX.1-2024 ？ | SUSv5 (UNIX V8) ？ | Issue 8 ※ 未リリース、規格名は予想 |

「POSIX」という用語が何を指すかですが、昔は POSIX.1 しかなかったので、POSIX.1 のことです。後に POSIX.2 が誕生しました。上記のリストに POSIX.1-2001 の前に空行を入れていますが、これは 1998 年に POSIX を策定していた団体が IEEE から現在の [Austin Group](https://en.wikipedia.org/wiki/Austin_Group) （IEEE PASC と The Open Group と ISO/IEC JTC 1/SC 22 のジョイントワーキンググループ）に切り替わる重要なラインです。この後に POSIX.1 シリーズのさまざまな規格と POSIX.2、そしてSUS が統合されました。**現在では POSIX.2 は POSIX.1 に統合されています**。今は単に POSIX といえば、POSIX.1 しかありません。





## Microsoft も Linux も Apple も POSIX API・コマンドを作っていない

Microsoft は Linux を組み込んだだけで、Microsoft 社自身は POSIX API や POSIX コマンドを作っていないじゃないかという批判があります。

仮想マシンではない WSL1 があるのだから POSIX API というかそれを超える Linux カーネル互換機能を Microsoft は作っているわけですが・・・、それはともかく なぜ Microsoft 自らが POSIX API・コマンドを作らなければならないのでしょうか？

例えば macOS は FreeBSD が作ったコマンドをパクってますよね？ 多くの Linux に含まれる GNU Libc や GNU コマンドは、GNU プロジェクトが作ったものをパクっているだけですよね？ BSD 系 Unix も元をたどれば BSD Unix をパクっていますし、System V 系 Unix も AT&T が開発した Unix をパクっています。すべてを自社で作っている POSIX 準拠 OS なんてありません。

どのプロジェクトもすでにある何かを利用して作られています。OS ベンダー、例えば Ubuntu だと Canonical が全部作らないといけないなんて話だと、Linux は POSIX 準拠になることは永遠にないでしょう。したがって Linux カーネルや Ubuntu ごとパクって Windows の一部として POSIX 準拠環境を実現したとしてもなんら問題ありません。

ここでいうパクるとは言葉の綾です。利用するのに正式な権利が必要なのは当然の話であり Microsoft は Linux や Ubuntu の権利を侵害していません。

## POSIX は Unix の作り方ではないし OS はどう作っても良い

POSIX は OS のインターフェースです。OS の実装方法ではありません。POSIX に完全に従って OS を作ったとしても Unix は作れません。なぜなら OS として必要なシステム管理機能が POSIX には含まれていないからです。

POSIX は Unix の仕様を定めたものでも、Unix だけに適用できる規格でもありません。POSIX は Unix のインターフェースを元に策定したと言うだけで、**あらゆる OS に POSIX インターフェースを追加することが出来る**ように作られています。だから Windows にも POSIX インターフェースを追加することが出来ます。

Windows に Cygwin や MSYS2 を使って POSIX 準拠環境を作っても構いません。もっとも Cygwin や MSYS2 は Microsoft 製品ではないので、この場合 POSIX 準拠環境を提供しているのは Microsoft ではなく Cygwin や MSYS2 ということになります。

Windows にサブシステムで POSIX 準拠環境を追加しようが、仮想マシンで POSIX 準拠環境を追加しようが、**POSIX は OS の作り方を規定していない**のだから、一切関係ありません。

Windows カーネルに POSIX インターフェースを実装する必要もありません。POSIX は ライブラリ関数とカーネルのシステムコールを区別していません。

https://pubs.opengroup.org/onlinepubs/9699919799/frontmatter/preface.html

> No distinction is made between library functions and system calls; both are referred to as functions. 

**翻訳** ライブラリ関数とシステムコールを区別することはない。どちらも関数と呼ばれる。

したがって POSIX 準拠環境のすべてをユーザーランドで実装しても構わないということです。なぜライブラリ関数とシステムコールを区別することはないのか？ 当然です。システムコール（カーネルの一部）として実装しなさいと決めてしまうと、それは OS の作り方を規定することになってしまうからです。

POSIX はソースコードレベルでコンパイルしてアプリケーションを移植できればいいのです。Unix を作らなければならない一言も言っていません。また現実的には修正を一切せずに移植できるわけではありません。というかそもそも「移植」という言葉には修正するという意味が含まれています。POSIX はソースコードを別の OS に移植（修正）しやすくするためのもので **「POSIX 準拠したソースコードは、POSIX準拠 OS であればどれでも動作させることができる」といえるほど簡単なものではありません**。

## POSIXという名前は「POS」の末尾に「IX」を付けたもの

POSIX という名前はリチャード・ストールマンが命名しましたが、彼はオープンソース（正確には自由ソフトウェア）な GNU プロジェクトを立ち上げた人です。GNU は GNU is Not Unix（GNU は Unix ではない）の略です。つまり（クローズドで不自由な） Unix が嫌いなわけですね。その彼がなぜ POSIX を命名したかと言うと IEEEIX （誰かが IEEE.1003 に付けた名前） は呼びづらく簡潔な名前を付けなければ Unix と呼ばれるようになってしまうと危惧したからです。そこで IEEEIX のサブタイトルだった「Portable Operating System」に「IEEEIX」の「**IX**」をくっつけたわけです。**「X」をくっつけたのではなく「IX」をくっつけました。「末尾の「X」はUNIX互換OSに「X」の字がつく名前が多いことからつけられた」って出典はどこですか？** もっとも現在は POSIX は「Portable Operating System Interface」の略ということにはなっていますが（[参照](https://www.opengroup.org/austin/papers/backgrounder.html)）。ともかく、名実ともに POSIX は Unix ではありません。

https://stallman.org/articles/posix.html

> So I put the initials of "Portable Operating System" together with the same suffix "ix", and came up with "POSIX". 

https://opensource.com/article/19/7/what-posix-richard-stallman-explains

**追記** IEEE-IX は 1986 年の試用版で使われていたようですが、同じく 1986 年の第二版では POSIX へと変更されたようです。80 年代の半ば頃には UNIX がいくつもあり、その多くが「X」で終わる名前だった、それは名前の決定に影響を与えたのは確かだと以下に書かれています。

https://collaboration.opengroup.org/external/pasc.org/

> What is POSIX?
> The IEEE POSIX Standards are all currently entitled
> 	Information Technology --
> 	Portable Operating System Interface (POSIX) --
> 	Part xx: ....
> 
> The original, trial-use, standard published in 1986 was actually called IEEE-IX (IEEE's version of UNIX). However, this was rapidly changed to POSIX in time for the second printing (also in 1986).
> 
> The standard is heavily influenced by UNIX® -- and in the latest revision now merges with The Open Group's Base Specifications which comprise the core of the Single UNIX Specification -- in the mid eighties there was a plethora of UNIX operating systems, most of which had names ending in X (e.g. HPUX, AIX, PNX, Xenix, etc), and that certainly influenced the naming decision.
> 
>  The following quote appears in the Introduction to POSIX.1: "The name POSIX was suggested by Richard Stallman. It is expected to be pronounced pahz-icks as in positive, not poh-six, or other variations. The pronounciation has been published in an attempt to promulgate a standardized way of referring to a standard operating system interface".


## POSIXにGUIやシステム・ユーザー管理機能は含まれない

POSIX はアプリケーションのソースコードレベルの移植が目的なので、**システム管理機能、ユーザー管理機能、グラフィカルインターフェース、データベースサービス、画像ファイルフォーマット等は対象外**です。

https://pubs.opengroup.org/onlinepubs/9699919799/nframe.html

> The following areas are outside the scope of POSIX.1-2017:
> 
> - Graphics interfaces
> - Database management system interfaces
> - Record I/O considerations
> - Object or binary code portability
> - System configuration and resource availability

翻訳: 以下の領域は POSIX.-1-2017 のスコープ外である

- グラフィカルインターフェース
- データベース管理システムインターフェース
- レコード I/O に関する考察
- オブジェクトまたはバイナリコードの移植性
- システム構成とリソースの可用性

macOS は Unix ですが、macOS と同じ GUI やシステムやユーザー管理方法を提供しているその他の POSIX 準拠システムや Unix は無いでしょう？ 同じ Unix でも全部バラバラなんです。

Windows がコントロールパネルや「設定」からシステム管理やユーザー管理を行い、Unix と全く違う OS に見えても POSIX 準拠の話とはいっさい関係ありません。POSIX が「OS の作り方を規定していない」というのはそういうことです。

**POSIXによって定められていることは OS の機能として必要最小限のものだけ**です、C言語用のインターフェース（ライブラリ関数とシステムコールの区別はない）、プロセス環境、限られたファイルとディレクトリ、パスワードファイル、アーカイブフォーマットなど、それ以外のものは探しても見つかりません。例えば POSIX には `/bin` や `/home` などのディレクトリ構成も決まっていません。それも OS の作り方だからです。

## Windows は UNIX であり今は Linux である

元々 Windows NT は POSIX に準拠する OS として開発され、バージョンアップとともに UNIX としての機能を追加してきました。UNIX に関するサブシステムは時代とともに捨て去られ WSL によって Linux に関するサブシステムが追加されました。UNIX や Linux は Windows にとっては Windows に含まれる機能の一つという扱いです。だから Windows が今後 UNIX になることはありませんし Linux になることもありません。Windows の機能として組み込まれているからです。

Linux といってもさまざまディストリビューションがあります。同じ Linux でもディストリビューションごとに機能は異なります。同じ Ubuntu でも GNU を KDE のものに入れ替えた Kubuntu というディストリビューションもあります。WSL 込みの Windows は GNU に Windows デスクトップを採用した、Ubuntu ベースのディストリビューションと考えることも出来ます。Windows Terminal を起動すれば、すぐに bash が使えます。

## さいごに

1993 年当時の Windows の POSIX 準拠機能がどこまで使えたのかは私も懐疑的に思っていますが、それは私がそう思っていると言うだけです。シェルやコマンドが使えず Unix として実用にならなかったとしても POSIX 準拠であることは事実です。wikipedia に書くべきことは POSIX.2-1992 を含まない POSIX.1-1990 に準拠していたという事実です。シェルやコマンドが使えないのだから役に立たないだろうという個人的な主張は必要ありません。日本語版の wikipedia が役に立たないのはいつものことです。未だに Solaris や POSIX 準拠と書かれていますから。英語版からはとっくに消えています。1997 年以降の POSIX の歴史、現行の POSIX.1-2008（正確には POSIX.1-2017）どころか POSIX.1-2001 の話すら書かれていませんし、**日本語版を見ても POSIX を学ぶことは出来ません**。この素人さんは一体何年前の情報を元に書いたんでしょうかねぇ。誰か最新の英語版を翻訳してください。え？私がやれって？うーん、誰もやらなかったら、そのうちね。（近いうちに POSIX は改定されるから内容も変わるだろうし）