私たちの身近にはすでに多くのコンピュータが存在し、生活とは切り離せないものとなっている。かつてコンピュータといえば、パソコンをイメージする人が多かった。だが現在、あらゆる家電にコンピュータ技術が応用され、その存在はほとんど意識されなくなっている。コンピュータの存在感が希薄になっていくのと反比例するように、私たちの生活はコンピュータに依存したものへ変わってきているのだ。
いま家電量販店で売られている多くの家電製品は、コンピュータを内蔵している。そのコンピュータの頭脳に当たる部分がCPU(中央制御装置)だ。このCPUとソフトウェア、そして各種のデータを保存するメモリによって、家電のなかのコンピュータシステムは成り立っている。
たとえば炊飯器の場合、炊飯コースの設定にしたがって、コンピュータが蒸気発生器や炊飯釜ヒーターを制御する。またCPUが常に温度センサーなどの情報をモニタリングすることで、最適な炊飯がおこなわれる。そして各種の設定情報やリアルタイムのセンサー情報は、メモリに保存されて管理されるという仕組みだ。
プログラムとは人間が書いたコンピュータへの命令の集まりだ。これをコンピュータに理解できる言葉に翻訳したものがソフトウェアである。
プログラムとソフトウェアは、「私たちがコンピュータを使って実現したいこと」を具現化したものだ。プログラムはコンピュータを動かす処理の手順である「アルゴリズム」をもとに、プログラミング言語と呼ばれる一連の命令で記述されている。これを前提にして、実際にコンピュータを動かすソフトウェアができあがる。
プログラムそれ自体は、独立した命令文を集めたものだ。だが最終的な目的を達成するには、あらゆる命令を正しく組み合わせ、意図した行動が達成される仕組みが必要となる。重要なのはプログラムそのものよりも、その前提となるアルゴリズムということができるだろう。
プログラミングをするには、コンピュータを使ってなにをどうするのか考える「プログラム設計」という作業が必要になる。使用するプログラム言語やOSなどの条件をもとに、適切なアルゴリズムやデータベースの構造を決定し、プログラムを細部まで決める。その後コンピュータを使って実際にソースコードを入力し、変換ソフトウェアを使って、コンピュータが理解できる言語に置き換えていく。
ただしこの時点で、問題なく動くプログラムというのはほとんど存在しない。できあがったらコンピュータ上で動かしてテストを重ねていく。これを「デバッグ」と呼ぶ。プログラムを打ちこむ作業よりも、デバッグ作業の方に多大な時間が費やされることも珍しくない。
プログラムの完成度や完成までのスピードは、プログラミングが始まる前の段階で決まる。だからこそ設計の時点で、実現すべき要件を正確に盛りこむことが重要である。
世界で最初のプログラミングは、計算問題を解くために加算機や乗算器などの計算回路をつなぎ替える目的で考案された。当時は複雑な数式を組み替えることがもっとも大切であり、そこに「思考を表現する」などという意味合いは存在しなかった。
今日のコンピュータは電卓的な計算機の範囲を超え、人間の代わりに知的な仕事をする機械と化した。まるでかつてただの計算機だったコンピュータが、突然変異を起こしたようだ。だが実際は突然変異などではない。プログラミング言語という中間言語の進化が、高度に抽象的な人間の思考内容すらも、コンピュータ上に反映できるようにしたのだ。
ただしプログラムに思考を反映できるようになったといっても、そこにはまだいくつかの条件がある。(1)考え方が順序立てられていること、(2)順序立てられた処理の内容がそれ自身で完結していること、そして(3)感情表現や抽象的表現のようなあいまいさがないことだ。プログラムを組むためには、人間側の思考が明瞭でなければならないのである。
もっとも基本的なプログラムは、上から一直線に処理をこなしていく形態である。ここでは料理ロボット用のカレーライス調理プログラムを題材に、直線的な処理の作り方を通して、「あいまい」な指示をどのようにプログラミングしていくか見ていく。
炊飯の段階で重要なのは、米の量や研ぎ時間、セットする炊飯コースの指定など、具体的な値を入力することだ。またカレーを調理する段階でも、材料の分量をすべてグラム単位で計算するとともに、「しんなりするまで炒める」や「とろみがつくまで煮込む」といった抽象的な表現を、すべて正確な時間で表現しなければならない。人間なら目分量でおこなえることも、コンピュータには具体的な条件として指示する必要がある。
プログラミング作業だけでいえば、直線的な処理は非常に単純だ。しかし「あいまいさ」を取り除く作業のような「なにをプログラミングするのか」という視点は、処理の流れとはまた異なった次元で大切なポイントになる。
特定の条件についての判断結果によって次の処理内容が変わる「条件分岐」を、プログラミングでは頻繁に使う。ここではじゃんけんを例として、条件分岐のプログラミング処理を考えていく。
まずじゃんけんの詳細なルールを入力する。合図を出し、自分の手を指示し、相手の手を見て勝敗を判定する、といった感じになるだろう。このとき勝ちか負けか、あるいはあいこかによって、次の行動が分岐する。勝った場合は「勝ち」を宣言、負けた場合は「負け」を宣言、あいこの場合は最初に戻るといった行動を記す。ここに勝ち負けの判定方法を加えたフローチャートを作ることで、条件分岐を加えたプログラミング処理が完成する。
論理的な正解のない問題に対する解決に、コンピュータを活用することは可能だろうか。ここではアルゴリズムを概念化し、ひとつの答えを導き出す過程を紹介する。とはいえ注意しなければならないのは、ここで出てくる答えはかならずしも真理ではなく、アルゴリズムにもとづいたひとつの結論にすぎないということだ。
「買い物」を例にとろう。買い物は商品と価値の交換だ。その判断には思考や投機的期待など、それぞれ異なった価値交換の考えが働いている。感情をともなった曖昧な買い物の判断をプログラム化するには、なんらかの手順で定量化された指標に置き換える必要がある。たとえば必要性と価格のバランスを数量化し、価格順に選択肢を並べるなどの手順を加え、購入判定プログラムのアルゴリズムを組み立てなければならない。
今日の情報化社会では、驚くべき速さで情報が拡散されるが、その正確性は定かではない。私たちが入手する情報について、その真偽の判定を行うプログラミングを作ることは可能だろうか。
たとえば入手する情報を、「ニュース」「特ダネ」「怪情報」の3つに分類し、それぞれの真偽判定アルゴリズムを検討。最後に「入力情報」に対する真偽判定として、プログラムを統合することは可能である。
そして情報源は実在するか、情報源が情報を発信したことは事実か、発信情報の内容によって誰かが利益を得たり不利益を被ったりしないかなど、「推定した発信情報の真偽のレベルを判定する」ための判断基準を入力する。それをフローチャートに入れれば、情報の正しさを推定するプログラミングが完成するはずだ。
プロセスを処理するプログラムは、ある種の対話型コンピュータシステムについて考えることと似ている。
たとえばディベートは、議論自体の進め方と思考の進め方がセットになっている。ディベートの主張は通常、複数の論拠から成り立ち、証拠となる根拠がそれを支える。主題の性質上、賛否どちらかが100%正しいということはあり得ないため、相手の主張の整合性を崩すことが目的となる。相手の論拠の欠点・弱点・矛盾・根拠の欠落を露呈させつつ、それを防いだ方が勝ちだ。
反論を述べるフローチャートを作り、それにしたがって議論を進めていくことは、プロセス的なプログラミングのイメージに近い。プログラミング的思考は、実際の議論の場でも活用できるといえる。
問題を解くアルゴリズムは、1つの問題に1つしかないわけではない。実現方法の視点を変えれば、まったく異なる方法を用いることもできる。たとえばカレーライスの作り方をプログラミングするとき、「玉ねぎがしんなりするまで炒める」というだけでは曖昧すぎる。だがここには「玉ねぎを炒める」と「玉ねぎがしんなりしたら炒めるのをやめる」という2つの動作が含まれており、後者を「玉ねぎを10分炒めたら終了する」に置き換えれば表現可能だ。
もちろん玉ねぎの状態によって終了を判定することが、かならずしも不可能というわけではない。玉ねぎの状態の変化を常に監視して、その違いから終了のタイミングを導き出すこともできるだろう。とはいえ現実的な視点からいえば、時間判定の方が適当だ。手間や費用といった外的な要因から、適切なアルゴリズムを導き出すことも、プログラミングには欠かせない要素なのである。
電卓とコンピュータの生まれはどちらも計算機だ。しかし電卓で計算するには、人間が特定の演算キーを特定の順番で押す必要がある。つまり電卓は計算能力があっても、問題の解き方(アルゴリズム)をもたないため、解ける問題の範囲が狭いのだ。これに対しコンピュータは、プログラムという形でアルゴリズムを内包しているので、答えを求めることができる。
アルゴリズムをもつかもたないかを境にして、両者は求められる機能とできることがまったく異なる道具となり、現在にいたっている。このことからプログラムは、コンピュータが理解できるアルゴリズム表現として、非常に大きな役割を果たしているといえるだろう。
3,400冊以上の要約が楽しめる