プログラミング言語の違いってなんですか?
はじめに
今日は来年度の4月から入社の新人さんの懇親会にお招きされたので参加してきました。その席で訊かれた質問が今回のタイトルにも書いたものなのですが、
「プログラミング言語の違いってなんですか?」
というものでした。
質問してきた人は全くのプログラミング初心者*1で、普段からプログラミングをしている人にとっては疑問に思うことすらないような質問なのではないでしょうか。簡単に答えられそうですが実は本質を付いている、そんな気がしました。
入力・処理・出力
プログラミングは言語の違いはあれど最終的に行っていることは本質的に同じで、要するに
- 入力
- 処理
- 出力
のこの3つしかありません。今後どんなにシステムが複雑になろうとも、この3つ以外のものは出てこないでしょう。
入力や出力はファイルだったりDBだったり、WEBページ(HTML)にだったりと様々あります。
そして処理に関しては基本的にコンピュータの出来ることは「計算すること」だけなので、「どう計算させるか」という部分について、「どう書くか」という点がプログラミング言語の違いとして現れてきます。
プログラミングパラダイム
といった、色々なパラダイムがこれまで登場してきたわけですが、コンピュータはチューリング完全という意味において、プログラミング言語においてできることはその当時から何も変わっていないというのが結論となります。
でも、機械語*3で書くよりもアセンブラ、アセンブラで書くよりも構造化プログラミング、構造化よりもオブジェクト指向、オブジェクト指向よりも関数型*4と言ったようにパラダイムシフトが進んできたのは、「如何に人間が理解しやすいか」という点を突き詰めて行った結果であると言えます。*5
変わるもの・変わらないもの
プログラミング言語の違いは文法とか書き方の違いだけなので、プログラミング言語を学びながらそこに記述されたプログラミング言語は一体「何をどうしたいのか」の本質を読み解けるようにしましょう。
一つのプログラミング言語を覚えただけで満足するのではなく、例えば同じ処理を2つの言語で書いてみてその違いを見ます。そうすると「変わらないもの」と変わるものが見つかる。その変わるもの」がいわゆる言語の違いということになります。
言語の違いは新しい言語に触れる度に出会うことになるでしょうから、その都度違いを覚えていけば習得できるし恐れることは何もありません。むしろその違いを味わいとして感じられるようになっていければみつけものです。
そして「変わらないもの」というのが「アルゴリズム」と言われる部分となります。もうちょっと平たく言えば「問題を解くための考え方」とでも言えるでしょうか。アルゴリズムは言語に依存せず普遍なので一度身に付けてしまえばずっと使えます。今後登場してくる色々な言語でもそのアルゴリズムは適用可能なのです。
ただし、オブジェクト指向でよく使われるアルゴリズム(これをデザインパターンと名付けた)はオブジェクト指向用の考え方であってこれをそのまま関数型に置き換えることが難しかったり、そもそも関数型ではデザインパターンを利用せずとも、それ相当のことが普通に出来てしまったりといった違いはあります。
「解きたいこと」は変わらなくても「解き方」は変わるということですね。
おわりに
色々な想いを巡らせながら懇親会の席で話をしていたのですが、結論としてはプログラミングの世界には「変わるもの」と「変わらないもの」が混在している。そのことを念頭に置いて日々プログラミングに接するのと、何も考えずにただ闇雲にプログラミングするのとでは、相当な違いが将来生じてくると私は考えています。