雑種路線でいこう

ぼちぼち再開しようか

機械語論争 意見整理

誤爆するつもりはなかったのだが今のままでは気まずいので、id:shi3zのところへ飯を食いに行く前に改めて自分の考えを整理してみる。

id:mkusunokまでもがマシン語論争に入ってくるとは思わなんだ。来週ご飯食べる約束した矢先にこれだ。

  • 僕は機械語ができなくても困っていない。それは僕がプログラマではないからである。プログラマであれば機械語ができた方がいいに決まっているし、プログラマでなくてもITに関わる人間は、機械語という世界があることは知っておいて損はない。
  • x86機械語がプロセサ内部でMicro-OPSやFused-OPSに変換され、逐次実行されていないからといって、機械語を勉強しても意味がないということにはならない。現代のソフトウェアスタックは良くも悪くも機械語に対する抽象の積み重ねであって、プロセサの内部命令まで意識してコードを書く機会は殆どない。
  • 命令の実行順をプログラマが予期できないのはCISCRISCも同様である。VLIWやEPICなら命令の実行順を指図できるが、あまりに複雑すぎて人手で最適化したから高速化できるというものでもない。
  • ポインタを正しく理解しているプログラマ、概ねスレッドセーフなコードを書くプログラマ機械語までブレークダウンして動作を想像できるプログラマは、泣いても笑っても割合として非常に少ない。あなたの周りにそういうプログラマがいたら、それはとても幸せなことだ。

ここから先は微妙に補足

  • プラットフォームが何年も固定されているゲームコンソールと異なり、頻繁に内部命令やキャッシュ容量や高速化技術が進化しているPCやサーバーの世界では、なかなか機械語レベルで最適化する機会はない。けれどもこれは機械語を勉強しないでいい理由にはならない。
  • 多くのLLはCで書かれているしCは結局のところ高級アセンブラだから。大事なことは、何をどの段階でどう抽象しているかを把握することで、そのために機械語を書く機会がないプログラマであっても、機械語を学ぶのは有用である。プログラマならデバッガを立ち上げる機会があるはずだし、であれば機械語アセンブラを書く機会こそなくとも、機械語を読むチャンスはいくらでもあるだろう。
  • 裏を返せばプロセッサの並列実行技術や最適化コンパイラの設計とかに興味を持っている訳でなければ、機械語よりも低レベルなプロセッサの内部命令にまで興味を持つ必要はない。あまりに動く標的だし、可視化することが難しいから。
  • いまどきのプロセッサはどれもCで書かれたコードを早く書くように最適化されているが、昔はiAPX432のようにAdaに最適化されたプロセッサや、SymbolicsのようにLISPに最適化されたプロセッサもあった。
  • かつてJava OSが失敗したのはデバドラまでJavaで書こうとすると性能が出ないことが原因だったらしいが、OSの最適化技術が経路依存的にC言語チックになってしまったからで技術的必然はない。ただ、WindowsMacLinuxも、Cで書かれている程度にUNIXの末裔だ。80年代半ばまでコンピュータの世界にはもっと多様性があったし、やっぱりLispとかPrologとかを知ると世界は拡がるのではないか。それらを仕事で使う機会があるかどうかとは別にして。
  • 世のOSがUNIXの末裔ばかりで埋め尽くされたのは、せいぜいこの20年の傾向である。チップのC言語設計とか仮想化とか形式検証とか、最近のいくつかの技術トレンドは、そろそろUNIXの末裔ばかりではない世界が開けてきそうなことを予感させる。