このページの本文へ

基礎から覚える 最新OSのアーキテクチャー 第12回

アプリがWindowsの機能を使うには? APIとDLLの仕組み

2012年03月15日 12時00分更新

文● 塩田紳二

  • この記事をはてなブックマークに追加
  • 本文印刷

OSのAPIをアプリケーションはどうやって使うのか

 APIの基礎について語るには、昔話をする必要があるだろう。OSが登場する前、コンピューターの上ではアプリケーションだけが動いていた。そもそも「OSとアプリケーション」という区別はなく、ただプログラム(アプリケーション)が動作していた。

 こうした原始的な仕組みの場合、どのプログラムにも同じような部分が存在してしまう。例えば文字を画面に表示したり、外部ストレージ(HDDどころかカセットテープだったりする)からデータを読むといった部分である。こうした部分のうち、入出力に関しては「BIOS」として、コンピューター側が提供するようになった。あらかじめ、入出力のプログラムを作ってメモリーに置いておき、これをプログラムから呼び出すのである。ある意味、これが最初のAPIである。

 その後コンピューターの発達にともない、「高級言語」というプログラミング手法が出てきた。初期のコンピューターではCPUが実行する機械語コードを直接書いていたが、もっと数学的な表現などが使える言語でプログラムを記述して、これを機械語のコードに変換するものだ(変換はコンピューターがやる)。「自動プログラミング」という表現もあった。

 さて、こうしたコンピューター言語が使われるようになると、今度は「同じような処理を、プログラマーがいちいち書くのは無駄だ」という話になる。例えば三角関数などは、機械語命令では処理できずプログラムを書いて処理させる。しかし、物理演算のプログラムを作るたびに、三角関数の計算をゼロから書いていたら、いつまでたってもプログラムは完成しない。そこで汎用性のある計算処理に関しては、あらかじめプログラムを作って置き、これを別のプログラムから呼び出して使おうという手法が登場した。これを「ライブラリ」という。

 ライブラリはプログラムとしては完成しているが、ほかのプログラムとつないで機能を呼び出せるような、特別な形に作られている。プログラム中でほかの場所にあるプログラムを呼び出す方法には、「サブルーチン」という手法があり、多くのCPUには、これを実現するための命令が用意されている。しかし実際にプラグラムからほかのプログラムを呼び出すには、呼び出し先のメモリーアドレスが必要になる。

 ライブラリにもいろいろな種類がある。三角関数のライブラリがあれば、自然対数の計算ライブラリもあるだろう。定積分や二次方程式の解法なんてライブラリもあるかもしれない。だからと言って、必要になりそうなものを全部まとめてしまうと使わない部分が多くてメモリーが無駄になるから、例えば三角関数とか高級関数といったくくりで、関数をまとめたライブラリをいろいろと作っておく。こうした複数のライブラリをプログラムとつなげるわけだから、ある関数のアドレスがどこになるのかは、全部をつなげ終わるまでわからない。

図1 ライブラリの関数を呼び出す「リンク」の概念図

 そこで多くのプログラム言語では、ライブラリなどにある関数の呼びだし先を未定としたままプログラムを作り、最後にライブラリをくっつけて、未定の呼びだし先アドレスを確定させていく。こうした作業を「リンク」という(図1)。リンクは通常、アプリケーション開発の最終段階で行なう。リンクを行なうことで初めて、メモリーに読み込んで動作するプログラムのバイナリーが完成する。

 APIはライブラリから呼び出される形で、高級言語から利用される。例えばファイルの読み書きAPIを、その言語でのI/O処理のやり方に合わせて行なうわけだ。ライブラリとは「APIを特定の言語に合わせて表現したもの」とも言える(図2)。

図2 ライブラリとAPIの関係。プログラムは各言語に合わせて用意されたライブラリを呼び出し、ライブラリがOSが持つAPIを呼び出す

 なお、プログラムにライブラリが直接結合されることを「スタティックリンク」という。

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン