資料シート●[情報処理]

プログラミング
△
< |
>
http://www.infonet.co.jp/apt/March/syllabus/Literacies/programming.html
プログラム
アルゴリズム
エウクレーデス法
プログラミング
機械語
アセンブラ
アセンブラ言語
プログラミング言語
高級言語
代入
参照
容器
順次
繰り返し
場合分け
呼び出し
fortran
basic
algol
pascal
c
c++
Java
JavaScript
オブジェクト指向プログラミング
lisp
prolog
コンパイラ
デバッガ
リンカ
make
インタプリタ
今回の迷信
"プログラミング言語はコンピュータのことば"
???
アルゴリズム
何かの仕事をするための作業の手順を
アルゴリズム(algorithm)という。
数の計算(>
[情報])はもとより、ストリングの変形(どっちも
[情報]で学習した)、画像や音の加工(
[像+音])など、情報を廻るいろんな作業に対してアルゴリズムが知られている。
プログラム
何かの仕事を他人にしてもらいたい場合、求めている結果の内容をきちんと相手に説明しても、その結果がなかなか出してもらえないことがある。これは、相手がその仕事の
アルゴリズムを知っているとは限らないからだ。このような場合には、その仕事の
アルゴリズムを、
相手が知っている作業の要素を
相手が知っている組み合わせ方によって組み立てて、
あらかじめ相手に教えておくことが必要だ。この情報を
プログラム(program=予記)という。
OSに包まれているコンピュータの本体は、
CPUと
メモリと、それらを互いに繋ぎ合わせている
バスから構成されている。
CPUは
ビット列と
ビット列とを組み合わせて新しい
ビット列を作り出したり、それらをメモリに対して読み書きしたりするように作られている。現代の
CPUは、このような機能を数十種類以上備えている。
CPUのいろいろな機能は、(足し算や等しいかどうかの判定などの)機能の種類と、その機能を実行させるのに使う(計算の素材になる数を読み出させたり、計算の結果を書き出させたりするための)メモリのアドレスと、そのほかの細かい指定の組合せを、それぞれを表わす
ビット列をくっつけて並べた
符号を使って表現することができる。これを
命令(instruction)という。
CPUの中には
命令レジスタ(instruction register)という部分があって、ここに機能の
符号を書き込んでから合図をしてやると、
CPUにその
命令を実行させることができる。この連続によって、数の
計算やストリングの探索(のようにわたしたちには見えるところの)いろんな処理が実現している。したがって、
CPUに一つのまとまった仕事をさせるための(本来の意味での)プログラムは、
命令を順に並べることによって表現することができる。
プログラムをあらかじめ作っておき、それをメモリの一連の範囲に書き込み、先頭の
命令から順に命令レジスタに読み込んでは実行を繰り返すようにしておけば、
CPUはそれを実行して、作文を手伝ったり工場の機械を制御したりする作業をしてくれる。コンピュータの最も外側を包んでいるアプリケーションや、そのすぐ内側を包んでいるOSの実体は、大部分がプログラムだ。
命令を単語と考え、その並べ方を文型と考えると、
CPUのためのプログラムの書き方の規則は、日本語のような言語になぞらえることができる。これを
機械語(machine language)ということがある。
プログラミング
プログラムを作る作業には、以下のような作業が含まれる。
○外部設計
どんな機能を持ったプログラムを作るといいか考える
○内部設計
その機能は、どんな手順と呼びかけ合いとで構成できるか考える
○(狭い意味での)
プログラミング
手順と呼びかけ合いをプログラムとして書き下す
これらのうち、難しいのは(そしておもしろいのは)、どっちかと言うと初めの二つの方だ。この意味で、プログラムを作るのは、書道で書を書くのよりはむしろ小説を書くのに似ている。
手順をプログラムとして書き下すのは、人手ではかなり難しい。それは第一に、
CPUが実行できる
命令は、書き下そうとしている手順からすると細かすぎて、全体が見渡しにくいからだ。そこで、
命令をそのまま書き下す代わりに、もっと大づかみな機能(たとえば指定した数式を計算してくれるぐらいの)を持った架空のコンピュータを想定して、プログラムを作る手法(▽図)が使われている。
架空のコンピュータのプログラムを書くつもりでプログラムを書く
▽
そのプログラムを実際のコンピュータのプログラムに書き直す
初めの段階で書くプログラムを
ソースプログラム(source program)という。ソースプログラムは、実際のプログラムとは違って、内容については同等だけれど、そのままでは実行させることはできない。
ソースプログラムから実際のプログラムへの書き直しの作業は、(人手でやる場合もあるが)ふつうは情報システムにやらせてしまう。架空のコンピュータのプログラムを現実のコンピュータのプログラムに翻訳するアプリケーションを
コンパイラ(compiler)という。
コンパイラに対するソースプログラムを書くための記法を
高級言語(higher-level language)という。架空のコンピュータとしては何種類かの使いやすいものが考えられていて、それぞれに対応するいろんな高級言語(
あとで学習する)が決められている。
架空のコンピュータではなく、どうしても実際の
CPUの機能に合わせてプログラムを作りたい場合もある。こんな場合でも、せめて
ビット列ではなく、読み書きはできるように、動詞はふつうの単語(またはその短縮形)で、アドレスは数や名前でプログラムを書きたい。こんな場合は、コンパイラの代わりに、それぞれの
CPUの機能に合わせた特別な翻訳システムが使われる。これを
アセンブラ(assembler)という。
アセンブラのソースプログラムを書くのに使う記法を
アセンブラ言語(assembler language)という。アセンブラ言語は、文型や意味については機械語と全く同じで、それぞれの単語を決められた
ビット列で書くかふつうの動詞や記数形で書くかが違うだけだ。したがって、アセンブラ言語という一つの記法があるわけではなくて、
CPUの種類の違いによって、それぞれのアセンブラ言語がある。
高級言語とアセンブラ言語を合わせて
プログラミング言語(programming language)という。
実際のプログラミングでは、一つのプログラムをいくつもの部品に分けて、個別に作っていく。その方が、作っていて見渡しやすいし、それぞれを別々のコンパイラやアセンブラで生成することができるし、前に作った部品を使い回して性能を揃えることもできる。このため、いくつもの部品プログラムを一つに結合するシステムが必要になる。このようなシステムを
リンカ(linker)という。
さらに、このような場合は、コンパイラやアセンブラにどのソースプログラムを変換させ、リンカにそれらの結果と前からあるプログラムのどれを結合させるかをあらかじめ指示しておいて、自動的に実行させることが必要になる。これを行なうシステムがいくつかある。unixでは、その初期から
makeというアプリがこの目的で使われている。
コンパイラとは逆に、現実のコンピュータに代わって、架空のコンピュータのふりをして、ソースプログラムを実行するシステムを使うこともある。このようなシステムを
インタプリタ(interpreter)という。インタプリタに実行させるプログラムは、
スクリプト(script=台本)と呼ぶことが多い。
プログラミングが難しい理由の一つは、プログラムのレベルとコンピュータのレベルとがかけ離れていることにある。プログラムの中で使いたい作業の要素は複雑で多様だが、実際のコンピュータが行なえる作業の要素は単純で種類も少ない。この隔たりを埋めるには、プログラムのレベルをコンピュータに合わせて引き下げるか、コンピュータのレベルをプログラムに合せて引き上げるかしなければならない。コンパイラもインタプリタもそのためのシステムと考えることができる。コンパイラは翻訳によってプログラムのレベルをコンピュータのレベルまで引き下げ、インタプリタは実際のコンピュータに仮想的なコンピュータのまねをさせることによって、コンピュータのレベルを引き上げている。
プログラムを作っていて、実際に期待したとおりに動かない場合には、どこでどう期待から外れてしまっているのか確かめることが必要になる。そのためには、▽表のような特別な機能を持った、
デバッガ(debugger)という専用のインタプリタが役に立つ。
少しずつ実行させることができる
あらかじめ決めておいた所まで進んだらそこで止めることができる
容器の内容が変化していくようすを確かめられる
△
デバッガの特別な機能
高級言語
手続き型言語
高級言語の多くは、(基本的に)一連の
代入(assignment)の連続としてプログラムを組み上げていくようにできている。このような高級言語を
手続き型言語という。今は、手続き型言語では
c(およびそれを発展させた
c++)と
basicが最もよく使われている。これらはそれぞれ、
algolおよび
fortranという歴史の古い記法を発展させて作られた。また、論文の記事として
アルゴリズムを書き表すのには、
pascalという記法がよく使われている。このほかにも、今では使われなくなったものまで含めれば、たぶん百種類以上の手続き型言語があるだろう。
手続き型言語が想定している架空のコンピュータには、名前のついた
容器(一般の呼び方では変数=variable)がいくつも準備してある。そして、そこから内容を読み出しては何かの加工をして、その結果を同じ容器や別の容器に書き込む作業を繰り返していくことができるようになっている。どんな加工をするかは代入の右辺に式を書いて指定し、その結果を書き込む先は左辺の式で指定する(▽図)。
C[I,J]:=A[I,J]*B[I,J];
S:=greyed(T);
△
実在しないがありそうな手続き型言語による代入の記述の例
上:縦横に切れている二つの表A,Bの、(I,J)番目の欄に書き込まれている2数の積を、第3の表Cの対応する欄に書き込む。I,Jも容器で、そこには番号として使う数が書き込まれている
下:Tに書き込まれている写真を白黒に変換して、その結果をSに書き込む
式の中には容器の名前を書くことができる。容器の名前が書いてあったら、それはその時点でのその容器の内容を意味するものとして取り扱われる。このしかけを
参照(refference)という。
容器としては、内容(たとえば点の座標)に合わせて中が細かく仕切られているもの(x,y,zの三つの仕切り)を作っておくこともできる。このような容器については、代入や参照は、全体でもできるし、仕切りごとにもできる。
手続き型言語は、
CPUの機能と考え方が対応するように作られている(▽図)。
手続き型言語の概念
|
CPUの機能
|
代入
|
命令
|
容器
|
メモリ
|
△
手続き型言語の概念とCPUの機能との対応
代入の
順並び(permutation)だけでは、あまり多様な作業は表現できない。しかし、これに
繰り返し(iteration)と
場合分け(condition)を組合わせると、たいがいの手順は組み立てられることが知られている。そのため、手続き型言語では、これらのパタンにしたがってより小さい手順を並べることによって、より大きい手順を組み立てるようになっている。部品になる手順を組み立てて、それに名前をつけて、全体の組み立てに使うこともできる。この部品を
機能素(一般的には関数=function)と言う。大きい手順の中で部品の手順を使うことを
呼び出し(call)という。
ウェブに、見る人との応答や、時刻を調べてそれに応じて変化するような能動的な機能を持たせるには、二つの手法が考えられる。一つは、
アプレット(applette)と呼ばれる小さいアプリを作って、それをスチルなどと同じようにページの一部として埋め込む手法だ。もう一つは、ページ全体を一つのアプリにする手法だ。
初めの方式を実現するためのシステムとして、現在は、
Java(ジャバ=ジャワまたはコーヒー)が広く使われている。Javaは、アプレットをプログラミングするのに使う
コンパイラ(ともちろんそのプログラミング言語)、および
ブラウザに架空のコンピュータとしての機能を持たせるプラグとで構成されている。
ウェブを作る側は、Java語でプログラムを書き、それをコンパイラに通すと、実在のコンピュータではなく、架空のJavaコンピュータ用のプログラムが生成される。それをウェブのページに埋め込んでおく。
ウェブを見る側は、あらかじめプラグを
ブラウザに架空のコンピュータとしての機能を持たせるプラにつないでおく。こうしておくと、
ブラウザに架空のコンピュータとしての機能を持たせるプラはJavaアプレットが埋め込まれたページに出会うと、Javaコンピュータとしてそのアプレットを実行することができる。
あとの方の手法を実現するには、
JavaScriptなどのプログラミング言語を使う。JavaScriptの場合だと、ページの内容のうち、応答などによって変化させたい部分をJavaScriptの表示命令(正確には表示文)とその前後の処理のプログラムとしては、(一部の)代わりに書きこんでおく。JavaScriptをカバーしているブラウザがこのページに出会うと、ブラウザはJavaScriptプログラムを実行してその結果としてページの内容を表示する。
今では、多くの
ブラウザはJavaScriptを実行できるようになっている(動かさないように調整してあるかもしれないが)。
高級言語
オブジェクト指向言語
実際に形のある機械は、少しの機能しか持っていないより単純な部品から組み立てられている。そして、その部品もまたさらに細かい部品から組み立てられている。情報システムも、機械と同じように部品(ボタン、ウィンドー、いろんな変換器など)を作って組み立てるという考え方で作り上げていくことができる。このようなプログラムの作り方を、
オブジェクト指向プログラミング(object-oriented programming, OOP)という。
オブジェクト指向プログラミングに便利なように手続き型言語などを強化したものを
オブジェクト指向言語(object-oriented language)という。
プログラムの部品を
オブジェクト(object=物体)という。オブジェクトは、実際の機械の部品とは違って、(仮想的な)機械が動作している途中で必要に応じて増やしたり減らしたりすることができる。また、その時に新しい機能を追加することもできる。オブジェクト指向プログラミングでは、このことを活かして単純なしくみで強力なはたらきのできるシステムを作ることができる。
高級言語
関数型言語 論理型言語
lispは、必要としている結果を素材から算出する関数を定義することによってプログラムを組み立てる記法だ。扱える素材の形式は、リストといって、数やストリングを並べたもの(とそれをまた並べたものとそれをまた..)だけだが、単純な割りにはいろんなプログラムを組み立てることができる。
prologは、仮定+結論のタイプの命題の集合としてプログラムを組み立てるための記法だ。そこに、必要としている結果に対して望んでいる条件を書き加えることによって、条件が成立するような結果を命題の中に現われている項目の中から探し出させることができる。
これらの記法は、素材から結果を得るために容器を準備したり処理の順番を工夫したりしなくてもプログラムが作れるという点で、手続き型言語よりも優れている。これらの記法のタイプを、それぞれ
関数型言語(functional language)、
論理型言語(logical language)という。
[演習]
演習の進め方をよく確認してからとりかかりなさい
残りの部分
・
アプリケーションやOSのほとんどの部分はプログラムだというが、それ以外には何が含まれているだろうか。
新しくアプリケーションを使えるようにするには、いくつかのファイルをハードディスクのどこかに書き写す必要がある。それらのファイルの中には、プログラム以外のものが書き込まれているファイルもある。その内容を調べれば、アプリケーションを構成する要素として、プログラムのほかにどんなものが必要か分かるだろう。
・
コンピュータを使い慣れていないと分からないかもしれない
自分で考えなさい
エウクレーデス法
・
アルゴリズムは、本来は最大公約数を求める方法の一つを指していたが、それが拡張されて、一般の作業の手順を指すようになった。その
アルゴリズムは、最大公約数が引き算だけで求められるというふしぎな方法で、今では
エウクレーデス法(Eucleides-、ユークリッド-。資料
[Eucleides法])と呼ばれている。
なぜこんな
アルゴリズムで最大公約数が算出できるのか説明しなさい。
・
適切な例を使ったり、図を描いたりして、(学生ぐらいなら)誰にでも分かるように説明しなさい
・
報告例
近堂真弓
この報告を見てしまうと、自分で課題を学習することが難しくなる
この課題に取り組むつもりなら見ない方がいいだろう
アルホワリズミ
・
エウクレーデス法が
アルゴリズムと呼ばれていたのは、
アルホワリズミという数学者が著書の中で紹介したかららしい。アルホワリズミの本に載っている算出法という意味でそう呼ばれたのかもしれない。
アルホワリズミの業績について調べ、現代の意味での
アルゴリズムを軸にして紹介しなさい。
・
自分で資料を探して調べなさい
・
報告例
今西彩乃
プログラミング言語
・
講義で取り上げられたプログラミング言語のうちからどれか一つを選んで、その使われ方について調べてみなさい。
何か特徴が見つかったら、具体的な例を示してその特徴を説明しなさい。
時期によって使われ方が変化してきたものも多いので、歴史と現状とを区別して調べなさい。
・
自分で調べなさい
自分でプログラミング言語を使って実際にプログラムを作った経験がないと少し難しいだろう
・
報告例
稲森久子
手順の大きさ
・
手近なコンピュータについて、以下の(ア)、(イ)を調べ、それらから、わたしたちが基本的だと感じる作業の単位と、
CPUの
命令との細かさの差を推定してみなさい。
ア)ほどほどの幅丈のカラー写真のウィンドーを開く。そして、その全体に対して、ぼかしなどの加工をさせ、かかった時間を測る。
この時間を、写真の幅(単位:ピクセル)と丈(同左)とで割ると、写真の単位のます当たりの加工に必要な時間が分かる。
イ)そのコンピュータに入っているCPUが1秒に実行できる命令の個数を調べる。
コンピュータのマニュアルやカタログには、CPUのクロック周波数が書いてある。これは、CPUが1秒に実行できるインストラクションの個数とほとんど同じだと考えていい(正確にはその何倍かかもしれないがここでは無視していい)。
・
自分で調べて考えなさい
・
報告例
飯村美智子
この単元の内容と関係がある手引きの記事
▽
2.3 プログラム
7 VisualBasic for Application

△
Ada

△
紋紙
△
< |
>
Copyleft(C) 1999-00, by Studio-ID(ISIHARA WATARU). All rights reserved.
最新更新
00-02-14