初めて独学でプログラミングを始めたころ、参考書を開いても全く頭に入ってこなくて苦労した覚えがあります。その理由は、コンピュータやプログラムというものの仕組みを知らずに、いきなりプログラミング言語の構文を覚えようとしていたためでした。
そこで今回は、そもそもプログラムとは、プログラミング言語とはどんなものなのか、プログラミング学習自体が初めての方向けに成り立ちや考え方をご紹介したいと思います。
目次
1.1 プログラムとは
1.2 プログラミング言語とは
1.3 アルゴリズムとは
1.4 コンパイルとは
1.5 バグとは
1.6 ライブラリとは
2.1 命令はたったの5種類
2.2 アルゴリズムを考える(例:ソートのアルゴリズム)
2.3 流れ図を書く(例:JISフローチャートの書き方)
2.4 プログラムを組む(例:バブルソート)
1.プログラムとは?
1.1 プログラムとは
プログラムとは、コンピュータに実行させたい処理を記載した手順書のことです。コンピュータは常にこの手順書に沿って動いており、それ以外の動きをすることはできません。手順書に沿っていない動きをしたように見えるときは、その手順書=プログラムが間違っているのです。
1.2 プログラミング言語とは
プログラミング言語とは、プログラムを組む(プログラミングする)ために使用する言語のことです。決められた単語や構文が存在し、コンピュータに命令を伝えるための専用の言語です。
プログラミング言語には低水準言語(低級言語)と高水準言語(高級言語)があります。ここでいう低水準とは、劣っているという意味ではありません。より機械が理解しやすいものが低水準、より人間が理解しやすいものが高水準と分類されています。
<低水準言語(機械が理解しやすい)>
・機械語
・アセンブリ言語(アセンブラ)
<高水準言語(人間が理解しやすい)>
・C言語
・Java など。他言語すべて
基本的には、機械語とアセンブリ言語の2種類以外の言語は全て人間寄りの高水準言語になります。しかし近年人気のスクリプト言語等と比べるとかなり機械寄りであるC言語などのコンパイラ言語を、低水準言語と呼ぶ場合もあります。
1.3 アルゴリズムとは
アルゴリズムとはプログラミングにとってとても大事な存在であり、課題を解決するための「解法」です。
目的地への道順は一本ではないように、同じ問題を解決するためのアルゴリズムも複数存在します。出来るだけ早く到着したいのか、他の目的地にも対応できるようにしたい(汎用性を高くしたい)のか、途中の景色を楽しみたい(副産物がほしい)のかで、通る道順は大きく違ってくる可能性があります。
いろいろな道順を考えて、どの道順が最も要求を満たしているかを考えることが、アルゴリズムを考えることなのです。
1.4 コンパイルとは
コンパイル(Compile)をそのまま日本語訳すると「翻訳」ですが、プログラミング用語としてのコンパイルは「機械語に翻訳する」という意味を持っています。人間が理解しやすいプログラミング言語からコンピュータが理解しやすい機械語に翻訳し、コンピュータが理解して実行できる状態にすることが「コンパイル」と呼ばれています。さらにコンパイルしていつでもコンピュータが読める状態になったものが、拡張子「.exe」などの「実行ファイル」です。
なおコンパイルを行うための開発ツールのことを、「コンパイラ」と呼びます。プログラムの開発には、他にプログラミング言語を入力・編集するための「エディタ」や、プログラムの誤り=バグを発見するための「デバッガ」などの開発ツールを主に使用します。
この「エディタ」「コンパイラ」「デバッガ」を全て組み合わせたものを、「統合開発環境」と呼びます。かつて統合開発環境は、C言語のVisual Studioなどを代表としてパッケージで販売されており、数万円するものが主流でした。しかし現在はJavaの統合開発環境である「Eclipse」など、誰でも無料でダウンロードして使えるものが主流となっています。
このEclipseなどの統合開発環境には、コンパイルという名称の代わりに「ビルド」と名づけられた機能がある場合があります。この「ビルド」では、コンパイルを行った上で、さらにライブラリへの関連付けが行われています。
1.5 バグとは
バグとは英語の虫(bug)が語源で、IT界隈では主にプログラムの誤り(エラー)のことを指します。かつてプログラムは、長い紙テープにパンチで穴を開けて記録していました。一説ではこの紙テープに予定外に空いてしまった穴を虫食い穴に見立てて、バグと呼ぶようになったと言われています。(ただしこの説はコンピュータの登場より以前から機械の不具合をバグと呼んでいた例があるため、誤りではないかと言われています。)
余談ですが先日定年を迎えた元エンジニアの方に聞いた話によると、彼が20代だった頃はこの穴あきテープによる記録が主流で、テープの穴を機械に通さずそのまま読んでいたそうです。その時代に比べると今はプログラムを学ぶハードルがかなり下がっているようで、いい時代になったものだなあと思います。
1.6 ライブラリとは
ライブラリとは、あらかじめよく使う機能を共通プログラムとして準備しておき、誰でも呼び出して自由に使える部品のことです。その言語に最初から同梱されているものだけでなく、有志が作成した部品を読み込んで使用することもできます。一からプログラミングすると何行も必要な処理をたったの一行で呼び出すことが可能なので、ライブラリが充実しているほどすっきりとしてコンパクトなコードを書くことができます。
2.プログラムの仕組みとプログラミングの流れ
次にプログラムが動く仕組みと、プログラミングの流れについてご紹介したいと思います。
2.1 命令はたったの5種類
コンピュータは次のような、たったの5種類の装置で構成されています。
・入力装置
・演算装置
・制御装置
・記憶装置
・出力装置
このそれぞれの装置を動かすのが次の5つの「命令」です。
・入力せよ
・計算せよ
・処理の流れを制御せよ
・記憶せよ
・出力せよ
実はプログラミング言語とは、大きく分けるとこの5つの命令の組み合わせのみで構成されています。この5つの命令で構成された手順書に沿ってそれぞれ対応する装置が動くことで、コンピュータが動作するのです。
2.2 アルゴリズムを考える(例:ソートのアルゴリズム)
前項でも述べましたが、アルゴリズムとは簡単に言うと、課題を解決するための方法です。プログラミングを行うには、まず手始めに前項で登場した5つの命令をどのように組み合わせれば課題を解決できるのか考える(アルゴリズムを考える)必要があります。
アルゴリズムを学ぶ際によく例に挙げられるものとして、「ソーティングのアルゴリズム」があります。「ソーティング(ソート)」とは、「並べ替え」のことです。例えば、バラバラに並んだ数字を小さい順(昇順)に並べ替えるには、コンピュータにどのような命令をどのような順番で与えればいいでしょうか。
■バブルソートのアルゴリズム
並べ替えでもっとも単純なアルゴリズムは、順番に隣と比べて交換していく方法です。
バブルソートの処理方法は、次の通りです。
この方法は図のように隣り合う数字を比較して、「小さい方を左端に寄せていく」=「軽い方を上に浮かせていく」ことから、バブルソートと名づけられました。
なおプログラムの処理性能を評価する方法に、オーダ(O)という概念があります。計算量から処理時間を算出するという方法ですが、ソートする要素の数を「n」とすると、バブルソートの平均計算時間と最大計算時間は、次のように表すことが可能です。
平均計算時間:O(n²)
最大計算時間:O(n²)
バブルソートは総当たり戦のようなものなので、平均も最大も計算時間は常に同じです。
■クイックソートのアルゴリズム
現時点で最も早いと言われている、並べ替えのアルゴリズムです。
クイックソートの処理方法は、次の図の通りです。
このように「軸要素」を決定して、それより小さいか大きいかで分割していくのがクイックソートです。開発当時に存在した他のどのソートのアルゴリズムよりも処理速度が速かったことから、クイックソートと名づけられました。
なおクイックソートの平均計算時間と最大計算時間は、次のように表すことができます。
平均計算時間:O(nlog(n))
最大計算時間:O(n²)
クイックソートについては、軸要素にうまく中央値が選択できるかどうかで計算時間が大幅に変化してきます。そのため中央値の求め方は多数ありますが、主に次のような求め方があります。
・配列の真ん中の数字を、軸要素とする。
・左右どちらかの1番端と2番目を比べて、大きいほうを軸要素とする。
・左右の端と真ん中の数字の平均値を、軸要素とする。 (ほか多数)
■その他のソートのアルゴリズム
他にもソーティングのアルゴリズムは数多く考案されており、代表的なものには次のようなものがあります。
・選択ソート
・挿入ソート
・2分木ソート
・マージソート
・ヒープソート
・バケットソート
・シェルソート
興味のある方は、ぜひそれぞれのアルゴリズムについても調べてみて下さい。
2.3 流れ図を書く(例:JISフローチャートの書き方)
前項で考えたアルゴリズムを元に、プログラムの具体的な流れを図に起こします。これは「流れ図(フローチャート)」と呼ばれており、フローチャートに使用する図記号は、JIS規格に定められています。
■フローチャートに使用する図記号の例
■フローチャートの作成例
前項で挙げた「バブルソート」のプログラムをフローチャートにすると、次のように表すことができます。
- (参考:平成25年度秋期 応用情報技術者試験 午前試験 問9)
int BubbleSort(int x[ ], int n)
{
int i, j, temp;
for (i = 1; i < n-1; i++) {
for (j = n; j > i+1; j--) {
/* 1つ前の要素の方が大きいならば */
if (a[j - 1] > a[j]) {
/* 要素を交換する */
temp = a[j];
a[j] = a[j - 1];
a[j - 1]= temp;
}
}
}
}
3.独学におすすめの入門ツール
本項では、JIS規格そのものではありませんがアルゴリズムの考案やフローチャートの作成をゲーム感覚で楽しめる、おすすめの入門ツールをご紹介したいと思います。
■公式サイトURL:https://scratch.mit.edu/
ScratchとはMITメディアラボが開発した、教育用プログラミング環境です。フローチャートを書く感覚でプログラミングできる、ビジュアルプログラミング言語を採用しています。複雑な構文を覚えることなく論理的にプログラミングする感覚を練習することができるため、子供にだけでなくこれからプログラミングを始めたい大人にもおすすめです。
■公式サイトURL: https://home.jeita.or.jp/is/highschool/algo/
アルゴロジックとはJEITA(電子情報技術産業協会)が開発した、パズルゲーム感覚で楽しく学べるアルゴリズム学習環境です。ロボットを動かして赤い旗を全て回収することが目的ですが、いかにして効率よく動かすかを考えるところに醍醐味があります。繰り返し(Loop)や条件分岐(If)などの制御も登場しよりプログラミング風になっている、アルゴロジック2もリリースされています。
4.アルゴリズムはプログラムを支える屋台骨
アルゴリズムの項で例に挙げたソーティングのプログラムですが、今では自力で作成することはほとんどありません。なぜならばライブラリを呼び出す「たった一行」を書くだけで、最も効率的なソーティングを実現できる言語が多くなったためです。
特に大規模開発が主流となっている現在では可読性(他人が読んで修正できること)が最重要視されており、かつての家庭用ゲーム開発現場のように限られたハードウェア性能の中でいかにグラフィックやレスポンスに優れたゲームを作るかに心血を注いだ時代のような、オリジナリティあふれるコードを書く機会は少なくなりました。
しかし言い換えると、誰にでも書ける・読めるようなプログラムは、いずれAIでも書けるようになってしまうかもしれません。可読性の高いプログラムだけでなく性能の高いプログラムも状況に応じて書けるようなプログラマになるためにも、ぜひコンピュータの仕組みやアルゴリズムから考えてプログラミングする習慣を身に着けてみて下さいね。