プログラマならばマシン語を読める(書ける)べき?

マシン語を知らない子ども達 - UEI shi3zの日記

プログラムが書ける、という状態は「マシン語が書ける」という状態の延長線上にあるべきで、マシン語を理解していないということはマシンを理解していない、つまりプログラムを理解していないのとほぼ同じだと思います。

最近はLLと呼ばれる、いわゆる軽量スクリプト言語がメインになってきていますし、僕も普段はPHPでプログラムを書くことが増えてきましたが、それでも依然として、コンピュータというのはマシン語で動くもので、プログラムというものは全てマシン語の延長上にあると思っています。

その意識がないと、たとえPHPJavaScriptのコードを書いていても、不可解な動きをしたり、遅くなってしまったりしたときに「なぜだろう?」ということがピンとこないことになります。

最終的には、ものすごくシンプルかつ低機能な命令語に落ちていって、それはコンパイラががんばっているから。ぐらいの所がわかっていればいいのかなと。あとは、CPUレベルでスタックだレジスタだってものがある事と、OSがリングゼロっていう特殊な実行環境にあって、一般のプログラムとは違うって事とか。この辺の事がわかっている・いないという事で困るのは、ランタイムにプログラムがおかしくなって、コアダンプが出たときじゃないのかな。そーゆー低レベルで何が行われているかを知っている・いないの差が、こーゆー火急の事態に対応できるかどうかの差になってくる。
んー、後は「書ける」までのスキルがいるかどうかだけど、いるんだろうなー。ものすごく低レベルな機能の命令だけになるから、元の高度に抽象化されたアルゴリズムがどんな命令に分解されるかわかっていないと、その分解された命令の並びを見ても、元のアルゴリズム(=より抽象的なレベルで何をしているか)がわからない、か。

でもまあ、大抵のバグなり不具合なりは、ランタイムにクラッシュ→コア吐いて死亡なんて事にならないので、その手の「特殊技能者」は社内に数人いれば、まわっちゃう。全員が押さえておく必要も、実際問題としてはないのかな。まあ「知っておいてほしい」という気持ちは私もあるけど、ね。

まあ、あれだ「〜はなぜ動くのか」シリーズは、そーゆー所に光をあてたから、あれだけウケてるんだろうね。

↑のは読んでないけど、きっとそんな所がメインテーマな気がする。こんど立ち読みしてみよう。

ん、そういえば基本情報処理技術者試験って、CASLとか無くなったのか? ん、まだあるようだ。でもまあ、この手の試験を受ける人もすくなくなったのかな。

グチになっちゃうけど、同期実行・非同期実行が、あんまわかってない人が*1マルチスレッドで動くプログラム書いたりしている現実を見ちゃうと、まー、マシン語わかれよ!なんて10年早いって感じしちゃうな (;´Д`) 年寄りの昔話だけど、昔はほんとすごい人いっぱいいたんだ。8進数のダンプが延々と続いているジャーナル読んで何がまずいかわかっちゃう人とか、CISC系命令のものすごく特化したヘンな命令まで覚えている人とか、物理層スレスレの低いところまで知っている人ばかりだった。それが技術屋ってモンで、自分もそうなるんだと、当時は胸を熱くしたものだけど、結局PM崩れみたいな感じなんだよなー。なんだかしょんぼり(´・ω・`) もう17〜8年も前になるけど、当時仕事で使っていた汎用機*2のエディタは、今編集している行が、コンパイル後にどんなコードになったのかを分割した画面にニモニックで表示する機能が、当然のようにあった*3COBOLとALGOLで同じアルゴリズムを記述してもコンパイル後のコードがまるっきり違うのにびっくりしたっけ。COBOLはワーキングストレージで定義した変数を操作するのに、ものすごいめんどくさい事になっていた。なんというか、COBOLは開発当初共通基盤として設計されたけど、それを動かす実機はそんなもの知ったこっちゃないというアーキテクチャになっていたので、その隙間を埋めるようにコンパイラとかランタイム*4ライブラリがVMみたいに機能していた*5。そのお陰でISAMが普及したし、COBOLを知っていれば職場が変わっても仕事ができた(方言とかはあったけど)。Javaが21世紀のCOBOLだって位置づける人は多いけど、まあ、確かにそうかもね。普及した技術っていう側面もあるけど、VMという形で実行環境を規格化したという点でも類似している。ISAMはRDB+SQLに置き換えられた。IDEも普及したし便利な世の中になったもんだ。

と、このエントリを書いていて「〜を知らない子供たち」ってフレーズ、どっかで・・・ と思ったら自分で起こしていましたw
あーうー - おろかな日々
老人が若い世代を嘆くって構図は、永遠に変わらないのかなw まあ、敬老の日ってことで許してたもれw

*1:セマフォって何ですか?とか言われてがっくりしました。

*2:いわゆるメインフレーム。とはいいつつも、マイナーメーカーの傍流のだけどw でもIBMとかでもあったんじゃないかな?

*3:MSのVC時代の開発環境にはあった機能だと思うけど、最近の.NETとかはこんなのあるのかな? CLR命令が表示できるとか・・・

*4:まあ、別にランタイムには限らんか。

*5:中には抽象化・実機の隠蔽がクソで、プログラマにそのマシンの1ワードの大きさ(なんと36bit。オクテットで割れませんw)と境界を意識させる実装もあったけど。