マシン語を知らない子ども(一の位を四捨五入すれば20歳)の俺様が通りますよっと。
dankogai氏ほどの人が燃料投下しなくてもいいのに、と思いながら読んでたら、ちと思うところがあったので言語化しておく。
話しの流れとしては『(プログラムは)マシン語を理解してはじめて書けるもの』→『そんなことはない。「知っていると得」と、「知らなければ駄目」の間はあまりに離れている』という、もう何度議論されてるのかわからない内容。
私はマシン語書けない子どもです。CPUレベルの知識が「あればいいな」と思ったことも「アセンブリわかった方がいいんだろうな」と思ったこともあるけど、本当に必要になった事がまだないので、惰性でここまで来ている。というか、その時間を他の事に当てている。
機械語を書けなくてもいいとは思っているが、機械を知らなくていいのかというとそうは思ってない。
で、機械語必要論を唱えている方の追記での機械語が必要な例として
「デバッグプリントは9600bpsのシリアルポート経由で表示されるので、毎フレーム表示しようとすると確実に処理速度が落ちます。
これはデバッグプリントがシリアルポートと同期する際、CPUがACKを待つまでクリティカルセクションで割り込みブロックされ、タスクスイッチされなくなるからです」
というのがあるんだけど、デバックプリントが遅いのなんて常識じゃね? 元の怒りのメールを送った人の勉強不足だろ。この例はわかりやすい一例として書かれてるもので、もっと機械語を理解していないとわからないような事もあるんだろうが、そういう事例は機械語を知らない世代にも『セオリー』として伝えられていないもんなのかと。
ここで私が『デバックプリントが遅いのなんて常識』と思っているのはスタンドアロンでのデバックプリントとシリアル経由のデバックプリントの両方を『経験』があるからかもしれない。私の『経験』では「クリティカルセクションが〜」なんて説明はできない。これは機械語という『経験値』がないから。
『経験値』の溜め方はいろいろあるし、身につける技術の方向性もいろいろなんだから、機械語による経験値上げに拘る必要なんてないんじゃないのかな、と。
最近は、全くの文化系の女の子が、わずか数ヶ月の研修で「システムエンジニア」や「ITコンサルタント」と称してJavaのプログラムを書くような商売もあるらしいのですがそんなときにもぜひマシン語を勉強してもらいたいと思います。
勉強してもらうのが理想だとは思うんだけど、同じ時間勉強させるなら、マシン語教えるより、「文字列連結を頻繁に使うときはStringじゃなくてStringBuffer使おうね*1」みたいな『セオリー』を詰め込んだ方がよっぽど使い物になるのではないかと思うわけです。
なんでStringBufferの方がいいのかとか、その他もろもろ勉強しているうちに、人によっては機械語まで降りて行く人もいる、ってのが(私も含めて)今の子供なんだと思う。
機械語もCもJavaも知らない子がいきなりRubyをはじめたとして
0.upto(100000000) do |i| a = [i, i+2, i+10] # 以下略 end
よりも
a = nil 0.upto(100000000) do |i| a = [i, i+2, i+10] # 以下略 end
の方が速い(らしい*2)というのを聞いて、どう思うのか。それは学ぶ人間と学ばせる人間次第であり、学ばせる人間はより良いと思う方向に導いてやらないといけないんだと思う*3。
元のネタを書いた人は、だんだん低レベルプログラムがわからないプログラマが増えていくことに警鐘を鳴らしたかったんだろうな、と好意的に脳内補完。最初の方*4は補完の過程で消した(爆)。
# 昼休みに急いで更新