開発の勉強をしていると、ときどき「セマンティクス」という言葉が出てきます。
最初に聞いたとき、
「意味論……? なんだか難しそう」
と思ったのですが、プログラミングの文脈ではまず、
セマンティクス(semantics)=その記述や操作が「何を意味するか」
と考えると分かりやすかったです。
今回は、よく一緒に出てくる「シンタックス」と比較しながら整理します。
シンタックスとセマンティクス
この2つはセットで考えると分かりやすいです。
| 用語 | 意味 |
|---|---|
| syntax(シンタックス) | どう書くか、書き方・文法 |
| semantics(セマンティクス) | その記述が何を意味するか |
たとえばJavaで、
int count = 10;
と書いたとします。
int 変数名 = 値;
という書き方のルールがシンタックスです。
一方で、
「整数型の変数 count を用意して、10を代入する」
という、このコードが表している意味がセマンティクスです。
つまり、
シンタックス
↓
どう書く?
int count = 10;
↓
セマンティクス
↓
これは何を意味する?
という関係です。
REST APIで考えると分かりやすい
Web APIでは、HTTPメソッドにもそれぞれ意味があります。
たとえば、
GET /users/1
なら、
「IDが1のユーザー情報を取得する」
という意味として扱います。
同じように、
GET → リソースを取得する
POST → リクエストを処理する・リソースを作成する
PUT → リソースを置き換える
DELETE → リソースを削除する
といった意味があります。
これもセマンティクスです。
単に「GETという文字を書く」という話ではなく、
GETというHTTPメソッドには、どういう意味・性質があるのか
まで考えるのがセマンティクスです。
書けるけれど、意味がおかしいことがある
ここが面白いところです。
たとえば、
GET /users/1/delete
というAPIがあったとします。
技術的には、このURLにアクセスしたときにユーザーを削除する処理を書くことはできます。
つまり、プログラムとして実装できないわけではありません。
しかしGETは、本来リソースを取得するために使われるメソッドであり、安全なメソッドとして定義されています。
そのGETでデータを削除してしまうと、
書くことはできるけれど、HTTPメソッドが持つ意味と実際の処理が一致していない
状態になります。
これが「セマンティクスがおかしい」と言われるケースの一つです。
なぜ「意味」を守る必要があるのか
最初は、
「最終的に動けばいいのでは?」
とも思いました。
でも、システムは一つのプログラムだけで動いているわけではありません。
ブラウザ、サーバー、キャッシュ、プロキシ、監視ツール、別のAPIクライアントなど、さまざまなものがHTTPのルールを前提として動きます。
開発者自身も、
GET /users/1
を見れば「これは取得だな」と予想します。
つまり、セマンティクスを守ることは、
その仕組みを使う人やシステムが、同じ意味として解釈できるようにすること
でもあります。
「RESTful」という言葉にもつながる
以前、RESTfulなWebサービスについて調べたとき、
GET /users/1
POST /users
PUT /users/1
DELETE /users/1
のような設計が出てきました。
これも単にURLをきれいにする話ではありません。
同じ /users/1 というリソースに対して、
「何をしたいのか」をHTTPメソッドの意味で表現しています。
RESTを理解するときも、
「GETならこの処理を書く」
と丸暗記するより、
HTTPでは、それぞれのメソッドにどんな意味が与えられているのか
と考えると理解しやすくなりました。
セマンティクスはAPI以外にも出てくる
セマンティクスという考え方はHTTPだけのものではありません。
たとえばHTMLでも、
<h1>タイトル</h1>
と
<div>タイトル</div>
では、画面上の見た目をCSSで同じにすることはできます。
しかしh1には、
「これはページの見出しである」
という意味があります。
つまりHTMLでも、
「どう表示されるか」だけではなく、
「その要素が何を意味しているのか」
が重要になります。
これが「セマンティックHTML」という考え方につながります。
まとめ
セマンティクスという言葉は難しく見えますが、まずは、
セマンティクス = それが何を意味するのか
と覚えておけばよさそうです。
特にシンタックスとの違いを意識すると分かりやすいです。
Syntax → どう書くか
Semantics → それは何を意味するか
コードが文法的に正しくて動いていたとしても、その技術が本来持っている意味と使い方が一致しているとは限りません。
API設計などで「なぜGETを使うのか」「なぜPOSTなのか」と考えるときは、単なる書き方ではなく、その裏にあるセマンティクスまで考えてみると理解が一段深まりそうです。