Vol.59 No.10(2018年10月号)



Vol.59 No.10(2018年10月号)

匿名希望
れい
大学院生

 

 こんにちは.
 プログラミングを学ぶ際にはよく「コンパイラはソースコードをコンピュータが理解できるように変換する」と説明されます.この説明によれば,どんなソースであってもOSに依存せずプログラムが動くように思えるのですが,実際にはWindows向けにコンパイルしてできたバイナリはLinuxでは動きません(Hello worldのプログラムですら).
 どうしてOSが違うとソフトウェアは動かなくなるのですか.

 OSには2つのインタフェースがあります.1つは仕組みの難しいコンピュータを多くの人が使えるようにするための仲立ちです.マウス操作だけでファイル移動や削除ができるなど,昔に比べると随分やさしくなりました.でも,OSごとに操作法が微妙に異なりますよね.
 もう1つが,プログラムとコンピュータ・ハードウェアとの仲立ちです.世の中には多種類のコンピュータがあります.これらは,理解できる「言葉」(機械語,あるいはバイナリと呼ぶ) が違います.この違いをOSが,たとえば「画面に文字を表示する」といった,実際には長ったらしい機械語プログラムから見るとかなりまとめた書き方に丸めて吸収します.コンピュータの差を考えなくていいので,コンパイラはこの丸めたバイナリの書き方(システムコールと呼ぶ)へコンパイルします.長ったらしい中身の実行はOSが代行します.
 このバイナリの書き方がOSごとに違うので,OSごとにコンパイルしないといけないのです.コンピュータの差を吸収するはずのOSが何種類かあって,同じコンピュータなのにバイナリの差が問題になるというパラドックスですね.でも,OSの差も吸収する工夫が考えられています.

竹内郁雄
竹内郁雄
[正会員]
東京大学名誉教授