POSIX は規範的なものですか、それとも記述的なものですか?

POSIX は規範的なものですか、それとも記述的なものですか?

POSIX は、過去にアプリケーションが UNIX の特定の部分をどのように実装したかを説明したものなのでしょうか、それとも UNIX をどのように実装しなければならないかを規定した規範なのでしょうか。

説明的な場合は、含まれるすべての実装に共通する機能のみが有効になります。どの実装でも機能が実装されていない場合、その機能は「未定義」になります。

規範的である場合: どの理論的枠組みに基づいていますか? 数学ですか? C 言語ですか? 経験ですか?

答え1

それは規範的である法律上、しかしほとんどは説明的なデファクト

POSIX は、ドキュメントが公開された時点ですでに存在する実装と将来の実装の両方を含む、実装を照合できる仕様のセットです。つまり、規範的です。

実際には、POSIX は主に既存の実装の共通サブセットとして始まりました。したがって、この意味では、POSIX は主に記述的です。しかし、POSIX は新しい動作を義務付けることもあります。最も一般的なのは、多くの実装に存在していたが、異なるインターフェイス (関数名、コマンドラインオプションなど) を持つ機能に対して、POSIX は次のようないくつかの関数とユーティリティを導入しました。pax( Unix系OS間で大きく異なるtarと の代替)およびさまざまなcpioposix_xxx機能POSIXでは新しい定数とコマンドラインオプションも導入されました。例えば、ps「この-Aオプションは、BSD-gおよび SVIDと同等です-e。2 つのシステムは異なるため、ニーモニックの妥協案が選択されました。」 根拠セクションでは、多くの場合、この機能またはその機能が組み込まれた理由が説明され、どの実装にすでに機能が含まれていたか、または互換性のない実装間で選択が行われた、または行われなかった理由が言及されます。

答え2

POSIX の目的は、既存の動作を記述することであり、歴史的な動作がすでに明確な歴史的なバグであるとみなされない限り、歴史的な動作を壊さないこと (歴史的な UNIX を非準拠にしないこと) です。

POSIX のさらなる目的は、独自の発明を導入することではありません。既存の実装が標準化に役立たないため、いわゆる独自の発明が必要になることが判明した場合、POSIX 委員会のアイデアは、さまざまな UNIX (またはプログラム) バージョンの作者と議論され、最善の解決策が導き出されます。このような議論の結果、最終提案が書き込まれた時点でその提案をサポートする新しい実装が生まれることがよくあります。

いくつかの例外があります。たとえば、POSIX は、getpgrp()10setpgrp()年前にすでに存在していた BSD インターフェイスと競合する方法で定義されています。POSIX はgetline()fexec()GNU libc から互換性のないインターフェイスが導入される前の 30 年近く存在していた実装とはまったく互換性のない方法で定義されています。

既存の実装が一致しないことが判明した場合、どのバリアントを使用するか (または既存の異なる実装の組み合わせを導入するかどうか) が決定され、POSIX 固有の名前が導入されます。これは、たとえば、posix_xxx()Roger Faulkner (Sun Microsystems) による以前のリファレンス実装に非常によく似た関数が導入されたスレッド インターフェイスで発生しました。

関連情報