糖衣構文

出典: フリー百科事典『ウィキペディア(Wikipedia)』

糖衣構文(とういこうぶん)は、プログラミング言語において、読み書きのしやすさのために導入される構文であり、既に定義されている他の構文の(人間にとってより理解しやすい)書換えとして定義されるもののことである。構文糖(こうぶんとう)あるいは構文糖衣ともいう。

英語の syntactic sugar (シンタクティックシュガー、syntax sugar (シンタックスシュガー)とも)の訳語で、語源は英単語の sweet が、「甘い」の他に「扱いが楽」という意味をもつことから。

目次

[編集] 解説

糖衣構文はなくても言語の記述能力(論理的な、できること/できないことの境界)は変化せず、他の構文を利用することによって等価な記述をすることができる。――というのが、ソフトウェア工学が唱える建前である。

一般に糖衣構文と呼ばれているものの中にも、糖衣構文の使用時/未使用時の間で細かな処理の違いがあったり、無視できない性能差などがあったりする場合がある。 このため現実には機能上完全に等価とは言えないことのほうが多く、実際には「ほとんど同じ」という程度のあいまいな等価性と考えたほうが正確である。

なお、より厳密な意味でのプログラミング言語の機能等価性は、アラン・チューリングによって述べられており、チューリング等価として知られている。

読み書きの負荷を軽減する目的で始まった糖衣構文は、プログラマの意図をコード中に反映させて残すための手段としても活用できることが知られている。

ある目的のためによく用いられる記法が二つ以上ある場合、プログラマはそのどちらかを選ぶことになる。 このとき(初心者でない)プログラマは統一性のある個人的/職場的/言語的なルールに従って記法を選択するのが普通であるため、 どの記法が選択されたかによって、当時コードを記述したプログラマの意図を推し量ることができるのである。

Perl等のスクリプト言語では糖衣構文が数多く言語仕様に定義されているため、こういった活用が成されている状況が多い。

[編集] 糖衣構文の例

[編集] Cでの配列へのアクセス

C言語では、配列は連続するメモリ領域に要素を並べたものとして定義され、配列の要素へのアクセスは配列の先頭要素のメモリアドレスに要素のインデックスをオフセットとして加えたアドレスの値を参照することで行われる。しかしメモリアドレスを指定するポインタを直接操作することは誤りの原因となることが多い。そこで本来ならば *(a + i) と書くところを、a[i] とも書けるようになっている。この糖衣構文はポインタ演算がより面倒になる多次元配列のアクセスを行うときに特に役に立つ。

またこの糖衣構文は、括弧の手前に書かれるものが配列の先頭アドレスで括弧の中がインデックスであるというように、コードの意味をより明確で分かりやすくする。

[編集] for文

C言語for文

for(i=0;i<=10;i++){
  P
}

は、次のように(ただしcontinue文のジャンプ先が異なる点を除いて)等価な処理を書くことができる。ただしPは処理を表す。

i=0;
while(i<=10){
  P
  i++;
}

[編集] 中置記法

Haskellのような関数型言語では、中置記法a+bは、関数を適用する文(+) a bに対する糖衣構文である。

[編集] 配列の宣言と初期化[要出典]

Javaの配列の宣言と初期化の記法

String[] strs = new String[3];
strs[0] = "a";
strs[1] = "b";
strs[2] = "c";

String[] strs = { "a", "b", "c" };

と書ける[1]String以外のオブジェクトでも可能である。 後者は「あらかじめ決まったいくつかの文字列から文字列の配列を作りたい」という記述者の思考を、より良く反映している。

[編集] Perlにおける条件文

Perlの条件文の記法

if ($boolean) {
  print "Syntax sugar\n";
}

print "Syntax sugar\n" if $boolean;

と書ける。

Perlの開発者ラリー・ウォールによればこれは糖衣構文であるが、FORTRANPascalやCやJavaに慣れ親しんだプログラマの中には、これを読みにくいと感じる者も多い。それは、「読み書きのしやすさ」が主観に基づくためである。

[編集] 参考文献

  1. ^ Java Language Specification Third Edition, 10.6