Hatena::ブログ(Diary)

プログラミング言語を作る日記

2012-01-19 Cの宣言は英語順で読もう、という話

[]Cの宣言は英語順で読もう、という話

Cでのポインタの読み方

上記のページ、現時点ではてなブックマークが1241ついています。同趣旨のことを私は1998年に以下のページに書きました。

配列とポインタの完全制覇

こちらのはてブ数は212…… きいいっ! 悔しい!!

などという話はさておき。

上記ページに関連してだと思うのですが、Twitterで@kinabaさんが以下のようにつぶやかれておりました。


『という方針のCの入門記事』ということであれば、WebではないのでURLは貼れませんが、たとえば柴田望洋先生の「秘伝 C言語問答 ポインタ編」*1には以下の記述があります(p.22)。

ここで、下のように考えると、int x;の部分が*ptrに相当すると考えられますね。

int   x  ;
int *ptr ;

――*ptrはint型変数であると言っているように解釈できますね。

で、実のところこれを意識した上で、私は「C言語 ポインタ完全制覇」にこう書きました(p.38)。

別の考え方として、

  int *hoge_p;

という宣言について、hoge_pがhogeを指しているとき、*hoge_pはhogeと同じように使えますから、

ほらほらhoge_pに*を付けると、int型の変数hogeと同じように使えるんだよね。この宣言はつまり、hoge_pに*を付けたものがint型だという意味なんだよ

という説明をする人もいます。

この考え方は、確かにそれなりに通用するのですが(たとえば配列でも同じようにいえる)、では、

  int *&hoge;

と書くと、int型の変数としてhogeが宣言できるのでしょうか?*2――やってみるとわかりますが、これはシンタックスエラーです。

それに、この考え方は、宣言の中にconstが割り込んでくると破綻しますし(式の中じゃconstは書けない)、関数へのポインタの宣言でも問題が発生します。

関数へのポインタの宣言でも問題が発生します』について補足します。上記のような説明は、『使う時の構文と宣言の構文が似るようにという方針で設計されてる』という前提に従うわけですから、たとえばint *a;という宣言があったとき、これを『使う時』に*aと書くとint型になるよね、ということを前提としています。では関数へのポインタのときにはどうか。int (*func)(void);という宣言があったとき、これを『使う時』、みなさん(*func)()のように書くかというと*3、たいていfunc()と書くのではないでしょうか。少なくともこのケースでは、「使う時」の書き方と宣言がずれています。

実のところ関数へのポインタを持ち出すまでもなく、int *a;と宣言した変数を使うときにはa[i]と書くことなどは普通にあるのですから、『使う時の構文と宣言の構文が似るようにという方針』がさして役に立つとは思えません。『使う時』というのは式の中で使うということでしょうが、その式の中では配列ポインタに読み替えられるとか、関数関数へのポインタに読み替えられるとか、関数定義の仮引数の宣言においてのみ最外周の[]ポインタを意味するとか、謎の規則がいっぱいある以上、結局、"a ptr to func returning ptr to func returning char"のような『コンパイラの内部表現っぽい表示』を経由しない限り、理解には至らないと私は思います。

最初に紹介したページのブクマコメントには、『実際にこんなコード書かれたらキレタ方ががいいと思う』とか『おとなしく typedef 使おうず』といったコメントがつきました。確かにsignal()みたいな関数はちょっと特殊な例かと思いますし、適切にtypedefを使ったり構造体をかませたりするほうがよいのは確かです。ただし、typedefは結局『コンパイラの内部表現っぽい表示』の一部に名前を付けてコピペする機能でしかないわけで、まずは宣言をきちんと読めていないと結局使いこなせないのではないでしょうか*4

さて。最後は宣伝しますよ。

「Cの宣言は英語で読め」とか、「配列は式の中ではポインタに読み変えられる」とか、「添字演算子[]は配列とは無関係だ」とか、「Cには多次元配列は存在しない」とか、役に立つ記述でいっぱいですよ!!

10年前の本ですが、今回「Cでのポインタの読み方」というページがホットエントリに上がってきたということは、たぶんまだこういう本の需要はあるのでしょう。そして上記ページとかこういう本とかに需要があるということ自体が、「結局のところコンパイラの内部表現っぽいレベルまで理解しないとCを使いこなせない」ということを意味しているのだと思います*5

*1:この本は何度も改版されています。「秘伝C言語問答 ポインタ編 第2版」→「図解C言語 ポインタの極意」→「詳解 C言語 ポインタ完全攻略」でいいのかな。ただし、私が持っているのは「新版 秘伝 C言語問答 ポインタ編」のみです。

*2:実はCを学び始めた頃、試したことがあります。私。

*3:書けますし動きますが

*4:そしてtypedefは構文上「記憶クラス指定子」なので、typedef自体を理解するのもたぶん結構難しい

*5:「ポインタ完全制覇」では、Cの型について連結リストの図で説明しています。まさにコンパイラの内部表現ですが、それが必要だと私は判断しました。

2011-08-08 祝! はてなブックマーク改悪状態からおおむね復帰

[]祝! はてなブックマーク改悪状態からおおむね復帰

3ヶ月放置したら広告が出るんだったっけ、と思ってたら本当に出たので間に合わせの記事ですが。

はてなブックマークの各エントリのページに「人気」「新着」のタブがつき、「新着」を選べば、コメントつきのブクマの全件を一覧表示できるようになりました。かつ、一度「新着」を選べばブラウザが覚えていてくれるので、これならほぼ以前のはてブと同様の感覚で使うことができます。

最初、「新着」タブで表示されているのが「コメントつきのブクマ全件」であることに気付かずに、「まあ改悪かよ!」と思ったのですが、これなら許容範囲です。

正直、本当は元に戻してほしかったですが、一応喜んでおきます。

2011-05-08 「はてブ元に戻して」運動実施中です。

[]「はてブ元に戻して」運動実施中です。

ご存知の通り、4/5にはてなブックマークが改悪されました。

はてなブックマークのエントリーページを改良しました - はてなブックマーク日記 - 機能変更、お知らせなど

上のページのはてブ。

はてなブックマーク - はてなブックマークのエントリーページを改良しました - はてなブックマーク日記 - 機能変更、お知らせなど

この変更により、ブックマークの一覧性が失われてしまいました。現状、私はブクマのページを表示するたびに毎回一番下までスクロールし、「すべてのブックマークを見る」をクリックしている、という有様です。面倒です。

この変更には、「早期に☆がついたブクマコメントしか読まれなくなる」という弊害もあります。この仕様だと「平日の昼間っからネットをうろうろしてせっせとブクマコメントを書いている人たち」が有利になるわけで、「ネット上で声の大きい人」の声をさらに大きくするだけでしょう。

というわけで、いまさらではありますが、私は最近はブックマークするたびに「はてブ元に戻して」というタグをつけています。

はてなブックマーク - kmaebashiのブックマーク

よろしければ皆様もご一緒に。

2011-04-10 寄付で売名もできないこんな世の中じゃ

[]寄付で売名もできないこんな世の中じゃ

id:Dr-Seton さんのところのエントリに便乗し、日本赤十字に義援金を送ってきました。

皆様にお願い - シートン俗物記

f:id:kmaebashi:20110410065021j:image

私が確認した時点で1355ブクマだったので、それ×100円分。今はなぜかひとつ減って1354ブクマになっていますが。最初の24時間くらいはブクマ数がむくむく伸びていて、それはドキドキしましたとも。最終的な金額は、まあ「ただちに生活に影響がでるものではない」金額ですのでご心配なく。

それにしても、今回のシートンさんのところのブックマークコメントでもそうですが、この手の話になるとやれブクマ稼ぎだの黙ってやれだのの声が出てきて閉口します。というより私がこれに便乗して募金する気になったのは、id:temtanさんの以下のコメントが原因です。

temtan (´Д`)y-~ いいからとっとと自分が出来る募金をしろよ。それとも自分の自己顕示欲を満たさないと禄に募金もできねーのか?ありえないとか言ってる癖に大怪我を防ぐ予防線張ってるのも見事に糞 2011/03/31

「見事に糞」とまで言いますか。

メタブクマではこれ。

はてなブックマーク - はてなブックマーク - 皆様にお願い - シートン俗物記

temtan (´Д`)y-~ わかった、「募金を利用して自分の自己顕示欲を満たしたいけど出した金額に見合った満足度じゃないと嫌だし、自分が許容できない金額も出したく無い」って見えるからむかつくんだ.

自己顕示欲だろうが売名だろうがそれで被災者の方が助かるのならよいのでは、と思いますし、そもそも私には自己顕示欲を満たそうとしたり売名したりブクマ稼ぎしたりすることの何が悪いのかがわかりません*1。それなりの金額を募金するのなら、金額を含め、公開でやったほうが「あの人があんなに募金したのか。じゃあ私も募金しよう」的な効果が期待できるはずです。もちろんそれの度が過ぎて、「募金しない奴は非国民」みたいな同調圧力が高まってしまったら息苦しいですが、現状、募金しているほうが『見事に糞』と罵られている状態です。これはいくらなんでもおかしい。

実のところ私は、被災者支援などということは本来税金で行うべきことで、義援金のようなものをあまり当てにするようになってしまったら困ると思います。それもあって、あまり募金を人に勧めようとは思わないのですが、募金する方を非難するのはさらにどうかしている。それが宣伝や売名と紐付いていたとしても、それによるマイナス面は何もない。

というわけで私も宣伝するよ!

ネタがネタだけに興味を持つ人は限られるのかもしれませんが、型なし言語、静的型付け言語それぞれについて実際に言語を作りながら解説していますから(ソースはWebからダウンロードできます)、言語作りに興味のある方は一読されても損はないと思います。正直、そんなに売れてないので私としては是非売れてほしい本です…… よろしくお願いいたします。

その他、現在ふつうに入手可能な既刊本が以下。

こっちは現在amazonに在庫なし?

追記:今回件のエントリーをブクマされた方に言いたいのですが、ブクマしたことで100円募金した気にはならないでくださいね。だって募金してないし。

追記2:今回の件でシートンさんを批判したのはtemtanさんだけじゃないですが、一番言葉が汚いと思ったので代表として選択しても問題ないと判断。

*1ブクマ稼ぎについては、spamになってしまえば問題ですが、今回のケースではそれに当たらないでしょう。

2011-03-02 「カレー無料法」は思考実験にも何にもなってない

[]「カレー無料法」は思考実験にも何にもなってない

mojixさんの記事:

もしも「カレー無料法」ができたら - モジログ

いやさ、mojixさんはどうせいつもこんな感じなのだけども、賞賛しているブクマコメントが多いのに引いた。

はてなブックマーク - もしも「カレー無料法」ができたら - モジログ

これを「思考実験」と言うのなら、ある状況を仮定したとき次にどのような状態になるのかを論理的に説明できなければいけないでしょう。この例では、

『「お金のない人にも、せめてカレーくらい食べさせてあげよう」という趣旨のもと「カレー無料法」が制定され、政府が一食500円の補助金を出して飲食店にカレーを無料で提供させる』

という状況を仮定しています(その前の、補助金なしでカレーを無償提供させる例はあまりにも非現実的なので割愛)。

もし本当にこんな状況になったら何が起きるか。mojixさんの言うように、みんなカレーばかり食べるようになって他の飲食店が壊滅するのか。

んなわきゃない。当たり前だが、500円の補助金で無料で提供できるカレーには、500円以上の価値はない。店が架空請求でもしない限り、500円の補助金をもらうためには、材料費と人件費をかけてカレーを作り、広告し、店舗を構えて、カレーをお客さんに実際に食べてもらわなければならない。よって、売値で500円以下のカレーでなければ商売にならない。「(売値500円以下の)カレーならただで食えるとしても、金払ってもいいから他のものを食べたいと考える人」は別の店を選ぶはずだ。市場原理ってそういうもんだろう。

牛丼屋のように、もともと単価の安い店とは競合するかもしれない。しかし毎日カレーじゃ誰だって飽きるし、タダのカレーを提供する店はホームレスさんとかが主な客層になりそうだから*1、ある程度お金のある人はそういう店は避けるだろう。ホームレス向けの炊き出しは、別に「ホームレスであることの証明」を求めたりはしないから、たとえば私が列に並んだって何か食べ物をもらえるんだろう。だからって私は並ぼうとは思わない。そういう話。

ところで、上記仮定では「補助金が500円であること」が前提になっている。これは、もともとの想定が、「お金のない人にも、せめてカレーくらい食べさせてあげよう」という趣旨の法律だから、まさか補助金を3000円にするわけにはいかなかった、ということだろう。いやさもちろん実際には500円でも世論の支持は得られるわけがないんだけどそれはさておき。もしこれが、「カレー大好きな王様が、何が何でも国民にカレーを広めようと、カレーに限り1食あたり3000円の補助金を出した」ということだと話が変わってくる。補助金が3000円出るんなら、本来1000円のカレーを出しても2000円余計に儲かる。カレーばかりじゃ客も飽きると思うけど、「本来1000円の価値のランチの端っこにカレー粉をかけてカレーだと言い張る」という手も使えるかもしれない。こういう状況なら、確かにmojixさんの危惧する状況が起きるかもしれない。

でも、そんな状況、ありえないでしょ。

mojixさんがこのたとえ話において「お金のない人にも、せめてカレーくらい食べさせてあげよう」というカレー無料法の趣旨、および500円という補助金の金額を設定したのは、「これぐらいの設定ならまあ無理がないだろう」という想定があったわけでしょう(もちろん実際には1食500円の補助は世論の支持は得られるわけがないんだけどまあ3000円よりはマシだ)。しかし、この設定の上では、mojixさんの「思考実験」におけるその後の展開には無理がありすぎる。

わかってやってるのなら読者をだます行為ですし(だまされる方がひどい、というレベルですが)、本人もこれを信じちゃってるのだとしたら――ちょっともう救いようがないとしか言いようがない。

参考:

「カレー無料法」の馬鹿馬鹿しさは比喩の馬鹿馬鹿しさだ - 紙屋研究所

*1:「お金のない人にも、せめてカレーくらい食べさせてあげよう」という趣旨の法律なのだから、身なりが汚いからって入店を拒否することはできないはずだ。