• ベストアンサー

プログラミング言語のAPI

プログラミング言語の『API』にあたるものって具体的には何なのでしょうか? 例えば,C言語の場合『API』にあたるのはprintfやscanfなどの『標準関数全体』という解釈で合っているのでしょうか? また,ライブラリとAPIの関係についても教えていただけると嬉しいです. 読んだ本の中で少し触れられていたのですが,表現が曖昧であまりよく分かりませんでした・・・.

質問者が選んだベストアンサー

  • ベストアンサー
  • GOOD-Fr
  • ベストアンサー率32% (83/256)
回答No.4

API というのは、もともと OS が用意しているシステムコールのことを差しています(「API システムコール」で検索すると、そういう説明をしているページが山のように見つかります。)。さきほど、20年ぐらい前の古い書籍まで含めてざっと書棚に目を通しましたが、一般の人に API という言葉が聞こえるようになったのは OS/2 のころです。それまでは MS-DOS も Unix も「システムコール」と呼ぶのが普通でした。(なぜ MS-DOS でシステムコールと呼んでいたのを OS/2 で API という名称に変えたのか、とかは省略します。類似の言葉にスーパーバイザーコール、というのもありますが、これも省略) その後、コンピュータシステムは複雑になり、OS とアプリケーションプログラム、で完結する、という時代ではなくなってきます。いわゆる「ミドルウェア」が出現してくるわけですが、クライアント-サーバモデルで説明されることが多い「サーバ」側のプログラムを作成するためには、「サーバを呼び出す」必要が出てきたのです。(たとえば、データベースサーバ上にデータベースを構築するには、データベースサーバに「仕事を依頼」しなくてはいけません) これは、OS がもともと持っている「API」と似ている(プログラマからは区別ができない)ので、同じ「API」という言葉で呼ぶようになりました。つまり、「OS 以外のシステムが用意している機能をアプリケーションから呼び出す」という意味でも API という言葉が使われるようになったのです。(OS が持っている機能を使いたいから「OS に依頼する」のが API ですが、データベースサーバの機能を使いたいから「データベースサーバに依頼する」のも API でいいじゃないか、ってことです。データベースプログラムは OS から見ればひとつの「アプリケーション」に過ぎませんが、プログラマから見ればシステムの一部として「あらかじめ機能が提供されているかのように」見えます) それから十年以上が過ぎて、Web や Java など、新しい機能が搭載されたオペレーティング環境が発明されました。Web や Java を作った人たちは、ネット上の Web サーバや Java の処理系を呼び出す仕組みを作ったのですが、この仕組みにも名前をつけないと人と話すときに不便です。(「今度作った Java の処理系の機能を呼び出す仕組みの xxx という部分なんだけどさ」「あー、うんうん、その Java の処理系の機能を呼び出す仕組みの xxx ってこないだ話してたやつだよね」「そーそー、その Java の処理系の機能を呼び出す仕組みの xxx を改良したんだけどね・・・」って、これでは落語のネタにはなっても、会話になりませんよね。やはり呼び名は必要です) そこで、ふと思いつきました。「自分のプログラムから他の機能を呼び出すことを API と呼んでいるんだから、これにも API と名前をつけてしまえ」 かくして、これらも「API」という名称で呼ばれることになったわけです。が、さすがにもともとの「API」とはあまりにかけ離れているので、「遠慮して」Web API とか Java API と、「形容詞」をつけたわけです。「端っこでいいから、仲間に入れてね」ってわけです。 「C 言語の API」というのは、正しいのか? これはやはり一般的であるとは言い難いです。現在では API という意味がもともとの意味から拡張されて使われていますが、それでもなお「システム側がプログラムをする人たちのために用意している呼び出し方法」であることに変わりはありません。ですから、「C 言語の」というのが、「C 言語の一部であるところの」とか「C 言語に包含される」という意味であるのなら、「C 言語の API」という言葉は、やはりありません。API は「C 言語の外」であるシステム(OS とかサーバ)が用意しているものであり、C 言語はそれを「呼び出す」ことができるに過ぎません。もしかすると、呼び出されたシステムも「C 言語で書かれている」のかもしれませんが、それは結果論であり、システムを記述した言語が C であれ、Pascal であれ、マシン語を直接書いたのであれ、決められた呼出し手順(これを「API の仕様」と言います)にしたがって呼び出せば、C 言語からであろうと他の言語からであろうと、この API を利用することができます。つまり、呼び出す側からは呼び出されたシステムがどのように作成されたかはブラックボックスであり、内部的にどのように処理されているのかを気にせずに呼び出せるのが API です。呼び出されたシステムは所望の動作を行なったのち、呼び出したプログラムに戻ってきます。 ・ プログラミング言語の『API』とは? 一般的に、この言葉は使われません。API はシステム側がプログラムのために用意している「呼び出し窓口」のことを指します。ですから、通常は「Unix の API」とか「Windows の API」というように、OS をはじめとするシステム側の名称に続いて使われる言葉です。最近ではサーバなど「広義のシステム」に属するものが増えているため、「データベースの API」という言い方もされていますが、本来の意味でのシステムは OS を指していたと理解するところから始めるとよいでしょう。 ・ 例えば,C言語の場合『API』にあたるのはprintfやscanfなどの『標準関数全体』という解釈で合っているのでしょうか? あっていません。printf などは「標準入出力関数」とか「標準入出力ライブラリ」と呼ばれることがありますが、これらは言語処理系を作成した人がプログラマのために用意するものです。一般的にこのような「有用なルーチンのかたまり」をライブラリと呼びますが、API とは呼びません。(ライブラリの効用は他にもありますが、話がそれてしまうので割愛します) ・ また,ライブラリとAPIの関係についても教えていただけると嬉しいです. 入出力などは、OS 側が用意しているものです。言語処理系で入出力が必要な場合、入出力ライブラリや入出力文を呼び出します。そのライブラリや入出力文ルーチンの中で API を呼び出して OS に入出力を依頼し、最終的にプログラマは入出力結果を見ることができます。ただし、「ライブラリ」の中には「算術ライブラリ」など入出力を伴わないものもあります。このようなライブラリを呼び出しても API は呼び出されないので、「ライブラリの内部では必ず API を呼び出している」とは言えません。 > 読んだ本の中で少し触れられていたのですが 以上の説明で、本の記載事項とうまくかみあうと思いますが、いかがですか?

iruka0913
質問者

お礼

回答ありがとうございました. どうやら根本的な解釈を間違っていたようです...素人の僕にも分かりやすく解説していただいて,本当にありがとうございます.

その他の回答 (6)

回答No.7

引用で、大事な部分を引用するのを忘れてしまいました。謹んでお詫びします。 >呼び出す側からは呼び出されたシステムがどのように作成されたかはブラックボックスであり、 >内部的にどのように処理されているのかを気にせずに呼び出せるのが API です。

回答No.6

質問者は http://pc11.2ch.net/test/read.cgi/tech/1226461162/395- ここら辺を読めばいい。 特に大事だな場所は >まぁ中身が分かっていてもいいんだけど、これだな、本質は。 >しかもアプリケーションを作る上で必須のある程度のまとまりがあればそれがapiになる、んだと思うが。 >この人はなんかjavaを否定してるっぽいけど、 >javaの言語から使う命令が、言語から見たら最後に使うモノだからapiでいいと思うよ。 >実装は見えないんだし…。 ここら辺です。 後、気になったけど >Win32 API を「Windows の API」だと発言した人をみんなで袋叩きにしている 2ch の書き込みを発見。 って書き込み訂正したの? この一文が気になったけどこれは、どういう状態での意味だったのか? ・WindowsのAPIはWin32APIだけではない。って意味。 DirectX・.NET FrameworkもWindowsのAPIだって意味だったのか? ・WindowsのAPIはWin32APIの一部に過ぎないって意味。 API=システムコールととった場合システムコールは、Win32APIの一部に過ぎない。って意味だったのか?

iruka0913
質問者

お礼

回答ありがとうございました. いろいろな方が意見を書き込んでくださってとてもありがたいのですが,素人の自分には判断がつきません.APIという概念の意味を狭義にとるか広義にとるかってことなんでしょうか…. いただいた意見等を参考に,もう少し自分でも考えてみようと思います.本当にありがとうございました.

  • tomtom963
  • ベストアンサー率19% (19/96)
回答No.5

自分もちょっと古い本をあさってみたけど ことごとく引っ越しのたびにその段階で必要無いのは 捨てていってしまってあまり古いのが無かったのですが 「QTプログラミング入門」ってMattbias Kalle Dalbeimer著の和訳本の初版本(1999年)の本にAPIの記述を見ると 明らかにAPIがOSの提供するだけの物ではなくてMotifやXtなんかのツールキットから呼び出すAPIって感じで書かれていた。 ツールキットはミドルウェアかどうかは微妙だと思うけど MotifやXtの下にあるXlibはミドルウェアとして扱ったとしても その上のツールキットはどうなんだろう?

iruka0913
質問者

お礼

回答ありがとうございました. APIという言葉は,使われ方が結構曖昧だということなんでしょうか.

  • vaidurya
  • ベストアンサー率45% (2714/5983)
回答No.3

みんな回答したあと、その後を見てんのかな?ヲレほぼ見ていない :-) それはさておき、狭義のAPIは 「APIが違うから違うOSからの移植が難しい」 という一文から見て取れると思います。 C言語はUNIX系OSでも多用されるもので、C言語の標準的なライブラリだけで プログラムを作れば、そのライブラリがOSごとのAPIを適宜呼び出し 違うOSでも、そのままコンパイルして実行できるソースファイルとなります。 OSごとの特有のAPIを必要とするライブラリなどが使われれば 違うOSで動かすために、違うAPIで同じ処理を実現するライブラリが必要です。 あるいは大幅なソースファイルの修正が必要になります。 そして、たとえばWindowsXPのWin32APIと同等のAPIを UNIX系OS上で実現すれば、Win32APIを使ったWindows用ソフトがUNIX系OSで動いたりもします。 実際に実現したのが、その筋で有名なWineであり WineをベースにしたDavidやCrossOver Macです。 概念的に考えれば APIは主にOSがアプリケーションに対して提供しているものです。 対してライブラリは開発言語がプログラマに対して提供しているものです。 そのライブラリの中の個別の機能が関数ということになります。 MicrosoftはOS(API)開発と開発環境(ライブラリ)開発と 両方を行なっているから強いとも言えますね。 そこをうまく繋ぎ合わせることが ひいてはソフトの開発性、安定性、高速性を向上させるのですから… #特定のOSの中で籠もるなら気にしないほうがいいものってありますね。 #逆に、違うOSと比較したほうが理解しやすいものもあります。

iruka0913
質問者

お礼

回答ありがとうございました. なるほど,APIとライブラリは違うもので,自分の思っていた具体的な関数などはライブラリ側の一要素なのですね.素人なので,まだまだ理解するのに難しい点はいくつかありますが,もっと勉強してからもう一度いただいた回答をじっくり読みなおしてみます.本当にありがとうございました.

  • GOOD-Fr
  • ベストアンサー率32% (83/256)
回答No.2

質問が誤ってます。 「プログラミング言語のAPI」という言葉は普通使いません。 API というのは、OS が提供しているものでプログラミング言語とは直接関係ありません。システムコールと呼ぶこともありますね。 プログラミング言語は一般的にライブラリを用意していますが、ライブラリの一部は API を呼び出しています。が、API とまったく無関係なライブラリもあります。某社の Windows では、OS が提供している API と言語から呼び出せる API とライブラリがごちゃまぜになっています。が、こういう「ごちゃまぜ」のシステムは Windows ぐらいしかありません。ちゃんとした OS は API をきちんと定義してありますし、その API は手順さえ守ればどの言語からでも呼び出し可能です。 ですので、「プログラミング言語の API」という言い方は「ない」という解釈でよいと思います。 余談ですが、「C言語の API」なるものが存在すると仮定して、ちゃんと理解したいのなら「C言語以外の API」を調べたほうがいいです。当然、「C言語以外の API」は C言語を含まないはずですから、「C言語の API」と「C言語以外の API」を理解すれば、どの部分が C言語で、どの部分が API か、自然と理解できると思います。(「C言語の API」という言葉はないので、今回は無理ですが・・・。「C言語のライブラリ」なら、できるわけか)

  • tomtom963
  • ベストアンサー率19% (19/96)
回答No.1

http://ja.wikipedia.org/wiki/Application_Programming_Interface printfと言うよりそこからさらに先にある部分も含めたところから APIと言うのが正しいと思いますよ。

関連するQ&A

  • プログラミング言語について

    プログラミング言語でprintfとscanfというのがありますが、printfとscanfの違いは何ですか?どういうときにprintfを使って、どういうときにscanfを使うんですか?回答よろしくお願いします。

  • C言語でWin32API

    C言語を使ってWin32APIを呼び出すような、Windowsプログラミングを始めたいんですが、何かよい本やサイトはご存知ないでしょうか。 Visual C++6.0はあるんで、それを使えばいいと思うんです。 C言語はわかるんですが、Windowsプログラミングに関する知識はほとんどないので、ごく基本的なことから知りたいんです。 WinMain関数というのを書くようなんですが、その書き方すら知りません。  スケルトン(出来れば、それよりもっと基本的なこと)から書いてあるようなものです。

  • c言語ネットワークプログラミングのAPIを乗せているwebページないですか?

    現在私はC言語でソケット通信を使って サーバとクライアントでメッセージのやり取りをおこなってみたいと思っているのですが どのライブラリのどの関数を使って通信できるのか全くわかりません。 (例えば、readの返り値ってなにを返すんだろう?とか) できればunix上(SunOS)でのc言語ネットワークプログラミングに関する APIが乗っているURLを教えていただけないでしょうか?(できれば日本語のwebページがいいです。)

  • プログラミングC言語の問題ですがわかりません。

    プログラミングC言語の問題ですがわかりません。 5つのint型変数a,b,c,ans,responseを宣言する。a,b,cの値はscanf関数で読みこむことにより初期化する。 a(1)b(2)c= と表示して、scanf関数によりユーザーの答案をresponseに読み込み、演算結果が正しければ1、間違っていたら0を表示するプログラムを作成しなさい。ここで(1)と(2)には算術演算子(+,-,*,/,%)がはいる。5×5=25通りの演算をすべて実行するようにしなさい。 特に正しければ1、間違っていたら0を表示するプログラムがわかりません。 まだprintfとscanf関数と演算子しかやっていないのでそれを踏まえたプログラムを1通りだけでいいので書いて頂けると幸いです。

  • APIとDirectXって何?

    DirectXはOpenGLのようなものだと言う事はわかるのですが、DirectXも無償で プログラミングできるんでしょうか? APIとはC言語の標準ライブラリだけではできない作業を補うものである位しか知識が有りません。 現在XPでStudio.NETを使っています。 APIとDirectXについてどのような物なのか知りたいのですが どなたかご指導いただけませんでしょうか。

  • C#プログラミングに役立つAPIの本???

    もっぱらC#を使用しています C言語のプログラム遺産の活用等には全く縁の無い私です だから今後もC#だけで行こうと思っております VC++などに移る気などサラサラありません それ故に、念のために ・・・・・ 実は内心では心配だから、APIだけは勉強しておこうと思って教科書を探しました 日経ソストウエアが出版している『APIで学ぶWINDOWS』¥2095を購入しましたが的外れ! ウインドウズの解説本でありプログラミングには役立ちません 更にC#プログラミングに役立つAPIの本を探したのですが、適当なものが見つかりません ご存知でしたら教えてください、お願い申し上げます

  • プログラム言語とAPI(windows API)の関係は?

    プログラミング言語といってもいろいろありますが、 このそれぞれのコンパイルでは、オブジェクトコードをつくっているのですよね? APIは、どこでプログラミング言語と関係しているのでしょうか? コンパイルでは、APIに直してからコンパイルしているのでしょうか?

  • c言語 プログラム メニュー

    C言語のプログラムでメニューの原型を作りたいと思っています。 内容としては ・標準ライブラリのみ ・関数を自作する ・関数の中身はprintfやscanfなど初歩的なもののみ ・メニューといっても1◯◯、2◯◯、3◯◯、4終了を表示(◯◯は適当)し、キーボードで1、2、3が入力されるともう一度メニューが表示されるというものです。(4のみプログラム終了) ご協力お願いします。

  • C言語より後に開発されたプログラミング言語は

    C言語を基にして開発されたのでしょうか? C++,C#はもちろんそうですが、Java、PHP、JavaScriptなどもそうなのでしょうか?と言うのも、C言語の関数とこれらのプログラミング言語の関数がかなり似ているところ(共通しているものも)があるからです。また、Excelの関数とも似ているのですが、これらのプログラミング言語と何か関係があるのでしょうか。

  • C言語のプログラミング

    今、独学でC言語を勉強しています。それで、練習にと思い、損益分岐点計算をC言語で作ってみようと思い、作りました。以下が、私が作ったプログラミングです。 float tanka,hendo,kotei,ryo; printf("単価 ¥"); scanf("%d",&tanka); printf("変動費¥");scanf("%d",&hendo); printf("固定費¥");scanf("%d",&kotei); ryo=kotei/(tanka-hendo); printf("限界利益率は %3.1f%です\n",(1-hendo/tanka)*100); printf("損益分岐点時の販売量は%.0fです\n",ryo); printf("損益分岐点時の売上高は%.0fです\n",kotei/(tanka-hendo)); しかし、実行してみると、最後の「損益分岐点時の売上高」が0になってしまいました。 参考書などの問題ではないので、答えがなくて困っています。どこがおかしいのかが分かる方、ぜひ教えてください。