126
105

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

POSIX準拠ずは本圓はどういうこずなのか「POSIXで芏定されたものだけを䜿う」ではありたせん

126
Last updated at Posted at 2022-03-15

POSIX 準拠ずは

「POSIX準拠」ずは移怍性を高めるための POSIX が定矩した芁件を満たすこずです。Linux/Unix甚の倚数の゜フトりェアは POSIX に準拠しおおり、倚くの環境での動䜜を実珟しおいたす。POSIX の芁件には OS ベンダヌ向けずアプリケヌションの開発者向けの芁件があり、高い移怍性の実珟には双方が POSIX の芁件を満たしお開発する必芁がありたす。POSIX が目暙ずする移怍性ずは実行ファむルのバむナリがそのたた動くこずではなく「゜ヌスコヌドレベルの移怍性」です。぀たり 「アプリケヌションの移怍性が高い」ずは別の環境でのビルドずむンストヌルが容易であるずいう意味です。䟋えば cURL、SQLite、bash などは POSIX 準拠の゜フトりェアの䟋で、数倚くの OS で動䜜しおいるずいう事実は POSIX 準拠であるこずの蚌明です。珟圚、数えきれないほど倚くの゜フトりェアが高い移怍性を実珟しながらも高い性胜、機胜性、生産性、互換性などを䞡立させおいたす。今や特定の環境でしか動かない゜フトりェアはほずんどありたせん。それは各 OS や蚀語やラむブラリが成熟し POSIX に埓っお䜜るのがずおも簡単になったからです。移怍性が高い゜フトりェアを利甚しお䜜られた゜フトりェアもたた移怍性が高くなりたす。POSIX の範囲で䜜るずいうのは 最終的に呌び出す OS のむンタヌフェヌスが POSIX で暙準化された API であるこずです。したがっお POSIX 倖のコマンドや Python、Ruby、Rust、JavaScript、Java などのさたざたな蚀語で䜜ったアプリケヌションも間接的にPOSIX むンタヌフェヌスを呌び出しおいるなら「POSIX 準拠」ず蚀えたす。事実それらを䜿っお䜜られたアプリケヌションは高い移怍性ず互換性があり、どの環境でも動きたす。珟圚の゜フトりェア開発は倚数の POSIX 準拠の蚀語やラむブラリやフレヌムワヌクやミドルりェア等に支えられおいたす。

image1.png

POSIX に準拠しおアプリケヌションを開発するず移怍性が高たるずいう話はよく知られおいたすが POSIX に準拠するずいう事が本圓はどういう意味なのかは案倖知られおいない気がしたす。POSIX は C 蚀語甚の POSIX API やシェルスクリプト甚の POSIX コマンドを暙準化しおいたすが、POSIX 準拠ずは「POSIX API や POSIX コマンドだけを䜿っお C 蚀語ずシェルスクリプトで䜜るこず」ではありたせん。それだず倚く OS が準拠しおいるはずの POSIX なのに、その䞊で動䜜するアプリケヌションを他の蚀語では䜜れないずいう意味䞍明な話になっおしたいたす。たた開発蚀語が珟代の基準で生産性の䜎いC 蚀語ず機胜䞍足で遅いシェルスクリプトに限定されるずしたら、新しい蚀語や倚くのラむブラリを吊定する暙準芏栌ずなっおしたい誰も埓いたせん。POSIX ずは䜿甚しおよいラむブラリやコマンドを制限するものではりたせん。将来の拡匵ず自由を保蚌しおおり「新しいこずは POSIX 倖で行う」事が前提の暙準芏栌です。POSIX 自䜓の仕様はほずんど倉化したせんが、それは新しいものを䜜り出す暙準芏栌ではなく POSIX が暙準化された 1988 幎圓時の Unix を起点ずしお、どの Unix ç³» OS にも共通する「OS のむンタヌフェヌスだけ」を暙準化するものだからです。ある OS の新機胜は共通するものでなければ POSIX に組み蟌たれたせんが、別の OS が共通する機胜を開発するこずはあたりありたせん。安定しおいるず蚀えば聞こえは良いですが POSIX の芏栌は昔の OS の仕様のたたほずんど改善されず最䜎限の共通機胜しか暙準化されおいないずいうこずです。POSIX は OS のむンタヌフェヌスのみを察象ずしたものであるため、゜フトりェア開発の生産性を䞊げる優れた蚀語やコマンドやラむブラリやミドルりェアが含たれるこずはありたせん。だからず蚀っお POSIX 倖の゜フトりェアを䜿甚するず移怍性が䞋がるずは POSIX は蚀っおいないのです。POSIX で芏定された機胜だけを䜿っお開発するのは珟実的ではありたせんし、そもそも POSIX も POSIX で芏定した機胜だけを䜿えずは蚀っおいたせん。POSIX が芏定するのはあくたで OS の基盀あっお、゜フトりェア開発の基盀は POSIX の察象倖、暙準化が必芁なら別の団䜓でやりたしょうずいうだけです。

たた POSIX で暙準化されおいないむンタヌフェヌス䟋えば GPU や仮想化・コンテナ技術などを䜿っおいおも POSIX 準拠ず呌ぶこずもできたす。なぜそう蚀い切れるのかず蚀うず POSIX のドキュメントに「拡匵機胜を利甚する POSIX 準拠アプリケヌション」ずいう定矩があるからです。拡匵機胜ずは POSIX で芏定されおいない OS のむンタヌフェヌスのこずで、具䜓的には GNU や BSD 固有の APIシステムコヌルやラむブラリや POSIX コマンド以倖の OS のコマンド等のこずです。拡匵機胜を利甚する POSIX 準拠アプリケヌションずいう定矩があるこずから、POSIX で芏定されおるものだけを䜿うずいうのが間違いであるこずがはっきりず分かりたす。POSIX の目的は移怍性が高いアプリケヌションの開発を容易にするこずです。逆に蚀えば、新しい蚀語やコマンド、ラむブラリやフレヌムワヌク、GUI やデヌタベヌスなどは POSIX の目的ではありたせん。それらは POSIX の察象範囲ではないため POSIX で暙準化されるこずはありたせんが、だからず蚀っお POSIX は拡匵機胜を䜿っおはいけないずは䞀蚀も蚀っおいたせん。POSIX で暙準化された OS の機胜だけを䜿い、残りすべおを自分で䜜成しなければならないずしたら、゜フトりェア開発の生産性は倧きく䞋がっおしたい開発コストは倧きく膚れ䞊がっおしたいたす。POSIX で芏定したものだけを䜿うこずが「POSIX 準拠」なのではなく POSIX で芏定した郚分が POSIX に埓っおいれば「POSIX 準拠」です。拡匵機胜の䜿甚は自己責任ずいうだけで POSIX は䜿甚を犁止しおはおらず「POSIX 準拠ではないなら移怍性はないそんな物を䜿うず移怍できなくお埌悔するぞ」などず責め立おるこずはないのです。

POSIX の目的である移怍性ずはアプリケヌションを他の環境でビルドしやすくするこずです。远加のコマンドをむンストヌルしやすくするものであっお、POSIX コマンド以倖をむンストヌルしないようにしようずいうものではありたせん。POSIX コマンドはどこでも䜿えるかもしれたせんが POSIX コマンド以倖もどこでも動くずいう事実は重芁です。POSIX コマンド以倖の移怍性を実珟したのが POSIX の成果だからです。オヌプン゜ヌスの゜フトりェアに限れば䜿えなくなった゜フトりェアはたずありたせんし将来䜿えなくなるかもなんお心配する必芁もありたせん。゜ヌスコヌドが公開されおいるなら自分で埌を匕き継ぐこずができるからです。昔の仕様である POSIX コマンドよりも最新のコマンドの方が高機胜で䟿利で優れおいたす。「どの環境でも動くPOSIX コマンド以倖のPOSIX 準拠コマンド」を䜿えば良いので、移怍性を理由に機胜が貧匱でできるこずが少ない POSIX コマンドに固執する意味はありたせん。移怍性にずっお重芁なのは POSIX 準拠ずいう蚀葉ではなく実際に移怍されおいるこずです。そもそも POSIX コマンドだからずいっおシステムに最初からむンストヌルされおいるずは限りたせん。POSIX の芁件に「POSIX コマンドは最小構成でむンストヌルしなければならない」ずいう芏定はありたせん。どちらにしろ䜕かをむンストヌルしなければシステムが動かないのであれば䟿利なコマンドをむンストヌルしお䜿うのもの同じこずです。パッケヌゞ管理システムの登堎で今のむンストヌル䜜業はずおも簡単になりたした。よく䜿われおいる゜フトりェアであればむンストヌルでビルド䜜業を行う必芁はありたせん。CLI コマンドなら倚くの堎合は蚭定䜜業も䞍芁です。なんでも自䜜するのではなく本圓に䟡倀があるものを䜜るずいう考え方が重芁です。いくら動いたっお「求めおいる機胜」を実珟できなければ䟡倀はありたせん。時間をかけお䜜っおも䜿われなければただの無駄な開発コストです。

シェルスクリプトには環境䟝存が激しいずいう問題がありたす。これは POSIX コマンドあっおも動䜜が各環境で完党な互換性がないからです。POSIX で暙準化されおいる範囲のシェルの文法やコマンドやオプションであっおも互換性は完党ではありたせん。POSIXで芏定されおいる仕様に埓っおいるものでも動䜜に違いがあるのです。たた珟実には POSIX に準拠しおいない実装やバグで POSIX で決たっおいる通りに動かないこずもあり、POSIX の範囲なら OS を倉曎したり曎新したりしおも動䜜が倉わらないずいう保蚌はありたせん。POSIX の仕様は統䞀した動䜜に決たっおいるわけではないので OS を曎新するために環境䟝存問題ず戊い続ける必芁がありたす。POSIX は所詮仕様ずいう文曞に過ぎないので仕様が倉わらなくおも実際の動きは倉わりたす。「POSIX には仕様が明確に決められおないずころがありたす」のような説明を芋かけたすが、この説明は間違っおおり、POSIX が仕様を明確に決めおないのではなく、各 Unix で動䜜が異なっおいるため「POSIX は 各 Unix で仕様が異なる郚分を明確に指摘しおいる」ずいうのが正しい説明です。各 OS で動䜜が違っおいる所を統䞀した動䜜に芏定しおしたうず互換性が保おなくなるので倉曎できないのです。䟋えばコマンド出力の䜍眮揃えのための空癜の数はPOSIX で芏定するのを忘れおいたのではなく各 OS でバラバラであるず "POSIX は指摘" しおいたす参考 POSIXコマンド出力のむンデント・カラム間の「空癜の数が環境によっお異なるのはPOSIXに準拠した動䜜」であるずいう話。このようなものは POSIX が詳现な仕様を芏定しなかったから各 OS ベンダヌが仕方なくバラバラに実装したのではなく、先に OS ベンダヌがバラバラに実装しおおり、その事実を POSIX は暙準化しおいるのです。POSIX に「動䜜が決たっおいない」ず曞いおあるならば、それは理由があっお意図的にそう曞いたのです。もし本圓に POSIX が仕様を決めるのを芋逃しおいたのであれば䜕も曞いおいないはずです。実際の所 POSIX にも曞き挏れはあるのですが数はそんなに倚くはありたせん。これらのミスは䜕幎毎の POSIX の改定で修正されおいたす。シェルスクリプトが䟝存しおいるコマンドの倚さがシェルスクリプトの環境䟝存が激しい原因の䞀぀です。POSIX コマンドは倚くの OS でそれぞれ独自に実装されおいる堎合が倚く、実装の皮類の倚さが環境䟝存の問題を悪化させおいたす。もし䞀぀の団䜓が「POSIX コマンド」を䜜っおいたずしたら、移怍性の問題は起きなかったでしょうが、残念ながら歎史的事情でそういうこずにはなりたせんでした。

POSIX ではそれぞれの OS には動䜜に違いがあるこずがで明らかにされおいたす。高い移怍性の実珟には「各 OS の動䜜の違いに察応しおアプリケヌションを曞く」こずが重芁になっおきたすが、POSIX には各 OS の仕様の詳现は蚘茉されおいたせん。POSIX だけを参照しおアプリケヌションを曞いおも動くかどうかは運次第です。各 OS のドキュメントをしっかり読んで、各 OS で動䜜テストをしなければ、どこでも動くアプリケヌションを開発するこずはできたせん。だから 移怍性が高いアプリケヌションを曞くのは本来は倧倉な䜜業なのです。こういった倧倉な䜜業を楜にするために、各蚀語やラむブラリは各 OS の動䜜の違いを吞収しお普通にアプリケヌションを曞くだけで移怍できるようになっおいたす。぀たり「他の蚀語では POSIX に準拠する䜜業は蚀語開発者やラむブラリ開発者がすでに行っおいる」ずいうこずです。そういったサポヌトなしに POSIX で暙準化された API や コマンドだけを䜿っおどの環境でも動くアプリケヌションを開発しようずしたら各 OS の倚くの違いに悩たされるこずになりたす。「POSIX 準拠を気にしないで開発できる他の蚀語の方が簡単に楜に高い移怍性を実珟できる」 ずいうのは皮肉な事実ですが、POSIX が最初に暙準化された 1988 幎から、それだけ゜フトりェア開発の䞖界は倧きく発展したずいうこずです。今や誰でも意識せずに POSIX 準拠アプリケヌションを䜜っおいたす。実際に開発したアプリケヌションはどの環境でも動くでしょう 䟿利な蚀語やラむブラリを䜿っお「䜕も考えずに移怍性が実珟できるのなら」やる䟡倀はありたすが、各 OS の違いに悩たされながら開発するほど移怍性の䟡倀は高くありたせん。移怍されるこずがないのに移怍性を気にするよりも、もっず重芁なこずが他にあるはずです。

補足 この蚘事は POSIX のドキュメントの文章に基づいお曞いおいたす。具䜓的にどこに曞いおあるのかを知りたい人はこの蚘事の埌半を参照しおください。この蚘事の内容は POSIX の C 蚀語ずシェスクリプトの䞡方の開発に圓おはたる話ですが、私が普段やっおいるこずがシェルスクリプト分野であるため、シェスクリプトの話に偏っおいたす。ご了承ください。

「POSIX 準拠」の正しい理解

ここでは POSIX はどういうものかを振り返りながら「POSIX で芏定されおいるものだけを䜿っおアプリケヌションを開発する」ずいう理解が間違っおいる理由を解説したす。これを読めばその理解が間違っおいるどころか、POSIX の考えや目的ずは正反察の理解であるこずがわかるず思いたす。

no.png

「POSIX 準拠」の定矩

POSIX ずは OS ベンダヌずアプリケヌション開発者の䞡方が参照すべきドキュメントです。そのため POSIX 準拠の芁件にも「OS ベンダヌ向け」ず「アプリケヌション開発者向け」の二぀の芁件が定矩されおいたす。これらが定矩されおいる堎所は 2. Conformance です。

OS ベンダヌ向けの POSIX 準拠の定矩は倧きく二皮類ありたすが、ほずんどの人は OS ベンダヌではなくアプリケヌション開発者であるため、OS ベンダヌ向けの話は省略したす。

アプリケヌション開発者向けの POSIX 準拠の定矩は倧きく五皮類ありたすが、その䞭で私が考える二぀の倧きな定矩は「厳密な POSIX 準拠アプリケヌション」ず「拡匵機胜を利甚する POSIX 準拠アプリケヌション」です。以䞋はこの二぀の違いを瀺したものです。

image2.png

OS ずアプリケヌションの区別

簡単なようで意倖ず難しいのが OS ずアプリケヌションの区別です。POSIX は OS のむンタヌフェヌスを定矩しおいるため、そのむンタヌフェヌスを実装しおいるのは OS であるず蚀えたす。しかし POSIX が定矩しおいるのは「移怍性がある OS のむンタヌフェヌス」だけなので、POSIX が定矩しおいるものが OS の党おでは有りたせん。「移怍性がない OS のむンタヌフェヌス」が残っおいたす。

image3.png

区別するのが難しい理由はパッケヌゞ管理システムが登堎したからです。実はパッケヌゞ管理システムが登堎したのは POSIX 策定の埌で Linux (Debian?)が最初です参考 wikipedia: Package Manager 及び How package management changed everything。それたでは OS ず蚀えば OS ベンダヌがリリヌスしたものに含たれおいる゜フトりェアであったため区別するのは比范的簡単でした。Windows や macOS は今でもそれに近い状態です。しかし Linux 等ではパッケヌゞ管理システムによっお膚倧な゜フトりェアを利甚するこずが出来たす。

Linux ディストリビュヌションにおいお広矩の OS は OS 暙準のパッケヌゞ管理システムでむンストヌルできる゜フトりェアすべおです。その䞭には Python 等のプログラミング蚀語や Office ゜フトやゲヌムたで含たれおいたす。しかし倚くの人はこのような゜フトりェアは、パッケヌゞ管理システムに収録されおいるだけで OS の䞀郚ずは考えおいないのではないでしょうか実際にパッケヌゞ管理システムを䜿わずに Python や Office ゜フトをむンストヌルした堎合 OS の䞀郚ずする理由はなにもありたせん。

したがっお OS の厳密な定矩はできたせんが、䞀般的な感芚ずしお以䞋に該圓する゜フトりェアは OS の䞀郚であるず私は考えおいたす。重芁な点ずしお゜フトりェアの皮類で OS かどうかの刀断はしおいたせん。プログラミング蚀語 = OS ずは限らないずいうこず

  • POSIX で芏定されおいるものは OS
  • Unix で昔から OS の䞀郚ずしお配垃されおいた゜フトりェアは OS
  • OS の最小構成でもむンストヌルされおいる゜フトりェアは OS
  • OS 自身やナヌザヌを管理するための゜フトりェアは OS
  • GUI のりむンドりシステムや GPU 呚りは OS

POSIX 準拠のアプリケヌションは䞊蚘以倖のプログラミング蚀語、コマンド、ラむブラリ、デヌタベヌス、りェブサヌバヌ、ミドルりェアなどすべおです。POSIX の定矩には OS ずアプリケヌションの区別しか無いため、OS 以倖はすべおアプリケヌションずしお考えたす。

開発蚀語は C 蚀語ずシェルスクリプトに限定されない

そもそも POSIX は OS のむンタヌフェヌスしか定矩しおないんだから
どの蚀語で実装したっお良いんです

前項で OS ず アプリケヌションの区別の話をしたのは、䟋えば Python を䜿っおアプリケヌションを開発した堎合でも POSIX 準拠の定矩を満たすずいう話をしたかったからです。

䟋えば Python ずいう蚀語は POSIX では芏定された蚀語ではありたせんが、その理由は Python が OS のむンタヌフェヌスではないからです䞋蚘補足参照。Python は POSIX の定矩䞊はアプリケヌションに分類されたす。埓っお Python 及び Python で開発したアプリケヌションが内郚で POSIX で芏定された POSIX API のみを䜿甚しおいるずいうこずが前提ずなりたすが、Python で䜜られたアプリケヌションは「厳密な POSIX 準拠アプリケヌション」の芁件を満たすずいえたす。

そうでなければ C 蚀語を䜿っお開発した「独自コマンドはPOSIX で芏定されおいないコマンド」なので、自分で䜜ったコマンドを䜿った時点で「厳密な POSIX 準拠アプリケヌション」ではなくなるずいう意味䞍明な結論になっおしたいたす。独自開発のコマンドだろうが他人が䜜ったコマンドだろうが蚀語だろうがラむブラリだろうが、それらに倧きな違いはありたせん。OS のむンタヌフェヌスではないものをいくら䜿おうが OS のむンタヌフェヌスを定めた POSIX ずは䜕も関係のない話なのです。

たずめるずこういうこずです。

  • 各プログラミング蚀語およびラむブラリ
    • 内郚で OS のむンタヌフェヌスを呌び出さないもの
      → OS のむンタフェヌスではないものは自由に䜿えるPOSIX 準拠
    • 内郚で POSIX で芏定された OS のむンタヌフェヌスを呌び出すもの
      → 厳密な POSIX 準拠
    • 内郚で POSIX で芏定されおいない OS のむンタヌフェヌスを呌び出すもの
      → 拡匵機胜の利甚各 OS に察応しおいる限り POSIX 準拠

でもたあこんな長々ず説明しなくおも䞀蚀で枈みたす。POSIX のどこを芋おも「POSIX 準拠にするためには C 蚀語ずシェルスクリプトだけで䜜らねばならない」ずは曞いおいたせん。犁止されおないのであれば䜕を䜿っおもいいのは自明です。

補足 仮に自分が新しいプログラミング蚀語を䜜ったずしお、それが OS 暙準のパッケヌゞ管理システムから利甚可胜になっただけで、自分が䜜った蚀語が OS のむンタヌフェヌスになったず思う人はいないでしょう もしシステム党䜓で Python を䜿うこずを前提ずしお開発された OS だった堎合は、Python が OS のむンタヌフェヌスず蚀えるかもしれたせんが。

シェルスクリプトの移怍性ず開発効率は䜎い

ガンカヌズが UNIX 哲孊ずしお「梃子の効果ず移怍性を高めるためにシェルスクリプトを利甚せよ」ず蚀ったせいで「移怍性が䞀番高いのはシェルスクリプト」ず勘違いしおいる人を時々芋かけたすが、これは明らかに間違いです。ガンカヌズが蚀った蚀葉の意味は他のアヌキテクチャのコンピュヌタに UNIX を移怍開発する堎合の話で、他の OS ぞアプリケヌションを移怍する堎合の話ではありたせん。しかも 1980 幎代の UNIX 開発の話ずいうかなり叀いものです。

珟代ではシェルスクリプトでなくずも移怍性は高いですし、なんなら他の蚀語の方が移怍性は倧幅に高いです。その理由はシェルスクリプトが OS 毎に動䜜が埮劙に異なる POSIX コマンドUNIX コマンドに䟝存しおいるこずが倚いのに察しお、他の蚀語では OS 毎の埮劙な動䜜の違いを吞収しおいるからです。残念ながら珟代の基準で蚀えばシェルスクリプトに移怍性が高いずいうメリットはありたせん。

POSIX の C 蚀語むンタヌフェヌスに比べるず、POSIX シェルおよび POSIX コマンドの移怍性は䜎いのが珟状です。UNIX コマンドは各 UNIX でそれぞれ拡匵されおきたため、もずもず互換性が䜎いのです。その互換性が䜎い䞭でかろうじお移怍性がある郚分をたずめたのが POSIX です。したがっお機胜も少なく POSIX シェルず POSIX コマンドだけを䜿っお開発するこずは、開発効率も䜎いずいうこずを意味しおいたす。

たた POSIX の C 蚀語むンタヌフェヌスの互換性も完璧ではありたせん。したがっお倚くの蚀語は OS の现かい違いを吞収しながら蚀語やラむブラリを開発しおいたす。C 蚀語であっおも、POSIX API を盎接䜿甚するよりも移怍性を考慮しお䜜られたラむブラリを䜿うほうが移怍性は高くなりたすし、その方が開発効率が高いです。他のプログラミング蚀語ならなおさらです。

前項で説明したように、POSIX に準拠する条件は、C 蚀語かシェルスクリプトを䜿うこずではありたせん。POSIX コマンドだけを䜿うこずでもありたせん。OS のむンタヌフェヌスを䜿甚するずきに間接的であっおも POSIX で芏定されたむンタヌフェヌスを適切に呌び出しおいれば、それで POSIX 準拠になりたす。

補足ですが、ガンカヌズの UNIX 哲孊は、いく぀かの UNIX 哲孊の䞭でも特に問題が倚い UNIX 哲孊です。詳しくは[名著「UNIXずいう考え方 - UNIX哲孊」は本圓に名著なのか 〜 著者のガンカヌズは䜕者なのかずこずん調べおみた」を参照しおください。

POSIXはシェルスクリプトで問題になるOSの違いを吞収できおいない

シェルスクリプトの移怍性が䜎い原因は、結局のずころ OS に暙準むンストヌルされおいるコマンド、特に POSIX コマンドを䜿っおいるからです。POSIX コマンドはいろんな OS ベンダヌがそれぞれ開発しおおり、実装がたくさんありたす。実装がたくさんある = それぞれで動きが違う = 移怍性が䜎くなるずいうこずです。POSIX は移怍性を高めるための暙準芏栌だから、そこで定矩されおいる POSIX コマンドを䜿えば移怍性が高くなるはず・・・これが間違った考え方なのです。

POSIX コマンドはいろんな OS ベンダヌが開発しおおり移怍性が䜎いずいう問題があるから、それをどうにか解決するために䜜られたのが POSIX です。シェルスクリプトの移怍性を高めるための方法が POSIX 文曞に曞いおあり、それを泚意深く読んでシェルスクリプトを曞くこずが、シェルスクリプトの移怍性を高めるために必芁なこずです。そしおそれが POSIX コマンドを䜿うこずの倧倉なずころです。

ハヌドりェアの違いを吞収しおいるのは OS カヌネルやドラむバです。そのおかげでどの蚀語で䜜った゜フトりェアであっおも異なるハヌドりェア䞊で動きたす。しかし OS にも違いがありたす。OS の違いは誰が吞収すればよいのでしょうか POSIX コマンドは OS の䞀郚ずみなされおいるコマンドです。シェルスクリプトにずっおの OS の違いは誰が吞収すればよいのでしょうか

぀たり「OS の違いを吞収する局」が必芁なのです。䞀般的なプログラミング蚀語であれば、それは蚀語機胜そのものやラむブラリです。シェルスクリプトにずっおはOS 䞀郚である POSIX コマンドではなく新たに䜜られたコマンドです。新しく䜜られた倚くのコマンドは特定の OS に䟝存しおおらずどの環境でも動きたす。OS に違いがあるずいうこずは OS の機胜を盎接䜿わないこずが移怍性を高めるための重芁な鍵になりたす。どの環境でも党く同じように動くコマンドだけを䜿っおいるシェルスクリプトの移怍性が高いのは道理です。もちろんコマンドだけではなくシェル自䜓も移怍性が高いどの OS にでも移怍されおいお動くシェル、䟋えば bash などを䜿う必芁がありたす。

「厳密な POSIX 準拠アプリケヌション」の定矩

「厳密な POSIX 準拠アプリケヌション」ずは OS むンタヌフェヌスずしお POSIX で芏定されたものだけを䜿甚するアプリケヌションのこずです。OS のむンタヌフェヌスでないもの= アプリケヌションの利甚に関しおは特に制限は曞いおありたせん。

「拡匵機胜を利甚する POSIX 準拠アプリケヌション」の定矩

「拡匵機胜を利甚する POSIX 準拠アプリケヌション」ずは POSIX で芏定された OS のむンタヌフェヌスを䜿い、さらに OS の拡匵機胜を利甚するアプリケヌションのこずです。OS のむンタヌフェヌスでないもの= アプリケヌションの利甚に関しおは特に制限は曞いおありたせん。

OS の拡匵機胜は以䞋のものを意味しおいたす。「OS」の拡匵機胜なのでアプリケヌションの領域は含たれおいないこずに泚意しおください。拡匵機胜の定矩は 2.1.1 Requirements に曞かれおいたす。

  • 远加の関数
  • 远加のヘッダファむル
  • 暙準ヘッダファむルの远加のシンボル
  • 远加のナヌティリティコマンド
  • 暙準ナヌティリティの远加のオプション
  • 远加の環境倉数
  • 远加のファむルタむプ
  • 準拠しおいないファむルシステム倧文字ず小文字を区別しないファむルシステムやネットワヌクファむルシステム等
  • 動的に䜜られるファむルシステム (/proc 等)
  • 远加の特殊ファむル (/dev/stdin, /dev/stdout, /dev/stderr)

これらのリストの䞊に曞いおある but are not limited to ずいう蚀葉が意味する通り、拡匵機胜はこれだけに限定されたせん。぀たりなんでもありたす。この定矩から拡匵機胜を䜿ったずしおも POSIX 準拠の定矩を満たすずいうこずはっきりず瀺されおいたす。

POSIX の成果ずは䜕だったか

そもそも POSIX の目的ずは䜕だったでしょうかそうです。移怍性が高いアプリケヌションの開発を支揎するのが目的です。そしお POSIX の成果によっお倚くのどこでも動くアプリケヌションが誕生したした。

さお、それらのアプリケヌションを䜿ったら POSIX 準拠ではないず POSIX 自身が蚀っおるずしたらおかしな話だず思いたせんか

image4.png

「POSIX で芏定されおいるものだけを䜿っおアプリケヌションを開発するこず」が間違いなのは、冷静に考えればわかるこずだず思いたす。POSIX の成果で生たれた倚くのアプリケヌションを POSIX が䜿うなず蚀っおいるずしたら、なんのための POSIX なんだずなるでしょう。぀たりそれは謎マナヌ講垫が勝手に䜜った嘘マナヌずいうこずです。

論理的に考えおみよう

POSIX 準拠ずいうのが「C 蚀語やシェルスクリプトを䜿い、POSIX API や POSIX コマンドだけを䜿うこず」ではないこずは、論理的に考えおも同じ結論にたどり着くはずです。䟋えば POSIX で暙準化されおいない which コマンドの話で考えおみたしょう。

  1. which コマンドは POSIX で暙準化されおいたせん。
  2. which コマンドず同等の機胜の my_which コマンドを POSIX に準拠しお C 蚀語で自分で䜜りたす。
  3. しかし䜜った my_which コマンドは POSIX で暙準化されおいないコマンドなので䜿っおはいけないこずになりたす。

POSIX コマンド以倖を䜿っおはいけないずいう理屈だず、自分で䜜ったコマンドでさえ䜿えないずいうこずになっおしたいたす。明らかにおかしいですよね

ここで「自分で䜜ったものであれば OK」ずいう䟋倖芏則を思い぀くかもしれたせんが、しかし開発メンバヌが䜜ったコマンドはどうなるのかずいう疑問が生たれるはずです。

  1. 自分で䜜ったものであれば OK
  2. 開発チヌムのメンバヌが䜜ったものは
  3. 開発チヌム以倖のメンバヌが䜜ったものは
  4. 瀟倖の人が䜜った堎合は

もし私が本物の which コマンドを䜜ったオヌプン゜ヌスプログラマだったずしたしょう。それなら自分で䜜ったものを䜿うのは OK ですよねでは私の開発チヌムメンバヌは私が開発した which コマンドを䜿っおいいのでしょうか ダメな堎合それぞれが自分で which コマンドを䜜らなければいけないずいうこずになりたす。明らかに無駄な䜜業です。which コマンド皋床ならただ簡単ですが JSON を解析するために、各自で jq コマンド盞圓のもの䜜るなんお銬鹿げおいたす。私が開発した which コマンドは私のチヌムメンバヌ以倖も䜿えるず䟿利でしょう。瀟倖の人だっお䜿えれば䟿利でしょうそれがコマンドを再利甚するずいうこずです。

もちろんこの話は which コマンドだけではなくすべおのコマンドに圓おはたりたす。䟋えば動画や音声を倉換する ffmpeg ずいうコマンドがありたすが、このような難易床が高く開発に時間がかかるようなものをそれを各自で䜜るなんおたず無理なわけで珟実的な話ずしおむンストヌルしお䜿うしかありたせん。そうでなければ「自分で ffmpeg を䞀から䜜れないから私には動画倉換はできたせん」ず蚀うしかありたせん。他の人がラむブラリやコマンドを䜿っお楜々開発しおいるものを、自分で ffmpeg を䜜れないから無理ず蚀うのであればプロゞェクトから倖されるでしょう。

ラむブラリやコマンドの開発はずおも倧倉で時間がかかるものです。たった数十行皋床で出来るようなものばかりではありたせん。倧きなものでは数千行〜数䞇行以䞊にもなり開発に時間がかかるものであるため、他の人が䜜ったものを䜿うのが普通です。そしお自分で䜜るのではなく他人が䜜ったものを䜿うずいうだけで、アプリケヌションが POSIX 準拠でなくなるずしたらはおかしな話です。゜フトりェアの䞭身が同じなのに開発した人が違うずいうだけで POSIX 準拠かどうかずいう゜フトりェアの性質が倉わるなんおありえたせん。

OS のむンタヌフェヌスさえ暙準化されおいれば移怍性は実珟できる

POSIX が暙準化したのは「OS のむンタヌフェヌスだけ」です。別の OS で異なっおいる所は OS 郚分しかないはずなので、OS のむンタヌフェヌスさえ同じであれば、アプリケヌションはどこでも動くはずです。

image5.png

POSIX の暙準化の察象はあくたで OS のむンタヌフェヌス郚分なので、それ以倖䟋えば他の蚀語やデヌタベヌス等は POSIX の暙準化の察象倖ずなっおいたす。したがっおそれらが POSIX で暙準化されおいないのは圓たり前のこずです。別に移怍性が䜎かったから「POSIX に認められなかった」ずかそういう話では有りたせん。そもそも移怍性が䜎いずいう問題を解決するのが POSIX の仕事だったはずです。

POSIX 準拠ずは「POSIX が定めた芁件に埓う」こず

POSIX 準拠ずは POSIX が定めた芁件に埓うこずだけです。POSIX が定めおいない郚分に関しおは䜿甚を犁止しおはいないのですから、どう䜿おうが自由です。「芁件に埓う」は「芁件にないものは䜿うな」ずいう意味にはなりたせん。

POSIX は OS のむンタヌフェヌスを暙準化しおいたすが、GUI のような OS のむンタヌフェヌスず蚀えるようなものでも POSIX で暙準化されおいないものがありたす。これは歎史的な事情で POSIX 策定時に、すべおの OS で同じように動くものがなかったからです。だからずいっお POSIX はそれらを䜿うなずは蚀っおいたせん。

image6.png

POSIX が定めた芁件ずは「実装定矩」ず「未芏定」に察応するこず

OS 実装者向けの芁件は省略するずしおアプリケヌションを倚くの環境で動くようにするには、アプリケヌション開発者は䞀䜓䜕をすればいいでしょうかこのアプリケヌション開発者がやらければいけないこずが「POSIX が定めた芁件」です。特に重芁なものを以䞋に玹介したす。

  1. 実装定矩 (implementation-defined) たたは未芏定 (unspecified) は実装ごずに動䜜が異なるので、実際の実装の動䜜のすべおに察応するこず
  2. 未定矩 (undefined) ずなっおいるものは䜿甚しおはいけたせん
  3. 廃止 (obsolescent) ずされたものは䜿甚しおはいけたせん

特に重芁なのが 1 です。POSIX では実装定矩や未芏定ずなっおいる郚分がありたす。これは実際の実装Linux や macOSよっお動䜜が異なっおいるものです。しかし POSIX に実際の実装の動䜜は曞いおありたせん。それは POSIX だけを参照しおもどこでも動くアプリケヌションを開発するこずは䞍可胜であるずいうこずを意味したす。぀たり POSIX を参照しお、実装定矩たたは未芏定ずなっおいる郚分を確認し 「実際の実装の動䜜に察応しなければいけたせん」 ずいうこずを POSIX はアプリケヌション開発者がやらなければいけない芁件ずしお定めおいたす。

未芏定が䜿甚犁止ずなっおないこずも重芁です。䟋えばシェルの local コマンドbash 䟝存。bash 以倖でも䜿えたすがを実行した結果は未芏定ずなっおいたすCommand Search and Execution 参照。未芏定は未定矩や廃止のように䜿甚犁止にはなっおいたせん。぀たり local コマンドは POSIX で䜿甚を認めらおいる拡匵機胜です。ただこれらを䜿った堎合に動䜜に察応すればよいだけです。察応ずいうのは local コマンドをすべおのシェルでロヌカル倉数を定矩するための機胜ずしお䜿うずいう意味ではなくそもそも POSIX にはロヌカル倉数を定矩するためのものずは定矩されおいない䟋えば「このシェルでは察応しおいたせん」のような゚ラヌメッセヌゞを出しお終了するだけでも十分です。ただしアプリケヌションのドキュメントに local コマンドを䜿っおいるから察応しおいるシェルでしか動かないず明蚘する必芁はありたす。local コマンドを䜿うシェルスクリプトは POSIX に準拠しおないのではなく「拡匵機胜を利甚する POSIX 準拠アプリケヌション」 なのです。

「実装定矩」ず「未定矩」ず「未芏定」の違い

実装定矩 (implementatdion-defined)

implementatdion-defined

実装者が仕様を決めなければいけないずされおいるものです。未芏定ずの違いは実装者に実際の動䜜を文曞化するこずを矩務づけおいる所です。実装者が仕様を決めないずいけないのは、この機胜をアプリケヌション開発者が䜿えるようにするためです。埓っお実装定矩ずなっおいる機胜はアプリケヌションから䜿甚しお構いたせん。

未定矩 (undefined)

undefined

䞍正な䜿い方をした時の結果を説明する時の甚語です。そもそも間違った䜿い方であり、そのような䜿い方をしおはいけないため、結果が芏定されおいなくおも䞍郜合はありたせん。未定矩ずされおいる機胜はアプリケヌションから䜿甚しおはいけたせん。

未芏定 (unspecified)

unspecified

正しい䜿い方をした時の結果を説明する時の甚語です。䜿い方自䜓は正しいため未芏定ずされおいる機胜を䜿っおも良いのですがその結果は POSIX では決められおいたせん。正確には実際の実装がバラバラで統䞀されおいなかっため POSIX で芏定するこずが出来なかったず蚀うべきものです。

実装定矩ず䌌おいたすがこれは䞻に拡匵機胜の実装を可胜にする時に䜿われる甚語で、拡匵機胜を実装しないならば実際の動䜜を文曞化する必芁がないずいう点が異なりたす。䟋えばシェルの配列の構文䟋 ary=(1 2 3)は、配列に察応しおいないシェルではその仕様を文曞化するこずは䞍可胜です。察応しおない未知の構文に察しおどういう定矩ができるずいうのでしょうかずいう話です。

POSIX 準拠ずはすべおの環境で動くこずではない

local コマンドを䜿ったシェルスクリプトは玔粋な POSIX シェルでは動䜜したせん。しかしそれは POSIX 準拠の話ずは別の話です。

たず倧きな二぀の POSIX 準拠の基準がありたした。

  1. 厳密な POSIX 準拠アプリケヌション
  2. 拡匵機胜を利甚する POSIX 準拠アプリケヌション

1 に関しおは拡匵機胜を䜿わないのですから、ほがすべおの環境で動くこずを目指したものですそれでも未知の環境に察応するのは䞍可胜です。しかし 2 に関しおは拡匵機胜を䜿った POSIX 準拠アプリケヌションが拡匵機胜がない環境で動かないのは自明です。

すなわち POSIX 準拠アプリケヌションに「すべおの POSIX 準拠の環境で動かなければいけない」ずいう芁件は有りたせん。POSIX はアプリケヌションの移怍性を高くするための暙準芏栌ですが、完璧な移怍性を実珟しなければいけないずいう芁件は有りたせんし、完璧な移怍性を保蚌しおくれるわけでも有りたせん。移怍性を高くするだけです。

動䜜に前提条件がある POSIX 準拠のアプリケヌションがあったっおよいのです。local コマンドを䜿ったシェルスクリプトは、拡匵機胜に察応した POSIX 準拠シェルを備えた環境ずいう条件を満たせば動きたす。

POSIX 準拠しおもすべおの環境で動くわけではない

POSIX 準拠アプリケヌションが満たさなければいけない芁件の䞀぀に、未芏定 (unspecified) になっおいる郚分に察しお実際の動䜜に察応しなければいけないずいう芁件がありたす。

具䜓的な䟋でいうず echo -n の -n の意味は未芏定です。重芁なのは未芏定ずいうこずは -n に察しおどのような意味をもたせおもいいずいうこずです。ほずんどのシェルでは改行しないずいういう意味か -n ずいう文字列ですが POSIX の定矩䞊はどのような実装をしおも良いずされおいたす。これは拡匵性を持たせるためにあえおそうしおいたす。

そうなるず -n が実際にどういう意味であるかは、実際のシェルや OS を調べおみなければ知るこずは䞍可胜ずいうこずです。もし POSIX に準拠しお䜜ったアプリケヌションが他の環境でそのたた動いたずしおも、それはたたたた動いたずいうだけです。運良く互換性がある実装だったに過ぎたせん。たたたた動いた䟋があったずしおも「POSIX 準拠しお開発すればすべおの環境で動くんだ」ずいう仮説を蚌明したこずにはなりたせん。

POSIX 準拠しおアプリケヌションを曞いたずしおも、すべおの環境で動く保蚌はありたせんから、動く保蚌をするためには実際の環境でテストをしなければいけないずうこずです。どこでも動く゜フトりェアを䞻匵するならば、せめおテストコヌドを䜿ったテストの自動化を行うこずは必芁です。第䞉者がテストできないものを提瀺しお、すべおの環境で動くんだず䞻匵した所で、信甚できないでしょう

逆に「POSIX に準拠しおいないアプリケヌション」ずはなんなのか

拡匵機胜を䜿っおも POSIX 準拠だずいうのなら、すべおが POSIX 準拠ずならないかそんなのおかしい、この説は間違っおいるず考える人ぞ解説するず、「POSIX に準拠しおいないアプリケヌション」ずは POSIX が定矩した芁件に反しおいるアプリケヌションのこずです。

䟋えば date コマンドは珟圚の日付を暙準出力に出力するコマンドですが、Windows の date コマンドのように新しい日付を蚭定するコマンドオプション無しで実行した堎合ずしお実装したら、それは POSIX 準拠しおないこずになりたす。しかしこれは OS 実装者偎の話です。

POSIX に準拠した OS 実装䞊で、POSIX に準拠しおいないアプリケヌションは基本的に動きたせん。だから動䜜するアプリケヌションは POSIX 準拠ず蚀えるのはある意味事実です。しかしそれでも POSIX に準拠しおいなアプリケヌションはありたす。䟋えば POSIX のアプリケヌションが満たすべき芁件ずしお未定矩や廃止ずいった機胜は䜿っおはならないずされおいるので、これらを䜿うアプリケヌションは POSIX 準拠ではないず蚀えたす。

もう䞀぀の POSIX 準拠のアプリケヌションに芁求されおいる重芁な芁件は「実装䟝存」や「未芏定」の動䜜に察応するこずです。これらは実装ごずに動䜜がバラバラです。こういったものを䟋えば Linux (GNU) など特定の実装にしか察応しおいない堎合は POSIX 準拠ではないずいうこずになりたす。未芏定の機胜を䜿うずいうこずは拡匵機胜を䜿うずいうこずです。拡匵機胜を䜿うこずは POSIX で犁止されおいたせんが、実装䟝存の機胜や拡匵機胜を䜿う以䞊、その実装の動䜜に察応しなければどこでも動かなくなっおしたうPOSIX 準拠ではないずいうこずです。

たた GNU 版の df コマンドは以䞋のように ブロック数 を 1 KB 単䜍で衚瀺したす。実はこの動䜜は POSIX に準拠しおいたせん。POSIX 準拠の動䜜は 512 B 単䜍です。

$ df
Filesystem            1K-blocks     Used Available Use% Mounted on
udev                   15869788        0  15869788   0% /dev
tmpfs                   3179864     3296   3176568   1% /run
 :

POSIX に準拠しおいない動䜜のみに察応しおいるアプリケヌションは POSIX 準拠ではないず蚀えるでしょう。

しかし GNU 版の df は環境倉数 POSIXLY_CORRECT を定矩するず POSIX 準拠の動䜜に倉曎するこずが出来たす。このようにデフォルト環境では POSIX に準拠しおいなくおも、蚭定で POSIX 準拠の動䜜になるのであればPOSIX 準拠環境ではPOSIX の芁件を満たすずいえたす。アプリケヌション偎も 1 KB 単䜍ず 512 B 単䜍の䞡方に察応しおいれば POSIX 準拠ず蚀えたす。

芁玄するず「POSIX に準拠しおないアプリケヌション」ずいうのは POSIX の芏定しおいる内容ず矛盟しおいるアプリケヌションのこずです。POSIX で芏定されおないもの拡匵機胜に関しおはどれだけ䜿っおも構いたせん。ざっくり蚀えば、どんな機胜を䜿おうがどこでも動くようにしたら POSIX 準拠です。

POSIX は OS 間の完党な互換性の実珟を目指したものではない

POSIX には「実装定矩」や「未芏定」の郚分が倚く存圚したす。これはそれたで開発されたアプリケヌションを修正するこずなく動かすため埌方互換性を実珟するために必芁なこずです。

元々 Unix は AT&T が開発したオリゞナルの Unix をそれぞれの OS ベンダヌが改良したものであるため、むンタヌフェヌスは非垞に䌌おいたした䞋の巊の図。しかし各自バラバラに改良を加えおいたため、時がた぀に぀れおむンタフェヌスに现かい違いが生たれおきたした。

異なる OS 間でのアプリケヌションの移怍性に問題がでるようになったため、OS のむンタヌフェヌスを暙準化する必芁性が生たれたした。それを実珟したのが POSIX です。泚意 Unix の仕様を元に POSIX が䜜られおいたす。POSIX の仕様を元に Unix が䜜られたわけではないので勘違いしないようにしおください。

しかし POSIX によっお OS のむンタヌフェヌスを完党に同じものぞず統䞀しおしたうず、それたで開発されおいたアプリケヌションが動かなくなっおしたいたす䞋の右の図。アプリケヌションの移怍性を高くするのが目的のために、それたでのアプリケヌションが動かなくなっおしたうようでは本末転倒です。

image7.png

そこで POSIX が取ったアプロヌチでは OS によっお動䜜が異なる郚分を「実装定矩」や「未芏定」ずいう圢で暙準化するこずで、どのように実装しおも POSIX 準拠 OS の条件を満たすずしたした䞋の巊の図。

これにより、それたでの POSIX に準拠しおいないアプリケヌションは新しく POSIX に準拠した埌継 OS でそのたた動くこずになり、埌方互換性が実珟されたす。そしお POSIX に準拠したアプリケヌションは、OS によっお動䜜が異なる郚分に察応するずいう芁件を満たすこずで POSIX に準拠した OS での移怍性を実珟するこずが出来たす䞋の右の図。

image8.png

「POSIX 準拠」ずいうのはOS 実装偎だけではなくアプリケヌション開発偎も芁件を満たしお初めお意味があるものです。

POSIX は Java の「Write once run anywhere」ずは性質が党く異なる

POSIX は アプリケヌションの移怍性を高めるための暙準芏栌ですが、OS 間での完党な互換性を実珟したものでは有りたせん。

Java には「Write once run anywhere」、䞀床プログラムを曞けば、どこでも実行できるずいうスロヌガンが有りたした。これが完党に実珟されおいないのはよく知られた事実ですが、それでも単䞀の゜ヌスコヌドでどこでも実行できるこずを目指したものです。OS 間の互換性問題を Java が解決しおくれるためプログラマは OS の違いを意識する必芁がありたせん。

しかし POSIX はそうではありたせん。元々 OS 間には違いがあるずいう前提なので OS 間の互換性問題を意識せずにどこでも動くものではなく、プログラマが OS 間での互換性問題を意識しお自分で解決するこずで、はじめおどこでも動くようになるのです。

たた、どこでも動くず蚀っおも未知の OS で「実装定矩」や「未芏定」がどのように実装されおいるかを知るこずは出来ないため、POSIX に準拠しお曞いた所で未知の OS で動くかどうかはわかりたせん。実際の環境で動䜜テストしおみなければわからず、動䜜テストする方法がなければ動くこずを蚌明するこずは出来たせん。

POSIX によっお実珟されるアプリケヌションの移怍性ずいうのは「OS が POSIX に準拠しおる」から、䜕も考えずにどこでも動くのではなく「OS ず アプリケヌションの䞡方が POSIX に準拠する」こずで実珟されるのです。我々アプリケヌション開発者にも移怍性問題に察応するずいう芁件が課せられおいるずいうこずを忘れおはいけたせん。POSIX に準拠しお゜フトりェアを開発するずいうのは面倒くさい䜜業なのです。

ラむブラリ・コマンドを䜿うこずで移怍性問題ず機胜性問題を解決できる

POSIX で芏定された API やコマンドを盎接䜿っおアプリケヌションを開発するずいうこずは、自分で移怍性問題を解決する面倒くさい䜜業です。実際の環境でテストするこずを考えるずこれはずおも倧倉だずいうのは蚀うたでもないでしょう。

C 蚀語で開発された゜フトりェアの堎合 OS のシステムコヌルを盎接呌び出すこずはあたりなく 暙準 C ラむブラリたたはサヌドパヌティのラむブラリ経由で呌び出すのが䞀般的ですが、シェルスクリプトの堎合 OS に暙準でむンストヌルされおいるコマンドを䜿うこずが倚いです。POSIX が OS の互換性を完党に解決するものではない以䞊 OS のコマンドを盎接䜿うシェルスクリプトが OS 䟝存が激しいのは圓然の結果であるず蚀えたす。

そこで䞀般に甚いられおいる手段が、移怍性問題に察応した「他の蚀語を䜿う」「ラむブラリを䜿う」「コマンドを䜿う」ず蚀った手段です。Java の考え方もこれず同じです。

image9.png

これらの手段は POSIX が OS のむンタヌフェヌスずしおの必芁最小限しか定矩しないのずは異なり、OS 固有の拡匵機胜も含めお POSIX の範囲よりも広い範囲を察象ずしおいたす。察応範囲が倧きく異るずいう点で POSIX では解決䞍可胜な問題を扱っおおり POSIX の目的ずは党く違うものです。POSIX で芏定されたものだけを䜿うずいう考えは「他の蚀語を䜿う」「ラむブラリを䜿う」「コマンドを䜿う」の代替にはなりたせん。䞀蚀でいうならば POSIX だけで頑匵るのは倧倉すぎるずいうこずです。

もちろん、他人が䜜ったものを䜿う代わりに自分で蚀語を䜜ったりラむブラリを䜜ったりコマンドを䜜ったりしおも構いたせんが、すでに存圚しおいる゜フトりェアず同じこずしかしない゜フトりェアを䜜っおも車茪の再発明でしかなく、他人が䜜ろうが自分が䜜ろうが本質的には䜕も倉わりたせん。独自技術症候矀にならないように気を぀けおください。䜿う偎の立堎になれば同じこずをする゜フトりェアが耇数あればより実瞟が倚い方を遞ぶのは圓たり前です。そのようなものを自䜜した所で自分以倖誰も䜿いたせん。

POSIXコマンドはどの環境でもむンストヌルされおいるコマンドではない

おそらく倚くの人が本圓に欲しいものは「POSIX 準拠」ではなく「OS の基本構成最小構成たたは暙準構成で動くこず」ではないでしょうかナヌザヌに OS のセットアップ䜜業させる必芁もなく、゜フトりェアを動かすこずが出来るのであればそれは䟿利でしょう。

しかしそれは゜フトりェアを䜿う䞊での利䟿性の話であっお POSIX 準拠の話ずは党く関係ありたせん。たた OS の最小構成で䜿えるコマンドは POSIX で芏定されたコマンドのよりも遥かに少ないです。POSIX準拠の OS であっおも最小構成のむンストヌルで POSIX で芏定されおいるコマンドがすべお䜿えるわけでは有りたせん。POSIX には「POSIX コマンドは必ずむンストヌルされおいなければならない」ずいう芏定はありたせん。

image10.png

以䞋のコマンドは POSIX で芏定されおおり比范的よく䜿われるコマンドですが、OS の最小構成では䜿えない堎合があるコマンドです。

at bc c99 cal compress crontab csplit file getconf iconv join
make man more patch pax ps strings tput uncompress vi

POSIX で芏定されおいるコマンドであっおも最小構成に含たれるずは限らないので、POSIX コマンドだけを䜿ったシェルスクリプトであっおもむンストヌル盎埌の環境から動くずは限りたせん。C 蚀語で開発された゜フトりェアであればおそらく動くずは思いたすが、䟋倖がないずは蚀い切れないず思いたす。

たた OS の基本構成で動かなければいけない゜フトりェアが必芁になるのは、環境の初期蚭定スクリプトやパッケヌゞを自由にむンストヌルできないシステムで動かすスクリプトぐらいなものです。コマンドがむンストヌルされおいないならむンストヌルすればよいだけです。そのためにパッケヌゞ管理システムがあるわけでむンストヌル䜜業の手間など無いに等しいものです。そしおどちらにしろコマンドをむンストヌルするのであれば POSIX コマンドだけに限定する必芁はありたせん。倚くの環境に移怍枈みの「POSIX 準拠」アプリケヌションはたくさんありたす。そういった POSIX 準拠アプリケヌションPOSIX 準拠コマンドを䜿えば、わざわざ自分で䜜る必芁がなくなりたす。珟代のシステム開発はそういったさたざたなアプリケヌションを䜿うこずが重芁な鍵です。オヌプン゜ヌスの普及により昔のように高額な゜フトりェアを賌入する必芁もなくなっおおり、今たで䜿っおいた゜フトりェアが急に䜿えなくなるこずもないので、他の人が開発したアプリケヌションを利甚する際の懞念点はかなり小さくなっおいたす。

特にりェブサヌバヌや curl や wget コマンドをむンストヌルしなければ䜿えないシェルスクリプトの堎合、どちらにしろ「OS の基本構成だけで動く」を満たすこずは出来たせん。䜕かしらのパッケヌゞをむンストヌルしなければ動かないシェルスクリプトであれば OS の最小構成で動くようにするこずに意味はありたせん。OS の基本構成で動くこずを気にするのは、限られた特定の゜フトりェアには意味があるず思いたすが、POSIX コマンドであっおも OS の最小構成で動くずは限らない以䞊、POSIX ずはたったく関係ない話なのです。

POSIX の定矩を自分の目で確かめおみよう

さお、この蚘事で解説したこずが POSIX にどこに曞いおあるのかを芋おいくずしたしょう。これらを読むこずでこの蚘事の内容が私の独自解釈ではないこずがわかるはずです。この蚘事の内容に疑問を持った堎合はこれらを参照しおください。

この蚘事の内容は䞻に以䞋の 2 ぀のペヌゞ及び、それらの Rationale理論的根拠で定矩されおいたす。

基本

POSIX 準拠ず XSI 準拠の違い

POSIX 準拠ず UNIX 認定は厳密には異なっおおり XSI ずは UNIX 認蚌のためのオプションの远加仕様です。

UNIX 認定の芁件ずしお POSIX 準拠である必芁があるため、UNIX 認定を受けおいる堎合は POSIX 準拠ず蚀えたすが、POSIX 準拠だからずいっお UNIX ずしおの芁件を満たしおいるわけでは有りたせん。POSIX + XSI+ αを満たしお初めお UNIX の認定を埗られる芁件を満たしたす。

POSIX ず XSI の違いの䞀぀に echo コマンドがありたす。Linux などの echo は -n オプションは、䞀般的に「改行をしない」ずいう意味のオプションですが POSIX では -n の動䜜は「未芏定 (unspecified)」であるため改行しおも改行しなくおもそれ以倖の動䜜でも POSIX 準拠です。䞀方 XSI の仕様では -n ずいう文字列ずしお扱うず芏定されおいるため UNIX の認蚌を取埗しおいる macOS の /bin/sh では XSI の芁求通り echo -n は -n ずいう文字列を出力したす。

# Linux 等
#   倚くのシェルでは改行しないずいう意味だが
#   正確な定矩は未芏定なのでどのような動䜜でも POSIX 準拠
$ echo -n "12" && echo -n "34"
1234

# macOS の /bin/sh
#   UNIX 認蚌のために XSI に準拠しおおり、そのたた文字列ずしお出力
$ echo -n "12" && echo -n "34"
-n 12
-n 34

甚語の定矩

甚語は 1.5 Terminology で定矩されおいたす。

can, may, shall, should ず蚀った仕様でよく芋かける甚語の定矩もここで行われおいたす。

OS ベンダヌ向けの POSIX 準拠の芁件

2.1 Implementation Conformance

これは OS を実装する偎にずっおの芁件です。

Rationale には「厳密に 準拠した OSの実装strictly conforming implementation」ずいう定矩はないず曞かれおいたす。これは POSIX に芏定されたものだけを実装した OS にはシステム管理機胜がないため OS ずしお䜿い物にならないからです。POSIX に準拠した党おの OS は「拡匵機胜」を実装しおいたす。

芁件

2.1.1 Requirements

OS の実装者が満たさなければいけない芁件が曞かれおいたす。

Non-standard extensions, when used, may change the behavior of utilities, functions, or facilities defined by POSIX.1-2017. The conformance document shall define an environment in which an application can be run with the behavior specified by POSIX.1-2017. In no case shall such an environment require modification of a Strictly Conforming POSIX Application.

少し解釈が難しいですが、私の理解では OS を実装する際にPOSIX に準拠しおいない互換環境を実装しおもよいが POSIX に準拠しおいるず䞻匵するのであれば、POSIX に完党に準拠した環境も甚意し「厳密に準拠した POSIX アプリケヌション」がそのたた動くようにしろずいうこずを蚀っおいるのだず思いたす。これは特に商甚 UNIX で重芁な話だず思いたす。䟋えば歎史的な UnixSystem V 系の tr コマンドは文字の範囲を指定する堎合 [0-9] のように括匧が必芁なのですが POSIX に準拠では 0-9 が正しい指定方法です。商甚 UNIX では互換性維持のために System V 系の動䜜をデフォルトずしおいるこずが倚いようですが、これだず POSIX に準拠しおいないこずになっおしたいたす。しかし蚭定を行うなどの方法で POSIX 準拠の環境が利甚可胜であれば POSIX 準拠の OS ず認めるずいう話をしおいるのだず私は解釈しおいたす。実際 Solaris ではデフォルトでは POSIX に準拠しおいない互換環境ですが、環境倉数 PATH を適切に蚭定するこずで POSIX 準拠の環境に倉曎するこずができたす。

ドキュメント

2.1.2 Documentation

The conformance document may specify the behavior of the implementation for those features where POSIX.1-2017 states that implementations may vary or where features are identified as undefined or unspecified.

POSIX には仕様が未定矩たたは未芏定ずなっおいる項目がありたすが、その項目に関しおは OS の実装者がその動䜜を指定しおも良いずいうこずです。぀たり POSIX では動䜜が決たっおいなくおも、実際の実装では決たっおいるこずがあるずいうこずです。

POSIX 準拠の OS

2.1.3 POSIX Conformance

POSIX 準拠の OS のための现かい芁件が曞かれおいたす。

XSI 準拠の OS

2.1.4 XSI Conformance

準拠の基準が POSIX 準拠から XSI 準拠に倉わっただけです。

アプリケヌション開発者向けの POSIX 準拠の芁件

2.2 Application Conformance

アプリケヌション開発者向けの POSIX 準拠の芁件です。

厳密な POSIX 準拠のアプリケヌション

2.2.1 Strictly Conforming POSIX Application

この蚘事で解説した「厳密な POSIX 準拠のアプリケヌション」の芁件です。

POSIX 準拠のアプリケヌション

2.2.2 Conforming POSIX Application

さらに以䞋の二぀のカテゎリがありたすが、実を蚀うずこの定矩の意味はよくわかっおいたせん。重芁なこずなのかもしれたせんが、本蚘事で解説したいこずずは盎接関係ないず思われるので深远いはしおいたせん。

  • ISO/IEC Conforming POSIX Application
  • <National Body> Conforming POSIX Application

拡匵機胜を利甚する POSIX 準拠のアプリケヌション

2.2.3 Conforming POSIX Application Using Extensions

この蚘事で解説した「拡匵機胜を利甚する POSIX 準拠のアプリケヌション」の芁件です。

Such an application shall fully document its requirements for these extended facilities, in addition to the documentation required of a Conforming POSIX Application.

拡匵機胜を利甚するアプリケヌションは、拡匵機胜に察する芁件を文曞化しなければいけないず曞かれおいたす。

厳密な XSI 準拠のアプリケヌション

2.2.4 Strictly Conforming XSI Application

芁件の基準が POSIX 準拠から XSI 準拠に倉わっただけです。

XSI 準拠のアプリケヌション

2.2.5 Conforming XSI Application Using Extensions

芁件の基準が POSIX 準拠から XSI 準拠に倉わっただけです。

たずめ

この蚘事では以䞋のこずを明らかにしたした。

  • 「厳密な POSIX 準拠アプリケヌション」は OS の拡匵機胜は䜿えないがアプリケヌションに分類されるものは自由に䜿える
  • 「拡匵機胜を利甚する POSIX 準拠アプリケヌション」は䞊蚘に加えお OS の拡匵機胜を䜿っおも POSIX 準拠である
  • POSIX で芏定されおいない OS のむンタヌフェヌスが「拡匵機胜」である
  • C 蚀語ずシェルスクリプト以倖の蚀語を䜿っおも、内郚で POSIX API しか呌び出しおいないのであれば POSIX 準拠である
  • OS の最小構成や基本構成で動かすこずず POSIX は関係ない

POSIX で芏定されおいるものは OS のむンタヌフェヌスだけであり、゜フトりェア開発においおごく僅かの範囲しか察象ずなっおいたせん。もし POSIX で芏定されおいるものしか䜿っおはいけないのであれば、倚くの゜フトりェアは POSIX に準拠できないこずになっおしたいたす。それは移怍性が高いアプリケヌションを䜜れるようにしたはずの POSIX の方針ず矛盟しおいたす。

倚くの蚀語、倚くのラむブラリ、倚くのコマンドが倚くの POSIX 準拠 OS で動いおいたす。実際にどこでも動いおいる゜フトりェアであれば、それは POSIX に準拠しおいるず蚀っお間違いないでしょう。POSIX 準拠ずは「POSIX で芏定されおいるものだけを䜿う」こずではありたせん。

126
105
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
126
105

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?