雑記
Cという言語
最終更新:
匿名ユーザー
-
view
C言語の売りというか、よく言われているうたい文句のひとつに、「移植性が高い」というのがある。
嘘っぱちである。
C言語なんてアセンブラが皮をかぶったようなもので、その気になれば(ならなくても)とてつもなく環境に依存したプログラムが出来上がる。
移植性が高いのは、モジュールである。正しく言い直せば、「その気になってやれば移植性の高いモジュールを作ることができる」というのがいいだろうか。
特に下回りのプログラムなどは、I/Oなどターゲットによって異なるし、そうでなくても例えばビッグエンディアンのCPUとリトルエンディアンのCPUではバイトオーダーが異なるわけで、バイト単位でしかデータを扱わないならともかく、そうでないならそれだけでたちまち移植性の悪いソースコードが出来上がる。
また、ターゲットにもよるけど下回りの環境って「標準入出力」がない場合もある。OSがない環境だと、「ファイル入出力」もしかり。
fopenとかのファイル操作系の関数やらputsとかの文字出力だって、あれはUNIXのOSファンクションコールがその出生じゃんか。その時点でもう「移植性が高い」なんて寝言言えないよなあ。
あるデバイスに何らかのデータを書き出すにはそのデバイスに依存したコードを書かなくてはいけないことなんてしょっちゅうで、とてもじゃないけど「移植性が高い」なんて言えない。
では、どうするか。
いちいち、新しいものを造るたびに同じ処理をその環境に合わせて作り直すのは、はなはだばかばかしい。
そこで、入出力など環境に依存する処理に対して、基本的なシーケンスを一枚ラップ(wrap)するのである。本筋の処理からはそのラッパー関数をコールするようにする。そうすることによってラッパ内で環境や機種の差異を吸収することができる。
また、それらをライブラリ化していけば、次回同じような処理を作り直す必要もない。処理の流れも追いやすくなり、ソースコードの可読性も増すだろうし。
この辺の苦労ってWindowsだけとかでプログラミングしてる人には、わかり難いのかなあ。CreateWindowとか、そのままバリバリ呼び出す関数じゃないと思うんだけどなあ。しばらくは、Windowsの天下が続くんだろうけど。