第23回:文法と意味

未分類

プログラミング言語というものは、英語をベースにした記述をする言語である。
たとえば、「あなたがジョンであれば、昼食を一緒に食べる」ということを記述するとき、

if you == john then
me.eatLunchWith(John)
end

という様な書き方をする。日本語の文法的に考えると、これは少し直感的ではないが、それでも、機械語ーコンピュータの世界で交わされる本当の言語が、ゼロとイチ、すなわち「電流を通すか、通さないか」をベースにしている以上、
00100101110101…といった文章よりは、はるかな進化をした高次のレイヤーにある言語だと言える。

余談だが、日本語のプログラミング言語というものも開発されている。たとえば、

あなたは「ジョン」
もし、あなたが「ジョン」ならば
  「昼食をご一緒しましょう」と表示。
違えば
  「さようなら」と表示。

などといった構文でプログラミングをするのである。もちろん、これも「英語を翻訳した」という意味合いが強く、日本語の文法にならってはいても、日本語の意味する含蓄までは模写することは難しいだろう。たとえば、日本語で、
「ジョンさんとご飯が食べたいなあ」と言えば、それは上記の意味合いになることもあるだろう。

というわけで、今回は、前置きが長くなったが、「文法と意味」の話。
プログラミングの世界で起きるエラーは大別して二種類ある(大別しすぎているが)。
ひとつは、「シンタックスエラー(Syntax Error)」というもの。「文法エラー」という意味であり、プログラミング言語の文法規則から外れた文章を記述したということである。たとえば、「昼食、ジョンさんいかが」などといった文章は文法規則(主語と述語の関係、係り受けの厳密さ)から外れてしまうため、シンタックスエラーとなる。

そして、もう一つが「セマンティックエラー(Semantic Error)」だ。「意味エラー」といった訳になるだろうか。「文法上は合っているが、意味的に間違いがある」という時に起こるエラーで、これはプログラミング言語のほうでは認識したり、修正をしたりしてくれない。
たとえば、「ジョンさんとは昼食を猛烈に睡眠する考えを埋めたタヌキである」などといった文章のことだ。
言うまでもなく、ジョンさんは人間であることが意味論的に期待されているし、昼食は睡眠されるものではないし、考えを埋めるという言葉はあまりに比喩的である。
こうした、通常の言語の枠組みから外れた/ユーザーが定義した意味の枠組みから外れた記述に対して与えられるのが「セマンティック・エラー」である。

プログラミング言語を機械語に直す処理は、
字句解析(”ジョン”,”昼食”…)→構文解析(“ジョンと”, “昼食を”…)
→意味解析(“ジョン”は人で、”昼食”は食事で、食事は….)→コード生成(0101111…)
の順に行われる。この枠組そのものが、人間の脳が言語を認識し処理する工程をなぞったものだ。だから、人間の脳の処理系に比べて、劣っていたり抜け落ちたりしていることももちろんあるかもしれない。

けれども、人間同士のコミュニケーションの欠落/失敗について、シンタックスとセマンティクス、文法と意味の二つについて考えることは、かなり有用なことだ。

では、ここでいう「意味」とはなんのことだろうか。それは、また次回。

更新:2012-12-06 慶應義塾大学 環境情報学部 中園 翔