macOS と Linux は全くの別物?


※この文章はベータ版です。

本文

「Dockerとはどういったものなのか、めちゃ
くちゃ丁寧に説明してみる」を読んで、気に
なったので、書いています。

macOSとLinux(広義のLinux)は上層では全く別物と
いっても過言ではないくらい違いますが、下層の
カーネルレベルではUNIXというOSアーキテクチャに
則って実装されているレイヤを持つ血統?的には近い?
OSです。

macOSのXNUカーネルはカーネギーメロン大学
で開発されたmachマイクロカーネル派生の
カーネルです。

XNUカーネルはFreeBSDのコードをベースとして
実装されたBSDレイヤをもっています。
(XNUカーネルのBSDレイヤには、Linuxカーネル
のAPIを採用している部分があります。)

macOSは、XNUカーネルのBSDレイヤにより、
UNIX仕様に準拠した、UNIX互換のOS、と
なっています。

Linuxカーネル(狭義のLinux)は、POSIXに準拠し、
UNIX仕様に沿って実装されていて、UNIX仕様に
ほぼ準拠している、UNIX互換のOSです。

(UNIX仕様を管理しているThe Open Group
から認証されないとUNIXとは名乗れませんし、
UNIX仕様に準拠している、とも言え(書け)
ません。

UNIX認証には費用が掛かります。OSSである
Linuxの開発サイドは費用の掛かるUNIX認証の
必要性を感じていませんでしたし、今も
感じていないでしょう。)

UNIX互換レイヤが、Linuxでは、カーネルのコア機能に
組み込まれていて不可分となっていて、macOSのXNU
カーネルでは、カーネルのコア機能と分離されている、
点が違うものの、どちらもUNIX互換のレイヤをもって
います。

macOS上のターミナルで、bash等のシェルを
介して、BSDレイヤの機能を利用しているユース
ケースでは、Linuxとの差異を感じることは
ほとんど、ありません。

両者にネイティブコードレベルでの互換性は
皆無ではあるものの、macOSでの実装において、
BSDレイヤのAPIのうちLinuxと互換性のあるもの
を利用するか、両者の上で動作する両者の差異を
吸収するライブラリを利用している、タイプの
プログラムであれば、ネイティブアプリであって
もソースコードレベルでの互換性を実現することは
可能です。

macOSは、CoreFoundation(C)とそれをラップ
したFoundation(Objective-C、Swiftに移行
予定?)というライブラリを持ち、その上に
AppKit、Mac Catalyst etcのライブラリ群が実装
されています。

これらのライブラリ群とその上に実装された
ツール群が、macOSをmacOSたらしめ、
Linuxとは全くの別物にしています。

オマケ

WindowsとLinuxは、上層から下層に至るまで、
全くの別物です、互換部分はどこにもありません。

Windows上でLinuxアプリを動かすしくみに
WSLがあります。

WSL1はLinuxカーネルのシステムコールを
Windowsカーネルのシステムコールに置き換えて
実行する荒技的な実装となっていましたが、
WSL2では、Windows10に搭載された軽量仮想
マシンを利用して、仮想マシン上でカスタマイズ
したLinuxカーネルを動かす形に変更されて
います。