2007年09月11日 22:20 [Edit]

マシン語読みの言語知らず

もうこの話題が登場して何度目になるのかは知らないが....

shi3zの日記 - マシン語を知らない子ども達
あまりも当たり前過ぎて21世紀に入ってから言葉にだしたことはあまりないのですが、当然のことながら、プログラムというのは、マシン語を理解して初めて「書ける」と言うのです。

そんなことは、ない。


私の上の娘は、まだ日本語文法を習っていないが、日本語で彼女の母や父である私や妹や級友と話すことが出来る。まだ辞書さえ知らない下の娘も同様だ。

確かに、「下の事」を一通り習った者は、「底まで知っていて」やっと「知っている」と言って「下の事」を知らない者を下に見がちだ。しかし、知識を深さでしか測れない者は、往々にして知識を広さを測ることが出来ない。「一段下の階層を知らなければそのことを知らない」という人に限って、そのことの左右に関して何も知らなかったりするのだ。

shi3zの日記 - マシン語を知らない子ども達
80386を理解することは現代のCPUを理解するということであり、これを理解しないままマルチタスクOS上で動作するプログラムを書くことはほとんど自殺行為です。

そんなことはない。私はよくマルチタスクのプログラムをperlやruby(やときどきerlang)書くけど、これらは何の改変もなしにPowerPCでもIA-32でも動く。もちろん各CPUの特性を知っておくに超した事はないが、最近のLLではこれらのCPUごとの「癖」をなるべく見せないように工夫されている。階層が一段違うが、例えばperlなら、fork()システムコールがないWindows上でもfork()関数が使えたり、RubyならPOSIX threadに頼らずともThread.newできたりといった具合だ。perlやruby書くのにCPUの知識は必要だが、perlやruby書くのに、CPUの知識は必須ではない。

# pythonが出てこないのは、単に私の使用頻度の問題

だいたい階層の設計において、下の階層の知識がなければ使えないというのであれば、その設計は間違っている。内部実装を知らないと使えないクラスというのは、ダメOOPの代表ではないか。エンジンがガソリンかディーゼルかハイブリッドか知らなくても車は運転できるのだ。

もちろん、一段下の階層は、知っておいた方が得だ。一段下の階層に関する知識は、隣接する知識との共通項になっていることも多いので、たいていそれを知る事は知識を深めるだけではなく、知識を広めることにもなる。

しかし、「知っていると得」と、「知らなければ駄目」の間はあまりに離れている。何のために階層があるかといえば、このキャズムを超えるためである。階層と階層の間にインターフェイスを設けて、階層の中身を知らなくてもそのインターフェイスさえ知っていればその階層の恩恵を受けられる。

さらに付け加えれば、下の階層への知識欲は、必要に応じて湧くものだし、そしてそういった知識欲が湧いている状態の方がすんなり飲み込めるものだ。

無理矢理飲ませる事はない。彼らの喉が渇くのを待ちさえすれば。

Dan the Man with Too Many Layers to Support


この記事へのトラックバックURL

この記事へのトラックバック
ネットでプログラミング言語談義があると、なんだか気持ちの悪いものばかり
先に日本語を憶えろ【clausemitzの日記】at 2007年09月17日 12:22
うーん微妙。一般にThreadを使う理由として、n個あるCPUを効率的に使いたいといった意図がある場合があるが、Rubyは今のところネイティブスレッドをサポートしていないのでMultithreadなコードを書いても複数CPUを利用できない。であれば、複数CPUを効率的に使う必要があれ
Ruby使いもCPUの知識はあった方がよい【雑種路線でいこう】at 2007年09月17日 00:29
実のところ機械語はマシンに対する高レベルな挙動を示す命令であって実行を厳密に写像したものではない。(何を言っているんだわたしは?) 「マシン語ってどんな感じか知りたくなった方へ」という大人気のエントリと、ニコニコ動画を見て、昨今の最新マイクロプロセッサで
機械語ではマシンの挙動は理解できない【未来のいつか/hyoshiokの日記】at 2007年09月16日 21:06
実のところ機械語はマシンに対する高レベルな挙動を示す命令であって実行を厳密に写像したものではない。(何を言っているんだわたしは?) 「マシン語ってどんな感じか知りたくなった方へ」という大人気のエントリと、ニコニコ動画を見て、昨今の最新マイクロプロセッサで
機械語ではマシンの挙動は理解できない【未来のいつか/hyoshiokの日記】at 2007年09月16日 20:58
最近、「Web業界に憧れるけど今の職場はそれにほど遠い」話や、マシン語や、組み込...
Web系SEと組込系SEの違いを考えてみよう【西岡Blog】at 2007年09月16日 12:30
shi3zの日記 「マシン語を知らない子ども達」 島国大和のド畜生「やっぱアセンブラは知っといた方が良いよ派?」 404 Blog Not Found「マシン語読みの言語知らず」この手の「お守りは何がいい?」議論に混じる気はないんで??
お守りは重りになることもあるよね。【かさぶた。】at 2007年09月15日 04:53
最近,己があまりに下位レイヤーを知らないことを情けなく思い, 現在,NASMの勉...
どこまで知っているのか.【sonson@Picture&Software】at 2007年09月14日 01:19
なんか盛り上がりそうなのは知ってたんだけど、二日ほど飲んだくれてたので出遅れた。
つーかね【Blogging Boozer】at 2007年09月14日 01:15
404 Blog Not Found:マシン語読みの言語知らず の だいたい階層の設計において、下の階層の知識がなければ使えないというのであれば、その設計は間違っている。内部実装を知らないと使えないクラスというのは、ダメOOPの代表ではないか。エンジンがガソリンかディーゼルかハ
お腐れ系開発における低階層知識によって幸せになるシチュエーションについて【ksh Days】at 2007年09月13日 01:00
この記事へのコメント
CPUの構造を知らなくてもスレッドは使えるという話がありますが、CPUやOSの“簡単な”仕組みを理解したほうがスレッドというものの概念の理解は容易です。ポインタも同じ。メモリだのアドレスだのを知らなくてもポインタは使えますが、知っていたほうがポインタの概念を理解するのは容易です。そして、いったんポインタを完全に理解したら、アドレスなんて過去の知識としてしまってもいいでしょうね。
Posted by 通りすがり at 2007年10月28日 14:57
最近はもっぱらRubyを使っておりますが、shi3zさんのエントリーを読んで、昔々、HITAC8150という汎用機のプログラムをアセンブラで書いていたころを思い出しました。「思えば遠くへ来たもんだ」という感慨はあるものの、あのころに戻りたいとは思いませんし、アセンブラの知識が今でも役に立っているとも思いません。

マシン語は遠きにありて思ふもの
http://sonzai.org/2007/09.htm#machine
Posted by 大黒学 at 2007年09月27日 16:48
最近でなく、コンピュータ史の大半です。
最初に実働したプログラム式コンピュータが1941年のZ3ですから、現時点で66年間。
マイクロプログラム方式が普及したのは、大ヒットしたIBM360シリーズの発売年である1964年と言っていいでしょう。これが43年前。43/66≒2/3もあります。
PCを生み出したマイクロプロセッサの場合は、最初の4004も8bitの8080も6502も16bitの8086も68000も32bitの80386もマイクロプログラム方式です。(特に68000はK7やK8と同様の二重変換式)
Posted by kk at 2007年09月25日 22:28
自然言語と、コンピューターのプログラミング言語(形式言語)を交ぜて論ずる底の浅さに絶望した。ちょっと理解モデルでも比較してからものを言った方がいいのでは?とか書けばいいんでしょうか。
良いところをすくい上げて意見を足すならいいですけど、揚げ足取りみたいな事書くのはいかがなものかと。
まぁ、それはそれとして、ただ単に、マシン語知ってるとプログラミングに役立つことも結構あるんだぜって、飲み屋で酔っぱらって言うのと同じだと思うんですが。
ネットは便所の落書きじゃないということなんですよねきっと。価値観の違いだなぁ。。。
Posted by katsuto at 2007年09月20日 22:27
・『プログラマはすべからくマシン語を理解すべし』というのは結局『伝統』に名を借りた体育会の後輩いじめに過ぎない。

・人類はマシン語の地平から遠ざかるために歩いてきているし、これからも歩き続ける。起点としてのマシン語の場所を覚えておく必要はあるかもしれない。
Posted by めー at 2007年09月20日 13:22
内部的な動きなんて、アセンブラまで降りることなくとも、Cのレイヤーくらいの理解があれば十分だと思うけどね。
デバッグするとき、プログラムを組むとき、アセンブラのレイヤーまで降りて考える必要がある人なんて果して全プログラマ中のどれくらいいるんだろうか。

もちろんアセンブラの知識が必須な人たちもいるわけで。
要は他の様々な知識と同じで、必要に応じて身に着けるべきでしょ。
Posted by hogehogehoge at 2007年09月15日 23:59
最近職場で「割り込みの意味も知らずにプログラム書いているやつがいる」という嘆きを聞いたので思わず反応してしまいました。弾さんの意見に賛成です。別にアセンブラを知らないくてもいくらでも良いコードはかけるはずです。ただアセンブラを知っていればプログラミングの幅は広がると思います。
で欲を言えばその下のハードの知識も欲しいですね。まず加算器とかシフトレジスタとかを理解して、次に順序回路と組み合わせ回路を理解してという順序ですかね。次にブール代数そしてキルヒホッフの法則とオームの法則でしょうか。次がマクスウェルの電磁方程式とまあきりがありません。そして私は理解できておりません。でも、ICのバグを見つけには電磁方程式のレベルまでの知識はあったほうがいいと感じております。いつかは理解できるようになりたいです。
Posted by 半日庵 at 2007年09月13日 20:42
shi3z さんがゲーム屋として。
もしそうなら、当たり前のことを言っているだけなので、なおさら哀愁が漂う文章なのですが。
最近の若いもんは・・・・程度の愚痴だよね。
Posted by 仮にさ at 2007年09月13日 11:22
要するに優越感ゲームでしょ。自分は皆よりも深いことを知ってるんだと。でも、高級言語→アセンブリ言語程度ではね。ハード屋さんに笑われちゃうと思います。かといってハード屋さんが必ずしもソフト屋さんを見下せるわけでもなく、「人にはそれぞれ自分の守備範囲があるのだ」ってことだと思いますけどね。
 
ま、Write Great Codeでも読んで、コンパイルオプションで常にアセンブリコードを出力しておけば十分なんじゃないすか。Z80のハンドアセンブルから始め、MC68000で寝る間も惜しんでクロック削りに没頭したゲーム屋の自分も、それ以上のことなんて普段考えてませんもの。
いい時代になったというか、逆に闇が深くなったというか(アセンブリ分かった程度でどうにもならないじゃん、今のCPU)。
Posted by ぬるぽにー at 2007年09月12日 16:24
つか、彼はゲーム機とか携帯の業界の人なんだからさ
そーいう背景読もうよ。字面通りしか読めないのかね

PS3扱うのに、マシン語知りませんってか?


大体、彼程度の人が何を言おうが「そういう面もあるし、そうでもない事もある」って程度の感想しかでないだろう
Posted by 騒ぐこと? at 2007年09月12日 16:07
より深きにいたろうとするならば必然と相対することになるマシン語圏文化や、そこで育ってきた技術者上がりの経営陣。彼らの経験を元に語られる旧技術に対するアプローチといま現在目の前にあるカネをもぎ取るために必要な方法論は相容れないものなの?

個人的には、暇なときはマシン語でコード書いてみて「遊ぶ」くらいはできないとね。
メモリ/レジスタ/バス/論理回路がどのようにコンピュータに実装されてるかなどに興味を持っていけば、そのうち行き着くものだとも思うし。

知らなきゃ知らないでもいいし。
それで誰も困らない。
Posted by test.asm at 2007年09月12日 14:54
というか shi3zさんって昔ゲーム関連の本を出して、ボロボロな数学知識しか持っていないことが露呈したあの人では・・・
相手するだけ馬鹿だぉ
Posted by みい at 2007年09月12日 14:46
ここに書き込むのもあれですが、はてなユーザではないので・・・
文系で語学専攻出身で英語を生業としている人間の視点からは
元記事の「英語を学ぶよりよっぽど役に立つ」という発言は喧嘩を売られている、あるいは侮辱されていると感じました。
世の中理数系のみの理屈で動いている訳ではないはずなので(とある有名な方の言では、天才的な物理学者ほど優れた芸術的センスをお持ちらしいですね)...
Posted by やまじぃ at 2007年09月12日 12:20
元エントリとそのやりとりを見ていると、極論を言えば「目立つ」のがメリットですが「批判される」のがデメリットであるということが分かって面白いですね。
しかし、「目立つ」のが目的でなければせいぜい「プログラミングするには言語以外の周辺事情もしっておくべき」程度のことを言及すべきでした。
まあ、マジメに書くと以下の例ようになって面白くないですがね。
・利用するH/Wの知識としては、CPUのみならずメモリやHDDなどの動きは知っておいた方が得なのは言わずもがな。
・プログラミングの「要件」を把握すべく、業務システムならば対象となる業務の登場人物と仕事の流れは知っておくべき
・ネットワークを利用するプログラミングするなら、デバドラの知識、通信機器の動き、プロトコルなどは知っておくべき。
・データベースを(略)
・利用するOSの(略)
Posted by H30 at 2007年09月12日 10:45
アセンブラ云々。。。と言い出すのは大概ロートルのタワゴト。
# ちなみに私はロートルの類

今の若い子なんか SSE まわりなんかいじらせると
それなりに凄いのも居る。
ヤツらは必要ならヤるし、必要じゃなきゃヤらないよ。
今は、そんなに必要な場面が多くないだけなんじゃないかなぁ。
# 昔だってダメなやつはダメだったしねー
# ただアセンブラで無駄に書くやつとか、
# DirectX の初期化まわりしか書かないやつとかw
Posted by とーりすがり at 2007年09月12日 10:33
ああ、なるほど。元エントリについては、低レベル層というものを学ぶ必要の有無と、80386みたいな具体的な機械語に精通する必要の有無の議論が混ざってるわけですね。私は現実に近い計算機のモデルが使えるならそれで良いと思います(必要に応じて現実にマップできさえすれば、具体的なCPUの機械語をいじれる必要はないと)。

弾さんの議論に即して言い直すと、「階層と階層の間にインターフェイスを設けて、階層の中身を知らなくてもそのインターフェイスさえ知っていればその階層の恩恵を受けられる。」というのは抽象化に漏れが無ければ正しいのだけれど、現実としてその漏れがほとんどない層とだだ漏れになってる層があってそれらを同一視すべきではなくて、(現実でも仮想でも)論理回路と機械語という層は漏れのほとんど無い特異な層なのではないか(従って学習の際に避けて通れないステップなのではないか)、ということです。
Posted by shiro at 2007年09月12日 09:09
厳密な意味で計算量を議論するなら、何らかの計算機の
モデルを仮定した上でする必要があるという意味で正しいと
思いますが、現実のプログラムを組む上でそこまで厳密な
議論が必要になるケースってそんなにあるでしょうか?

もちろん、厳密でなくとも、計算量の検討をするときには、
プリミティブな演算については定数時間で終わることなどを
暗黙の内に仮定している(暗黙の内に下位にあるマシン語を
意識している)はずですが、だからといってマシン語その
ものを知っている事が必須である、とは思えないのですが。
Posted by みずしま at 2007年09月12日 06:52
対象読者の違いじゃないですか。バイリンガルの人全てが通訳/翻訳/辞書編纂家にならなくてもいいように、他にプロフェッションを持っている人が道具としてプログラムする場合にまで「マシン語」だのなんだの言う必要は無いでしょう。

プログラマとしてのプロフェッショナルを名乗るならマシン語までは必須、と私は思います。理由をひとつあげるなら、KnuthがTAOCPでアルゴリズムの解説をするのにわざわざ自前のマシン語を定義したのと同じです。計算量を詳細に見積もるにはそこまで降りる必要があるからです(そこより下は係数に影響を与えるだけなので降りなくても大丈夫)。

客先はフルアセンブラのサーバは要らないでしょうが、計算量の検討が出来ないプログラマの書いたプログラムも願い下げだと思いますよ。
Posted by shiro at 2007年09月12日 05:21
マシン語の下には
CPUの構造
電子回路
量子力学
素粒子論
とか いくらでも深くなっちゃうんですよ。
それで マシン語くらい覚えろって言う人は 自分の得意分野までしか 下りていかない。自分の土俵でだけ戦おうとする。でも周囲に戦う人がいない(というか相手にされない)
で そういうことを吠えたくなるわけです。
下にもぐらずに上(オブジェクト指向より効率のよい言語とか)
とか 横に 勉強の幅を広げたほうが 有意義だと思いますよ。
下の階層のことは その道のエキスパートにまかせとけばいいんです。
そんなに マシン語が好きなら 客先に提案してみたらいい、
フルアセンブラのウェブサーバつくりましたけど、使いますか?って
で みんな そんなヤバイもの いらないわけです。
Posted by もあ at 2007年09月12日 02:58
視点の違いですね
Posted by higemania at 2007年09月12日 02:58
たぶんアセンブラくらい覚えろって言ってる人は、自分はアセンブラ知っているんだぞって自慢したいだけではないかと思いますよ。
で 自分の知らない分野になると とたんに
「そんなことは知らなくてもいい。そんなことは知る必要がない」って言い出すんです。
たぶん ですけど。
Posted by もあ at 2007年09月12日 02:51
自民党と官僚がいい例、民草のことなんかよく知らなくても
政治はできる。
あ、下層をよくしらないでプログラミングしてきたから
日本がぶっこわれちゃったのか。
よりよいパフォーマンスが得たいならやっぱりマシン語は必要ですね〜。




Posted by ぬご at 2007年09月12日 01:54
そのとおりだと思います。
人間自身がいい例。
科学とかも。
Posted by SQ at 2007年09月12日 01:18
shi3zさんはverilogやVHDLを出さずに「論理回路」なんて表現を使っている点からして知識が浅い。
それで大言壮語してるんだから、反論されてもしかたない。
Posted by hoge at 2007年09月12日 00:38
shi3zさんは
「もっていた方がいいよ、マシン語の知識」って言いたいんだろうけどねえ
「マシン語しらない人はプログラムできるとは言えない」ってな内容の事を書いちゃったから
大騒ぎ(?)になってるかんじで、なんとも

で、書いた本人もその事に気づいてない感じといいますか。
ま、本気でマシン語しらなきゃ、プログラム書いたと言えない、と思ってるなら違う世界の住人ですけど。
(ワタシも読めますけどね、読めない人がプログラム書いてそれがプログラム書いたとは言えない、とはちっとも思いませんもの、ええ)
Posted by hagege at 2007年09月12日 00:22
ははは,ハンドアセンブルで16進で直接メモリに書き込まなくっちゃ.
いやいや,トグルスイッチでアドレスとデータを指定が王道でスゼ.
 紙テープも見て読めなくてはね.
やっぱ,ビットスライスでコンピュータを自作するのが基本.
うーん,74シリーズのALUで組むのが本筋でしょう.
 コアメモリの編み直しも重要な経験
それを言うなら,3極管でフリップフロップを作らないとね.
 水銀遅延線も必需品
そんなのは特殊例で大部分はタイガー計算機ですよ
ヘンミやソロバンもよく使った...
そおいやあ,アナログ計算機もあったなあ
 簡単な微分方程式には良いね
Posted by hogege at 2007年09月12日 00:08
これって、アセンブリ言語の事だよね。
始めマシン語ときいて、CPUが直接理解できる機械語の事だと思ったよ。
まぎらわしい。で、やっぱり機械語は明記されていないけども、アセンブリ同様覚えるべきものと話題になっているのかな?
もしなっていないのなら、アセンブリ言語まで習得したのなら、機械語を理解して、独自アセンブリ言語を作るところまで行け!
中途半端は一番見苦しいと思いました。
それならば、弾さんの様に別に必要ないと割り切った方が正解でしょう。
Posted by 未記入 at 2007年09月11日 23:28
微妙ですね。どこか言いがかりにも似て。

shi3zさんと弾さんの言わんとしているところが微妙にすれ違っているように思えるのです。

shi3zさんは「コンピュータを最適に動かして何かしたい人」向け
弾さんは「コンピュータで何か最適なモノを手にしたい人」向け
の弁論だと思います。

車の喩えで言うならば、
クルマいぢりを楽しむ人、と
ドライブを楽しむ人、でしょうか。

昔はクルマも高価で、大した速度出なくて、メンテナンスも自分でできないととても維持できないシロモノだったけど。
今は安くて速くて整備も簡単になってきて、ようやく「運転」だけを楽しむことが安心してできるようになった。

shi3zさんは「プログラミングを極めるならマシン語は必須だよ」と言い、
弾さんは「プログラミングの楽しみを分かち合いたいならLLを使うと良いよ」と言い。

どちらも正しい物言いだと思うのです。



「釣り」なのかなぁ・・・
Posted by モカジマ at 2007年09月11日 23:11