Stricter Whitespace Enforcement(2005/4/11)

プログラミング言語を作る」を 立ち上げてはみたものの、最近何かと忙しく、更新がままならないので、 プログラミング言語関連の雑記でも書いてお茶を濁そうというのがこのページの主旨です。 現状(2005/4/11現在)で、ひとまずcrowbarは配列まで動作してるんですが、 テストと解説ページが間に合っていません。 現状で、以下のようなコードが一応動いています。 GCはmark-sweepに切り替えました。

# 配列リテラルの生成
a = {1, 2, 3, 4, 5, 6, 7, 8};
for (i = 0; i < a.size(); i = i + 1) {
    print("(" + a[i] + ")");
}
print("\n");

# 本筋に関係ないが、文字列のlengthメソッド。
print("len.." + "abc".length() + "\n");

# 配列への要素の追加。
for (i = 0; i < 10; i = i + 1) {
    print("a.size().." + a.size() + "\n");
    a.add(i);
}

for (i = 0; i < a.size(); i = i + 1) {
    print("(" + a[i] + ")");
}
print("\n");

# 掛け算99の表を作る。
a99 = new_array(9);
for (i = 0; i < 9; i = i + 1) {
    a99[i] = new_array(9);
    for (j = 0; j < 9; j = j + 1) {
	a99[i][j] = (i+1) * (j+1);
    }
}

for (i = 0; i < a99.size(); i = i + 1) {
    for (j = 0; j < a99[i].size(); j = j + 1) {
	print("[" + a99[i][j] + "] ");
    }
    print("\n");
}

さて、そんな話はひとまずどうでもよくて、 今回のネタは、この4/1に発表されたPythonのエイプリルフールネタ Stricter Whitespace Enforcementです。 ネタ元はまつもとゆきひろさんの日記 Matzにっきより。

Matzにっきの方が詳しいのでそちらから引用すると、

(中略)

また、Python 3.0からは縦方向の空白ルールも導入される。

んで、 PyJUGのページのコメントを見ると、「4月1日なのが残念なくらいです」とか、 「エイプリルフールなら悲しいぞ・・・」とか、 本当にこういう規制をかけてほしい、という要望がPythonユーザには多いように見えます。

私自身、センス・オブ・プログラミングには、

正直言ってこんなのは慣れの問題でしかありません。

くだらない論争をしているよりは、

という方針に従うべきでしょう。

ということを書いています。 つまり、インデントとか空白の空けかたなどの瑣末なスタイルは、 所詮慣れの問題でしかないので、統一することにこそ意味がある、 というのが私のスタンスです。

じゃあ、crowbarでも、中括弧の位置とかをコンパイラが把握し、 決められたスタイルから外れていたら、 コンパイルエラー(警告ではなく)にしてしまえばいいじゃん、 という意見も当然考えられるわけです。 技術的には、これはさして難しいことではありません。 lexを使っていると難しいかもしれないけれど、 レキシカルアナライザなんぞ自作したってたいした手間がかかるわけじゃなし、 実際私は、仕事で、とある顧客のコーディング規約に従っているかどうかをチェックする プログラムを書いたことがあります(対象言語はC)。 レキシカルアナライザを自作し、トークンごとに出現位置(行番号とカラム)を保持して yaccで作った完全なCパーサでチェックをかけました。

しかし、そういう「厳密なチェック」は、 仕事で作る大規模なプロジェクトでは有効でも、 初心者が最初に作るプログラムではどうかなあ、とも思います。 たとえば、以下のようなif文について(言語はcrowbar)、

  if (a == 10) {
      print("aは10です\n");
  }

といったことをコンパイラで強制することは確かに可能です。 でも、仕事でばりばりコーディングする人を相手にするならともかく、 プログラミング自体の初心者に、こんな瑣末なコーディング規約を、 言語と一緒に覚えてくれ、というのも無茶な話なわけで、 「crowbarでは改行や空白は基本的に意味を持たない。ただしコメントは例外ね」 という規則のほうが、ずっと覚えやすく、 初心者にとっての障壁を低くしてくれると思います。

ではどうすればよいのか。 たとえばコンパイラに-strictオプションを付けて、 それを付けたときだけ厳密なチェックを行えばよいのか。 でも、そのオプションを使うのは誰なんだろう。 初心者は一度にたくさんのことは覚えられないからOFFにするとして、 熟練者は熟練者で、 こういう瑣末なコーディングスタイルに妙なこだわりを持っている人が多そうだから、 オプションをONにしてくれない気がします。 それじゃ意味がありません。

そう考えると、面白くない結論ですが、 コンパイラはスタイルのチェックはしないようにして、 別途他のツールでチェックをかける、という、 他言語でも使われている方法が一番無難かなあ、という気がします。

言語を作るからには、言語作成者の特権として、 コーディング規約ぐらい俺に決めさせてくれよ、という思いはあるんですけどねえ… 現実には難しい気がしています。



次の雑記 | ひとつ上のページに戻る | トップページに戻る