MMGamesロゴ  MMGames
Twitterシェアボタン  Facebookシェアボタン   
 English 

しんで覚えるC言語
しんで覚えるC言語

プログラムとは何か?

プログラムとは
ここでは、プログラムに初めて挑戦する人のために、
プログラムの概要を説明します。

プログラムとは、コンピュータを動かす最も基本的な方法です。
プログラムでは、一般的にプログラミング言語と呼ばれる、
コンピュータのための言語を使用してコンピュータを操作します。

多くの人が、プログラミング言語がコンピュータのための言語であることは知っていますが、
それでもプログラムを簡単に理解できないのは、
プログラミング言語が自然言語とは異なる点が多いためです。
自然言語とは、我々人間が使う言語のことを指します。

つまり、プログラミング言語と自然言語の違いを理解することが、
プログラミングを理解する上での最初のハードルとなります。
この章では、具体例を通じて2つの言語の違いを説明します。
単純な文法
最初の違いは、プログラミング言語が自然言語より文法が単純であることです。
プログラミング言語の文法は、単語の記述順が決まっているだけです。
この章では、仮のプログラミング言語を例にとって説明します。

たとえば、以下の例を見てください。

ソースコード
REFLECT HELLO

このプログラムは、画面に「HELLO」という言葉を表示することを意味します。
プログラムを日本語の単語に置き換えると、以下のようになります。

ソースコード(日本語単語)
映せ こんにちは

これで、画面に「こんにちは」という言葉が表示されます。
たった2つの単語だけで構成されていますが、これがプログラミング言語の文法です。

プログラミング言語で使われる品詞のほとんどは動詞と目的語であり、
先ほどのプログラムでは「映せ」が動詞で、「こんにちは」という文字列が目的語です。
動詞を先に持ってくるのは、コンピュータが主に英語圏の国で発展したためです。

先ほどのプログラムを自然言語に翻訳すると次の通りになります。

日本語に翻訳
画面に「こんにちは」という言葉を映しなさい。

この2つを比べると、プログラミング言語の文法の単純さがわかります。

言語 文章
自然言語 画面に「こんにちは」という言葉を映しなさい。
プログラミング言語 REFLECT HELLO
プログラミング言語(日本語単語) 映せ こんにちは

プログラミング言語に慣れていない人は、単純な文法に疑問を持つことがあります。
しかし、前述したように、プログラミング言語はコンピュータを制御するための言語であり、
コンピュータに命令を伝えるために必要な最低限の表現力があれば十分です。

先ほどのプログラムを見た人の中には、
プログラム中に「画面に」という表現がないことに気づいた方もいるかもしれません。
これは「映せ」と記述した場合には「画面に」という意味になると、決められているためです。

何故そのように決められているのかといいますと、そのほうが人間にとって便利だからです。
人間にとって都合が良くなるように、人間が決めているのです。

明確に「画面に」対して「映せ」という命令を与える場合は、次のように表現します。

ソースコード
映せ 画面 こんにちは

この書き方であれば「こんにちは」を移す対象を変更することもできます。

ソースコード
映せ プリンタ こんにちは

このように書き換えれば、プリンタに「こんにちは」が印刷されます。
明確な意味
前節では、プログラミング言語の文法が非常に単純であることを説明しましたが、
プログラミング言語と自然言語との違いはそれだけではありません。

2つ目の違いは、プログラミング言語が自然言語に比べ、意味が明確であることです。
プログラムでは曖昧さが発生する余地はまったくなく、厳格で明確な意味が決められています。

たとえば、「三角形を書く」という例を考えてみます。
人間相手であれば、「三角形を書け」とだけ指示しても十分な場合がありますが、
コンピュータを相手にする場合、「三角形を書け」はあまりにも抽象的です。
曖昧さを一切含まない、明確で完全な手順で命令しなくてはいけません。

まず、どこから書き始めるかを命令しなければなりませんが、
その際には、どこからという位置も曖昧さがないように命令しなければいけません。
地球上の位置を完璧に指定するなら、緯度と経度を使用しますが、
今回は似た方法として、画面の左上から右に何ピクセル、下に何ピクセルと命令します。

次に、どこまで線を引くかを命令します。
この位置を三角形の形になるように指定すれば、三角形を描くことができます。

次は、英語のプログラミング言語で表してみた例です。

ソースコード
LINE 50,50 - 250,100
LINE 250,100 - 120,160
LINE 120,160 - 50,50

これを、日本語のプログラミング言語にすると次のようになります。

ソースコード
線 50,50 から 250,100
線 250,100 から 120,160
線 120,160 から 50,50

さらに、普通の日本語に訳すと次のようになります。

ソースコード
画面左上から右に50ミリ、下に50ミリの位置から、
右に250ミリ、下に100ミリの位置まで線を引け。
画面左上から右に250ミリ、下に100ミリの位置から、
右に120ミリ、下に160ミリの位置まで線を引け。
画面左上から右に120ミリ、下に160ミリの位置から、
右に50ミリ、下に50ミリの位置まで線を引け。

この手順に忠実に従うと、次のような画像が書かれます。





上記のように、「プログラミング言語」の特徴は、極めて明確な手順で命令することです。
手順には曖昧さがなく、すべての動作を詳細に命令しなければなりません。

もう1つの例を出すならば、ロボットにカップラーメンを作らせるためには、
「カップラーメンを作れ」という命令だけでは不十分です。

1メートル前進、右に90度回転、手を10センチ前方に突き出す、・・・
という明確な手順によって、ラーメンを取り出しヤカンに水を入れ火をつけて注ぐまで、
すべての動作を人間がこと細かく指示しなくてはなりません。

また、ロボット(コンピュータ)にとって、
これらの動作は単なる動作に過ぎず、それぞれが独立した動作です。

ロボットは、それらの動作が、カップラーメンを作るための動作であることを認識していません。
単に、与えられた指示に従って繰り返し動作しているだけです。
動作中に、何かにぶつかって、ヤカンのお湯をこぼしてしまっても、
それはコンピュータにとってただの動作の1つであり、ミスとは見なしません
ロボットは、熱湯がないヤカンをもったまま、指示された動作を継続します。

これだけでも、人間相手に比べると非常に厳格で曖昧さがないと思えますが、
実を言えば、ここで紹介した手順でさえ、曖昧さが残っている手順なのです。
実は「線を引く」という指示ですら、非常に曖昧な指示なのです。

コンピュータの画面は点(ピクセルと呼ばれる)の集まりであり、
画面上のどこにピクセルを描くのか全て命令しなければなりません。
次は、三角形を描くために必要なピクセルについて、すべて明確に位置を指定する例です。

ソースコード
DOT 50,50
DOT 51,50
DOT 52,50
DOT 53,50
DOT 54,51
DOT 55,51
DOT 56,51
・
・


しかし、とても恐ろしいことなのですが、実は「ピクセルを描け」ですら曖昧な命令なのです。
本質的には、コンピュータは、ピクセルという概念を知りません。
したがって、「ピクセルを描け」とはどういうことなのか、明確に指示しなくてはなりません。

「ピクセルを描け」という命令を、完璧に明確な命令にした場合、

完璧に明確な命令
コンピュータに接続されているOO番目の装置の記憶している数値の内、
32050番目の数値を0に設定せよ。

と言う、人間にとっては非常にわかりにくい命令になります。

ここでは、横幅が640ドットのディスプレイを例として考えます。
計算を行うと、32050番目の点が画面左上から50ドット下に50ドットの位置になります。
ここでいう「OO番目の装置」とは、ディスプレイ(正確にはビデオカード)を指します。
また、「0に設定せよ」というのは、色のことで、0は黒を表します。

この様に、極限まで分解すれば、コンピュータの動作とは、

コンピュータにできることはたったこれだけ
1つの数値を記憶する。(記憶)
1つの数値が0であるか判断する。(判断)
2つの数値を足し算する。(演算)

※しかも、ここで言う足し算とは、0+0,0+1,1+0,1+1 の4つだけです。
の3つだけということになります。
しかし、この3つを組み合わせれば、どんな複雑な計算でも行えてしまうのです。

しかし、これでは、人間にとってはあまりにも不便です。
そのため、人間にとって扱いやすくなるように、現代のコンピュータには様々な機能が追加されています。
したがって、現在では、プログラミングでも、様々な便利機能を享受できるため、
ここまで厳密で緻密に考える必要はありません。

しかし、現代(2023年)においても、コンピュータの本質的な仕組みには、一切の変化がありません。
したがって、全てのプログラムは、最終的には非常に単純な計算に分割されます。
そして、コンピュータは、ただ単に(1秒間に1兆回くらい)単純な計算を繰り返しているだけなのです。
プログラムを作るためには、コンピュータが厳密な機械であることを、意識しておくことが大事です。
すべては計算
前節の最後の方でも少しその形を見せましたが、
プログラミング言語と自然言語の最大の違いは、目的にあります。

3つ目の違いは、プログラミング言語が計算のために設計されているという点です。
コンピュータでは数値がすべてであり、数値以外の概念は存在しません。

前節で三角形を描く際も、数値で指定していましたが、
プログラミング言語で扱われるのはすべて数値です。
つまり、プログラミング言語とは計算用言語です。

しかしながら、前節で説明したように、コンピュータが行える計算は足し算だけです。
足し算の組み合わせによって、加減乗除や、さらに複雑な計算も行えますが、
所詮、コンピュータにできる計算はその程度でしかありません。

加減乗除しか出来ないのでは、電卓と大差ないように感じるかもしれませんが、
コンピュータには、人間から指定された順番通りに計算を行う機能があります。
計算の順番を指定するための言語が、プログラミング言語なのです。

現代のコンピュータは、加減乗除の計算順序をとてつもなく複雑に組み合わせて、
マウスを使って直感的に操作できるような機能を提供しているため、
どうしても数値を扱っているという感覚が薄れてしまいます。

しかし、プログラミング言語を習得する時には、数値を強く意識することで、
一見すると理解しにくい文法なども、わかりやすくなると思います。


本サイトについて

苦しんで覚えるC言語(苦C)は
C言語入門サイトの決定版です。
C言語の基本機能を体系立てて解説しており、
市販書籍と同等以上の完成度です。

第0部:プログラム概要編
  1. プログラムとは何か?
2章:プログラムの書き方
  1. 書き方のルール
  2. 書き方の慣習
  3. 練習問題2
3章:画面への表示
  1. 文字列の表示
  2. 改行文字
  3. 練習問題3
6章:キーボードからの入力
  1. 入力用の関数
  2. 入力の恐怖
  3. 練習問題6
9章:回数が決まっている繰り返し
  1. 繰り返しを行う文
  2. ループ動作の仕組み
  3. 練習問題9
10章:回数がわからない繰り返し
  1. 回数不明ループ
  2. 入力チェック
  3. 練習問題10
13章:複数の変数を一括して扱う
  1. 複数の変数をまとめて扱う
  2. 配列の使い方
  3. 練習問題13
20章:複数のソースファイル
  1. 最小限の分割
  2. 分割の定石
  3. 練習問題20

コメント
COMMENT

💬 コメント投稿欄を開く