いや、拙者は現場主義の人だから・・・

マシン語を知らない子ども達

当然のことながら、プログラムというのは、マシン語を理解して初めて「書ける」と言うのです。

いや、別にマシン語知らなくてもいいですよ。なんかプログラムを書くことの前提条件としてマシン語を知らねばならないといった論調に読めるのだがそんなことはないだろう。ただ全く要らないとも言わない。というのも結局プログラムを書く場面なんてのはそれこそ千差万別であって組み込み系とオープン系とFA制御系とWeb系をプログラミングと一括りにはできない。まぁ全くやらない人から見たら同じに見えるのかもしれないがやってる側からすればプログラミングではあるが全く異なったことをやっているのだ。だから全てのプログラママシン語を理解する必要は無いし必要な人はやればいい。でも必要では無い人も知っているといいことがある・・・はずだ。


拙者の職場は割と平均年齢が高い方だと思うのだが30前半の♂でbit演算が出来ねぇのがいるorz 例えば。ある基板上のディップスイッチの設定状態をシリアル通信でモニタして思った通りになっているか確認するようなプログラムがあるとしよう。bit0-7の8接点のディップスイッチをモニタした場合bit0がONの場合は"01"と返ってくるしbit7がONの場合は"80"と返ってくる。bit3,4がONの時が正しい状態だとした時にモニタ値がそうなっているか確認するやり方がわからないんだとさ(--) 当然16進→2進*1も出来ない。
マシン語の理解はいらんからとりあえず2進数だとか16進数だとかを学んでから仕事して欲しいと思う。


拙者自身は幸か不幸かHu-BASIC→MIND→MS-C→VB*2と歩んできたのでたまたま一度もアセンブラにもマシン語にも触れる機会は無かったからそのままここまで来てしまったから別に知らなくても仕事は出来ると言える。あ、マシン語の16進羅列をどうこうするのは首筋にコネクタでも付けないと無理だがニーモニックで書かれたもんなら何やってるかぐらいはわかる。こんなやつね。

MOV AH,09H
MOV DX,010CH
INT 21H

思いっきりな高級言語がメインの職場ではマシン語なんて知らなくても特に問題ない。というか、高級言語ってのはマシン語レベルでいじくり回さなくてもいいように開発されたんじゃなかったけ。とは言え、メインで使う言語より一つレイヤーの低い言語を学ぶことは実に有意義だと思う。例えばVBだのVCだのJavaだのやる前にCをやるとか、Cの前にアセンブラやるとかね。
良くVB

If IsNumeric(foo) = True Then
Else
End If

とか書いてるのを見かけるんだが、これは

If IsNumeric(foo) Then
Else
End If

でいいじゃないかとコードレビューの度に突っ込む。納得しない場合にこれをアセンブラに置き換えて考えるとステップ数が少ないだろ?だから実行中に何万回も通るような条件分岐ならわざわざ=Trueとか書かない方がいいだべ?とか言ったりする。でもこのへんの話は速度を取るかソースの可読性を取るかって話でもあるので何事もバランス感覚が大事みたいな話になるんだよな(^^;
VCで作成したDLLをVBから利用する場合でも受け渡しする構造体は4バイトでアライメントされてるからここはダミーの変数を置いとけみたいな話もデータがメモリに格納されるイメージが無いと話が伝わりにくかったりする。

ただね、拙者の場合は主戦場がオープン系&FA制御系だったりするから言うことなのかもしれないがソフト屋はプログラミングに長けることはもちろんとして、もっとパソコンのことも知るべきだと思う。例えばある一連の処理がどうにも遅いのでボトルネックがどこにあるのか調べて改善して欲しいという話になった時にパソコンにさせる処理の中で一番遅いのはなんだ?という問いに答えられないようでは正直、現場では使い物にならない部類行きだな。マシン語を知らなくても大手を振って仕事していいが、仕事に必要と思われる知識は言われなくても自ら習得して欲しいと思う今日この頃。


で、結論

  • マシン語レベルの知識が要求される分野でのプログラミングでは言うまでもなく必須に違いない。
  • そうではない分野でのプログラミングではもっと他に実戦向けに覚えることが山ほどあるだろ。

ですかね。

*1:例えば0x18=00011000

*2:一時期DelphiActiveBasicに浮気しました・・・