Perlの自然言語原理
by Larry Wall (Perl作者),
"
Natural Language Principles in Perl".
Japanese:
Daichi Mochihashi
<daiti-m@is.aist-nara.ac.jp>
(解説)
一度学んで、何度も使う
自然言語は一度学べば、何度も使うものである。ここから言語の設計者が学べるのは、
言語は学びやすさではなく、表現力の方に最適化されるべきだ
ということである。ゴルフカーの運転を学ぶのは簡単だが、それでは
やりたいことを表現することはできない。
しだいに学ぶ
人は自然言語を学ぶのを決してやめないという意味で、一度も自然言語を
学んでしまうことがない。
どんな人もかつて、何かの自然言語を完璧に学んでしまったことはない。
不幸にして, 直交性に対する要求から、多くのコンピュータ言語はいつでも
任意の自由度(次元)を持つように設計されている。
これは言語の全てを理解している時にはよいが、そうでなければ混乱に
陥ってしまうかもしれない。
最初は、可能な次元のいくつかは無視したいのではないだろうか。
初めは赤ん坊のように喋っても、それで通じる方がよいと思われる。言語が学ぶのに
難しくても支障はないが、一度に学ぶ必要はない。
様々な習熟度レベル
上の「しだいに学ぶ」が心理的なものであるのに対し、こちらは社会的な
ものである。人はあなたが自然言語の一部しか話せなくても別に気にしないし、
あなたが子供か外国人であればとりわけそうである (パリは例外として)。
もし言語が「しだいに学ぶ」ように設計されていれば、誰もが学習の途中なのだと
期待できるし、それでよいのだ。
同じことを表す複数の言い方
これは人類学的なものである。人々は言語をだんだんと学んでいくだけで
なく、様々な背景から来ているので、それぞれ違った言語の側面を最初に学ぶ
ことになるだろう。
Perlの世界では sed, awk, C, シェル, Basic, Lisp, Python, FORTRAN, などに
対応するPerlの機能の一部だけを使ってプログラムを書いてもかまわないと
公式に認められている。
。Perlが様々なコンピュータ言語のごった煮だからといって、
それらを混ぜ合わせて使わなければならないということにはならない。
借用は恥ではない
英語(と存続の危機に陥っていない他の言語
*
)では、人々は
アイデアを他の言語から盗んできてそれを自分の言語の一部にしてしまうこと
に躊躇しない。言語の「純粋さ」を守ろうとする努力(自然言語の場合も、
人工言語の場合も)は、特有の言葉遣いを持つエリート階級を作り出すことにしか
役立たない。
普通の人々はもっと分別があるし、そんな特殊な言葉遣いのことは気にしない。
中間的な次元
科学者は物体に対して、それに「ベクトル」つまりある決まった次元の空間内での
座標を与えてその位置を決定しようとする。これが、科学者が直交性、すなわち
ベクトルの各要素が独立であるのを好む理由の一つとなっている。
しかし、不幸なことに現実はたいていそうはなっていない。
言語的な問題を含む多くの問題は「ここからあそこに行く」ような問題で、
その間の地形が、どの解決法が実際的であるかについて大きな影響力を持つ。
問題は一つではなく、いくつかの段階を経て解決されることが多い。
典型的な移動は歩いて、車に乗り、エスカレータに乗り、動く歩道を使い、
ジェット機に乗り、
さらにまた動く歩道か電車に乗り、飛行機を乗り継ぎ、タクシーに乗り、
エレベータを使ってなされるものである。
それら一つ一つの段階でたくさんの「正しい観点」があり、その全体は本質的に
フラクタルなところがある。
*
言語に関しては、人は自分の言いたいことに近いことをまず言い、その後
細かい所を言い直すが、それはちょうど最初に発着の空港から旅行の計画を決め、
その後に初めて空港への行き方と空港から目的地への行き方を考えるような
ことである。
局所的な曖昧性
曖昧性があっても、それがすぐに解決される限り、人々はうまくやっていける
ものである。
一般的に自然言語においては、曖昧性は直前に話された単語と話題によって
すみやかに解消される。「それ」のような代名詞は、文法的には近接されたものを
指す。
Perl は同様に小さな曖昧性に満ちているが、
それは速やかに解消されるので、人々はほとんど気付かない。
たとえば、Perl には同じ文字で始まる項と演算子がたくさんあるが、Perl はそこで
項が期待されているのか演算子が期待されているのかをちょうど人間のように
見て解決する。もし 1&2
と書けばその &
はビットごとのANDであり、&foo
と書けばサブルーチン
foo
を呼んでいるのだとわかる。
これと対照的に、多くの強く型付けされた言語は「遠い」曖昧性をもつ。
C++ はこの最悪な例で、a+b
を見ただけでは
(演算子のオーバーロードがあるので)、+
が何をしているか全くわからないし、+
がどこで定義
されているのかもわからないのである。
この遠い曖昧性を解決するためには大学院にでも行かなくてはならないだろう。
韻律と屈折による句読点
自然言語はふつう、単語どうしがどう関連しているか示すために、音の高低や強勢や
中断によって区切られる。いわゆる「ボディランゲージ」が援用されることもある。
英語ではこうした句読法の一部は書き言葉にも表れる「ものもある」が、
ほとんどは表れないか、または何かで近似されるだけである。最近の電子的な
コミュニケーションの流れでは多くの句読法が発明されてはいるが :-)
こうした句読点
*
は悪いものだと考えているコンピュータ言語の設計者も
いるようだが、
彼らの国語の先生もそう言うかどうか、私には疑わしい。
数、格、語順を用いた曖昧性解消
言語が局所的な曖昧性を持たずにいられる理由の一部は、他の可能性が様々な
機構を通じて抑えられるからであろう。英語では数と語順、それから
代名詞に痕跡として残っている格変化を用いる。
「その男は彼らを見た、そして彼らは彼のほうを振り返った。」と書けば、
誰が誰に何をしたのかは完全に明らかである。同じように、Perl には名詞に対して
数を表す標識がある。$dog
といえば犬一匹だし、
@dog
といえば(可能性として)複数である。
つまり、$
と@
は英語の'これ'と'これら'のようなもの
である。
Perl は語順も用いる。sub use
が表していることは
use sub
が表していることとは全く異なる。
Perl はシェルのように、変数に$をつけることで、それが名前の参照ではなく
実際の値を表すというような格の区別はしないが、もしそう思ってよければ、
Perl のクオートを一種の格標識と思ってもよい。
やや抽象的には、Perl5 の \
演算子は変数の値ではなく、参照を
表す格標識あるいは前置詞の一種である。ただし、多くのコンピュータ言語同様、
前置詞のようなものは普通、引数リストの中での位置で表される。
(ただ、もちろん Perl では、名前つき引数を使って関数呼び出しを書き、そのとき
キーとハッシュの組を前置詞のように使うことができる。)
move $rock from => $qr_pos, to => "kb3";
主題化
主題化とは何かというなら、まずこの文自身が主題化文だといえる。
主題化子はこれから話したいことを最初に持ってくる。
英語には主題化の文型がいくつかあるが、
最も単純なのは名詞の倒置である:「人参は、僕はきらいだ。」
Pascal には "with" という書き方があって、主題化として機能する。
*
主題化子は主題の並びを受けとって、「これとそれについて、あれをする。」
のような書き方をすることもできる。Perl には、主題化子として働く色々な
書き方がある。
foreach (@dog) { print $_ }
複数の主題について言うこともできる:
for ($some_long_name) { s/foo/bar/g; tr/a-z/A-Z/; print; }
パターンマッチ(と実際ほとんどの条件文)は Perl ではまるで主題化文のように
書ける。
/^Subject: (.*)/ and print $1;
談話構造
談話構造とは、文をまたがって発話を組み立てる方法である。言語と文化によって
物語やジョークの構成規則は異なっているし、たとえばPerl の本についての書き方
も違っている。コンピュータ言語の中には、COBOL や Pascal のように、大きな構造に
対してかなり決まった書き方をしなければならないものがある。
Perl はこの点に関してはかなり自由で、書きたい順序でプログラムを書くことが
できるが、ただブロックの始めと終わりだけはきちんと(アリストテレスの
三段論法のように) {}
で明示的に囲わなければならない。
同様に、Perl では #!/usr/bin/perl
は「昔々あるところに」、
__END__
は「そしてみんな、幸せに暮らしました」だと
いってよいかもしれない。
代名詞化
誰でも、代名詞とその使い方は知っている。Perl にも代名詞はたくさんある:
$_
は「それ」、@_
は「それら」を意味する。
(ただし、$1,$2,..
は最後のパターンマッチでの部分文字列
を指す代名詞照応で、これは主題化としても働くことは上で述べた。)
foreach や grep の中では、$_
は問題となっているもののコピー
ではなく、そのエイリアスである。
*
同様に、@_
は関数の引数への照応のリストで、@_
の要素を変えることでもとの引数自体を変更することができる。
理論的な枠組を強制されない
自然言語を使う人々は、自分たちの言語がいかにエレガントであるかどうか
などにはほとんどこだわらない。最も効果的な表現を求めて努力するわずかな数の作家
を除けば、普通の人々はコミュニケーションの場であらゆる種類の冗長性
を使って、言いたいことを確実に理解させようとする。
手持ちの表現は何でも使って要点を伝え、仕事を片付ける。
普通、これは問題にはならない。人々は使えるとあらば新しい語を時に非常に
意欲的に学ぶが、法律家やコンピュータ・サイエンティストと違って、
言いたいことを言う前にその新しいたくさんの語に定義を与える
必要があるとはまず感じない。コンピュータ言語についていうと、
これはよく使われる概念をあらかじめ定義しておいて、人が多くの定義を書く必要が
ないようにする必要があるということである。かなりの数の Perl スクリプトは、全く
定義を含んでいない。
定義文がない C++ プログラムはいったいあるだろうか?
自由な文体
われわれはみな、フォークナーのように文章を書く必要もないし、
ダイクストラのようにプログラムを書く必要もない。私は自分のプログラミング・
スタイルについて喜んで他人に語ることができるし、彼らのスタイルの
どこがよくないと思うかを指摘したり、そうして罠に陥るのを避けたりすること
ができる。しかし、私はこれを同僚のプログラマとして行うのであって、Perl の
創造主として言うのではない。言語の作者には、多かれ少なかれ1行に1文
だけを書くなどの書き方を強制して、一つのスタイルを守らせようとする人がいる。
これは詩を書くにはいいかもしれないが、私はすべての人がPerlで詩を書くように
強制したいとは思わない。書き方の制限は自分で選ぶものであって、少なくとも
仲間内での合意の下に守られるべきものである。
言語の共同設計
誰も自然言語を自分で設計したりはしない(トールキン以外は)。
われわれはみな、いい表現をコピーしてわかりにくい表現を避ける、言葉の借用と
新造を行うことで自分たちの言語の設計に参加している。
最良の人工言語は共同作業の結果である―たとえ Perl のように、一人の人間が
責任を負うように見えたとしても。Perl のよいアイデアのほとんどは
私が考えたものではない。それは他の言語からきたものもあるし、開発の過程で
仲間からのアドバイスによって追加されたものもある。
もし言語というものを、それに付随する文化的な付属物(ライブラリや付属コマンド
など)も含めて考えるなら、CやAdaやC++, Unixシェルですらも多くの、非常に
多くの人々の共同生産物である。
Perlも例外ではない。
不可避な分化
上で述べたように、言語は多くの人々の手によって「設計」されるものなので、
それが方言に分かれていくのは避けられない。この分裂を遅くすることはできるが、
生きている言語ではそうしたまとめる力より分裂する力の方がほぼ間違いなく強い。
POSIXは System V と BSD を統合しようとしたが、その統合がうまくいったと
同時に、別の方向に多くの Unix クローンが生まれた。
ここから言語設計者が学ぶことができるのは、言語のどの変種が対象となっているか
明示的に指定できる機構を含めるということである。Perl5にはそうした明示的な
拡張機能があって、"use" 文を使うことでどういう特別な機能や「方言」に
依存したコードであるか指定できるようになっている。
Perl4にはこの機能がなかったので、言語本体に属さない様々な機能を言語に含める
必要があった。幸いなことに今われわれは「標準的な」Perlだけを定めればよいので、
昔のように oraperl, sybperl, isqlperl, ... などの方言を別に用意する必要は
なくなっている。
$Id: natural-ja.html,v 0.2 2002-11-12 23:12:26+09 daiti-m Exp $
* 富士通研 颯々野さんの指摘により, タイトルを変更しました。(2002/11/13)