概要
ソフトウェア・プログラミングの分野では、ハードウェアに近いことを低級(low level)、人の直感に近いことを高級(high level)と呼びます。本稿では、低級な概念から高級な概念まで、全てを俯瞰的に説明していきます。
本稿の意図
近年、いわゆるIT(Information Technology: 情報技術)の存在はますます重要になっています。パソコンのような分かりやすいものはもちろん、家電や交通システムのような生活に密着したさまざまなものがIT化されています。
この数十年間、ITシステムの需要が高まり、要求が高度化するとともに、その実現手法も劇的に進歩してきました。かつては要求に応じた専用のハードウェアを作っていました。次に、ソフトウェアで制御できる汎用コンピューターというものが生まれ、近年では、ITシステム開発全体に占めるソフトウェア開発の比率が(費用面・時間面ともに)どんどん高まっています。ソフトウェア開発の範疇内に置いても、その開発手法は日を追うごとに進歩を続けています。
ここで、1つ課題があります。この歴史あるITシステム開発を、今から新たに学ぼうという人、もしくは彼らを教育する人はどうすべきなのでしょうか。ITシステムに求められる要求が高度化してしまっている今、歴史を1から追いかける余裕はありません。実用に足るものを作りながら覚える(作らせながら教育する)ためには、最初から近代的な開発手法を用いるべきでしょう。例えば、ソフトウェアを開発するためのプログラミング言語に関しても、JavaやC#などの近代的で高級なプログラミング言語から覚える(教える)というやり方が増えてきています。
このやり方によって、昔なら並大抵の労力ではできなかったような高度なことに、一足とびに触れながら学ぶことができます。その一方で、飛ばしてしまった低級な部分の知識が不要かというと、少なくとも教養としては必要なものでしょう。著者の経験から考えると、JavaやC#のような高級なプログラミング言語を用いる場合でも、低級な部分に関する知識を持つ方が高品質なソフトウェアを作れます。
逆に、開発手法が進歩してきた結果である高級な概念を受け入れず、低級な概念のままで非生産的な開発を続けている人もいます。中には、高級なプログラミング言語を「軟弱だ」「ゆとりだ」と非難する人までいます。
「低級」「高級」という言葉は単にハードウェアに近いか、人の直感に近いかの違いであって、優劣を表すものではありません。どちらの知識も、欠けてよいものではないでしょう。
そこで、本書では、低級な概念から高級な概念まで、俯瞰的に説明していきます。本書の内容ほど広範囲な知識は、全てを直接必要とすることはほとんどないと思いますが、教養として俯瞰的な知識を身に着けることは、間接的に実務の手助けとなるでしょう。
本稿の内容
このサイト内での記事をきっかけとして書いた自著「コンピュータープログラミング入門以前」の内容を、 少しずつこちらに反映させていこうかと思っています。
本書の後半はC#をベースにした高級言語の話なので、「C# によるプログラミング入門」の方に反映させる予定です。 「コンピュータの基礎知識」以下では、主に、OS レベルより下の低級な概念を説明していきます。 これらを合わせて、低級な(ハードウェアに近い)概念から始めて、歴史を追うように徐々に高級な(人の直感に近い)概念を説明していきます。
まず、ハードウェア寄りの内容として、次のようなものがあります。
-
今主流となっているコンピューターは、突き詰めていくと半導体を使った電子回路です。 これに対して、半導体の物理的性質に関する知識がなくても電子回路設計ができるように、「ゲート」という概念を導入します。
-
0と1だけのコンピューターの世界に入る前に、10進数や2進数など、数字の表し方についておさらいしておきます。
-
論理演算という数学的理論を使って、ゲートの組み合わせを数式で表すことで回路設計する方法を紹介します。
-
記憶素子というものを導入し、さらに複雑な回路設計を行う手法を説明します。
ソフトウェア寄りのものでも、「コンピュータの基礎知識」以下に反映させる予定の内容として、次のようなものがあります。
-
ソフトウェアを実行するための回路、すなわち、汎用コンピューターの作り方と動かし方について説明します。 この段階では、ソフトウェアといっても、ハードウェアの構成を強く意識する必要のある機械語というレベルになります
-
ハードウェアを「どう動かすか」ではなく、人が「何をしたいか」を直接記述できるようにするための仕組みとして、オペレーティング・システムと高級言語について説明します。
そして、「C# によるプログラミング入門」の方に反映させる予定(というよりも、元々これを元にした内容。元記事に反映して、元記事を洗練)の内容として、次のようなものがあります。
-
高級言語の最も基礎的な概念である変数モデル。
-
構造化という考え方。
-
オブジェクト指向という考え方。
-
現代的なソフトウェア開発に必要となるいくつかの高級な概念。
書籍的には、歴史を追って低層から順に記述していましたが、必ずしもこの順序通りに学ぶべきというわけではありません。 まずは実務で使うレベルにあたる場所から覚えて、余裕ができた時に他のレベルを見てみるのもいいでしょう。