オブジェクト指向言語で理解する可算名詞

最近、英語をプログラミング言語の一種と捉えてみたらどうなるだろう・・・とか暇つぶしがてら考えてたのですが、先日それについて高専の後輩に話してみたら凄く反応が良かったので、今回ブログに書いてみました。
タイトルはその名もオブジェクト指向で理解する可算名詞』です。英文書くときなんかに、単数なのか複数なのか、theがいるのかいらないのか、などと頭を抱えてしまうアレですね。それに対し本エントリは「英語がオブジェクト指向言語である」という妄想から斬り込んで考察しています。以下の説明が厳密に正しいのか、あるいはあらゆるケースに対応しているかどうかは分かりません。あくまで面白参考程度ということで^^。*1

はじめに

論文でも日記でも、英語でライティングするときに必ず頭を抱えるのが名詞の表現ではないでしょうか。例えば「私は犬が好きです」や「私は犬を飼っています」だったら、

  • I like { dog / a dog / the dog / dogs / the dogs }.
  • I have { dog / a dog / the dog / dogs / the dogs }.

とそれぞれ5パターンくらいは考えられます。結局毎回こんなことを悩み続けて挫折、というのはよくある話かもしれません。
このような可算名詞の単複・冠詞の概念は日本語にはないので戸惑うのは当然なのですが、実はこれらの違いはプログラミングの世界では普段から概ね区別されている考え方のように思います。特に、可算名詞の考え方はとてもオブジェクト指向に近いと感じています。ということは、オブジェクト指向を使いこなしているプログラマさんたちは、可算名詞を操るポテンシャルは十分に持っていることに!。うほっ!。
そんなわけで、上記の各例を(説明の都合の良い順番で)解説していきますっ。あ、ただし、ここでは「of 何々」や関係詞などが付かないケースを対象にしています。それらには必ずしも当てはまらないので注意してください。

a dog / new dog() 〜 オブジェクトの生成

もうキャプションに書いちゃってますが、「a 単数形」はオブジェクトの生成を意味しています。例えばインタプリタ(英文の読者)が「a dog」を見つけたら、インタプリタのメモリ領域(脳内)に「dogオブジェクト」を生成する、そんなルールで動いています。
さらにこのとき、必ずデフォルトコンストラクタが呼ばれるルールになっています。デフォルトコンストラクタの動作といえば、プロパティを一般的な値でもって初期化するのみですので、結果的に生成されるオブジェクトはいわゆる無個性なものになっています。それで情報として十分であれば問題ないのですが、不足している場合は、形容詞による修飾などによって、いわゆる個性をプロパティに代入していったりします。
あともう一つ、「a dog」には、メモリ上には生成はされてないけど他にも「a dog」が存在するかもよ、というのを暗に示していたりします。そのため「○○の一種」というニュアンスを暗にですが含んでいます。

dogs / class dog 〜 クラスそのもの

さてさてこの流れで来ると、「なるほどっ。ってことは、裸の複数形はオブジェクト配列を生成させる命令だなっ」と予想したそこのあなた。残念↓↓。間違いです。
実は英語では裸の複数形はクラスそのものを表します。オブジェクトは生成されず、いわゆるクラスの静的要素(staticなプロパティなど)について述べるようなニュアンスになります。静的要素はクラスの全オブジェクトが共有する要素とも捉えることができますので、結果的に「裸の複数形」はそのクラスのあらゆるオブジェクトを意味するとも言えます。・・・巷では「dog一般を表すにはdogsを用いる」などと説明されます。

some dogs / new dog[some] 〜 オブジェクト配列の生成

これは最初の例文にはなかったパターンですが、実は「some dogs」がオブジェクト配列の生成*2になります。「some」の部分は確保する配列のサイズや感情の入り具合を表わしており、他に「no/ten/few/a lot of/so many」などが例として考えられます。ちなみに「some」はサイズ不定を表し、「no」は完全なるゼロを表します。このあたりの説明については『ハートで感じる英文法』という本がオススメです。

the dog / *((dog*)p) 〜 ポインタによるオブジェクトへのアクセス

英語では、一度生成したオブジェクトに再度アクセスするときは必ず「the 単数形」を使わなければなりません。いわゆるポインタによるオブジェクトへのアクセスです。「the」以外にも「my/your/every/each」などもポインタとしての機能を持つ(決定詞と呼ぶ)のですが、参考資料を挙げるにとどめて説明は割愛します。m(_ _)m
英語でもポインタの指す先はただ一つである必要があり、かつそれがnull以外を指している必要があります。そのため、「a dog」を2回するなどしている状態で「the dog」としたり、「a dog」してないのに「the dog」と書いてしまうと、インタプリタがオブジェクトを一意に特定できず負荷が急激に上昇し、最悪、Incomprehensible Exception を吐いて終了します。インタプリタが「どっち?」と感じないように、例えば「the white/black/former/latter/first/second dog」のように形容詞・数詞などを付加して「○○なほうのthe dog」と表現することで、コーダーがアドレス特定をサポートする必要があります。あんまりおろそかだと Incomprehensible Exception が発生します。
・・・とまぁ、こんな風に言えたら教科書的に綺麗な展開なわけですが、ちゃんと厄介な例外があります。それはオブジェクト生成しなくともポインタアクセスできるオブジェクトが存在するのです(orz)。これらはインタプリタがオブジェクトを最初から常にグローバル領域に保持しているので、いきなりポインタアクセス可能なのです。例えば、「(私たちが住んでいる現実の)世界」を表すworldオブジェクトは、どのインタプリタも最初からメモリ上に保持しているので、「the world」でアクセスしてもエラーになりません。一方、「(僕だけが知ってる、人には言えない妄想の)世界」のような意味のworldオブジェクトはないので、ちゃんと「a world」で生成しないとほとんどのインタプリタは理解できません。・・・ちなみに巷では「“みなさんご存知の○○”っていう類のものには“the”を付ける」と説明されています。ただ欧米の文化的な背景にも左右されるので日本人としては覚えるしかないケースもあります。
とにかく、英語でポインタアクセスする場合は、「何のこと?」とか「どっち?」っていう疑問をインタプリタに感じさせないように善処しよう!ということですね。こっちだって初心者なわけですし、ある程度はインタプリタが良きに計らってくれると信じましょう。

the dogs / *((dog(*)[])p) 〜 ポインタによるオブジェクト配列へのアクセス

ここまでくればもうお分かりだと思います。「the 複数形」は生成したオブジェクト配列に再度アクセスするときに使うわけですね。これも「the 単数形」の場合と同じように、アドレスが一意に定まる必要がありますのでご注意を。
・・・あと、もうお分かりだとは思いますが、英語では変数と配列は厳密に区別されます。プログラミングではこちらの捉え方のほうが一般的だとは思いますが。

可算名詞のまとめ+α

そんなわけで、最初の例文の意味の違いをいくつか考えてみましょう。

  • I like dogs.(私は好きなんですよ〜、犬クラス一般がね。)
  • I like the dog.(私は好きなんですよ〜、例の犬オブジェクトがね。)
  • I like the dogs.(私は好きなんですよ〜、例の犬オブジェクトたちがね。)
  • I have a dog.(私は飼ってますよ〜、犬オブジェクトをね。)
  • I have the dog.(私は飼ってますよ〜、例の犬オブジェクトをね。)
  • I have the dogs.(私は飼ってますよ〜、例の犬オブジェクトたちをね。)

可算名詞の表現を考えるときは次のような表を想像するとスッキリするかもしれません。

dogsクラス 単数 複数*3
未出 a dog some dogs
既出 the dog the dogs

まず最初に、対象がクラスなのかオブジェクトなのか明確にして、オブジェクトなら生成済みかどうか、またそのオブジェクトを特定するに十分な情報を記述しているか、そういうことを考えるといいのではないかと思います。
・・・え?、結局「裸の単数形」はどういう意味かって??。う〜ん、可算名詞が裸で登場することは(たぶん)ありえないので、「裸の単数形」はおそらく不可算名詞として解釈されると思います。不可算名詞だと、例えば、素材・成分・思想などを表現することが一般的なので、「dog」なら「犬という成分→食材」と解釈されて、「I like dog」で「(食べ物として)犬が好き」となりそうな気がします。あまり踏み込んだとこまでは分からないのでネイティブに聞いてくださいw。

おわりに

とまぁ偉そうに長々書いておりますが、よく英語巧者の友人達が「ノンネイティブが名詞を正確に使い分けるのは至難の業」と仰っているので、せめて打率7割程度になれるくらいの説明ができないかなぁ〜と思いながら書いてみました。7割正しければ、インタプリタ(英文を読む人)がエラーを起こさず(理解不能に陥らず)に、それなりの低負荷で処理できる(スンナリ理解できる)と信じてます(笑)。遊び半分なので間違いもいくらかあると思いますが、ご容赦くださいませ。ブレークスルーのキッカケにでもなれば幸いです。^^
他にも「there is/are 構文」はオブジェクト生成専用の構文だよ、とかも言いたかったけどここでギブです。申し訳ないでございます。それはまた今度気が向いたらで。

参考資料

*1:タイトルにあるように、対象をオブジェクト指向プログラミング言語を把握している方々に限るので、全くもってニッチなエントリですが、そんなマイノリティなあなたのお役にたてれば幸いっ。

*2:本当は「集合」と呼ぶ方がより適切だと思ってるのですが、「配列」の方が馴染んでいるプログラマを多いと考えて、あえてそう表現してます。

*3:1以外(0や小数なども)は概ね複数形で表されるはずなので、ホントは「非単数」と呼びたい(><)。