takaha.siの技術メモ

勉強したことをお伝えします。ちょっとでも誰かの役に立てればいいな…

MacがARMになることによって開発者が死ぬ可能性が高い件について

この間のWWDC 2020を見ていて発狂しそうになった。MacがCPUをIntelからARM(Apple Silicon)に移行するらしい。なぜそんなことをするのかさっぱりわからない。たしかに、AppleがISAを変えるのは今に始まったことではないが、今と昔では事情が違う。過去の時代遅れの成功体験に引っ張られてるのではない か?意味がわからない。ジョブズが居なくなったAppleのときみたいに潰れ(かけ)なきゃ良いけどね。。。

私がそう思う理由は、Mac上でx86のVMM(VirtualBoxParallels)が動かなくなるから。

VMMはISAレベルのエミュレーションを提供するソフトウェアであるが制約がある。物理ISAと同一のISAしかエミュレーションできない。しかしその分エミュレータと比較すると高速に動作する。その秘密は、特権命令やSensitive命令以外は可能な限り直接物理CPUで動かすから。要は、どうしてもエミュレーションしないと問題になるようなインストラクション(mov cr3, eaxとかsgdtとかpushf, popfとかね)以外は全部物理CPUに直接実行させるのである。これが速さの秘訣。I/Oを含んだり、よほどの作為的なプログラムでなければほとんど実CPUで実行してるのと変わらない速度で動作する。

つまりARMに移行されてしまうと、Mac上で(x86の)Linuxを動かして開発することが一切できなくなる。Mac版のDocker使ってる人も同じ。あれはVirtualBox上でLinuxを動かしてその上でDockerを動かしてるわけだからね、一切使えなくなる。

いやいやRosetta 2とやらがあるらしいよ?エミュレーターx86環境が動くとか?いやだからそれはエミュレーターなんだよね。ソフトウェアでCPUのすべての機能を模倣するわけ。VMMとは比較にならないほど遅い。理由は上述したとおり。今どきVirtualPCにもどりたいの?これは明らかな退行である。

いやいやARM版Windows 10では既存のx86アプリケーションがそのまま実用的な速度で動くだろう?だから、ARMの上で動作するRosetta 2とやらでx86やEMT64のOSも十分実用的な速度でうごくのでは?それは間違ってる。そもそもABIレベルのエミュレーションでなんとかなるようなバイナリと、ISAレベルのエミュレーション(特にMMU込みで)が必要なバイナリを味噌糞一緒にして論じちゃいけない。エミュレーションのコストが段違い。特にMMU周りは本来ハードウェアでやってるはずのTLB周りの挙動なんかをまるっとソフトウェアでそっくり模倣することになるのだからこのオーバーヘッドはかなり大きい。VT-xやAMD-SVMでまたEPTやNested Pagingが実装されてなかった10年以上前に逆戻りしたいの?これも明らかな退行である。

というわけでなんか色々許容できない。

いやわかってるわかってる。そもそも今日びISAなんて意識しないじゃん?みんなJavaScriptしか書いてないじゃん?それかGCPAWS Lambdaしか使ってないじゃん?どうしてもLinuxが使いたかったらARM版のVMMでARM版のLinux動かせばいいじゃない?

うんそうかもね。でも私は嫌だねそんなの。x86が使いたいよね。x86Linuxカーネル動かしたいよね。本番環境でARM機なんて使ってるの?使ってないでしょ。

というわけでおそらくMacは開発機としては終わりだろうなと思うわけです。

よくよく考えてみると、今のWindowsにはWSL2なんかもあって、Mac OS固執する理由などどこにもないかもしれない。が、Retinaが使えなくなるのは寂しい。あのきれいな画面でコーディングできなくなるのだ。この一点においてMacに後ろ髪をひかれる。

とはいえ富岳といいMacといいARMの隆盛は無視できない。ISA全然しらないし。VMMでも作ってみようかな?と思っている。