いろいろやってみるにっき

てきとーに生きている奴の日記

古いエントリのサムネイル画像がリンク切れになってたりするけど、チマチマ修正中


コンピュータの仕組みを育児に例えた図解があまりにもシュールで分からない

これはひどい

 

togetter.com

 

いや、これ見て分かりやすいとか言えるのはおかしい。「草」で正解。

 

この本か。ソフトウェアのほう?

 

まとめ内にもコメントにもあるけど、分かりやすいとか分かりにくいとかの前に、例えだとしても間違っているんだよ。分かりにくいけど。ただ、まとめ内にもコメントにも適切な指摘が無いのでちょっと書く。

あと、これから書くことと関係ないけどこのコメント好き。ゲロゲロゲロww

 

まず高水準言語(普通、高級言語って言う方が多いんじゃね?)のところがおかしい。「赤ん坊よ、食事せよ」だと赤ん坊が食事する例えを描かなければならない。なんで母親や父親が食事させているんだよ。オレが書いている意味わかりますよね。赤ん坊に能動的に動けという「赤ん坊よ、食事せよ」という文は、受動的に食事させてもらう場面には適さない。「赤ん坊に食事させよ」であればまだマシ。

 

それにコンパイラは実行してくれない。つまり母親役ではない。ソースプログラムを読んでオブジェクトプログラムを吐き出すだけである。実際にはこのあとリンケージという処理が必要でようやく実行プログラム(Windowsだと.comとか.exeで提供される)になる。そして誰かが起動しないと実行されることはない。

 

コンパイラインタープリタの比較にはリンケージエディタ/リンカーも欠かせない。

ja.wikipedia.org

リンケージエディタ(英: linkage editor、連係編集プログラムとも)またはリンカ(英: linker)とは、機械語のプログラムの断片を結合し実行可能なプログラムを作成するプログラムのことである。例として、C言語では、ソースファイルをコンパイルするとオブジェクトファイルが生成される。それに他のオブジェクトファイルやライブラリを結合して1つのプログラムが完成する。この結合(リンク)の際リンケージエディタが使われる。

仮にHello World程度の簡単なプログラムだとしても、コンパイラが出してくれるオブジェクトプログラムはOS上で実行するための色々なライブラリ*1は含まれない。

コンパイラの作りとして複数のOS(バージョン違い含む)をサポートすることを前提にする。コンパイラが実行プログラムを出そうするとOS(バージョン違い含む)ごとの差分まで色々を把握する必要がありサポート範囲が大きくなり過ぎる。またプログラミングする側も、ソースプログラムを全部1本に書くことができるような小さいプログラムばかりではない。機能別などに細かく分割して書くほうが合理的である。その時にコンパイラが実行可能プログラムを作る仕様だと連結した時にダブリが出る。

なので、コンパイラはそれぞれのソースプログラムに1:1対応したオブジェクトプログラムを出すだけにしてリンケージという処理をするほうが合理的ということになる。

 

一方のインタープリタ。上記コンパイラ+リンケージエディタのやるようなことを逐次実行する。頭が2つある父親は怖い。ごく古典的なインタープリタならこの説明でもいいかもしれない。ただ、赤ん坊CPUに処理させている父親インタープリタのCPUは?やっぱりこの親と赤ん坊っていう例えが悪いわ。

 

入門書を目にする機会がめっきりないんだけど、この本よりも普通にITパスポート試験基本情報技術者試験の本を見た方が余分な解釈無しに理解できると思うけど。

 

今日書きたいことはこんなところです。

*1:静的にリンクするライブラリと動的にリンクするライブラリがある。動的なライブラリはWindowsでは.dllファイルで提供されるダイナミック・リンク・ライブラリ

お時間あったら、他のエントリもクリックして頂ければ幸いです。