「中の小人さん」的C言語考
以前「Cが使えない癖にUNIX使いを自認するのは如何なものか?」というような意味の事を某巨大掲示板のUNIX板で読んだ事がある。
煽り文句だというのは判っていたけど、「そういわれればそうやな」と妙に納得して勉強し始め、C言語入門者が往々にしてそうであるように、俺も「ポインタ」がいまいち理解できずに挫折していた。
で、最近再びC言語に再入門しようと思いたったわけやけど、今回は「ポインタ」がメモリのアドレスを指しているのは判る。だから何?そんなややこしい事せんでええやん。という当時の疑問に答えを与える所から始めてみた。
本を立ち読みしたり、WEBで情報を探したりして、「ポインタを使わないと出来ない事」、「ポインタを使う事で処理が高速になる事」を「なんとなく」知るにあたって、「なんとなく」C言語の「作り」が判ってきた。
C言語で記述されてコンパイルされたバイナリが、文字や文字列、数値などを表示する場合、それは表現の形式だけで、バイナリの内部では1文字ならそのアスキーコードの数値として、文字列ならアスキーコードを値に持つ配列として扱う訳で、究極的には処理の段階で「文字」を直接扱う事は無く、文字だろうが文字列だろうが全て何らかの形で変換された数値として処理する方向にあるということに気づいた。
今まで俺が色々な言語やインタプリタで作って来たコードは何かしらの文字列を扱う事が殆どで、PerlだとかPHPだとかバッチファイルで言うような A=’abcdef’って感じの直接的な表現に慣れすぎてたせいでそこのところが判りにくかったようだ。
実際にその「A=’abcdef’」の命令の場合はperlやPHPやcmd.exeの中の小人さんが、文字列を数値に変換して覚えておき、「Aを表示」と言う命令に対して、数値をまた文字列に再合成して「abcdef」と言う答えを返してくれていたという事で、命令する側、つまりはコードを書く人間が内的な処理を意識していなかっただけにすぎない訳だ。
システムコールを使ったり、メモリから直接入出力したりする命令を持つC言語というのは、たとえば、perlやPHPやPythonでは中の小人さんに任せる所を直接扱うという意味で、よりハードウェアに近い動作な訳で、
かつ、中の小人さんに任せずに自分でCPU命令を直接叩くアセンブラよりは、ハードやアーキテクチャ依存の少ない言語という事になる。
これが何を意味するのかというと、perlやpythonよりは動作が速く、アセンブラよりは移植性が高いと言う事であろうかと思われる。
C言語が強力であるという所以は、移植性と動作速度が最適なバランスであるという部分にあるだろう。
と言ったものの、まだまだ入門者の入門者な訳で、根本的に間違っている部分があればご指摘下さい。