« ^ »

プログラミング言語での句、節、式、文、そして式文、複合文の違い

2022/11/25 更新
約 3分 で読める

プログラミング言語について解説している文章にはちらほらと「句」、「節」、「式」、「文」と言った単語が使われる。これらの説明をいくら読んでも私はピンと来なかった。何となくは分かる。Pythonで言えばifやforで記述されるコードの部分は文であり代入も文だ。一方で関数呼び出しは式であり、演算子を用いた値の操作も式だ。そのコードを評価した時、何の値にも置き換わらないコードは文、何らかの値に置き換わるコードは式という雑な認識をしている。句は構文解析は済んだが式とは言えず評価できない不完全な状態のコード一部分であり、実行はできない。節と句は同じものだが、プログラミング言語によってどちらかの表現がよく使われる。

概ね間違いではないと思うが、どうもピンと来ない。制御構文一つをとっても、プログラミング言語によっては、式であったり、文であったりするため、ifだから文というわけでもない。また、式文と言う単語も登場したりするため、もはや混乱状態となる。プログラミング言語を実装する上では、これらは明確に区別されているはずである。そこで今回は式や文について考えてみることにした。

大まかな定義

句、節 - Clause

式 - Expression

https://ja.wikipedia.org/wiki/%E5%BC%8F_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

文 - Statement

https://ja.wikipedia.org/wiki/%E6%96%87_(%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%9F%E3%83%B3%E3%82%B0)

式文 - Expression Statement

式と文、そして式文

Lisp

Lispの場合はこれらの都合はかなり異なる。基本的には文は存在せず、制御構文も含め、式として扱う。Scheme, Common Lisp, Clojure, Emacs Lispと言った各種Lisp方言は全て、これらに従う。S式の簡潔さはこういう所に現れている。

Haskell

Haskellには式と文の違いが明確にある。ifやforといった制御構文は文として実装されている。

SQL

SQLではUPDATE, INSERT, DELETEなどは文である。WHEREは句または節であり、どちらかというと句の方が多く使われるように思う。SELECTは文でもあるが、サブクエリを考えると値を返すことができるため式とも言えるようにも思える。ただあまりSELECT式という表現は聞かない。この当たりの認識が曖昧でよく分からなくなってしまう。CASEは式であるが、CASEを文としても実装しているデータベースも存在する。通常はCASEは次のように使用する。

SELECT CASE WHEN true THEN 1 ELSE 0 END;

この場合のCASEは値を返す式である。CASEを文として扱える例としてIBMのDb2がある。Db2はCASEを用いて発行するSQL自体を切り替えることができる。

A=true

CASE A
  WHEN true
    SELECT 1;
  ELSE
    SELECT 0;
END CASE

この場合のCASEは式ではなく文と言える。この機能はデータベースによってサポート状況が異なるため、例えばPostgreSQLでは動かない。

プログラミング言語パラダイムから見た文や式

関数型言語であるLispでは文は無いが、同じく関数型と呼ばれるHaskellには式や文はある。つまり関数型と言えど、文がないというわけではないようだ。一方で手続き型と呼ばれる言語、C、Java、Pythonなどはどれも文と式の両方が存在する。宣言型として分類されるSQLも、式と文の両方が存在する。


しむどん三度無視 により 2022/11/25 に投稿、2022/11/25 に最終更新
« ^ »