【図解】API とは

# はじめに
**API**（Application Programming Interface）という言葉はソフトウェア開発の世界でよく耳にする用語であり、さまざまなドキュメントや書籍で頻繁に登場します。

最近では API という言葉はソフトウェア開発者だけでなく、一般のアプリケーション利用者にも浸透しつつあります。
例えば、X（旧 Twitter）を利用している方あれば **`API 呼び出しの回数制限を超えました`** というエラーメッセージを目にしたことがあるかもしれません。「API 制限」という言葉がソフトウェア開発に直接関わっていない人々の間でも使われるようになっています。

API という言葉が広く使われるようになった一方で、その具体的な意味や用途については十分に理解されていないことも多いです。

本記事では、API の基本的な概念から具体的な例までを解説し、API に対する理解を深めていきます。

# API とは
**API**（Application Programming Interface）とは、その名の通り、インタフェースに一種で、広義には「**あるソフトウェアが提供する機能を別のソフトウェアが利用する際の、ソースコードレベルの取り決め**」を意味します。


![API](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/40a7d25b-2882-2d83-d8c6-433a282edb02.png)


さきほど、API はインタフェースの一種と説明しました。**インタフェース**とは異なる**何か**と**何か**を**繋げる役割**を持つものを意味します。

API ではその**何か**は**ソフトウェア**です。API は、ソフトウェア同士がやり取りを行う際のルールであり、**ソフトウェアを繋げる**役割を果たします。

「ソフトウェア同士を繋げる」と一口に言っても様々な段階での連携があります。API はその中でも、**ソースコードレベル**でソフトウェア同士を結びつける役割を果たします。

以下では、**ソースコードレベル**の意味について説明し、API の意味をより詳しく掘り下げていきます。

:::note
ソフトウェアとは、コンピュータが特定の処理を実行するために必要な**プログラム**や**外部データ**、**設定**などが組み合わさったものです。特に**プログラム**は**ソフトウェアの中核**となる部分で、コンピュータに対する命令の集まりです。
:::

ソフトウェアの中核を担う**プログラム**には、**ソースコードレベル**と**バイナリレベル**のものがあります。

![プログラム](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/5b5a8be0-04d5-ae62-d33c-4a46e4811174.png)


**ソースコード**とは C 言語や Rust などのプログラミング言語で記述された**テキスト形式のプログラムファイル**です。一方、**バイナリコード**とは 0 と 1 のビット列で構成され、**CPU が直接実行できる形式のプログラムファイル**です。

:::note
現代のソフトウェア開発では、バイナリコードを直接作成するのではなく、**コンパイラを利用**してソースコードからバイナリコードを生成する場合が多いです。
:::

API は、バイナリレベルではなく、コンパイル前の**ソースコードレベル**（つまり、プログラミング言語でソースコードを記述する段階）の取り決めです。

以下は `TypeScript` で記述された**ソースコード**です。
このコード内で `markdown_to_html` という外部ソフトウェア（ライブラリ）が提供する機能(`parser` 関数など)を利用する際に従う必要がある取り決め（関数の引数の型や返り値の型など）が **API** です。
```typescript
// 外部のソフトウェア（ライブラリ）
import { parser } from 'markdown_to_html';
// function parser(text: string): string{
//     let html: string;
//     // 中略
//     return html;
// }

// 自分のソフトウェア
const text: string = "# What is an **API**?";
// 
const html: string = parser(text); // <h1>What is an <strong>API</strong>?</h1>
```
一方、**バイナリレベル**でのソフトウェア間の取り決めは **ABI** (Application Binary Interface) と呼ばれています。

改めて API とは、
- 外部のソフトウェアが提供する機能を
- ソースコード内で利用する際の
- 取り決め

を意味します。

以下では、より具体的なイメージを掴むために API の具体例をいくつか紹介します

# API の具体例

## ライブラリやフレームワークの API
**ライブラリ**や**フレームワーク**のドキュメントを読んでいても API という言葉はたびたび登場します。

具体的には、[jQuery](https://api.jquery.com/) や [NumPy](https://numpy.org/doc/stable/reference/index.html) などのライブラリのドキュメント、[Laravel](https://laravel.com/api/master/index.html) や [FastAPI](https://fastapi.tiangolo.com/reference/) などのフレームワークのドキュメントで登場します。

API のドキュメントには、ライブラリやフレームワークが提供する関数やメソッド、クラスなどを利用する際の取り決めが記述されています。

重要な点として、API はライブラリ（やフレームワーク）そのものではないということに注意する必要があります。

API はあくまでライブラリを利用する際に従うべき**取り決め**です。ライブラリの具体的な内部実装の詳細を必要としません。

例えば、`NumPy` ライブラリの `asarray` メソッドや `where` メソッドは、これらのメソッドの中で何が行われているかを理解する必要がなく、メソッドの引数と返り値の型が何なのかの取り決め（つまり、ライブラリの API）を知るだけで利用できます。
```python
import num﻿py as np

arr = np.asarray([0,1,2])
result = np.where(arr>=2)
```

この特性により、ソフトウェア間の連携を容易にし、内部の実装が変更されても、API が変更されない限り、既存のコードを修正する必要がなくなるという利点があります。



# ブラウザ API
ブラウザ API は、ブラウザが提供する様々な機能を利用するための API です。DOM API や フェッチ API などがその例です。

以下は、JavaScript のソースコード上で DOM の機能を利用する例です。ブラウザ内部の実装を理解しなくても、簡単に HTML と CSS を操作することがきます。
```javascript
const id = "element_id";

const element = document.getElementById(id);
```

参考: [Web API の紹介 - ウェブ開発を学ぶ | MDN](https://developer.mozilla.org/ja/docs/Learn/JavaScript/Client-side_web_APIs/Introduction)

## Web API
今まで紹介した API は、連携するソフトウェアが同じコンピュータ上にあるという前提でした。

一方、**Web API**は**インターネットを介して**、異なるコンピュータ間でソフトウェアを繋ぐことができる API です。

![Web API](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2801269/a1ae35c7-e0e5-29b7-fccf-5cf77af5405f.png)

Web API は、インターネットを通じて、外部のソフトウェアの機能を利用する際のルールを意味しますが、その**機能を提供するサーバ自体**も Web API と呼ばれることがあります。

翻訳機能や決算機能などさまざまな機能を、容易に自分が開発するソフトウェアに組み込むことができます。

# おわりに

API は、異なるソフトウェアが連携して動作するための重要な仕組みであり、現代のソフトウェア開発において不可欠な要素です。

本記事で紹介した基本概念と具体例を通じて、API の理解が深まったことを願っています。