「高等学校情報B」の版間の差分
削除された内容 追加された内容
M フォーマットの整理、用語の整理などを行いました。 |
M フォーマットの変更、細部の注釈などを追加しました。 |
||
42 行
===コンピュータの仕組みと働き===
====コンピュータにおける情報の表し方====
49 ⟶ 48行目:
-->
ここまでで何度かコンピュータ
ここでは、コンピュータを用いて文字や数値や映像などの情報を扱う方法についてまとめる。まず、数値について考える。コンピュータは0と1しか扱うことができない。しかし、0と1だけを用いてもそれらを複数並べることで、より大きな数を表わすことが出来る。実際に、0と1以外の数値を用いるためには、2つ以上の数値を用いることが必要となる。このような数値の数え方を、数学的には[[w:2進数]]と呼ぶ。2進数についての詳しい説明は[[高等学校情報C]]の範囲である。2進数を用いるときには、10進数を用いるときと同様に、1の位が2進数の最大の数である1となった時に、更に1を加えるときには、桁上りが起こる。例えば、0の次は1であるが、1の次は、1の位が1であるため桁上りが起こり、次の数は10である。これはジュウではなく、イチゼロと読む。ここで、次の数は11であり、更に次の数は100である。このような手法を用いて、非常に大きい数も表わすことができる。2進数で表わされた数と、10進数で表わされた数の一般的な対応は、[[高等学校情報C]]の範囲である。
ここまでは整数について考えて来た。一方、数値には小数で現われる数もある。これらは、コンピュータ上では常に有限の桁数を持った数値として表わされる。これは、コンピュータの記憶量が常に有限であるので、無限個の数で表わされる数値を扱うことは出来ないことによる。具体的には小数を、
:<math>
a \times c ^b
</math>
の形に書き表す事が多い。ここで、aは、0から1までの有限の桁数の小数であり、bは、定まった定数であり、cは、元々の数の大きさを表わす数である。このとき、aを'仮数'、bを'指数'と呼ぶ。例えば、cを10とし、元々の数を5.24とすると、
:<math>
5.24 = 0.524 \times 10 ^{-1}
</math>
となるので、仮数は524、指数は-1となる。これによって、上で述べた整数を扱う方法を用いて、小数を扱うことが出来るのである。
ここまでで、コンピュータ上での数値の表わし方について述べて来た。ここからは、文字の表わし方について考える。文字にはラテンアルファベットやひらがな、かたかな、漢字などがあるが、コンピュータがこれらを区別できるようにするためには、これらにたがいに重複しない数値を与える必要がある。
仮にこのような当てはめがなされて、しかも、コンピュータに取って与えられた情報が文字であることが知らされていたなら、コンピュータはその情報を文字として扱うことが出来る。それぞれの文字にどのような数値があてはめられているかは、環境によって異なる。しかし、英語で用いられるアルファベットなどの基本的な文字については、これらは
ほぼ統一されている。一方、日本語の文字に対する数値は、環境によっており、統一されているとはいえないのが現状である。これらの異なった数値は、[[w:文字化け]]の原因となる。
文字化けの問題の解決策として様々な数値の当てはめ方の間を、移りかえる手法が必要となる。実際にどのような数値が当てはめられているかを調べる方法は、高等学校情報の範囲を超えるので、ここでは述べない。
<!--
Unixでは、hexdump
107 ⟶ 73行目:
-->
次に、映像の記録の仕方を説明する。ある映像をコンピュータ上に取りこむときには、その映像は映像を細かい点ごとに区切って表わし、各点の色の情報を数値で表わすことによって表わされる。一般に、全ての光の色は、赤、緑、青の3色の光によって作りだすことが出来ることが知られている。そのため、各々の点について3つの数値を扱うことが、色のついた情報を扱う上で必要となる。一方、白と黒だけで表わされる画像については、黒だけを色として扱えばよいので、各々の点に関してただ1つの数値を扱えばよい。
各々の点に対する数値の上限は、各々の点に対する色数が何通りあるかを表わす数であり、この数が大きいほど、多くの色を作ることが出来、より元の映像に近い色彩で、映像を保存することが出来る。よく用いられる上限は、それぞれの赤緑青の色に対して256通りの色を与える手法であり、この時には合計で
:<math>
256 ^ 3 =16777216
</math>
だけの種類の色が出せることに対応する。[[w:TrueColor]]も参照。
最後に、音に関する情報の扱い方について述べる。
[[w:音]]は、空気などの振動であり、音が聞こえている点での圧力の違いによって、音を表わすことが出来る。詳しくは、[[高等学校理科 物理I]]を参照。[[w:マイクロフォン]]は、圧力の違いによって現われる波形を、電気的な波形に変換する機具であり、これを用いることで、音を、電気的な波形とすることが出来る。
このような波形は、そのままでは数値として扱うことは出来ないが、非常に短い時間間隔でそれらの波形の大きさを記録することで、元々の波形にごく近い波形を、数値情報として取りだすことが出来る。ただし、記録を行なう時間間隔と比べて、非常に速く変化する
波形については、正しく波形を再現することは出来ない。
<!--
[[w:サンプリング定理]]を参照。
-->
====コンピュータにおける情報の処理====
146 ⟶ 96行目:
-->
ここまでにもコンピュータ
コンピュータは[[w:CPU]]を含んでいるが、コンピュータが実行する命令は、全てCPUによって実行される。そのため、コンピュータに対する命令は、CPUの動作を制御することが目的となる。具体的には、CPUは、あるデジタルデータによって表わされる命令を受けつけて、それに対応する命令を実行するように作られている。このため、適切なデータをCPUに与えることで、CPUを思い通りに動かすことができるのである。詳細については[[w:CPU]]、[[w:機械語]]などを参照。
このとき、コンピュータを扱う人間は、CPUがどのような命令に対して、どのような動作を行なうかを、把握していなくてはならないように見える。ただし、実際には、そのような命令を出す作業自体を、コンピュータに代行させることができるため、コンピュータの利用者全てが、そのような命令を把握していなくてはいけないというわけではない。実際[[w:キーボード]]、[[w:マウス]]などを用いてコンピュータに指示を与えることができるが、それらが具体的にどのような命令に対応するかは、コンピュータの構成、特に[[w:OS]]の機能によって異なる。
ここで、コンピュータのこの性質を用いて、コンピュータに行なわせることが出来る仕事を、具体的に述べる。
コンピュータが行なうことが出来る仕事として、古くから知られているものに、'並べ替え'と'探索'がある。並べ換えとは、ある条件に基づいて、与えられたデータの順番を並べかえる操作のことであり、探索とは、与えられたデータの中から、対応するデータを探しだす操作のことである。このように、コンピュータを用いて行なう作業のことを、[[w:アルゴリズム]]と呼ぶことがある。より高度なアルゴリズムについては[[w:計算機科学]]などを参照。
まずは、探索について述べる。ここでは[[w:線形探索]]と呼ばれる手法について述べる。線形探索とは、複数のデータが与えられたときに、それらを順番に探しているデータと比較し、それと等しいデータを探すという探索法である。探しているデータが見つかったときには、見つかったという情報を返し、探しているデータと等しいものが無いときには、探索が失敗したという情報を与える。具体的にコンピュータに探索を行なわせる手法を述べる。
探索されるデータ群と、探すデータの種類は、CPUに与えることができるものとする。具体的な探索手順は次のようになる。
;1 データ群から、最初のデータを取る。
;2 取ったデータと、探していたデータを比較する。等しいときには、4に進む。
185 ⟶ 115行目:
;5 探していたデータは与えられたデータ群には無いことがわかる。
ここで、コンピュータ
次に、並び換えについて述べる。ここでは、[[w:選択ソート]]と呼ばれるアルゴリズムについて述べる。選択ソートとは、与えられたデータの中から最も大きいものを順番に見ていくことで探しだして、それを最初に持って来て、残ったものの中で同じ事をくり返すという方法である。小さい順に並べるには、これをデータの中から最も小さいものを取りだすという手順に入れ換えて、行なえばよい。選択ソートはデータの数が多いときには非効率であることが知られている。
より高速なソートについては、[[計算機科学]]、[[w:クイックソート]]などを参照。
具体的な手順は、
220 ⟶ 142行目:
D. Knuth The art of programming 1. などを参照。
-->
====情報の表し方と処理手順の工夫の必要性====
227 ⟶ 148行目:
-->
ここまでで簡単なアルゴリズムについて学んだ。ここからはコンピューターを用いて、実際に課題を解くことで、学習を進める。
<!--
どのぐらいの難度の課題を扱うのかが明記されていないが、どうするのだろうか
235 ⟶ 155行目:
-->
まず、前章で述べたような、簡単な探索のアルゴリズムを、コンピュータ
CPUに対する命令に帰着することは常に正しい。しかし、CPUに対する命令をそのまま
書くことは、複雑な作業になることが多く、より専門的な知識が必要となる。
244 ⟶ 163行目:
... 。
-->
そのため、CPUに対する命令をより簡単に扱う方法が研究されて来た。ここでは特に、[[プログラミング]]言語を通した手法を用いて、コンピュータに対する命令を扱っていく。
まず、プログラミング言語の説明を行なう。プログラミング言語とは、本来数値として書かねばならないCPUへの命令を、より人間に取って分かりやすい表式で書き換える手法である。最も単純なプログラミング言語は、[[w:アセンブラ言語]]と呼ばれ、ほとんど全てのCPUに対して用いられる。これは、CPUに対する命令のそれぞれに適切な名前をつけ、それを書き連ねることで、CPUに対する命令を述べる手法である。もちろん、書かれた名前は何らかの手法で、CPUに対する対応する命令に置き換えねばならない。このような作業をするソフトウェアを、[[w:アセンブラ]]と呼ぶ。アセンブラは、それぞれのCPUに対して1つずつ存在し、CPUごとに使いわける必要がある。
これは、非常に不便であるので、様々なCPUに対して同一の情報を用いる手法が研究された。現在では、多くのCPUが持っている機能を、人間に取って、分かりやすい方法で書く手法が確立されている。このような手法で用いられる技術を[[w:高級言語]]と呼び、高級言語を対応するCPUへの命令([[w:機械語]]と呼ばれる)に変換するソフトウェアを、[[w:コンパイラ]]と呼ぶ。コンパイラが出力する機械語は、CPUごとに変化させる必要がある。しかし、コンパイラに入力するファイル自体は、それぞれのCPU間で同じものを用いることが出来る場合も多い。
理論的なコンパイラでは、最終的に機械語を出力するということだけが定められており、どのような命令に対してどのような機械語を対応させるかということは、定められていない。そのため、使用者の好みや、歴史的事情などに応じて、様々な高級言語が作成されるに到った。現在主要な言語としては、開発用の言語として、[[C言語]]、[[C++]]、[[Java]]などがある。また、数値計算や科学計算の分野では、[[Fortran]]が広く用いられている。これらの言語は、非常に機能が豊富であり、コンパイラに対する細かい指示を出すことが出来るが、一方で、初心者にはやや分かりづらく、敬遠される向きがある。
実際には、言語を扱うという観点では、機械語に置き換えるのではなく、読み取った言語の内容をその場で実行するプログラムを作ることもできる。このように実行される高級言語を[[w:インタプリタ言語]]と呼び、用いられるプログラムを[[w:インタプリタ]]と呼ぶ。'インタプリタ'は英単語 interpret '解釈する'から来ている。インタプリタは数が多く、よく用いられている言語も多い。
<!--
自分は
書きたいが、この部分がそれぞれの言語の支持者で埋めつくされるのも
あまり好きではない ... 。
292 ⟶ 182行目:
-->
ここでは、簡単なアルゴリズムを扱う言語として、[[w:Python]]を扱う。Pythonは、インタプリタ言語の1つで、教育目的で作られた言語に源があるため、使いやすく、簡単であることが特徴としてあげられる。Pythonの詳細については[[w:Python]]などを参照。また、インタプリタ言語には、古くからある[[w:Perl]]や、日本人が作者であり、近年特に注目を集めている[[w:Ruby]]などがある。興味があれば、これらについても調べてみるとよいだろう。
ここでは、前章で述べた線形サーチに対するプログラムを考える。そのためには、Python言語を用いて、CPUに対する命令を発する手法について、簡単にまとめる必要がある。ここでは、サーチするデータを5つの整数とする。必要な手法は次の通りである。
;値を記憶する。
;2つの数値が等しいかどうか調べる。
313 ⟶ 191行目:
などがある。これらについて、順番に扱う。
値をコンピュータ
a = b
の構文によって行なう。ここで、aは、値が代入される記憶領域であり('変数'と呼ばれる)、bは、aに代入される値である。aは、単に記憶領域を区別するためだけに付けられた名称であるので、どのような名前を用いてもよい。ただし、実際には覚えた情報の意味を表わすような名前を付けた方が、プログラムの意味がより明白になる事が多い。
次に、2つの数値が等しいかどうかを調べる方法について述べる。Pythonでは、この操作は、
a == b
と書かれる。a, bは、それぞれ変数でも定数であってもよい。aとbが等しいときには、この式は、特別な値Trueを返す。一方、aとbが異なる時には、特別な値Falseを返す。ここで得た値は、上の式の結果によって、行なう行動を変えるときに、用いられる。このような操作のことを'条件分岐'と呼ぶ。実際にある条件を課して、その結果に応じて異なった手順を実行するには、
if (a):
b
という構文を用いる。ここで、aは、条件として用いる式であり、bは、条件が満たされたときに実行される文である。より複雑な条件分岐も存在するが、ここでは扱わない。
<!--
より複雑な条件分岐とは、
343 ⟶ 207行目:
else:
のことである。 -->
ここで、これは
if (a):
b
c
d
とするのである。ここで、b, c, dは、異なった文である。これは、でき上がったプログラムを読みやすくする上でも重要な特徴である。
次に数値を並べておく方法について述べる。機械語においては、情報を記録する部分は通常[[w:メモリ]]と呼ばれる。これは、コンピューターのパーツとしての[[w:メモリ]]と同じものであることもあるし、違うものであることもある。これは、現在のコンピューターが非常に多くのメモリを必要とするため、物理的なメモリ以外の記憶装置を用いて、物理的なメモリの代わりをさせるからである。
ここでは、それらを区別しないで、単にメモリと呼ぶ。メモリにはそれぞれの位置に番地が置かれており、それらの番地が続くようにデータを置くことで、それらが続いたデータとして、用いることが出来る。一方、このようなデータの置き方にはいくつかの欠点があり、より一般的なデータの置き方が必要となることもある。pythonでは、いくつかのデータを扱うときには、通常後者のより一般的な配置を用いている。しかし、実際のデータの配置は、自動的になされるので、利用者がそれを意識する事はない。実際にpythonで複数のデータを扱う時には、
[a, b, c]
などのような表式を用いる。ただし、a, b, cは、記憶したい情報の事で、ここでは、整数である。このような表式を[[w:リスト]]と呼ぶ。これらの表式は、1つの変数に代入することが出来る。lという変数に代入するときには、
l = [a, b, c]
のように書く。リストに含まれるそれぞれの情報を扱うには、
l[i]
という式を用いる。ここで、iは整数で、情報が置かれている場所を表わす。ただし、これらの場所は、0から数える必要がある。0から数えるのは不思議に思えるが、多くのプログラミング言語でそうなっている。例えば、この場合では、
l[0]
は、aに等しい。
次に、並べたデータを順に見ていく手法を述べる。機械語を考えると、これは単に、データの数だけ比較をくり返し、それが終わったら全体を終わりにすればよい。重要なのは、データの数をあらかじめ与えておく事だけである。pythonでは、このようなくり返しは、
while (a):
b
を用いてなされる。whileは、aがTrueの間、bの内容をくり返すという命令である。aの値が常にTrueである時には、この命令はbを無限回くり返すという命令になってしまう。そのため、bにおいて、aの内容を変化させるような書き方をすることが、基本的な
手法となる。
最後に結果の出力を行なう方法について述べる。結果の出力を行なうためには、結果を画面に映し出すような手法が必要である。<!--これは、通常CPUの仕事とは
考えられず、画面を扱う[[w:ビデオカード]]の仕事である。しかし、ビデオカードの
処理も、コンピューターのプログラムを通して扱うことが出来、それに対する処理の
サポートは、与えられるプログラミング言語による。理想的なCPUと対応する機械語を考える場合には、
そのような出力を扱う機能は、特殊なCPU命令として扱われることが多い。
いずれにしても、-->pythonにもそのような命令が備わって
print a
と
これらをまとめたプログラムに移る前に、やや高度な内容だが、プログラムの途中でそれ以降の命令の実行を取り止める命令を導入する。この命令は、
exit (0)
の形で書かれる。ただし、この命令は、命令を用いる前に、
という文を書く必要がある。これは、import文と呼ばれる文だが、これについては詳しく説明しない。[[python]]などを参照。
これらの結果を用いて、プログラムを書けばよい。与えられたデータが、
422 ⟶ 262行目:
11: i = i + 1
12:print "I can't find that."
となる。ただし、先頭の数字は解説のためにつけたもので、実際のプログラムには現われない。
ここからはプログラムを順に見ていく。
430 ⟶ 269行目:
している。
3行目では、探している変数をlooking_for_this という変数に代入している。
4行目では、iというくり返しの条件に用いる変数に0を代入している。この値は、後にdataの数だけくり返しを行なうために必要となる。この数は、dataに代入されたリスト内の要素の数と、一致しなくてはいけない。実際には、変数data自身から、data内に含まれる要素の数を取得することも出来る。しかし、それが出来るかどうかは言語や、用いている環境による場合もあるので、ここでは考えない。
5行目が、くり返しの始まりである。この時条件文の中身は、iが0であることから、
0 < 5
となっており、0が5より小さいかどうかを調べている。これは'真'であるので、while内の文が実行される。そのことによって6行目が実行されるが、ここでは、if文を用いて、dataのi番目の要素が、探している量であるlooking_for_thisと等しいかどうかを調べている。ここでは、iが0の時には、data[0]が1であり、looking_for_thisが2であり、条件式は
1 == 2
となるが、これは1と2が等しいかどうかを調べている。これは'偽'であるので、if文の中身は実行されない。そのため、プログラムの実行は次に11行目へと移る。11行目の文は奇異に見えるかも知れないが、=が等しいことを表わす演算子ではなく、代入を表わす演算子であることを考える必要がある。更に、加法の演算子の優先度が、代入の演算子より高いことを考えると、11行目は、'変数iに、現在の変数iの値に1を足したものを代入せよ'という命令となる。結局、iの値に1を加えることに対応する。while文の範囲はここまでであるので、次に文の実行は、5行目に戻る。
ここで、再び、i < 5の比較を行なう。ここでは、さっきと違ってiは1であるが、依然としてiが5より小さいことは変わらないので、再びwhile文の中身が実行される。ここで、iが5になればこの条件式が'偽'となることから、このくり返しは、iが0,1,2,3,4の5回だけ実行されることが分かる。この5回は、リストに貯えた情報の数と一致しているため、ちょうど全ての情報を調べることができるのである。iが1の場合はdata[i]は4であるので、これも求める数ではない。再び、iが1だけ増える手順をくり返すのだが、iが3になったとき、
looking_for_this == data [i]
が'真'になる。ただし、要素の番号は0から数えることに注意。data[3]が2であり、data[4]が5である。このとき、7から10行目のif文の中身が実行される。7行目はprint文であり、書かれた内容を出力する。8行目も、print文だが、今度は、iの中に貯えられている値を出力する。ここで、print文の後に書かれている語の性質によって、print文の動作が変化していることに注意。実際にはこのために複雑な処理をしているが、それについては詳しく述べない。
9行目もprint文だが、これは文末のピリオドをつけるだけである。
10行目のexitは、プログラムの実行を停止する関数であるので、ここでプログラムの実行は止まる。結局探していたデータがdata[3]に保存されていたことがわかったわけである。
ここまでが、最も簡単な探索である線形探索の手順である。探索では[[w:2分探索]]なども有名であるが、ここではそれについてはふれない。[[計算機科学]]などを参照。
<!--
|