コンピューターとプログラム、プログラミング言語

ここでは、はじめてプログラミングに触れてみる前の予備知識として、 「コンピューター」というもの自体の特徴や、人間との違い、 そして何のためにプログラミング言語があって、一見ややこしい記法になっているのか … 等々についてを説明します。

これらは、実はプログラミングに入門する上で、必ずしも必要不可欠な知識ではありません。 ですが、はじめてプログラミングに触れる場合、具体的な書き方を覚え始める前に、一歩はさんで最初にこれらを抑えておいた方が、 後々の理解がスムーズに進むのではないかと思います。

というのも、恐らく一般に、プログラミングは最初の段階で挫折してしまうケースが多いように思えるためです。 これは、プログラムを書くための言葉である「プログラミング言語」が、 初見では人間の言葉と比べて意味不明な記述方法で、ルールも人間基準では色々と理不尽なためかもしれません。 それにはちゃんと理由があり、慣れれば乗り切れる事でもあるのですが、 慣れる前にばかばかしくなり、やる気が無くなくなってしまってはまずいですよね。

そこで、第一回である今回は、プログラミングで最初にぶちあたる「理不尽さ」を乗り切るために、 まずはコンピューター側に歩み寄って、土台にある事情を簡単に見ておきましょう。

- 目次 -

色々な処理を行える「コンピューター」

現代に生きる私たちにとって、コンピューターはとても身近で、便利で、無くてはならない存在です。 コンピューターといってもPC、いわゆるパソコンだけではありません。スマートフォンやゲーム機だって、 構造的にはれっきとしたコンピューターと呼べるものです。 他にも、色々な家電製品の中にだって(最近は炊飯器や洗濯機の中にも)、よく小さなコンピューターが入っています。

いろいろなコンピューターの図

それでは、コンピューターは一体なぜ便利なのでしょうか? なぜ、こんなにも色々な所で使われているのでしょうか?

それは、「コンピューターが色々な処理をできるから」に他なりません。 たとえばコンピューターは、複雑な計算を行う事も、 文章を書くことも、デジカメで撮った写真を編集する事も、 面白いゲームをプレイする事も、特殊な機器(デバイス)を制御する事だってできます。 実際にみなさんの持っているPCは、基本的にこれらの事を全部できます。

これって、道具としてはすごく特別な事だと思いませんか? 普通の道具は、だいたい何か決まった目的があって、そのために特化した機能を持っています。 でもコンピューターは、特定の何ができるというよりも、「色々できる」という事が便利なわけです。

コンピューターに処理内容を伝える「プログラム」

さて、色々な処理をできるコンピューターですが、何も指示されなければ、何もしません。 そこで、どんな処理をしてほしいかをコンピューターに伝えるものが、 「プログラム」です。

たとえば、あなたが他の人に、何か複雑な作業を頼むとき、どうするでしょうか? 恐らく、作業手順のリストを紙などに書いて、作業する人に渡すのではないでしょうか。

人間同士で作業リストを渡す図

これと全く同じで、コンピューターに何か複雑な作業(処理)を頼みたければ、プログラムに書いて渡せばよいわけです。 「プログラム」というと、なんだか専門的な用語で難しそうなイメージがありますが、 要するに「 プログラム = コンピューターにとっての作業リスト 」なのです。 コンピューターは、プログラムを渡されると、そこに書かれた通りの内容を、忠実に実行してくれます。

コンピューターにプログラムを渡す図

一般に、プログラムを書く作業を「プログラミング」や「コーディング」などと呼び、 書く人を「プログラマー」などと呼びます(仕事としての肩書きには色々なものがあります)。

作業(処理)における、コンピューターと人間の大きな違い

ところで、上の例でも触れた通り、リストに書かれた通りの事を行うだけなら、人間にだってできますよね。 なぜわざわざ、コンピューターの使い方やプログラムの書き方を覚えてまで、コンピューターに頼むのでしょうか?

実は、 何か作業(処理)を行うにあたって、 コンピューターと人間には大きな違いがあり、それぞれに得意・不得意があるのです。 なので、プログラミングを始める前に、この「違い」を理解しておく事がとても重要です。 人間に作業を頼むのと全く同じ感覚で、コンピューターに頼もうとすると、 融通の利かなさや細かさなどにイライラしてしまう事でしょう。 でも、相手の得意・不得意を理解しようという心構えが最初からあれば、意外と腹は立たないものです。

コンピューターは、自分でどうすべきか考えられない。
そのため細かい指示が必要だが、その代わり動作は正確!

それでは、具体的に人間とコンピューターの違いを見ていきましょう。 まず人間は、一から十から百まで細かく指示されなくても、 ある程度は自分でどうすべきか考えながら、作業を進める事ができます。 場合によっては、「 例の件、適当にやっておいてくれ 」といった指示でさえも、 ちゃんとこなす事ができます。

人間に雑な作業リストを渡したり、100回作業をお願いしたりする図

このように、人間は常にある程度考えながら作業をしているため、 未知の問題が発生しても、その場その場で適当に対処できます。これは人間の大きな強みです。 その一方で、 考えた結果として間違った事をしてしまったり、単純にケアレスミスをしてしまったり、 そもそも作業内容を勘違いしてしまう事もあります。

それでは、コンピューターはどうでしょうか。 コンピューターは人間と違い、 一手一手どうすべきか考えながら作業(処理)するのは苦手です 原則として、プログラムに書かれた通りの内容を、忠実に実行する事しかできません。

( ※ 近年では、機械学習などの人工知能技術も普及してきていますが、ここではより原理的な、コンピューターの基本動作の話に割り切っています。)

なので プログラムには、すべての手順を、誰が読んでも考える余地が無いくらいに、細かく明確に書いてあげる必要がある のです。 色々と省いたり記述ミスがあるような、雑なプログラムを渡しても、 最初から実行してもらえないか、途中で止まってしまいます。 どうすべきか考える事ができないからです。

コンピューターに雑なプログラムを渡す図

その代わり、ちゃんとコンピューターに十分わかるようにプログラムを書いてあげれば、 その通りに非常に正確に実行してくれます。 想定外のトラブルや不具合などを除けば、原則として間違える事はありません。 この「正確さ」が、コンピューターの強みの一つです。

コンピューターの動作は超高速! 膨大な回数の繰り返しも余裕!

コンピューターには、正確さの他にも、いくつも大きな強みがあります。 その一つは、動作がとても高速な事です。 たとえば、同じ作業(処理)を100回、繰り返し行う場合を考えてみましょう。 100回となると、人間が行うと結構な時間がかかるはずです。 慣れない内は何度か間違う事もあるでしょう。 特に、疲れてくると注意が続かなくなるので、休憩も必要です。

人間に100回作業をお願いする図

それに対してコンピューターは動作が高速なため、 そもそも100回程度であれば一瞬で終わってしまう事が多いでしょう。 具体的にかかる時間はプログラムの内容によって異なりますが、 人間が同じ手順を行うよりは、はるかに高速です。

コンピューターに100回作業をお願いする図

さらに1万回、1億回…と繰り返す必要がある場合には、それなりに時間がかかるかもしれません。 それでも、先に述べた通り、コンピューターは毎回ちゃんと指示通りに正確に処理を続けてくれます。 基本的に、慣れや休憩なども無くて大丈夫です。 さすがに年単位でずっと稼働させ続ける場合などは、耐久性や冷却性などに配慮し、たまに再起動やメンテナンスなども必要になったりしますが、 それでも実際にほぼ一年中ずっと動き続けているコンピューターは、世の中にたくさんあります。 人間にとっては、昼も夜も休憩なしに、一年中ずっと同じ作業をミスせず続けるのは、非常に厳しいですね。 この「繰り返しへの強さ」も、コンピューターの大きな強みです。

コンピューターと人間を繋ぐ「 プログラミング言語 」

プログラムはどう書くべき?
コンピューターのつもりになって考えてみよう

さて、コンピューターとプログラムのイメージがつかめた所で、 もう少し具体的なプログラミングの話に入りましょう。 実際に、プログラムはどのように書けばよいのでしょうか?

まず答えを先に言ってしまうと、「プログラミング言語」という特別な言葉で書いてあげる必要があります。 しかし、プログラミング言語はかなり独特の雰囲気を放つものなので、 いきなり「 このように書いてください 」と言われて、すんなりと受け入れられるものではありません。

見慣れない言語で書かれたプログラムを見て混乱する図

そこで、ここはひとつ、まずはコンピューターのつもりになって、 「 プログラムをどう書いてほしいか 」を一緒に考えてみましょう。 たとえば、人間に頼むのと全く同じように、以下のようなプログラムを書くのはどうでしょうか:

すみませんが、昼食代を計算してもらえますか? えーと、お茶が100円で、お弁当が200円です。

あなたは上のプログラム(のようなもの)を読んで、どう答えますか? 「300円」でしょうか。 恐らくそれが最も普通の答えでしょう。 でも、それが唯一の正解でしょうか? 100人が読んで100人とも「300円」と答えるでしょうか? そのように疑ってみると、上のようなプログラムの書き方の問題点が見えてきます。

まずは内容を細かく、具体的に!

まず大きな問題点として、 上のプログラムには「 何を何個ずつ買うのか 」という事が書かれていません。 10人で会議中に出前をとろうという状況かもしれないので、10個ずつ要るかもしれません。 300円と答えた人はきっと、 「 個数や他に必要なものが書かれていないという事は、単純にお茶とお弁当を1個ずつ買うのだろう 」 と考えたはずです。でも思い出してください。 コンピューターは、自分でどうすべきか考えて対応するのは苦手 です。 ちゃんと何を何個買うのか、はっきり書いてほしいはずです。

もう一つの問題点として、上のプログラムには「 昼食代をどう計算すべきか 」という事が書かれていません。 300円と答えた方は、きっと頭の中で「 昼食代 = お茶の値段×お茶の個数 + お弁当の値段×お弁当の個数 」という計算を行った事でしょう。 なぜなら、そう計算すればよい事は、小学校で習うような常識だからです。 でもコンピューターからすれば、上のような計算式も具体的に書いてほしいはずです。 また、値段が定価か税別かわからないので、場合によっては消費税がかかるかもしれません。 その場合は、消費税も含んだ計算式を書く必要がありますね。

コンピューターに、人間と同じ感覚で昼食代の計算をお願いする図

問題点はまだあります。 たとえば、上のプログラムには「 何も答えない 」というのも一つの正解です。 なぜなら、「 計算してもらえますか? 」と尋ねられているだけで、 「 答えを教えてください 」とまでは要求されていないからです。 人間からすれば、言われなくても当然わかる事ですが、 コンピューターにとっては、答えを教えてほしいならそう書いてほしいわけです。

また、確実に計算してほしいなら、「すみませんが、〜 してもらえますか?」のような社交辞令も不要でしょう。 仮に、本当に疑問形でそう尋ねたいなら、「 どういう場合に断るべきか 」まで書くべきです。 「えーと、」などのような意味のない記述も、コンピューターには不要ですね。

このあたりで一度、プログラムを書きなおしてみましょう。

昼食代を計算してください。 お茶の値段が100円で、お弁当の値段が200円です。 買うものは、お茶を1個と、お弁当を1個です。 昼食代の計算式は「 昼食代 = お茶の値段×お茶の個数 + お弁当の値段×お弁当の個数 」です。 最後に、計算した昼食代を教えてください。

内容が細かく具体的になって、行うべき処理ががはっきりしましたね。 でもその代わり、少し読みづらくなってしまいました。 このように細かい指示を書く場合、箇条書き( かじょうがき )の形のほうがすっきりします。 箇条書きは、上から下に読みながら作業を進めるように書くとわかりやすいので、ここでもそうしましょう。

最初に比べると、だいぶコンピューターに伝わりやすそうな内容になってきた気がしませんか? 実際にコンピューターに渡せるレベルまで、あと少しです。

人間の言葉 = 自然言語は、コンピューターには難しい!
そこで記号やキーワードなどを使って、書き方を単純化

さて、上で書いたプログラムには、まだコンピューターにとって「最後の壁」が残っています。 それは、各行が、普通の日本語の文章で書かれているという事です。 と言っても、英語で書いてもだめです。 日本語や英語のように、人間が日常で用いる言葉を一般に「 自然言語 」と呼びますが、 実はコンピューターにとって、自然言語は複雑すぎて、正しく理解するのがなかなか難しいのです。

一応、自然言語を処理する研究は進んでいるので、 中途半端な正確さでよければ、自然言語でコンピューターに指示を出す事自体は不可能ではありません。 実際、最近のPCやスマートフォンには、そのような機能が搭載されていたりもします。 言った事をちゃんと理解してくれる事もあれば、内容が間違って伝わる事もあります。

コンピューターが、自然言語を間違って理解する図

しかしながら、コンピューターの強みの一つとして、「 間違えず正確に処理を行える 」という事がありました。 なので、用途にもよりますが、 そもそも指示内容を勘違いして理解されたのでは、本末転倒で意味がない場合も多いはずです。 実際、いまはコンピューターに正確に指示したいので、それでは困ります。

そこで、プログラムの各行も、 普通の文章で書くのはなく、 もっとコンピューターが内容を簡単に解釈できるように、 ずっと単純化した形で書く事にしましょう。

たとえば 「 お茶の値段は100円とします。」 の行のように、 何かの値をコンピューターに知らせたい場合は、 「 お茶の値段 = 100 」 といった具合に「 = 」記号を使って書く事にしましょう。 こうすれば、「 = 」記号の左右を見るだけで、 「 『お茶の値段』に『100』をインプットすればいいんだな 」と簡単に解釈できます。

普通の文章から、記号やキーワードを用いて単純化する図

また、「 昼食代の計算結果を教えてください。 」 という行は、 要するに昼食代の値を画面に表示させたいわけですね。 であれば、「 表示 」というキーワードを用意しておいて、 その後に値を「 ( ) 」記号で囲って書くと、その値を画面に表示するというルールを作ってしまいましょう。 そうすれば、この行は 「 表示( 昼食代 ) 」 と単純に書けます。

( ※ 厳密な話では、言語によっては構文キーワードではなく関数名(識別子)だったりもしますが、難しくなるのでここでは触れません。 )

このように書き方を単純化してみると、先ほどのプログラムは次のように書けます:

そして 「 プログラミング言語 」 へ

さて、私たちはここまで、プログラムをどのように書くのがよいかを、コンピューターの視点に立って考えてきました。 そして最終的に、上で示したような「 独特な書き方 」に到達しました。 これはもはや日本語の文章でも何でもない、一つの言葉 = 言語と言えるでしょう。 このように、プログラムを書くのに特化した言語を「 プログラミング言語 」と呼びます。 つまり私たちは、ここまでの説明の中で、架空のプログラミング言語を一つ作ったわけです。

実際にこの架空の言語をコンピューターで使えるようにするのも面白そうですが、 それは話の本筋から外れてしまいます。 世の中には、すでに多くのプログラミング言語があります。 手っ取り早くコンピューターで実行して結果を得るには、それらを使うのがよいでしょう。

このコーナーは「 VCSSL 」と「 Vnano (VCSSL nano) 」というプログラミング言語のガイドなので、 例として、プログラムをそれらの言語(どちらでも同じ内容になります)で書き直してみましょう:

int お茶の値段 = 100 ;
int お弁当の値段 = 200 ;
int お茶の個数 = 1 ;
int お弁当の個数 = 1 ;
int 昼食代 = お茶の値段 * お茶の個数 + お弁当の値段 * お弁当の個数 ;
print ( 昼食代 ) ;

「 int 」というキーワードが登場していたり、「 表示 」の代わりに「 print 」と書かれているなど、 細かい部分は異なりますが、 私たちが上で作ってきた架空の言語とよく似ています。

実際には「 お茶の個数 」などの項目名も、英語で「 numberOfTeas 」などと書くのが普通で、 日本語でもローマ字にして「ochaKosuu」や「 kosuu_ocha 」などのように書きますが ( 読みやすさのため、単語の区切りの位置を大文字にしたり、アンダースコア「 _ 」をはさんだりします )、 そうするとSF映画などで見る、いかにも「プログラム」という雰囲気になります:

int nedan_ocha = 100 ;
int nedan_obentou = 200 ;
int kosuu_ocha = 1 ;
int kosuu_obentou = 1 ;
int daikin = nedan_ocha * kosuu_ocha + nedan_obentou * kosuu_obentou ;
print ( daikin ) ;

これまでの説明なしに、いきなり上のプログラムを見せられると、私たちの言葉とは全く違うので、理解に苦しんでいたかもしれません。 でも、ここまで読み進んだ皆さんは、なぜプログラムがこのような独特の書き方で書かれているのか、もうわかりますね。

さて、上のプログラムはもちろん、実際に皆さんのPCで実行する事が可能です。 詳しい実行方法はまた後の回で説明するとして、とりあえず実行してみると、画面に次のように表示されます:

300

そう、コンピューターが計算してくれた答えは、やはり300円。 長い道のりでしたが、私たちはようやく、コンピューターに昼食代を計算してもらう事ができたわけです。

コンピューターの頭脳とプログラミング言語のしくみ

CPU

無事コンピューターにプログラムを実行してもらう事ができたところで、最後におまけ話です。 プログラムが実際にどのように実行されているのか、そのしくみを見ておきましょう。

ここまで 「 コンピューターは考えるのが苦手 」や「 複雑な言葉はわからない 」 などと言ってきましたが、 そもそもコンピューターの頭脳はどんなものなのでしょうか? それは、「 CPU 」と呼ばれる特殊な電子回路部品です。

実は、上で書いたプログラムも、CPU が直接理解できるわけではありません。 信じられないかもしれませんが、あれだけ細かくかみ砕いても、まだ複雑すぎるのです。 CPU はもっとずっと単純な 「 機械語 」と呼ばれる言葉を解釈して動くように設計され、造られています。 従ってコンピューターは、機械語で書かれたプログラムをそのまま理解できます。

コンピューターの頭脳(CPU)が直接解釈できる、1と0が延々と並ぶ機械語の図

機械語は、 人間よりもやはり電子回路や電気信号にとって都合がいいようにできています。 たとえば機械語は 1 と 0 を並べて記述されます。 「 たし算 」命令は「 10001000 」と書くといった感じで、値も 2 進数で扱います。 そうすると解釈や計算を行う回路を単純にできたり、電気信号として正確に扱いやすかったりするからです。 電気的に値を覚えるのにも有利です。

また、機械語には非常に単純な命令しか存在しません。 というのも、あまり機能が複雑になると、CPUのしくみや電子回路としての都合で、処理効率や消費電力などに不利が生じます。 またCPUの製造でも、なるべく回路規模が小さいほうが、 一度にたくさん作れる上に不良品率も下がり、コストを抑えられます(シリコンの板の上に量産されます)。 従って機械語・CPUの機能は比較的単純にしておき、複雑な処理はそれらを組み合わせて使うのが合理的なのです。

言語処理系

実際に、(機械語ではない)プログラミング言語で書かれたプログラムは、 各言語に専用の 「 言語処理系 」 というものによって、 自動的に機械語の命令を組み合わせて実行されます。(実は、この言語処理系そのものもプログラムです。)

言語処理系が、プログラミング言語とマシン語の間を仲介する図

言語処理系には、 実行しながら(逐次的に)機械語の処理を組み合わせてプログラム通りに動かす「 インタープリタ 」や、 そもそも実行前にプログラム全体をまとめて機械語に変換してしまう「 コンパイラ 」など、 複数のタイプがありますが、 いずれにしても最終的にCPUを動かすものは機械語です。

もちろん、人間が直接、機械語でプログラムを書く事も不可能ではありません。 実際、単純に 1 と 0 の代わりにキーワードで置き換えただけの 「 アセンブリ言語 」 を人間が使う事はあります。 しかしCPUの機能は非常に単純で細かいので、それを人間が組み合わせて長く複雑な処理を書くのはたいへんです。

それよりは、ふつうの( アセンブリ言語と比べると "高級" な )プログラミング言語の方が、まだ人間寄りです。一方でプログラミング言語は、私たちの普通の言葉(自然言語)に比べると、ずっとコンピューター寄りでしたね。 つまるところプログラミング言語は、対極的な 「 人間 」 と 「 コンピューター 」 、 および 「 自然言語 」 と 「 機械語 」 との間をつなぐ存在であるとも言えます。