a や the は日本人にはなじみにくい概念と言われてますけど、実はプログラミングで考えるとイメージしやすいんじゃないかと思うのです。
ただ、あくまでも例えなので厳密な対応付けをすると破綻してしまうし、特定の言語を持ち出すとその言語の実装や哲学がからんで話がややこしくなるので、雰囲気プログラミングでゆるふわに解説したいと思います。

その前にまず、「一つの場合はa、二つ以上は複数形」と覚えてる人、それ、いったん忘れましょう。

×「一冊の本を読んだ場合は i read a book
  二冊以上の本を読んだ場合は i read books」


....うーん、これはなんか微妙に違う!


■ 新規インスタンスを生成するのが a

プログラムでよくでてくる、「新規インスタンスを生成して、それを新規の変数に割り当てる」という作業。これが英語の a に一番近い感じがしています。

私は本を読んだ。
I read a book.

これをプログラミング言語的に表すならこんな感じ

// Bookクラスの新規インスタンスを作成
var book1 <- Book.new();    // この Book.new() の部分が "a" !
i.read( book1 );


新規インスタンスって、自分が新しい本を書くという意味じゃないですよ。
これからある本についての話題を扱うので、とりあえずプレースホルダとして Bookクラスのインスタンスを初期化しておき、それからそのインスタンスに、昨日読んだやつ、とか、短編小説、といったプロパティを肉付けしていく、その前準備」という、その役割をするのが a です。

ちなみに、なんの本かは重要じゃないんだけどとりあえず引数として必要だからインスタンス放り込んどくか的なイメージなら:

i.read( Book.new() );

の方が感じ出ますかね。

■ 定義済みのインスタンスを参照するのが the

で、そうやって定義したインスタンス/変数をあとから参照するための構文が the です。

その本はつまらなかったです。
the book was boring.

book1.is_boring <- true;    // さっき定義した book1 を参照するのが "the" !

多くのプログラミング言語では、変数の頭に何もつけないと既存変数の参照になるのに対して、英語の場合は頭に the がつくと既存変数の参照になる、というのが大きな違いですかね。

* ちなみに the は、this とか my など、指しているものを特定可能な別の形式に置き換わることもあります。人の名前なども、それ自体で参照インスタンスが自明なので、the なしで the がついているのと同じ振る舞いをしますね。

■ 特定のインスタンスではなく、クラス全体を指す場合は a も the もつけない。

さて、上の a/the はあくまでインスタンスに対して言及する構文でした。「私はー、ある映画(a movie)がすきでー、その映画(the movie)っていうのはー、○○ってタイトルでー、○○って人が監督しててー...」みたいな使い方。
それに対して、「どの映画がっていうより、映画そのものが好き」みたいにクラス自体を参照したいときは、 a も the もつけません。

私は音楽が好きです。
I love music.

def i_love(Music any_music) {
 return true;   // どんな音楽でも Music クラスでさえあれば全部好き!
}

ざっくりいうと
  • 「インスタンス生成の a 」
  • 「定義済みのインスタンス参照の the 」
  • 「クラス全体を指すときはどっちもつけない」

基本はそんだけです。簡単 !


せっかくなのでもうちょい補足。

■ the のスコープについて

上のように the は定義済みの変数を参照する構文なので、特にいままで本の話題など出ていないのに唐突に

自分はその本が好きでした。
I liked the book.

と発言すると、聞き手は the book が指している変数を参照しようとして
undefined variable: book
え、どの本?

エラーを返す聞き返すでしょう。

ただ、場合によっては

宇宙一素晴らしい本
the best book in the universe

のように、これまでの会話の中では定義されていなかったはずの変数がいきなり the で参照されることがあります。
これはプログラミング言語と同様、the にはブロックによるスコープがあるからです。

現在の会話ブロック内で定義された変数は、同じブロック内から the で参照可能です。
また、会話ブロックの外側には「会話してる人たち同士で共通の話題」ブロックがあり、そこで定義された変数 - さっき送ったURLだとか、さっき一緒にいったランチなど - も内側のブロックから参照可能です。
さらに、world, universe, 世界で一番○○ といった、この世に一つしかないことが分かっているものはグローバルで定義済みの場合があり、これらはどこからでも the で参照することができます。

BlogPaint

あと、例えば "the computer changed the world" と言った場合の "the computer" はコンピュータというクラス全般を表します。(a/theなしで) "computers changed the world" と言うのとだいたい同じ。
これも、「単体としてのコンピュータ全体」を表す "computer" がグローバル領域にあらかじめ用意されてると考えるのがいいのかなぁ...(と思うけどここ、例えがうまくいってるのかちょっとわかりません)

■ 複数形は上記三種類のどの場合にも出てくる!

さて、最初に「一つなら a、二つ以上は複数形」というのはちょっと違うよ、と言って、以降複数形の話は避けてきました。
というのは、複数形は上記三種類(インスタンス生成、既存インスタンス参照、クラス参照) のどの場合にも使われるからです。なので a とのセットに縛られていると、特定のニュアンスを逃してしまう気がします。

複数形の使い方1: インスタンス生成の a が複数化する場合:

私は本を買いました。その本は友達にあげるためのものです。
I bought a book.
the book is for my friend.

これは、Bookの新規インスタンスを生成したあと、「友達にあげる」という属性を追加する感じですね。

var book1 <- Book.new();
book1.will_be_given_to <- friend1;

ここで、もしたまたま買った本が一冊じゃなくて二冊だったら?

私は本を二冊買いました。それらの本は友達にあげるためのものです。
I bought two books.
the books are for my friend.

a book が two books に変わった以外、意味は同じです。Book インスタンスが二個同時に生成され、以降は the booksでまとめて参照できます。

複数形の使い方2: 可算名詞をクラス参照する場合:

しかし複数形はインスタンス生成だけじゃなくて、クラス全体を参照する用途でも使われます。先の

私は音楽が好きです。
I love music.

の場合、music は Music クラス全般を指しているので a/the がつきませんでした。また、music は uncountable (不可算名詞) なので music なのか musics なのか悩まなくてすみました
が、これが countable な名詞の場合、 I love vegetables のように複数形が使われるのです。

■ ここまでを整理すると...

a と the と複数形まとめ

countable 単数countable 複数uncountable
新規インスタンスを生成a をつける
I bought a book
数字などをつける&複数形
I bought two books
頭にcountable な単位をつける
he played a piece of music
定義済みのインスタンスを参照the をつける
the book was amazing
the をつける&複数形
the books were amazing
the をつける
the music was amazing
クラス全体を参照する何もつけない&複数形
I love reading books
なにもつけない
I love listening to music


もちろんこれで全てじゃないですよ。プログラミング言語とちがって人間の言葉は例外のオンパレードなので、こういう冠詞の用例の総まとめをみてるとまた混乱して発狂しそうになります。
が、とりあえず頭を整理する足がかりとしては、いい線いってるのではと思いました。