応用プログラミング I II 2009.4.7 1. プログラミングとは 1.1 ハードウエアとソフトウエアパソコンをはじめとするコンピュータは ハードウエア といわれます このハードウエアだけで何ができるかといえば単なる計算だけです もちろんそれを表示することもできませんし キーボードから文字を打つこともできません 計算ができるといっても 数字を入力できないのですから数値を与えることすらできないのです このハードウエアを制御したり 計算させたりするために必要なのが ソフトウエア です ソフトウエアがハードウエアをコントロールしているわけです 前期の文書処理で使ったワープロソフト MS-Word や表計算ソフト MS-Excel もそんなソフトウエアの一つです ソフトウエアがあるからこそ ハードウエアを使うことができるのです そのソフトウエアを プログラム とも呼びます このソフトウエアを作るために必要なのがプログラミング言語なのです 逆にいえば ソフトウエアがあるからこそパソコンというハードウエアが意味を持ってくるのです これはパソコンに限らず 携帯電話機や車 炊飯器といった最近のほとんどのコンピュータ制御のものにも当てはまります それらプログラムはすべて プログラミング言語によって書かれています 区別するために 人が作成するのを ソースプログラム と呼びます このソースプログラムをもとに 実行するプログラムが作られるのです 1.2 アルゴリズム日本語で 算法 といいます 問題を解決する手順をいいます このアルゴリズムは知らなければ使うことはできません 実際に バラバラになったトランプを順に並び替える方法を考えてみましょう 一つではなく いくつもあるはずです コンピュータの世界だけではなく このような実際に行うものもその手順をアルゴリズムということができます プログラムの例をあげます 整列の簡単なアルゴリズムとして バブルソートと選択ソートというがあります 初歩的なアルゴリズムですが これを知っているかどうかは大きな差になります このアルゴリズムは一般的な形で書かれています 特別な場合だけ使えるのではなく一般的な形で書くことができるのがアルゴリズムです もちろん 同じ問題の解決方法としても 複数のアルゴリズムがあることもあります そのアルゴリズムには優劣があります プログラムを見ればわかるように バブルソートは簡単です それに対し 選択ソートはプログラムが少し複雑です しかし 実行時間は選択ソートが半分以下の時間で終わらすことができます もっと早いアルゴリズムとして クイックソートとヒープソートといわれるものがあります どちらも個数が多くなればなるほど バブルソートより早くなりますが 20 個程度のデータでは逆に遅かったりします 一般的にはクイックソートの方が早いのですが 元のデータの並びが悪い場合は バブルソートと同じだけ時間がかかることがあることも知られています ヒープソートにはそのようなことはなく どんなデータであっても同じ時間だけかかることになります つまり アルゴリズムは知っているだけでは不十分で それらがどのような特徴を持ち どのようなときに性能を発揮できるかを知っておかなければなりません 1.3 データ構造コンピュータプログラムが扱うものは ほとんどの場合数値データです しかし 実際に CPU 内のメモリで扱うことができるものは 0,1 の並びでしかありません 従って 整数や実数を扱うときにも それらのデータは 0, 1 の並びで表される形に変換されます 1
実際のデータは 1つの数値を取るだけではなく 複数の数値が集まって1つのデータとなることも多いものです これも あくまでも1つ1つ扱うのも1つの方法ですが これらをある特殊なデータ構造であるリストという形で扱えば その分 取り扱いが良くなります そのリストにも 線形リストや連結リストがあります この2 種類のリストも取り扱いが楽なものと苦手なものがあります 線形リストは 追加は簡単ですが挿入には向いていません それに対して 連結リストは挿入には向いていますが 1つ1つデータをたどることしかできないのが短所です アルゴリズムのと同様にデータ構造も知っているだけでは不十分で それらがどのような特徴を持ち どのようなときに性能を発揮できるかを知っておかなければなりません 1.4 構造化プログラミングとオブジェクト指向プログラミング現在のプログラミングには 構造化プログラミング と呼ばれる構造を持った形で作られるのが一般的です これは コンピュータのプログラム上の手続きをいくつかの単位に分け それぞれを別の形で記述する方法である この細分化には順次 分岐 反復の3つの要素を使って表現して行くことが特徴である 現在では このプログラミング手法が一般的である 現在では オブジェクト指向プログラミング と言われる手法も一般的になっている この考え方では プログラムを細分化したものをまとめ それをクラスとまとめたものです クラスには データとその動作であるメソッドを含むことになります このクラスによって プログラムの再利用生を高め 生産性を高めるのが目的です この オブジェクト指向プログラミング も基本的な処理の流れは 構造化プログラミング によっています 1.5 プログラミング作法ソースプログラムを書く上で 絶対に守らなければならないは各プログラミング言語で文法 ( 規則 ) として決まっています これらを守った上で さらにソースプログラムを作成する上でのガイドラインを含めて プログラム作法と言います このガイドラインでは 括弧の使い方や 空白の開け方 ( インデント ) のような見た目のものも含まれています 規則には従わなければ プログラムは作成できませんが ガイドラインについては守らなくても プログラムの作成にはほとんど影響はありません しかし これに従えば ソースプログラムを作成する際の間違いを減らすことができるやソースプログラムを読む際に理解しやすくなるなどの利点があります 2
応用プログラミング I II 2009.4.7 2. プログラミング言語 2.1 プログラミング言語とはすでに習っていると思いますが コンピュータ ( 正確には CPU) が理解できるのは マシン語 ( 機械語 ) といわれるものだけです このマシン語は人には単なる数字の羅列にしか見えません 2 進数ですが ほとんどの場合 16 進数で表示することが多いのです しかし これでは人間にとっては何がなんだか分かりません そこで そのマシン語を人間の言葉に近いもの ( アメリカで生まれたのでもちろん英語をもとにしています ) で置き換えたものが アセンブラ言語 といわれるものです このアセンブラ言語をマシン語に変換するプログラムをアセンブラといいます 一応 人の言葉に近いものになっていますがわかりにくいものです アセンブラ言語を 低水準言語 ( 低級言語 ) といいます アセンブラ言語では開発効率が低い わかりにくいなどの問題点があります そこで もっと人間の言葉に近い 開発効率を考えた言語の開発が行われました アセンブラ言語に対して この言語を 高水準言語 ( 高級言語 ) といいます ここで扱う C 言語のほかにも BASIC や Fortran, Pascal, Java などが高水準言語です しかし どの言語も英語を元にしているので かなり似たものに見えます ですから プログラミング言語 特に高水準言語はひとつを知っていれば 二つ名以降の学習は割と楽になるこ mov add 24 5F BC 47 ax, bx bx : #include <stdio.h> int main(void) { printf("hello\n"); return(0); 10 print "Hello" public class Main { public static void main(string argv[]){ System.out.println("Hello"); とが多いものです プログラミング言語にはいくつかのタイプがあります C 言語は 構造化 関数型 などといわれることになります それに対し Java 言語の場合は オブジェクト指向 イベントドリブン型 などといわれます 2.2 コンパイラとインタプリタプログラミング言語で書かれたプログラムを ソースプログラム といいます しかし これはマシン語ではないので CPU は理解することができません ソースプログラムを CPU の理解できるマシン語に変換しなければなりません この方法には 2 通りあります 一つ目は コンパイラ といわれるプログラムを使って ソースプログラムをすべて一度にマシン語に直し それを実行する方法です ちょうど英語の本を日本語に翻訳してもらい その本を読むようなイメージです 最初の翻訳のときには時間がかかりますが 本になっているのですから 繰り返し何度でも ソースプログラム ソースプログラム 1 行ずつ コンパイラ マシン語 インタプリタ 実行 3
読むことができます もう一つは インタプリタ といわれるプログラムを使って ソースプログラムを 1 行ずつマシン語に直し 実行する方法です 英語の分かる人にその場で英語の本を日本語に訳して読んでもらうことのようなイメージです すぐに内容は分かりますが その場で訳してもらっているので 時間がかかります もう一度内容が知りたくなったら また 日本語に訳して読んでもらわなければなりません 2.3 連結コンパイラでコンパイルして得られるのはオブジェクトファイルといわれる マシン語 ではありますが そのままでは実行できません 書かれたプログラムをそのままマシン語に変更しただけで それを呼び出す仕組みや 実行開始時の準備 printf のような標準関数は含まれていないためです このため これらの部分を連結して実行形式に直さなければいけません そのために使われるのが連結エディタ ( リンカ ) と呼ばれるものです この連結を行うことで初めて実行できるのです そのため この連結をするためのソースプログラムは一つでなくてもよく 複数のソースプログラムをコンパイルして得られた複数のオブジェクトファイルを連結することもできます C 言語で使う printf のような標準関数はコンパイル済みで パソコンのハードディスクに ライブラリ とい形で保存されています ソース プログラム コンパイラ ライブラリ オブジェクト ファイル 連結エディタ ( リンカ ) 実行形式 2.4 いくつかのプログラミング言語 1950 年代に IBM で開発された最初の高水準プログラミング言語が Fortran でした この Fortran は数値計算の分野で現在も多く使われています この Fortran をもとに簡素化した BASIC も使われています 高校の範囲に含まれるのがこの BASIC です これらの言語はラベルによって好きな行に制御が映ることから プログラムの流れがつかみにくくなるという欠点も持ってました 科学技術計算用の言語である Fortran に対し 他に事務処理用の言語として COBOL も作られました この言語は 事務処理のためのツールを多く含んでいるのが特徴です 現在も 事務処理の分野で分野で使われています これに対し 1970 年頃 構造化プログラミング といわれる概念が提案されました これはプログラムを論理的にわかりやすく記述することを目的としています 現在では この構造化プログラミングがもはや常識となり Fortran や BASIC の現在のバージョンでも 構造化プログラミングの概念を取り入れるようになっています このような言語に ALGOL, C, PASCAL 等があります C 言語は UNIX と呼ばれる OS のために AT&T のベル研究所のリッチー カーニハンらによって開発されたシステム記述用の言語で 構造化プログラミングを基本とする言語です 当初 C 言語はベル研を中心とした一部愛好家だけが使っていた言語でしたが UNIX システムの成功により研究機関へ普及していきました 普及に伴い 当初のシステム記述言語としての役割のほか 現在では科学技術計算 4
用 事務処理 図形処理 各種ゲームなど幅広い分野で使われるようになりました オブジェクト指向プログラミング 用の言語として作られたのが SmallTalk です この言語ではすべてものが オブジェクト としてプログラミングしなければならず かなり面倒でした それに対して C 言語を発展させて オブジェクト指向プログラミング の考え方を導入したものが C++ 言語です よく使われている C 言語をもとにしたために一部の制約はありますが オブジェクト指向プログラミング言語として必要な機能を持っています さらに C++ 言語をもとに発展させて作られたプログラミング言語が Java です C++ 言語に比べ オブジェクト指向プログラミング によるプログラムが必須となります その他に スクリプト言語と呼ばれる Perl, Ruby, Python, PHP などもあります これらの言語では ほとんどの場合はインタプリタを使って実行します これらは 動的に Web ページを生成することに使われています 掲示板やチャットのシステムを作ったり データベースを利用する Web ページの開発に使われます 5