---
type: article
title: 機械語が分かると。。。
timestamp: 2007-09-16T00:00:00Z
profile: sorane-okf/0.1
noFontEmbedding: true
---

# 機械語が分かると。。。

<p><a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>を巡る<a href="http://blog.hatena.ne.jp/shi3z/">id:shi3z</a>さんの<a href="http://d.hatena.ne.jp/shi3z/20070913">&#x4EBA;&#x6C17;&#x30A8;&#x30F3;&#x30C8;&#x30EA;</a>から、<a href="http://blog.hatena.ne.jp/hyoshiok/">id:hyoshiok</a>さんが<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>の高速化技術に話を振るとは思わなんだ。キャッシュコヒーレンシの話がプッツリ終わっているところとか微妙というか、なんとなく浮いている気もするが。まあ確かにSMPになるとパイプラインと違って最適化<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>任せにできないし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>が意識せねばならないことが増える。いまどき<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a>も<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a>も、その辺をきっちり意識しているが、お陰で初学者には取っつきにくくなってしまった気もする。"<a href="http://d.hatena.ne.jp/asin/4756118445/mkusunokhaten-22">Lions’ Commentary on UNIX (Ascii books)</a>"とか読むと、大昔の<a class="keyword" href="http://d.hatena.ne.jp/keyword/UNIX">UNIX</a>ってすげーシンプルだし。GOTO文とかも結構あって最初はギョッとしたけどね。

<br />
ところで命令をμ<a class="keyword" href="http://d.hatena.ne.jp/keyword/OPS">OPS</a>に落として云々という記事を初めて読んだのは10年くらい前に米BYTE誌の<a class="keyword" href="http://d.hatena.ne.jp/keyword/Pentium%20Pro">Pentium Pro</a>解説記事でだったか。まだ微妙に<a class="keyword" href="http://d.hatena.ne.jp/keyword/CISC">CISC</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>論争が尾を引いていたり、Nexgenが<a class="keyword" href="http://d.hatena.ne.jp/keyword/AMD">AMD</a>に買収された頃の話である。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Pentium%20Pro">Pentium Pro</a>は16bit命令の実行速度が遅く、サンクダウンする<a class="keyword" href="http://d.hatena.ne.jp/keyword/Windows">Windows</a> 9xを動かすと<a class="keyword" href="http://d.hatena.ne.jp/keyword/Pentium">Pentium</a>よりも遅いこともあった。<br />
確か<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>命令を<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>命令セットに変換するというア<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A4%A5%C7%A5%A2">イデア</a>はNexgenが最初で、そのRISC86命令は<a class="keyword" href="http://d.hatena.ne.jp/keyword/AMD">AMD</a>の<a class="keyword" href="http://d.hatena.ne.jp/keyword/K6">K6</a>に引き継がれた。どっちにしてもスーパースカラやスーパーパイプライン、分岐予測、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%B8%A5%B9%A5%BF">レジスタ</a>リネーミング等の手法が<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>に持ち込まれた時点で<a class="keyword" href="http://d.hatena.ne.jp/keyword/CISC">CISC</a>/<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>論争など無意味になったし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>が<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>でなくなった訳だが。まあ<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>のように命令変換が行われていなかったとしても、<a class="keyword" href="http://d.hatena.ne.jp/keyword/RISC">RISC</a>チップだって高速化のためにパイプラインとか分岐予測が出てきた時点で、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>レベルの最適化を行うことは非常に難しくなった。<a class="keyword" href="http://d.hatena.ne.jp/keyword/MIPS">MIPS</a>の最適化<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>はCと<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A5%BB%A5%F3%A5%D6%A5%E9">アセンブラ</a>の間に、手動で最適化するための中間コードがあったっけ。<br />
だから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>を分かっても無意味ということではなくて、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>まではどの<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>でも共通なのだし、ごく一部を除くとOSもアプリケーションも大概は<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>までの抽象度で書かれていて、あなたが最適化<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>を書くとか、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>レベルで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AD%A5%E3%A5%C3%A5%B7%A5%E5%A5%E1%A5%E2%A5%EA">キャッシュメモリ</a>の利用をギリギリまで最適化しようとかでない限り、μ<a class="keyword" href="http://d.hatena.ne.jp/keyword/OPS">OPS</a>を意識する機会はないはずだ。だいたい<a class="keyword" href="http://d.hatena.ne.jp/keyword/MPU">MPU</a>のステッピング毎に最適化されたコードを用意して元を取れる世界なんて、そうそうない。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Pentium%204">Pentium 4</a>の時代はパイプラインが深かったので埋めるためには色々と考える必要があったり、HT対策でマルチスレッドの書き方を工夫する必要があったが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/gcc">gcc</a>はその辺を考えてくれなくて<a class="keyword" href="http://d.hatena.ne.jp/keyword/Athlon">Athlon</a>と比べると性能が出なかったらしいが、最近はどうなんだろう。<br />
吉岡さんの記事にはCore MAとかの<a href="http://pc.watch.impress.co.jp/docs/2006/0306/kaigai247.htm">Macro-OPs Fusion</a>の話が含まれてないなと気づいて後藤さんの記事を読み返したのだが、この辺のマイクロ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>になると再びパイプラインが浅くなったので、μ<a class="keyword" href="http://d.hatena.ne.jp/keyword/OPS">OPS</a>まで意識しなくても性能が出るし、チューニングしても労多くして功少なしということか。まあ隠蔽しているのであれば、見えなくても支障がないようにしてくれることが技術的には正しい。そもそも後期<a class="keyword" href="http://d.hatena.ne.jp/keyword/Pentium%204">Pentium 4</a>のパイプラインが30段もあることがおかしいのである。<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A1%BC%A5%B1%A5%C6%A5%A3%A5%F3%A5%B0">マーケティング</a>のためにギリギリまでクロックを上げて、あとは最適化<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>や<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>が頑張ればいいとでも考えたのだろう。<br />
μ<a class="keyword" href="http://d.hatena.ne.jp/keyword/OPS">OPS</a>から先のことが見えないとか、何がどう並列実行されるか分からないことを隔靴掻痒というか、最適化が難しいよねと考える人は結構いるようで、Itaniumなんかは<a class="keyword" href="http://d.hatena.ne.jp/keyword/VLIW">VLIW</a>といって何と何を並列実行するかまで<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>時に決定する仕組みになっているので、本物の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>でギリギリまで最適化できる。原理的には速くなりそうだしDBや<a class="keyword" href="http://d.hatena.ne.jp/keyword/ERP">ERP</a>でItaniumが採用された例はあるが、費用対効果の点では規模の経済が働かないこともあって難しいのだろうか。どうも最適化<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%E9">コンパイラ</a>頼みは、急進的<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>屋の陥りがちな陥穽のようだ。<br />
<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>は設計に時間がかかって柔軟性がないから、できるだけ面倒なことはソフトに寄せようというのは工学的に正しいアプローチである筈なのだが、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a>はi860、Itaniumと2回もこのアプローチで苦労している。あまり知られていないことだがNT<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%AB%A1%BC%A5%CD%A5%EB">カーネル</a>はもともとi860を対象に移植性を持たせるカタチで開発され、それから<a class="keyword" href="http://d.hatena.ne.jp/keyword/x86">x86</a>に移植された。<a class="keyword" href="http://d.hatena.ne.jp/keyword/VLIW">VLIW</a>といえば<a class="keyword" href="http://d.hatena.ne.jp/keyword/Transmeta">Transmeta</a>を忘れてはいけない。素晴らしい技術だったが、いつの間にリーク電流削減技術のライセンシング会社になってしまった。まぁ<a class="keyword" href="http://d.hatena.ne.jp/keyword/VLIW">VLIW</a>に限らず、市場から去った斬新な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>を追っかけるのは面白い。<a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a> <a class="keyword" href="http://d.hatena.ne.jp/keyword/iAPX432">iAPX432</a>とか、Symbolicsとか、Thinking Machinesとか。生き残った技術だけをみても、時代の先を読むことは難しい。<br />
ところでソフトウェアに負担のかかる急進的な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%A2%A1%BC%A5%AD%A5%C6%A5%AF%A5%C1%A5%E3">アーキテクチャ</a>といえばメニーコアが目下のトレンドである。これもAzulがインドのソフトウェア技術者を<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%EC%A5%A4%A5%AA%A5%D5">レイオフ</a>したり、両社は否定しているが<a class="keyword" href="http://d.hatena.ne.jp/keyword/SONY">SONY</a>がCELLの生産ラインを<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C5%EC%BC%C7">東芝</a>に売却すると報道されたり、前途多難のようだ。まぁSunの<a class="keyword" href="http://d.hatena.ne.jp/keyword/Niagara">Niagara</a>は性能が出ているようだし、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Intel">Intel</a>の<a href="http://pc.watch.impress.co.jp/docs/2007/0611/kaigai364.htm">Larrabee</a>とかも気になる。技術的には面白いのだが成功するかどうかは分からない。最適化の面倒な<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C8%BE%C6%B3%C2%CE">半導体</a>は流行らないという法則に照らすと、なかなか前途多難である気もする。<br />
とか何とかだらだら書いてきた訳だが、わたしは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>が読めない。幼稚園の頃だか自宅にあった<a class="keyword" href="http://d.hatena.ne.jp/keyword/PC-6001">PC-6001</a>用のHexダンプをみて、これは人間の読み書きする言語ではないと思った。打ち間違えても暴走するばかりでBASICと比べると不親切だしね。Z-80の裏レジが云々とか、NTVDMって仮想86モードに落ちるから云々とか、マイクロアーキ毎にパイプラインの構成とか違うから<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D0%A5%A4%A5%C8%A5%B3%A1%BC%A5%C9">バイトコード</a>を環境毎に<a class="keyword" href="http://d.hatena.ne.jp/keyword/JIT">JIT</a><a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B3%A5%F3%A5%D1%A5%A4%A5%EB">コンパイル</a>した方が最適化の余地が大きいかもねとか何となく分かったような口を利くが、正直いって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>は読めない。<br />
そういう言語が世の中にはあって、自分の書いたり使ったりしているプログラムが様々な経路を経て、そういう風に噛み砕かれていることは何となく知っているだけである。これまでの人生で<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>を知らなかったことで損したことはないが、それはきっと、ちゃんとプログラムを書いたことも数えるほどしかないからかも知れない。ということもあって<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>を操るひとは素直に尊敬する。世の中にはトグルスイッチから自分でつくった<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B9%A5%D1%A5%B3%A5%F3">スパコン</a>のOSを直接入力して一発で動かす<del datetime="2007-09-16T23:19:04+09:00">変人</del>天才とかもいて<a href="#f-1bd45b00" name="fn-1bd45b00" title="スーパーコンピュータの Cray シリーズを設計したシーモア・クレイは、自ら設計したコンピュータに、自ら設計した OS を、丸ごとトグルスイッチで入力したと伝えられる。八進数で。寸分たりとも過たずに。そしてそれが動いた。なんと雄々しき超弩級「本物のプログラマ」であることよ。 出典:[http://cruel.org/freeware/hdomcorrect.html:title="A Brief History of Hackerdom"]">*1</a>、そういうひとが大事にされる社会じゃないとね、とか、そういう人と張り合うのは止めておこう、とか思う訳だが。<br />
そういう意味で<a href="http://blog.hatena.ne.jp/shi3z/">id:shi3z</a>や<a href="http://blog.hatena.ne.jp/hyoshiok/">id:hyoshiok</a>のようなsuper hacker達と張り合うのは本意ではない。まぁ世の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A4%CF%A4%C6%A4%CA%C2%BC">はてな村</a>の住人の多くは僕と同じように、<a class="keyword" href="http://d.hatena.ne.jp/keyword/Linux">Linux</a> kernelにある<a class="keyword" href="http://d.hatena.ne.jp/keyword/hoge">hoge</a>.Sとかを何度かlessとかで眺めて、はぁ、とか溜息をついて終わってるんじゃないかい。たぶんそれは普通のことだし、あまり心配しないでいい。ただ、そういう世界があって、あなたのパソコンのメモリにも、僕のパソコンのメモリにも、そういう<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>が詰まっていて、プログラムの性能上の問題を解く場合に、時折そういう層まで意識すると問題が解ける場合もあるくらいのことは、頭の片隅に置いておいて悪くない。<br />
あなたの身の周りに<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>までブレークダウンして問題を把握できる<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>がいるとしたら、それはきっとかなり幸せなことだ。ただ吉岡さんが書いているように、Z-80時代の実行モデルとモダンな<a class="keyword" href="http://d.hatena.ne.jp/keyword/MPU">MPU</a>の実行モデルは大きく異なる。とはいえ世の中はもっと下らない問題に溢れていて、なかなかそういうディープなことでハマる機会は少ないのではないか。まぁ何というか、仕事にも友人にも恵まれたいものである。</p>
<blockquote cite="http://d.hatena.ne.jp/hyoshiok/20070916" title="未来のいつか/hyoshiokの日記 - 2007-09-16"><p>実のところ<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>はマシンに対する高レベルな挙動を示す命令であって実行を厳密に<a class="keyword" href="http://d.hatena.ne.jp/keyword/%BC%CC%C1%FC">写像</a>したものではない。（何を言っているんだわたしは？）<br />
「<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%DE%A5%B7%A5%F3%B8%EC">マシン語</a>ってどんな感じか知りたくなった方へ」という大人気のエントリと、<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%CB%A5%B3%A5%CB%A5%B3%C6%B0%B2%E8">ニコニコ動画</a>を見て、昨今の最新マイクロプロセッサでは<a class="keyword" href="http://d.hatena.ne.jp/keyword/%B5%A1%B3%A3%B8%EC">機械語</a>がもはや機械の挙動と一対一に対応しなくなっちゃったのである、というツッコミをしたくなった。<br />
(略)<br />
シングルプロセッサでは、そーゆめんどうな事は、通常は観測できない。しかし、マルチコアになると、あるコアで書き込んだものを別のコアで利用するなんていうことが日常茶飯事で発生するのであるが、それについては別途なにがしかの方法が必要になってくるのである。</p>
</blockquote><div class="footnote">
<p class="footnote"><a href="#fn-1bd45b00" name="f-1bd45b00" class="footnote-number">*1</a><span class="footnote-delimiter">:</span><span class="footnote-text">スーパーコンピュータの Cray シリーズを設計した<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%B7%A1%BC%A5%E2%A5%A2">シーモア</a>・クレイは、自ら設計したコンピュータに、自ら設計した OS を、丸ごとトグルスイッチで入力したと伝えられる。八進数で。寸分たりとも過たずに。そしてそれが動いた。なんと雄々しき<a class="keyword" href="http://d.hatena.ne.jp/keyword/%C4%B6%D7%B8%B5%E9">超弩級</a>「本物の<a class="keyword" href="http://d.hatena.ne.jp/keyword/%A5%D7%A5%ED%A5%B0%A5%E9%A5%DE">プログラマ</a>」であることよ。 出典:<span style="font-style:italic;"><a href="http://cruel.org/freeware/hdomcorrect.html">&quot;A Brief History of Hackerdom&quot;</a></span></span></p>
</div>
