コンピューターとプログラム

manzyun edited this page May 12, 2014 · 8 revisions

プログラミングでできること

ひょんな事でこのWiki、もしくは某所のプログラミングスクールを受講している皆様こんにちは、まんじゅ(´ん`)です。
皆様なんらかの目的を持ってこちらをご覧かと思いますが、念の為「プログラミングができると何ができるの?」という例をいくつか紹介しましょう。

GIMPやMyPaintやInkscape、もちろんPhotoshopやIllustratorだってプログラミングによって作られたソフトウェアです。
ArdorやSONARなどのDTMやDAWソフト、そしてそれらに使えるVSTiプラグインもプログラミングによって作られたソフトウェアですね。
あなたが普段インターネットを使うときに立ち上げるそのアプリやソフト―”インターネットブラウザ”と言います―も、プログラミングによって作られたものです。
そしてあなたがさっき、もしくはこの後送信するであろうTwitterやFacebookへの投稿を、次の瞬間には全世界だったりフォロワーだったり友達にだけ公開したりしているのも、TwitterやFacebookの持っているコンピューターで動いているプログラムで、それももちろんプログラミングによって作られてます。

さて、もしかすると僕世代の人たちはテレビゲームを作りたいと思ったことがあるかもしれませんが、あれもプログラミングによって作られております。

ところで、TwitterやFacebookのアプリを立ち上げるその操作だったり、パソコンやMacで.xslxというファイルをダブルクリックすると、ExcelだったりOpenOfficeだったりLibreOfficeだったりが起動して、ダブルクリックしたファイルが開くように動作するように制御しているプログラムだってあります。
ちょっと混乱しましたかね、iOSやAndroidやWindowsやMac OS XやLinuxやBSDといったOSだってプログラミングで作られたものです。

というように、プログラミングによってほぼあなたのお持ちのパソコンやタブレットやスマートフォンで動いているものが作れます。

また、ちょっと変わった例だと、最近のちょっと高性能な洗濯機の「洗濯物の重さを測って水を入れる機能」はもちろん「ボタンを押したらコースを変更する」というのもプログラミングで書かれていますし、最近の自動車のエンジンも自動車の会社の方がプログラミングされたプログラムで制御していたりします。
みなさんでも作れるものだと、この自動でカクテルを作ってくれるマシンがいいかもしれません。
大丈夫、作ろうという気さえずっといだき続ければ生きてるうちにほぼ必ず作れます!

コンピューターの仕組み

さてそんなコンピューターですが、いくつか気をつけなければいけない点があります。
コンピューターはコンピューター自身で物事を考えることができません。
でも不思議ですね、人間の声を聞いたら意味を理解してインターネットから検索したり、テレビゲームの対戦相手になってくれたり、チェスや将棋でチェスプレイヤーや棋士を打ち負かしたりと。まるで自分の意志で考えているようですね。

ではそんなコンピューターがどのように物事を考えるようになるのか、ちょっと紐解いていきましょう。

まずコンピューターは「電気が入ったか切れたか」のみで物事を解釈します。
「電気が入ったか切れただけだったら、蛍光灯やモーターと同じじゃないか!」
確かにそのとおりですね、でも入ったか切れたかの情報をいくつも並べたら、表現の幅は広がると思いませんか?

ON OFF ON ON OFF OFF ON ON

少し発想は違いますが、モールス信号も似た発想ですね。

・ー・・ーー・・

ただし、モールス信号の場合は「通電していない時を信号の区切り」とし、コンピューターの場合は「内蔵されている時計のリズムで区切っている」という違いがあります。
詳しい話はここでは省きますが、調べる際のキーワードとしてクロック周波数という言葉を出しておきます。

コンピューターと数字

では、コンピューターの扱う数字はどのように表現されるのでしょうか。ずばり2進数という「1に1つ数を足されると繰り上がる数」です。
対して普段私達が日常で使っている数字は10進数と言います。

ここで一つ例を出してみましょう。64という数字があります。これを2進数にしてみると

1000000

という数字になります。では日常でキリのいい10は?

1010

となります。

計算方法もありますが、単純に指折り計算でも可能ですよ?
1の時に指を曲げて、繰り上がる時に隣の指を曲げて、さっきまで曲げていた指は伸ばして……という具合にやっていくと、512までの数字を2進数で数えることができます。

さて、ここで出てきた2進数の数字がそのままコンピューターにとっての数字になります。10進数の10で例えると

1010

ON OFF ON OFF

という信号になります。

しかし、コンピューターでは命令と値を分けたりするために8桁0埋めが基本なので、10という値をコンピューターに伝えるには以下のようになります。

00001010

コンピューターでの文字

ではコンピューターは文字をどう表現するのでしょうか?

簡単に言うと、文字の表がありそれを数字で指定して表示します。
この辺りの話は後でちょっと確認してみますが、この表が元々データを書く際に使われていたものと閲覧する際に使われているものが違うことによって文字化けが起こりますが、これを文字コードと言います。

画像や音声もコンピューターのミクロな世界では「0」と「1」で表現されますが、今回はその話は少々省きます。
自分で調べてみたいという方はディジタル表現もしくは標本化量子化というキーワードで調べてみてください。

以上のように、コンピューターでは全てのデータが0と1で表現され、コンピューターは0と1でものごとを解釈し、演算しております。
しかし、機械語で命令するのは不便なことが多いため、人々はプログラミング言語という形で、コンピューターに容易に命令や作業の手順を書き記し、作業させられるようにいたしました。

プログラミングしてみよう

ということで、ようやくプログラミングをするわけですが、コンピューターにプログラミング言語で書いたプログラムを実行させるにはコンパイラインタプリタという、プログラミング言語から機械語に変換する辞書の・ようなものが必要です。コンパイラとインタプリタの違いについてはここでは省きます。

そういえば皆さんには少々残念なお知らせがあります。それはプログラミング言語はたくさんあるということです。
でも大丈夫、英語を学ぶよりは簡単ですから。

ということで、中には初めからOSと一緒にコンパイラなどが入ってる言語もあるのですが、今回はPythonという言語で進めていこうと思います。

コンパイラを入れる

ということでまず最初にあなたのコンピューターにPythonの翻訳環境が整っているか確認してみましょう。

  1. Windowsの方は「コマンドプロンプト」、MacやLinuxやの方は「ターミナル」を立ち上げてください。
  2. そして以下のコマンドを入力して[Enter]を押して実行してみてください。
python -V
  1. 以下のような表示が出てきたらプログラミングできる準備はできています。「X」の部分は何らかの数字が入ります。最初の数字が「3」なのが理想です。
Python X.X.X(Xは任意の文字)

もしかすると複数のバージョンのPythonが入っているかもしれません。その場合は以下のコマンドを入力して[Tab]キーを2回押してみてください。

python

おや? 出てこない? そうしましたらPythonの公式ページでインストーラーをダウンロードしてインストールしましょう。

Pythonダウンロードページ(最新版(3.X)が理想です。)

NOTE:Pythonを入れるのが面倒くさいという方へ

最近だとインターネット(ブラウザ上)でPythonが使えるサービスもあります。そちらを利用するのも一つです。
筆者が勧めるのは英語のサービスになりますが以下となります。

ただし本格的にプログラミングをする(Webアプリを作る予定があるetc..)というのであれば、あなたのパソコンにPythonをインストールしたほうが便利なことは多々あります。

Hello, YOU!

さて、Pythonのインストールは確認できましたでしょうか。そうしましたらIDLEというアプリケーションを起動しましょう。
Windowsの方はスタートメニューのPythonのフォルダにIDLEがあるかもしれません。
MacやLinuxの方はターミナルで以下のコマンドを打ち込んで実行してみてください。

idle

すると以下のような文字の書かれたメモ帳のようなアプリが起動すると思います。 以下はLinuxの場合。

Python 3.4.0 (default, Apr 11 2014, 13:05:11) 
[GCC 4.8.2] on linux
Type "copyright", "credits" or "license()" for more information.
>>> 

早速ですが、試しに以下のように入力してEnterキーを押してみましょう。

print("Hello Python")

どうでしょう? "Hello Python" と表示されたでしょうか。

では、メニューバーから File > New File と選択して新しいファイルを作成しましょう。 そして、そこに以下のプログラムを書きます。

# for 2.X

name = raw_input("What's your name? >>> ")
print "Hello", name, "!"

もし最初のPythonの文字表示で「Python 3.X.X」と表示されていた場合、以下のソースコードを打ち込んでください。

# for 3.X

name = input("What's your name? >> ")
print("Hello," , name , "!")

できましたら一度「hello.py」という名前で皆さんのわかりやすいところ(迷った場合はとりあえずデスクトップ)に保存しましょう。

保存し終わりましたら[F5]キーを押してみてください。
すると、先ほど「Hello, Python」と表示させたウィンドウで、以下の文が表示されるはずです。

What's your name? >>> 

ではあなたの名前を入力して、[Enter]キーを押してみましょう。すると……

Hello, あなたの名前 !

コンピューターがあなたの名前を呼んでくれたでしょうか?

プログラム解説

では先ほどのプログラムに注釈を付け加えましょう。

# for 3.X

# 変数nameにinput命令で取得した文字列を代入する
# "What's your name? >>> "と表示してからキーボード入力を受けつけ、Enterが押されるまで待機する。
name = input("What's your name? >>> ")

# "Hello,"とnameの中身と"!"と表示する
print("Hello,", name, "!")

ちなみに上のプログラム、そのまま書いてもちゃんと動きます。
このように"#"をつけた後ろの部分はPythonで翻訳する際に無視される部分です。
この記号を上手に使って、一時的に動かしたくない部分を無効化することをコメントアウトと言ったりします。

ところで、ソースコードの中で唐突に変数という言葉が出てきましたね。名前のとおりに受け取ると「変化する数」です。
もうちょっというと、一時的に値を入れておく箱やバスケットだと思っておいてください。
今回の例だと「nameというバスケットを作って、その中にユーザーから受け取った値を入れる」という具合です。

もしかすると数学の得意な方は「文字式のxやyに該当するのが変数」と言ったほうがしっくりくるかもしれませんね。

「え? 文字列も数?」
そう思った方、先ほどお話した「コンピューターの文字の表」のお話を思い出してください。

ここで次のようなプログラムを書いて実行してみてください。ファイル名はasciiCode.pyとしましょう。

#for 2.X.X
print "\x48\x65\x6c\x6c\x6f\x20\x50\x79\x74\x68\x6f\x6e"
#for 3.X.X
print("\x48\x65\x6c\x6c\x6f\x20\x50\x79\x74\x68\x6f\x6e")

「Hello world」と表示されたでしょうか? 一見すると謎の暗号ですが、これは直接コンピューター内の文字の表の番地を指定しているものと思っておいてください。

もう少し解説いたしますと、「\x」で始まる数字の並びは16進数という数字としてコンピューターに解釈させます。つまり「16で次の桁に繰り上がる数」です。

中途半端に思われるかもしれませんが、コンピューターにとっては8の倍数なので都合がよい数字だったりします。

「でも、数字は0から9の10個でしか表現できないよ?」
と思われた方。確かに9から上の数を数字の一文字で表現するのは、新たな数字を作らないと表現できないかもしれません。

しかしコンピューターでは新たな数字を作ることなく、10進数で言うところの「10」は「A」、「11」は「B」というように、アルファベットで表現するという事になっております。

コンピューターは何を考えているのか

さて、変数をコンピューターがどのように使うのかよく知るために次のプログラムをプログラミングしてみましょう。

# for 2.X.X
x = 1 + 1
print "変数xの中には", x, "が入っています"
# for 3.X.X
x = 1 + 1
print("変数xの中には", x, "が入っています")

そういえば、こういったプログラミング言語で書かれた文章の事をソースコードと呼びます。今後から頻繁に使っていきますね。

では、このソースコードを「variable.py」と名前をつけて保存して、[F5]キーを押して実行してみましょう。

変数xの中には 2 が入っています

と表示されましたでしょうか?

しかし、コンピューターにこんなつまらない計算をさせるのは、こちらとしてもつまらないですよね?

xの後ろの式をあなたの好きなように自由に書き換えてください。しかし、Pythonの辞書の中には「×」や「÷」という記号は登録されていません。その代わりに "*" や "/" が使われます。

特に計算させたい数字が思いつかない人は、たまたまポケットに入っていたレシートの内容を手打ちして計算させてもいいですし、以下の計算をさせてみたりしてください。

  • 16 * 24
  • 30 / 6
  • 150 / 223 + 336 * 458
  • 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 10 + 11 + 12
  • 3.14 * 12 * 12
  • 6.17 + 84.2 - 43.263

一瞬で答えを出すけど?

さて、多分コンピューターはどんな式を入力して計算させても、一瞬で答えを出したかと思います。

ところで、いちいちソースコードを書き換えて[F5}キーを押すのは多少面倒かもしれませんね。ここで対話式プログラミングという方法を使ってみましょう。

まず、先ほどからプログラムの実行結果が表示されるウィンドウを選択します。
そして次のように入力して[Enter]を押してみましょう。

x = 128 + 256

続いて次のように入力して[Enter]。 (Python2.X.Xで取り組んでいる人は今回の章の今後はprintの()はいりません。)

print(x)

もうおわかりですね。Pythonのソースコードを1行1行入力すると逐次実行してくれます。

こんな時はどう返す?

ところで、先ほどまでごく普通に変数xの後ろの式を書き換えていたかもしれませんが、この時
「あれ? 前のxの値に加算されるのでは?」と思った方がもしかしたらいらっしゃるかもしれません。

ではここで次のソースコードを対話モードで1行ずつ入力してみましょう。あ、注釈は書かなくてもいいですよ?

x = 10 # x に 10 を代入
x = 20 # x に 20 を代入

# さて答えは?
print(x)

さて結果はどうでしたでしょうか? おそらく「20」と表示されたかと思います。

それでは先に入れた10はどこに行ったのでしょうか……残念ながら消えました。

そう、コンピューターは常に新しい情報しか覚えていません。過去にどんな重要な情報があったとしても、プログラムでの指示やユーザーからの入力があれば即座にもともと入っていた値は捨てられて、すぐに新しい値に置き換えられます。

それでは現在の変数を値を加算したり減算するのはどうすればいいでしょうか? こう書きましょう。

x = 10 # x に 10 を代入
x = x + 20 # x に x + 20 を代入

# さて答えは?
print(x)

はて、ちょっとこの式をみて不思議に思うかもしれません

「x + 20 だけでいいのでは?」と。では試しにやってみましょう!

x = 10 # x に 10 を代入
x + 20 # x に 20 を加算(のつもり)

# さて答えは?
print(x)

対話モードで行った場合は2行目を実行したところで「30」という値が表示されたので正常に処理がされたと思われがちですが、その後に表示されたxの中身は10ですね。さてどっちが正しいのでしょう?

今注目しているのは「変数が加算されたか」なので、変数の中身を表示している最後の「10」の表示が正しいことになります。ではさっきの「30」は?

さっきの「30」はコンピューターが演算した結果を素直に示しているだけなので、その値は次の行に移る頃にはすぐに破棄されます。

コンパイルエラーを出してみる

ではここであえてコンピューターから「間違っている」と叱られるソースコードを書いてみましょう。

x = 10
x = x + 20
pront(x)

このソースコードを「error.py」として実行してみましょう。 もしかしたら何度も見たかもしれませんが、次のようなエラーメッセージが出てきたと思います。

Traceback (most recent call last):
  File "error.py", line 3, in <module>
    pront(x)
NameError: name 'pront' is not defined

せっかくなのでこのエラーに関して解説していきましょう。

1行目は「このソースを追ってみたんだけど……」というコンピューターからのメッセージ 2行目は「error.pyの3行目」と場所を示してくれています。 3行目はその行の内容。 4行目は「具体的に言うとこういう間違いだ。よく調べろ」 というコンピューターからの指摘になります。

素直すぎるコンピューター氏 ―あなたの書いた通りにしか動かない―

最後に、ちょっとこわい実験をしてみましょう。以下のソースコードを書いてみてください。

while True:
  print("なにか好きな文字") #頭の2つ半角スペースを忘れない

このソースコードを「infiniteLoop.py」として保存して実行してみましょう。

なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字
なにか好きな文字


# 以下永遠と続く……

はい、このまま動かし続けると面倒なので[Ctrl] + [C]で強制停止しましょう。

次回詳しく説明する命令ですが、whileという繰り返しを行う命令にTrueという条件を設定し、繰り返しする処理の内容に print("なにか好きな文字") という命令を書き込むことで、コンピューターを操作している人が強制停止させない限り、print命令で指定した文字をコンピューターが本気で書き続けるというプログラムが出来上がるのです。これを無限ループと呼んだりします。

このように、ソースコードの書き手は無限ループを期待していなかったとしても、コンピューターは書かれたソースコードを元に翻訳し、そのとおりに仕事をしますので、動かしてみたら思わぬところで無限ループに陥ったり、別の処理を行っていたりということがよくあります。

まとめ

ということでやっとまとめです。

まずコンピューターはどんなやつなのかというと「仕事は完璧にこなすけど、本当に指示どおりにしか動けない」というやつである。 ということだけでもわかっていただけたら幸いです。

この2言を実証するためにいままでのながーい説明があったと言っても過言ではありません。

つまるところ、コンピューターは何を考えているのかというと「何も考えずに指示通りに演算している」だけです。なんてこったい!

そんな融通やなあなあの通じないやつですが、しっかり指示を出せば1万件のアンケートをすぐにまとめたりすることができます。 ということで、次回からもう少し柔軟に作業してもらうための命令を教えていきたいと思います。

最後に、しまりのないプログラミングスクールなのでこの言葉でしめます。

「今回私が話したことは、あなたや私が忘れてしまっても、一生使わないと呪っても、私達が知識を失わないのは、誰かが覚えていてくれるからです。コンピューターの仕組みや気持ちを忘れても、このことは忘れないでください。これで今日のスクールを終わります。」

参考資料