アセンブラの今と昔

この記事は約3分で読めます。

文字起こしのためにインストールした「FFmpeg」だけど、アセンブラで記述したら94倍も処理速度が向上したというニュースを見た。

その昔、パソコン上級者といえばアセンブラ(機械語)が使えるのは一般的だった。現代だとEXCELでマクロが組めるレベルでも、彼らから見れば初級者に過ぎない。
自分より5歳上になるとアセンブラ使いは普通にいるが、5歳年下だとほとんどみかけない。
自分と同じくらいの歳で理解できるのは、Z80かx86とかで100人に4~5人位だろうか?
1980年代頃だと、プログラムと言えばBASICとアセンブラのほぼ2択のような時代があった。
BASICは必要最低限の機能のプログラムは書けたけど、もっさりとして遅いのが難点だった。PCの最大能力を生かすにはアセンブラしか選択肢がなかった。しかしながら取得するにはハードルが非常に高く理解できる人は今も昔も限られている。トップレベルになると彼らは数字の羅列でCPU命令を覚えており、ひたすら16進数の数字を入れまくるというプログラミングスタイルで、とてもまねできる物では無い。

自分も32bitのx86までなら何とか分かる。16進数の羅列では無くVisual C++ 6.0のアセンブラ機能を利用していた。それにOllyDbgと呼ばれるデバッガはお気に入りのツールだった。
全盛期は仕事で自分が作ったC言語の実行ファイルを逆アセンブルしては、気に入らない箇所をアセンブラで書き直していた物だが、とんでもなく生産効率が悪かったので二度とやりたくない。

現代の方は、もはやアセンブラを覚える必要も無いだろう。かなり特殊なソフトを作成する方と、セキュリティーエンジニアくらいだろうか?
もしかしたらOSに近いコードでも無い限り、C言語やC++もいらないかもしれない。freeとかdeleteとかメモリー管理が面倒だし、少々使用メモリーが増えたところで気にしなくても良くなった。CPUも爆速になっているので、適当なコードでもそれなりに動くようになった。それよりも自分が使いやすく読みやすいコードの方が重要だと思う。アセンブラだと他のプラットフォームでは再利用できないし。
ただセキュリティーエンジニアは別で、やっぱりアセンブラの知識が無いとセキュリティーは語れないと思う。バッファーオーバーランとか知らないセキュリティーエンジニアはちょっとどうかと思う。

そういえば、今主流のx64のアセンブラは見たことも書いたことも無い。
ちょっと時間があったので、WEBで調べてみた。
RAX,RBX,RCX,RDX,RSI,RDI,RBP,RSPあたりは昔からあるレジスタの拡張版だから抵抗感は無い。R8~R15もレジスタが増えただけなのでそんなに違和感は無いかな?
WINAPIの呼び出し規約を見ると標準でレジスタ渡しになるよう変わっていた。昔の__fastcallに近いのね。
x86まではスタックへ積んでいたデータが、x64だとバラバラにレジスタに格納されていくわけで、どこに何の値が格納されているかを覚えるのが大変そうである。
そのため、おそらく読めるだろうけど書けない。老兵には最適化したコードを書ける気が全くしない。書けてもR8~R15を効率良く使う方法がわからないだろう。

ところで「FFmpeg」はAVX-512を使っているらしいので、通常とは別のレジスタだ。
512ビットのZMMレジスタが32個もある。そして64ビット長の整数を8個同時に扱うこともできる。
特殊な計算用なので個別に値を追うことは無いかもしれないが、命令セットがめちゃくちゃ多い。そしてコンピューター系の数学を熟知していないと使えそうも無い。
パイプラインだとかキャッシュだとかを理解しながら最適化したコードを書くのは至難の業だ。

ちょっと見ただけで少なくとも老兵にはもう無理だと分かった。x86のMMX命令が限界だ。もう全くの役立たずである。

コメント