こんにちは、あのぶるです。

「プログラミングって何?」と質問をされたとき、あなたはどのように答えますか?
RFC等で明確に定義があるわけではないようですが、現在では概ね「(プログラミング言語を使って)コンピュータへの命令を作成すること」という説明がされているようです。
私はよく、もう少しだけ噛み砕いて「コンピュータへの作業指示を作ること」と説明しています。

コンピュータへの作業指示とは?という話をする前に、まずは「そもそもコンピュータは何をしているのか」という話をさせてください。

今あなたがこの記事を読んでいるパソコンやスマートフォンをはじめ、身の回りのコンピュータはとても複雑な処理をしているように見えます。
……いえ、実際に複雑な処理を行っているのですが、原理的な話をすると(一般的に普及しているタイプの)コンピュータが出来ることは

  • データの出し入れ
  • 整数の足し算(と引き算)
  • 論理演算
  • 分岐

しかありません。
(実は整数の足し算も論理演算を使って行うのですが、今回は簡単のため分けて説明します。)

でも、私たちの目の前にあるコンピュータは文章を作ったり映像を見たり、もっと複雑なことを実現できていますよね。なぜでしょうか?
それは、前述の4つの処理を細かく組み合わせ、人間には到底真似できないスピードで行っているからなのです。

「処理の組み合わせ」の簡単な例として、コンピュータに掛け算をさせてみましょう。
例えば4×7の計算をするとき、こんな風に指示をすると計算結果を得ることができます。

  1. 計算結果を保存する場所Aを確保し、そこに0をセットする (データの出し入れ)
  2. 繰り返しの回数を管理する場所Bを確保し、そこに7をセットする (データの出し入れ)
  3. Aに4を加える (整数の足し算)
  4. Bに-1を加える (整数の足し算※実質的な引き算)
  5. Bの値が0になったかどうかをチェックする (論理演算)
  6. 5.の結果が「なっている」であれば7.に進み、「なっていない」であれば3.に戻る (分岐)
  7. Aの内容をを答えとして出力する (データの出し入れ)
実際にはより効率のよい手順があるため、現行のコンピュータがこの手順で掛け算を行うことは殆どありません。
ただ、「小さな処理を組み合わせてより複雑なことを実現する」という考え方を知るには良い例だと思い、紹介させていただきました。

このように、コンピュータが行う処理はすべて「コンピュータが直接できること」まで人間側で噛み砕く必要があり、それをコンピュータが1秒あたり何百〜何千億個というものすごいスピードで実行することで実現しているのです。
ただし、現代においてソフトウェアを作る人が全ての処理をこのレベルまで噛み砕くのは現実的ではありません。そのため、あらかじめ「やりたいこと」をコンピュータが分かるように指示を組み立てておき、使いやすいようにまとめられています。それがプログラミング言語であったり、「命令セット」や「API」と呼ばれるもの(と実行環境)の正体なのです。

「コンピュータが直接出来ること」自体はコンピュータが生まれたばかりのころから殆ど変わらないのですが、当時は処理ができるスピードも今より遅く、計算処理だけでも「人が計算した方が早い」なんて言われてしまうような状況でした。現在のコンピュータが複雑な処理を実現できるのは、電子機器としてのコンピュータの性能が進化して計算をものすごいスピードで実行できるようになったからなのです。
ソフトウェアエンジニアとしては、ハードウェア分野の皆様には本当に頭が上がりません。

……という点を踏まえて、続編では「コンピュータに指示を与えるとはどういうことか」の話をしようと思います。
もしよろしければ引き続きお付き合いください。


The following two tabs change content below.

あのぶる

Software Engineer
杜の都で育ち、赤べこの街でコンピュータのいろはを学んだソフトウェアエンジニア。今はスマホゲームのためのWebAPIを作るお仕事をしています。最近はすっかりガルパンおじさん化。