手っ取り早く基礎を学ぶには

またまたマシン語がどーたらの話なんですが。

id:amachangが「マシン語やりたい!」といってるのをみて。

だって、普段パソコン使ってるけどパソコンのこと全然分かってないもん。

  • Windows も Mac も Linux も同じ CPU で動かせるのに、なんでバイナリが違うの?マシン語 = バイナリじゃない?
  • ハードディスクを管理してるのは、OS なのに(これが間違い?) OS のプログラムはどうやってハードディスクから起動されるの?

とかとか、僕正直パソコンのこと全然分かってないよ。恥ずかしいけど。

とのことらしいですが、俺は一芸あれば別に低レイヤ無理にしなくてもいい、ってタイプなんですが、まぁPHPとかJSが出てきてホント高レイヤで活躍してる人も増えて、基礎に不安をもっていたりするんだなあ、と思いました。

個人的にそういう人は情報処理試験技術者試験の「ソフトウェア開発者」あたりの解説本を買ってみればいいのではないだろうか?と思っていたり。

いわゆるアルファギーク界隈というものができて、そういう界隈ではへっ、資格なんてなんだよ、みたいな感じだと思うんだけど、まぁそれは正しい。暗記するだけでもなんとかなるから、実践力になるかは疑問だし。

ただ、一応国家試験だけあって、内容は確かです。過去問がタダで見れるので、一度できるかやってみたらどうでしょう。ソフトウェア開発技術者試験の午前がオススメです。


情報処理技術者試験:過去問


軽く内容を挙げてみると

  • 負数を2の補数であらわす32ビットの整数同士の加算
  • 乱数関数の値の分布
  • 単純マルコフ過程
  • 論理回路
  • DFA、NFA
  • BNF
  • コンピュータの処理性能が何MIPSか求める
  • 実効メモリアクセス時間を求める
  • メモリインタリーブとは?
  • DMAとは?
  • タスクスケジューリング
  • SAN
  • P2P
  • 待ち行列
  • 暗号化
  • TCP/IPの問題

などなど。まさに基礎という問題がそろっています。さぁどれだけ解けるでしょうか。まぁ解くの自体はやりかた丸暗記でいいと思うんですが。それでも問題の意味すらわからない、とかどう考えたらいいのかさっぱり、っていうのはマズいと思うなあ。

こんな感じの問題が出るので、解説本とかみると基礎をとりあえず幅広く見ることができるのではないかと。んで興味があるところを見つけたり、深追いしたいところがあればネットなりで調べたり、別の本を買ったりすればいいんじゃないかなあ。

そんな風に思うのです。

07.27.08/12am

マシン語とか

最近の若いもんはマシン語をしらん、けしからん、みたいな話が盛り上がってますね。

そんな若くもないのですが(22歳)、中学のころにはWindows95があって、携帯電話を持っていて、高校生のころには既にADSLなどの高速回線を普通に使っていた、そんな世代の俺の考え。まぁ俺はプログラマでもなんでもないんだけど。

全体的な結論

全体的な結論を先に言うと、個人的にこういう原点回帰的な話というのはそんなに好きじゃない。もっと高次で活躍する人が増えてもいい、と思っているから。一人の人間の時間は有限で、それを高次レイヤにつぎ込んでもっとおもしろいことができるなら、そっちにつぎこめばいいんじゃないかな。俺はそれは全然アリ派。たとえば、音楽でいうと、DTMしかできないやつは音楽できる顔すんな、みたいなのが嫌い。DTMしかできなくてもいい曲かく人なんていっぱいいるし、それでいいと思う。なんていうか、努力とかよりも、感性にあこがれるタイプだからかな。上のレイヤからはいっても、きっと基礎を固めてちゃんとやりたい、それが必要だ、と思えば人は勉強する。だからあえて言うこと(必要だと言い切ること)でもないんじゃないかなあ。現に、だいたいコンピュータ技術者というものは最終的に下のレイヤへ下がっていく人が多いですよね。

マシン語とかについて

きっと議論を呼んでいるのは「絶対必要」みたいに断定してしまったからで、知っていればこんないいことがあるんだよ、という感じならみんな納得するんじゃないかなあ。

上に書いたように俺の世代ってのは中学ですでにWindows95があってVBやらVCやらDelphiがあった世代で。そんなに苦労しなくても見栄えのいいGUIアプリがかける環境があったわけで。当然意識しないとマシン語とかアセンブラには触れない。俺はたしかJAVAからプログラミングに入ったけど、別にマシン語知らなくても全然大丈夫だった。

んでさらにはWebアプリの台頭。Webアプリを書いているときにマシン語をしらないから、という理由で困ったこともないし、新しい言語を覚えるときに困った覚えもない。つまりプログラマでも書くプログラムによってはそんなに必要ない、ということ。そういう時代まで、先人達の努力でやってきた、ということ。暇があるなら低レイヤを覚えておくにこしたことはないけど、他に覚えるべきことがあるなら、そっちを勉強したらいいと思う。

ただ、知っといたほうがいろいろいいことがあるのも事実。なので覚えたい人はがんばりましょう、ということで。

同じことを書いてる人もいるけど、むしろアセンブラとかにこだわりを持っている人のほうが、「ひどい」コードを書くこともあるよね。処理効率を優先しまくって可読性を落としたりとか、何をやってるのかわからないのがイヤ、と自分で必要ないものまで書いたりとか。

俺と低レイヤ技術

とそんなことを書きつつ、実は低レイヤも好きな俺。すみませんすみません。個人的に低レイヤの(特にCPUとか。ネットワークとかじゃなく。)ことを勉強したいなら、エミュレータは一度書いてみるべきだと思う。一個8bitCPUのエミュレータを書いて、そのCPUの逆アセンブラを書いて、デバッガ作って、できれば自分でアセンブラを書いて、アセンブリ言語をマシン語に落として、そのコードを実行させてみれば、CPUの基礎はかなりわかると思う。データがそろってる8bitCPUならそんなに苦労することなくかけるので、一度書いてみてはいかが。アセンブリ言語の書き方も、割り込みがどーたらも、なんMhzとかってなんなの、とかサイクルってなにとかメモリってどうなってんの、DMAってなにがうれしいんだよとかそういやビット演算ってなんの役にたつの、とか色々一気に疑問が解決する。それがわかっていればあとは順をおってCPU関連技術を勉強していけば理解もはやい気がする。自分で命令セットまで考えてそのCPUをソフトで実装すればもっと完璧。

実装言語はなんでもいいんじゃないかなあ。手前味噌だけど、Pythonでもエミュレータを書こうと思えばかけるわけで、PerlでもRubyでもJavascriptでもいいと思う。動作速度よりも理解する過程が楽しいかと。ちなみに自分の書いたPythonでのNESエミュレータだとCPU(6502)とメモリ関連で、簡易逆アセンブラ込みで1000行ほど。速度を犠牲にすればもっと短くかける。

あと、これも書かれてるけどむしろネットワークとか、DBとかのほうがよっぽど低レイヤの知識が必要だよなあ。10BASE-Tと100BASE-Tでなんでつなげるリピータハブの数が違うのかとか、これならどれだけスループットが確保できるか、それをわかるためにもCSMA/CDはなんたるかとか、実際どうやってケーブル上で衝突を検出してんのかとか色々わかってないと困るしねえ。他のネットワーク技術でも一緒。生のパケット(orフレーム)を見なけりゃいけないことも多々あるし。ソフト使ってちゃんと設定がかけます、だけだと意味ない。OSIの層を上から下までカバーしないと。そういった意味でもネットワークっておもろい。

07.27.08/12am

とにかく好きなものを作るということ、あるいは器用貧乏について

via つまらなくて役に立つ物を作るということ

たまにはma.laさんに釣られてみるテスト。

実は俺のプログラミングというかクリエイティブなことについての考えはシンプルで、「とにかく作りたいものを作る」それだけだったりする。まぁ結局その作りたいものがゲームだったり、XMLをパースしたりすることだったりするわけなんだろうけど。


もっと突っ込んで言うと、作りたいものを作る、それだけなので別に何も残せなくても俺はぜんぜん気にしない。死ぬまでのなかで、あの人は○○を作った人だ、とかそんな人になりたいとは思わない。

事実、俺が個人で作っているものは好き勝手だ。

このブログに出してる成果物で言えば、あるときはRailsを触っていろいろやっていたり(まぁこれは仕事もあったが)、Javascriptをいじってテンプレートエンジンつくったりいろいろしたり、PythonでNESエミュレータを書いたり。

ma.laさんとは違ってゲームも作る。SDLを使って2Dのも作るし(Ruby/SDLやpygameではない。CあるいはC++、昔だとDXLibかなあ)、最近はIrrlichtも勉強していて3Dゲームも作りたい。

言語とかその他の面でも手を出しまくりだ。普段からC,C++,Java,Ruby,Python,Javascript,Schemeなどを書くし(作りたいものに一番便利な言語を使うだけ)、単に勉強として変な言語にも手を出す。

他にはReasonやハード音源を使って自作の曲をだしてたりもした(別名義)。一応小さいころから音楽はやっていて、しかもきちんと音楽理論も教えてくれるとこだったので、そこそこのクオリティだと思う。DTM特有の技術も、一通りの生楽器の奏法の再現法を勉強したり、エフェクトをいじり倒したりした。

画像もやる。そこまで絵心があるわけじゃないけど、いろいろなソフトを経てGimpに落ち着き、ある程度の画像処理ならできるし、ゲームのマップ作成とか位なら普通にやる(A5のインテュオスほしいなあ・・・)。前にも書いたけど、3Dにも手を出している。


んで、そんなに手を出しまくってお前は何を残せたんだ、と言われたら「何も残してないよ」だ。何も誇れるものなんてない。結局どれも中途半端で役立たずだ。だから、俺はWEBプログラマでもなければ、ゲームプログラマでもなく、プログラマですらなく、ミュージシャンでもなく、絵描きでもない。

実はこれは結構悩んだ。というか悩んでる人は結構いるんじゃないかと思っている。世の中、スペシャリストスペシャリストで、仕事をしようにも俺みたいな器用貧乏タイプの人は困る。だから、無理に自分がほんとに好きなものはどれなんだ、とか何か残せているのか、とか自問したりする。

それに対しての俺の結論は、「器用貧乏で何が悪い」だ。楽しければそれでいいのだ。俺は作ることすべてが好きなんだ。たとえ何の才能もなくて何も残せなくても作る過程が大好きなんだよ。少なくとも、世の中がスペシャリスト優遇だからといって自分を抑えて、スペシャリストになって生きるよりは、不器用に器用貧乏で生きるほうが絶対楽しい。めざせ最強の器用貧乏。なにかひとつ、スペシャリストになるほど好きなものが持てる人は運が良かっただけなのだ。


ただ、器用貧乏じゃないとできないこともあるんだぜ、とは常々思っている。器用貧乏タイプの人はどうか、負けないでほしい。

07.27.08/12am

About

Author:yuin(http://inforno.net/)

文学部文化学科卒という生粋の文系趣味プログラマ。

主にRuby、Javascript、PHP、JAVA,Python,C,Scala,Schemeなどを使っています。今はPythonな感じかもしれない。今後作曲活動なども復活するかもしれない。

Pages