<更新記録>
2007年 11月 1日
作成

姉妹サイト検索 Web検索


言語学習

導入

一般人からして、プログラミングをするためにしなければいけないことといえば、 プログラミング言語を覚えることだと思います。 例えばC言語を覚える、Javaを覚える、Perlを覚える、Basicを覚えると言ったとき、 覚えるとは、プログラム言語の言語仕様を覚えるということを指すと思います。 しかし、言語を覚えただけでは、よいプログラムをつくることはできません。 プログラム言語を覚えることに何も悪いことはありませんが、 ここでは言語学習の際の注意点や助言などをしたいと思います。

覚えることと使いこなすこと

プログラム言語を覚えることと、プログラム言語を使いこなすことが異なるのは、なんとなくわかるとは思います。 では、実際に、どのような点で、両者は異なるのでしょうか。

まず、言語を覚えるとは、言語について覚えることですね。 例えば、C言語でいえば、数値型の定義は

int i = 5;

と書くというような、本当の仕様のことです。 たいがいの学習では、

  • 標準出力への出力
  • 変数の扱い方
  • 条件分岐

といった手順で学習を進めていくことと思います。 オブジェクト指向言語であれば、それに加えてクラスのつくりかたなどの説明も加わります。

それに対して、言語を使いこなすことは、言語を覚えることに加えて、 以下のことを意識しながら言語を記述することを言います。

  • プログラム・ソースの可読性を意識する
  • メモリ効率を考える
  • 実行速度を考える
  • プログラムに修正が入る際のインパクトが少なくなるようにする

これらは一朝一夕で身につくことではありません。 実際にこれらを身につけるには、長い時間をプログラミングに費やさなくてはなりませんが、 近道はあります。

言語を使いこなす近道は、ただやみくもに自分でいろいろと考えてプログラミングをするだけではなくて、 自分以外が記述したプログラムのソースや、書籍などに載っているプログラムのソースをたくさん読むことです。 そこにはたくさんの、自分が思いもしなかった表現が載っています。 つまり、ある事を実現するために、複数の手段があることを知るということが大切なわけです。

例えば簡単な例として、C、C++、Java、Perlでのソースを挙げてみます。 以下はいずれも、2から100までの偶数を画面に表示するプログラムです。

C
int i;

i = 1;
while (i < 101) {
	if (i % 2 == 0) {
		fprintf("%d\n", i);
	}
	i = i + 1;
}
C++
int i;

i = 1;
while (i < 101) {
	if (i % 2 == 0) {
		cout << i << endl;
	}
	i = i + 1;
}
Java
int i;

i = 1;
while (i < 101) {
	if (i % 2 == 0) {
		System.out.println(i + "\n");
	}
	i = i + 1;
}
Perl
$i = 1;
while ($i < 101) {
	if ($i % 2 == 0) {
		print $i + "\n";
	}
	$i = $i + 1;
}

どうでしょうか。 以下に、書き方を少し変えたプログラムを載せます。

C
int i;

for (i = 2 ; i <= 100 ; i+=2) {
	fprintf("%d\n", i);
}
C++
for (int i = 2 ; i <= 100 ; i+=2) {
	cout << i << endl;
}
Java
for (int i = 2 ; i <= 100 ; i+=2) {
	System.out.println(i + "\n");
}
Perl
for ($i = 2 ; $i <= 100 ; $i += 2) {
	print $i + "\n";
}

先に載せたプログラムと後に載せたプログラム、どちらのほうが読みやすいでしょうか。 前者では、無駄に行数が長く、やっている内容も読み取りにくいばかりか、 100回ループしているので、実行速度もその分遅くなります。

それに対して後者は、短いソースで納まっており、50回しかループもしないので、 その分実行速度も前者に比べると早いです。 ここでは例としてなので、短いソースを載せましたが、 実際にプログラムを開発している場合には、もっと長いソースで、ごちゃごちゃしてきますので、 ソースの可読性の重要性も高まってきます。

今回は本当に簡単な例しか示しませんでしたが、プログラムのあらゆる場面で、 同じことを実現しようとしても、いろいろな実現方法がある 場面に遭遇すると思います。 将棋や碁でいえば、勝つために手を打つのですが、その途中の局面が、毎回異なることと似ています。

自分で考えることも重要ですが、自分で考えるだけでは、アイディアに限界があるので、他人のよい考えは、 おおいに吸収するべきですし、 すでに誰かが思いついたプログラムの表現方法をまた自分で一から考え直すのは、時間の無駄です。 (車輪の再発明:すでに車輪という発明がなされているのに、その事を知らないで、再び車輪を発明すること。 つまり意味がない。) 将棋も碁も、よい対局の棋譜などを研究したりして勉強しますが、プログラミングにおける勉強にも、 似たものがありますね。

結論

ここでは、あまり深く話しを掘り下げることはしません。 なぜならば、言語を使いこなすには、プログラミング言語ごとの熟練度が必要になってくるので、 言語依存の具体的な話を展開していかなければ説明しきれないからです。 (Java言語については、言語を使いこなすための説明を熟練Javaのコーナーに設けていますので、 そちらを参照して下さい。)
このページでお伝えしたいことは、 言語を覚えることと、使いこなすことは別であって、 例え言語を知っているからといって、その言語を使いこなせているわけではない。 言語を知らない人と知っている人では、あるプログラムを記述できるかできないかの違いがあるが、 言語を知っているだけの人と言語を使いこなせている人とでは、プログラミング能力に、 最大で10倍もの差があると言われている ということです。
(ここでいうプログラミング能力とは、プログラムを組むスピードであったり、 実際に完成したプログラムの性能や拡張性に優れているかなどのことです。)

これからあなたがプログラマとしてさらに成長しようとしているのであれば、 言語習得だけではなく、使いこなせるように努力するよう心がけてください。


Powered by VeryEasyCMS