2015年01月29日の日記です

目次

01-29 「デフォルト」という言葉の意味
01-29 プログラム言語における「デフォルト動作」


「デフォルト」という言葉の意味  2015-01-29 11:28:11  コンピュータ

▲目次へ ⇒この記事のURL

いつも朝食の準備をしながらFM横浜を聞いてます。


ニュースや天気予報を読み上げるアナウンサーに言葉にセンシティブな方がいて、語源とか意味にも詳しい。

DJが、これが面白くてわざとおかしな言葉遣いをして訂正されたりしてます。まぁ、これはちょっとしたお遊び。


ところが、今朝は様子が違った。

アナウンサーの方が「デフォルト」という言葉を使い、DJが意味がわからず問い直した結果、アナウンサーの方は答えられませんでした。


アナウンサーの方はなんとなく使ってしまったようで、じゃぁその意味は、となると、判って無いようでした。




そこは生放送のラジオ番組のこと。すぐに、視聴者から意味を教えるメールが多数寄せられます。

…ところが、この内容が正しくない。


いや、間違っちゃいないし、その意味では正しい。

でも、語源を押さえずに「最近のつかわれ方」に根差した使い方を教えているので、DJの方は混乱するばかり。


・パソコンの初期設定のこと

・パソコンの標準装備のこと

・パソコンの標準設定のこと


…このあたりが、メールの主な内容でした。


まぁ、間違っちゃいないけど、どうも微妙に違和感がある。

DJの人は「辞書を調べたら、パソコン用語で初期設定のことと書いてあった」とも言ってました。


そうか、そんなこと書いちゃう辞書があるのか。

…って、今調べたら Wikipedia にそう書いてありました。


「辞書」=「ウィキペディア」か。まぁ、そういえなくもないでしょう。


じゃぁ、英語ではどう書いてあるのだろう、とおもったら、Wikipedia英語版には Default の解釈として正しいことが書いてあります。

日本語版はでたらめなことが多いのですが、こんなにまるっきり違うことが書いてある記事も珍しい気がします。


ただ、英語版も「本来の言葉の意味を知ったうえで」、コンピューター用語としてはどのように使われるか、という形で書かれています。

本来の言葉を知らない人が英語版を翻訳すると、日本語版みたいにまるっきりおかしな内容になるかもしれません。




さて、デフォルトはデ・フォールトです。

「デ」は、デバグのデ。離れる、下げる、否定する、などの意味を持つ接頭語です。


フォールトは「失敗」。

テニスでサーブに失敗すると、審判が「フォールト」と宣言します。あのフォールトです。



だから、デフォルト、は字句通り捉えると「失敗回避」。

ただ、実際には失敗を回避するという意味合いではなく、本当に大切なものを守るために、やりたくないけど何かを諦める、という感じです。


フォールトが単純な「失敗」ではなくて、何もかもがダメになるような失敗なのね。

それを回避するために、目先の些細なこと(でも十分大切な事)を切り捨てるような意味合いになる。


だから、デフォルトとは「棄権」などの意味になります。

辞書を引くと「債務不履行」とあるのだけど、これもそうした意味。




さて、パソコン用語として。

もともとはプログラマーが使っていた用語で、そこから派生してパソコン一般に使われる用語になりました。


コンピューターは、1から10まで、すべてを教えてやらないと動くことができません。

でも、人間にとってはこれは大変な事。


そこで、なにかを省略する、ということができるようにします。

もちろん、省略した時にどうするか、というのも誰かが教えているのだけど、少なくとも使う人にとっては「コンピューターが善きにはからってくれた」感じになる。


たとえば、条件分岐があったとします。

プログラムって、条件分岐が非常に大事。大事っていうのは、わかりにくいという意味でもあり、プログラムのバグが出やすいところ。


たとえば、4択のクイズゲームがあったとしましょう。

ユーザーに、1 2 3 4 の数字キーを押して答えてもらう。


1 を押した場合はこの処理を、2 を押した場合はこの処理を…と 4 までの処理を作り、プログラマは「これで大丈夫」と考えます。

ところが、ユーザーはプログラマの想定外のことをする。0 を入れられてしまったとします。


この時、プログラムは間違いなく誤動作します。

あらかじめ想定していなかった入力が来たのだから。



ここで、「想定外だったら、もう一度入力からやり直させる」というようなプログラムを入れておけば問題は無くなります。

これが「デフォルトのプログラム」。


全体がダメになりそうな時に、それを回避するわけです。


プログラマーの方ならわかりますね。C言語由来の switch 文を持つ言語なら、大抵 default という「どの条件にも合わない時」のプログラムを書く方法があります。




やはりプログラムで、関数に値を渡す必要があるとします。

C言語などでは、基本的にはあらかじめ決めた数の値を、必ず渡す必要があります。そうしないとエラーになります。


でも、これが案外面倒くさい。Javascript とか、 PHP とか、perl とか、「値を渡さないと適当な値が入る」ようにしてある言語が増えました。


Javascript の場合、入る値は undefined 。「何も入ってないよ」という意味を示す値です。

PHP の場合、関数設定時に値が決められます。渡されなければあらかじめ決めた値が入るし、渡されればその値になります。


つまりこれらは、引数の数が合わない、というエラーを回避するための「デフォルト値」なのです。




コンピューターを応用した機械では、さまざまな設定を行い、その設定を記憶できる、というのが普通になりました。


しかし、何も設定していない状態で「設定が無いからおかしな動作をする」のは困ります。

購入者が、何も設定していない状態でも、それなりに動作するように、あらかじめ工場で設定をしておきます。


これが「デフォルト設定」。出荷時の初期設定です。


じゃぁ、デフォルト設定から変更したものはもう「デフォルト」ではないのか、というと、そうでもないのがややこしいところ。


設定の中には、特定機能が動作する際の「デフォルト値」を定めるようなものもありますからね。


#必ずメニューを出して聞いてくるのだが、よく使う値が設定された状態で聞いてくるので、問題なければ OK を押すだけで良い、など。




WEB ページなどで、多国語に対応している場合があります。

大抵は、ユーザーが自分で言語を選べるようになっているのですが、はじめて訪れた場合でも、大抵ユーザーの母国語で表示を行ってくれます。


これも、設定していない状態なのに適切に動いてくれる、という「デフォルト設定」の一種。

実はブラウザに対して「存在するなら日本語で表示」などの設定を入れてあって、その設定も変えられるようになっているのですが、多分多くの人はこの設定があることも知らないでしょう。


なぜなら、ブラウザもまた、「デフォルト設定」として、自動的にユーザーの母国語を要求するように設定されているからです。

じゃぁ、ブラウザは何故「母語」を知っているのか。


言語ごとにインストーラーが別れている、というのも昔はありましたが、今は大抵多言語対応で全部一緒。

なので、OS に対してユーザーの母国語を問い合わせて、初期状態を決めます。

もし、OS に聞いても判断がつかない場合の「デフォルト」は英語でしょうね。多分。


たとえば、UNIX であればユーザーの環境変数に ja_JP.UTF-8 とか入っているので、日本語が母語とわかります。


さらに、大抵のユーザーはこの環境変数を自分で設定していません。

設定しない場合、システムが決めた「デフォルト」の値が入る。


たとえば、Linux ではインストーラーが大抵早い段階で言語を聞いてきます。

インストールの説明をその言語で行うためでもあるけど、システムの「デフォルト設定」を決めるためでもある。


さらに、システムデフォルトも設定していないとどうなるか。

環境変数が設定されていない場合、UNIX では「C」が母国語となります。

つまり、これが UNIX にとっての、本当の「デフォルト」の言語。



これ、C言語の意味ね。

UNIX はC言語で作られ、C言語は UNIX の上で作られた。

だからCが母国語という意味。多分ただの冗談。


…えーと、通常のソフトは英語出力になりますが、ツールの作者が一番良いと思った言語で出力していいです。

僕だったら、たとえ多国語版を作っていたとしても、日本語で表示させる。僕にとって一番正しく使えている言葉だから。




最後の方は完全に余談ですね。


意味がかえって分かりにくくなっていそうなので、もういちどざっくりまとめましょう。


1から10まで指示しないといけないコンピューターでは、うっかり指示を忘れることも良くある。


本当なら、指示がおかしいので、コンピューターの動作はおかしくなります。

でも、それじゃ使いにくいから、「多分こういうことだろう」と、普通の人が使いそうな設定をあらかじめ決めてある。


もしかしたら、あらかじめ決めておいた設定は、やりたかったこととは違うかもしれません。

決め打ちするのは危険なことなのね。でも、まったくおかしな動作をするよりはいい。


これが「デフォルト」の考え方。



最初はプログラマ同士のスラングとして、今では一般的なスラングとしても「デフォルト」という言葉をコンピューター外で使う場合があります。

特に指定されない場合は、大抵こうなるよ、という意味合いが原義。


ただ、コンピューター外、特に英語の会話では、元の意味の「デフォルト」も使われることを忘れないでね。


全体を守るために、本当は大切な事をあえて切り捨てる、という考え方は一緒。

残念ながら棄権する、とか、借金踏み倒して夜逃げする、とかそういうこと。単に「怠ける」という意味もあるけど。



どちらにしても、この意味合いに沿っていれば、言葉遣いとして間違っている、ということもないと思います。


言葉は生きているものですから、どんどん意味が転じても構わない。

元の意味をちゃんと理解していれば、その「使用場所」が広がってもおかしな意味にはならない。



ただ、今朝のFM横浜は酷かったのよ…


視聴者からのメールで生半可な知識仕入れて、「用例」をコントのように繰り広げるのだけど、「初期設定」とか「付属品」の意味で使おうとするから、意味の解らない珍妙な会話になるの。

聞いてて恥ずかしかった。



▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

関連ページ

ラリーウォールの誕生日(1954)【日記 13/09/27】

C言語で会話【日記 18/08/06】

久しぶりのperl【日記 19/11/20】

プログラム言語における「デフォルト動作」【日記 15/01/29】

別年同日の日記

05年 外構チラシ

09年 ジョウビタキ

10年 加湿器

16年 【追悼】マービン・ミンスキー

16年 AI囲碁

18年 テクニカルサポート

21年 微分積分いい気分


申し訳ありませんが、現在意見投稿をできない状態にしています

プログラム言語における「デフォルト動作」  2015-01-29 16:46:22  コンピュータ

▲目次へ ⇒この記事のURL

さっき、デフォルトの話書いたのだけど、話の腰を折りそうだったので、書いてから削除した一節がある。


そもそも、過去に書いてたよなー、って思ったら、書いてなかった

じゃぁ改めて書くか。


というわけで、自分が書きたいから書くというだけの、どうでもいい話。




perl には、「デフォルトの動作」がある。

プログラム上、特に書かなかった場合に、勝手に言語が「こうしたいのだろう」と察知して、善きに計らってくれるの。


たとえば、一部の命令では、操作の対象を明記しないと変数 $_ を対象とする。


これが、すごく便利。


というのも、perl の先祖の一つが sed だから。


sed は「ストリームエディタ」の名前の通り、入力に対していろんな処理を施して、出力する。

常に「処理中のデータ」が処理対象なので、変数と言う概念は無い。


で、perl はまともな言語なので、いくつものデータを同時に扱える。

正規表現による置換も、どのデータに対して置換を行うのか明記しなくてはならない。


でも、明記しない場合は $_ を対象とする。

これにより、まるで sed のように処理を書くことができる。




プログラムの話なので、概念だけ書くより実例を挙げよう。


perl の代表的なプログラムに、次のようなものがある。


while(<>){print;}


これは、引数として渡されたファイル名のファイルを開き、内容を行ごとに分割しながら読み込み、その読み込んだ行を標準出力に書きだすプログラムだ。


ちなみに、引数としてファイル名がわたされなかった場合には、標準入力から読み込みを行う。


というわけで、上のプログラムは Unix コマンドである cat と同じ動きをする。



何が省略されているか、もう少し省略しないで書きこんでみよう。


while($_=<>){print $_;}


なんだか <> って命令から $_ に受け取っている。

そして、print では、$_ を書きだしている。


さっき書いたけど、いくつかの命令は、省略されたときに $_ を対象とする。

<> も print も、省略に対して $_ を使っていた、というのがここまででわかってもらえると思う。


問題は <> だ。

ファイルから行単位で受け取る、と最初に説明したのだから、<> がファイルから行単位で読み込み、受け取っているのだ、ということはわかってもらえるだろうか。


foreach $N (@ARGV) {
  open(FILE,$N);
  while($_=<FILE>){
    print $_;
  }
  close(FILE);
}

実はこんな感じになっている。いきなりプログラムらしくなった。


@ARGV というのは、引数として渡されたファイル名のリスト。複数渡すこともできるので、foreach で1つづつ受け取る。

open はファイルアクセスのための準備。FILE にファイルハンドルが入る。


で、<FILE> とすると、ファイルから1行を読み込むわけだ。

うん、やっと全貌が見えてきた。


…でも、じつはこれでは「ファイルが無いときに標準入力から」にはならない。


<> と書いたときは、@ARGV の内容を1つづつオープンし、読み込んでくれる。

@ARGV が無いときは標準入力を使ってくれる。


さっきは、プログラムで同等機能を実現してみたけど、そういうプログラムが省略されていたわけではない。

<> が「善きに計らって」くれていただけだ。




さらに、こんなこともできる。


@_ = <>;


さっきは、while で1行づつ読み込んでいた。

でも、 @_ = <> とすると、while なしで一気にバッファに読み込んでしまう。


@_ がバッファだ。というか、perl では @ で始まるのは配列だ。

1行づつ分解して、配列の中に順次収められている。


代入相手がスカラー変数だと、1行しか読み込めないから、1行づつ処理する。

代入相手が配列変数だと、いくつも入れることができるから、まとめて処理する。


動作が変わるのだから、本来的には命令に対して「スイッチ」みたいな引数があって、そのスイッチで動作が変わる…というのが正しいだろう。

でも、perl は文脈からそれを判断する。人間が細かな設定をしないでも、言語自体が人間のやりたいことを察知してくれるのだ。


こういうのは、「文脈依存文法」といって、人工言語ではあまり美しくないことになっている。

なぜ美しくないかと言うと、文脈に依存するということは、解釈が曖昧になりやすいからだ。


でも、perl はあえて文脈に依存する。

その依存の仕方が、プログラマーが良くやる処理と見事に一致しているため、やりたいことが簡単に出来て気持ち良い、ということになる。



ちなみに、


print @_;


とすると、もちろん配列内容を一気に書きだしてくれる。

もっと言えば、print <>; でも cat になる。




while(<>){
  s/banana/apple/g;
  s/(subuta.*)pineapple(.*)/$1$2/g;
  print if(!/^$/);
}


構造がシンプルとはいえ、プログラムだから改造も出来る。

上のプログラムは、最初に書いた cat のプログラムに、いろいろと処理を追加したものだ。


s/●/▲/g;


というのは、●を▲に置き変える、という意味の sed の命令だ。

perl の命令じゃなくて sed の命令。でも、先に書いたように perl は sed のプログラムをそのまま埋め込めるように設計してある。


ちなみに、本当は


$_ =~ s/●/▲/g;


と書かなくてはならない、 =~ という演算子で、左辺にある変数内容を正規表現によって書き変えるの。


さて、先ほどのプログラムの場合、banana は apple に変わる。

そして、subuta の後ろにある pineapple は取り除かれる。


#ちなみに、僕は酢豚にパイナップルが入っているのは好きだ。


subuta pinebanana buta という文字列があると、「banana」部分が apple に変わり、pineapple になる。

そして pineapple は取り除かれ subuta buta となる。



最後の print の後ろに if が書いてある。

これ、実は「if の条件が満たされたときだけ print せよ」という書き方だ。


perl では、if の後ろは必ずブロックにしなくてはならない。

たった1命令をブロックに入れるのが馬鹿らしい場合、命令の後ろに if を書けばいいことになっている。



で、条件は、やっぱり sed 風の命令だ。 /~/ で、正規表現を書いてある。

ただ、さっきの命令と違って s/ で始まらないことに注意。


これ、「正規表現と一致する」ことを確認するだけで、変数内容を書き変えない。

もちろん、$_ =~ が隠れている。$_ 以外の変数に適用したいときは、ちゃんと書いてやればよい。


というわけで、プリントの条件は /^$/ でないこと。(! は否定の意味)

これは、正規表現で「行の始まり(^)の直後に行の終了($)が来る」ことを意味する。


つまり、空行だった場合は出力しない。




デフォルト動作の話ではないのだけど、perl のエラー処理の「イディオム」は面白い。


~ or die "error";


って書くのね。


これで ~ の部分で失敗したら、プログラムを強制終了する。(die はメッセージを表示して終了する命令。)

「~するか、さもなくば死ね!」って、わかりやすいと思う。


これは、C言語でも使う人いるね。

~ || error();


とか書くと、~部分が false の時だけ error() が実行される。


先に書いた print if ~ もそうだけど、英語として読み下せるようになっているセンスがなかなかだ。




さて、perl 講座ではないので、これくらいでやめにしておく。


perl のプログラムを書くときに、かなり大胆な省略が出来ることがわかってもらえればそれでいい。

少しの例示しかしなかったけど、perl ってこんなのばかり。



省略した時には、「デフォルトの」動作をやってくれる。

この「デフォルト」の決め方がすごく上手で、ちょっと処理したいな、なんて思ったときに、さくっとプログラムが書ける。


もちろん、省略して書いたプログラムは、やりたいことは十分に満たせるけど、性能が悪かったり、かゆいところに手が届いてなかったりするかもしれない。

そういうのは後で改良することになるけど、その際にはあえて細かく書くことで、デフォルト動作をどんどん減らし、自分で書き下すことになる。


究極的には、すべてを自分で設定できるので、「簡単に使えるけど、簡単な処理しかできない」というような言語でもない。




まぁ、この「省略可能」な点こそが、perl が嫌いな人にとっては許せない部分だったりもする。

省略されると、perl の動作に堪能な人しか意味がわからないのだよね。


なんでそのプログラムが動いているのか理解できない、という状態では、自分の目的に合わせて改造したい場合も改造できない。

スクリプト言語だからプログラムのソースもすぐ見られるのに、全く手を出せない、というのはもどかしい。



perl プログラマであっても、他人のプログラムは読みたくない、という人も多い。

いや、自分のプログラムですら、1か月も経ったら読めなくなるという人もいる。


perl はやりすぎかもしれない。

でも、perl 以前は、プログラムと言うのは「厳密に書くもの」で、省略が許される、なんてなかったように思う。


今の言語では、程度の大小はあれど、省略を許すことは結構ある。

先に書いた「デフォルトの言葉の意味」の記事の方に、Javascript や PHP は引数の省略を許す、と書いた。


ただそれだけでも、昔では考えられなかったような「いい加減な」書き方を許しているんだ。


こういう省略、perl がきっかけだったのではないかな、と思う。




僕は昔 perl で CGI 組んでお金頂いていたので、それなりに perl は出来るし、人が書いたプログラムでも問題なく読む。


ただ、今は perl で仕事になることはあまりないので、使ってない。

でも大好き。センスの良い言語。気持ちの上では今も perl 使いだ。


▲目次へ ⇒この記事のURL

同じテーマの日記(最近の一覧)

コンピュータ

関連ページ

ラリーウォールの誕生日(1954)【日記 13/09/27】

C言語で会話【日記 18/08/06】

久しぶりのperl【日記 19/11/20】

プログラム言語における「デフォルト動作」【日記 15/01/29】

別年同日の日記

05年 外構チラシ

09年 ジョウビタキ

10年 加湿器

16年 【追悼】マービン・ミンスキー

16年 AI囲碁

18年 テクニカルサポート

21年 微分積分いい気分


申し訳ありませんが、現在意見投稿をできない状態にしています


戻る
トップページへ

-- share --

29004

-- follow --




- Reverse Link -