プログラミング

そもそも「プログラム」や「プログラミング」とは何なのでしょう?

プログラムとは

コンピューターは実に色々な事ができます。膨大な計算を行い、膨大なデータを蓄え、電車やロケットを制御し、そしてコンピューターゲームや音楽、CGなどを人間にとっての楽しみさえも提供します。

ただ、どれだけ複雑な事をしているようであっても結局のところは人間が指示したとおりに動いているにすぎません。その「指示」のことを「プログラム」とよび、プログラムを作成することを「プログラミング」と呼びます。人間が指示、つまりプログラミングした以外のことはコンピューターはなにもできないのです。
もともとの指示が間違っていた場合は、コンピューターは「間違ったように」動作します。こういう指示の間違いのことを「バグ」と呼んだりします。

「プログラム」は敢えて日本語に訳すと「算譜」と訳されることが多いようです。これは「楽譜」と言葉が似ていると思いますが、基本的な構造やルールもプログラムと楽譜(五線譜)はとてもよく似ています。

例えば次のような点です。

  1. 小さな構成単位に分解されます。楽譜では音符やその他の記号に分解されますが、プログラムも同様です(後で詳しく説明します)
  2. 最初から始まり特別な指示がない限り終わりまで読み進めていきます
  3. 特定の指示があった場合には指示された区間を繰り返すなど、処理の流れを途中で変更する手段を持っています



(楽譜の例)

または、演劇の脚本のようなものだと考えても良いかもしれません。

プログラミング言語

実はコンピューターはとても単純な処理しかできません。ただ、それをとても素早く行うことができます。
コンピューターに指示を行う、つまりプログラミングをする場合にはそのコンピューターに理解できる形で指示を与えてやる必要があります。しかしその指示はとても単純な処理を山のように組み合わせることによって行う必要があります。例えるならば、「レゴブロック」で実際の大きさの高層ビルやタンカーを作れ、と言っている様なものなのです。仮にレゴブロックに十分な強さがあったとしても、それを一人の手で組み立てて高層ビルを作ることは絶対に不可能とは言わないけれど、あまりやりたいことではないと思います。

そこで考えられたのが、できるだけ人間が普段使うような言葉に近い人工的な言語を作り出し、その言語を使ってプログラミングを行い、そしてできたプログラムをコンピューターが理解できる言語へ翻訳してやるという方法です。そう聞くとかえって難しいことをやっているように思えるかもしれませんが、例えば前回の例ででてきた

GraphicsWindow.DrawRectangle(100,100,200,200)

Small Basicのこのたった一行の命令は裏では多分数千から数万もの命令に翻訳されているのです*1

人間の言葉にも英語や日本語、フランス語といったように色々な言葉があるようにプログラミングをするための言語にも沢山の種類があります。これを「プログラミング言語」と読んだりします。いくつか例を見せましょう。これらは全て1から10までの自然数を足し合わせた結果を表示するプログラムです。


C言語

#include <stdio.h>

void main(int argc, char **argv)
{
    int i;
    int sum=0;

    for(i=1;i<=10;i++){
        sum+=i;
    }
    printf("Sum of 1~10 is: %d\n",sum);
}

Common Lisp

(defun sumnum (start end)
  (if (> start end)
    0
    (+ start (sumnum (+ start 1) end))
  )
)
(format t "Sum of 1~~10 is: ~D" (sumnum 1 10))

Perl*2

printf "Sum of 1~10 is: %d\n",sub{$s+=$_ foreach (1..10);return $s}->();

FORTRAN 77」

       INTEGER  I, SUM

       SUM=0
       DO  10 I=1,10
          SUM=SUM+I
   10  CONTINUE

       WRITE(*,*) 'SUM OF 1~10 IS: ', SUM

       END

「APL」

Java

public class Sum10 {
    public static void main(String[] args) {
        int  i, sum;
        sum=0;
        for(i=1;i<=10;i++){
            sum+=i;
        }
        System.out.println("Sum of 1~10 is: "+sum);
    }

}

上の例はほんの一例で、世の中にはもっとたくさんのプログラミング言語が存在し、そして使われています。
なぜそんなに沢山の種類のプログラミング言語があるのか?どれか一つに統一したほうがよいのじゃないのか?
そう思うかもしれませんが、それぞれの言語にはそれぞれの特徴や得意な分野が存在し、使い分けられているのです。

じゃぁ、コンピューターを使いこなすためにはそれらのたくさんのプログラミング言語を覚えなければいけないのか、というとそうでもありません。
実際によくつかわれるプログラミング言語はほんの少数ですし、
もし自分がよく知っているプログラミング言語ではないプログラミング言語を使わなくてはならなくなったとしても、
どれか一つの言語に習熟できていれば、その他の言語を覚えるのは比較的容易いと思います。

まとめ

「プログラム」とはコンピューターに指示を与えるために考案された人工の言語(プログラミング言語)でかかれた指示のことです。
Small Basicもプログラミング言語の一種です。
コンピューターは指示されたように動きますが、指示された以外の動きはしません。間違った指示のことを「バグ」と呼びます。

今日出てきた用語
プログラミング言語
コンピューターに指示を与えるために使われる人工の言語。
プログラム
コンピュータに指示を与えるためにプログラミング言語で書かれた指示書のこと
バグ
プログラムのうち、期待したように動作をさせないような間違った指示のこと

*1:実はこの説明には微妙なウソがというか、ややっこしい事情があるのだけど、それはまた別の機会に説明します

*2:敢えてperlらしく(?) ワンライナーで書いてみましたが、無名関数を使うよりももっとスマートに書ける方法があるかもしれない...