Document

アルゴリズムとプログラミング
(Algorithms and Programming)
第1回:イントロダクション
情報処理・プログラミング言語の役割
概要
•本講義の目的
•情報処理・プログラミング言語の役割
•プログラミングを学ぶための基礎知識
Oクラス 担当:渡辺正裕
• 所属: 大学院総合理工学研究科
物理電子システム創造専攻
普段いるところ
水曜日:大岡山南9号館(S9)ー705
それ以外:すずかけ台J2棟11階1102室
質問:メールは随時([email protected])
直接なら上記の場所で
1.はじめに
1.1 講義の目的
情報処理の重要性
数値計算:熱・強度計算,気象予測などの物理現象シミュレーション
一秒間に100兆回の浮動小数点演算(4月から東工大で稼動)
データベース:成績,預金,住民基本台帳,...
画像・音声処理技術:電話,ディジタルテレビ,IP電話,ディジタルカメラ
通信技術との融合→インターネット,情報検索...
制御:ロボット,自動車,プリンター,腕時計,各種家電製品...
地球シミュレータによる台風の進路予想解析
情報とは?
– 事物・出来事などの内容・様子。また、その知らせ。
– 〔information〕ある特定の目的について、適切な判断を下したり、行動の意志決定をす
るために役立つ資料や知識(文字、符号、音声、画像。。人間が5感で把握できる記録)
情報処理とは?
情報を加工すること.
情報を処理できるもの
– 人間
– コンピュータ= 情報を加工する機械(現代の情報処理に欠かせない)
コンピュータを使った情報の加工
本講義!!
コンピュータによる情報の加工は
プログラムによって記述される
• プログラム:単純な加工操作(命令)を複数組み合わせて、
複雑な意味のある処理を行う
• データ構造:情報の格納法
• アルゴリズム:格納された情報の加工法
人間の知恵がプログラムに集積される時代
– 各種パッケージソフトウエア.シミュレーションソフトウエア.
– 偽造問題で有名になった建物の構造計算もデータを計算機に入力するだけ
で答えが出るように作られたソフトウェア.
– 職人が持っていた各種の製造ノウハウが製造機械に秘められる.
– プログラムはそのコントロールを担当.
– 非常に製造が難しかったICが製造装置さえ買えば,どこでも作れるように
なった.(ただし、新たな製造方法を編み出す人間の知恵は今後も当然必要)
– 設備投資の先読みが、利益を出すために重要な時代.
– 開発費がかかるソフトウエアは,デファクト・スタンダード化が進む.
– 日本のソフトウエア輸入9,000億円,輸出90億円(鮭の輸出と同程度)
プログラミング言語の必要性
• コンピュータは、本来、CPU(中央演算処理装
置)固有の機械語命令しか実行できない
• 機械語:人間には理解し難い(プログラムを作成するのは人間!!)
→人間が理解しやすいように工夫した
アセンブリ言語(機械語と1対1対応)
より抽象的な概念を取り入れた高級な言語へ進化
FORTRAN, BASIC, C/C++言語, Java
低級言語← 機械語<アセンブリ言語<C言語<Java →高級言語
主なプログラミング言語と特徴
Fortran : FORmular TRANslator,科学技術計算,スーパーコンピュータで昔から利用.
BASIC : 初心者教育用対話型言語.初のインタープリター型.初期のパソコンに付属.
PASCAL : 構造化言語,begin end,関数内関数定義.
COBOL : 事務処理用,昔は60万人COBOLプログラマーと言っていた.
C言語: UNIXを記述する言語として開発.何でもできてしまうため高級アセンブラ的側面も.
C++ : C言語をオブジェクト指向言語に拡張したもの.
Perl : テキスト処理,WebのCGI (Common Gateway Interface)に使われる.
Ruby : Perlと似ている.はじめからオブジェクト指向,日本人が作った.
Smalltalk : 最初のオブジェクト指向言語,XeroxのStarで採用.マウス,イーサネッ
トもStarが最初.
Java : Javaバーチャルマシン上で動く.C++の文法を整理したオブジェクト指向言語.
JavaScript : HTMLに埋めこんで使う.Javaとは無関係.(Java アプレットはJava)
LISP : LISt Processor.データ構造であるリストを処理する.人工知能のための関数
型言語.Emacsで使われている.
Prolog : 人工知能のための論理指向の言語.通産省主導した1980年~1989年の第5
世代計算機の研究で使われた.
本講義の位置づけ
• プログラミング・スキル習得のきっかけに
– 多くのプログラミング言語に通じる基礎概念を学習する
– 電気電子工学の幅広い分野でITセンスが要求される
– 電子回路・電磁気現象・半導体物理等シミュレーション技術の基礎
• 実際に簡単なプログラムを打ち込んで、動かしてみる→少し
ずつ自分で変更を加えて動作を確かめる.
授業・評価方法:
• プログラミング言語として主にJavaを扱い,最後にC言語について触れる.
• 教科書:やさしいJava入門(改訂版), 池田成樹著,カットシステム.
• 期末試験,中間試験,小テスト(演習)
講義内容(予定)
1.情報処理・プログラミング言語の役割
2.情報システムの基礎
3.オブジェクト指向プログラミング
4.変数
5.演算
6.制御構造(条件分岐,繰り返し)
7.クラスとインスタンス
8.配列と行列計算
9.中間試験
10.配列と各種ソートアルゴリズム
11.各種ソートのプログラミング
12.クラスの継承
13.ポリモーフィズム
14.演習のまとめ
注意:
●この講義は「準必修」である.
●しかしながら,後期のプログラム実習で単位を取得するためには,
本講義の内容を理解しておく必要がある.
●したがって、実質必修に近い...
プログラム実習(後期)
●必修講義
●週2回
●VLSI設計室で実際にjavaを使ってプログラムを作成する.
●1テーマごとに,課題説明,事前レポート,プログラミング・実行,
レポートから構成されている.
(予定)課題
• 行列計算
• ソート(撰択ソート,クイックソート)
•自由テーマ(後期の授業だが,早めに考えておくこと)
なぜJavaを勉強するのか
1.オブジェクト指向である(現在のプログラミングの本流.流行っている?).
2.新しい言語なので,信頼性の高いプログラムを作成するために必要な工
夫が多く取り入れられている.
3.家電製品などの組込みシステムがJavaで動いている.
4.広範囲なハードウェア・プラットフォーム上で動く.
5.WebのアプリケーションもJavaが多い.
6.開発環境が無料! 自分のパソコンで自習できる.ぜひインストールしよう!
http://java.sun.com/
7.ライブラリーが充実している(無料のものも多い).
8.最新の統合開発環境EclipseはJavaがメインターゲット
9.Javaがわかれば,他の言語もだいたいわかる(C,C++はすぐにわかる).
10.MITもJavaを最初に教えている.
11.Javaアプレットなどでも使われている.
12.現在,日本のプログラマーの半分は,Javaを使っているとか.
コンピュータの動作の仕組み
ノイマン型コンピュータ(von Neumann computer)
ストアードプログラム型コンピュータ
• どのような処理をするのかあらかじめ命令として定めて蓄積しておく.
• 与えた命令は逐次処理していく.
• 処理内容が変っても計算機の構造は変更しなくてもよい.(プログラムを
変更すればよい)
• 処理内容が同じならば,処理対象が変っても,計算機の構造を変更しな
くてもよい.(プログラムすら変更する必要はなく、パラメータだけ変更す
ればよい)
参考:
それ以前の計算機は,処理内容が変ると配線などを変更していた.
理論的には,万能チューリングマシンがもとになっている.
この辺を勉強したい場合は,「帰納的関数」を勉強すると良い.
余談:ノイマンさんについて.
– 原子爆弾が最も効果的になる爆発高度(580 feet)を計算.
– 京都への原爆投下を進言(標的委員会).
– ソ連への核攻撃を提言.
コンピュータ中のデータ表現
• コンピュータの中では、データ、プログラム(命
令)ともに2進数で表現される
• 初期のコンピュータを設計した人は、2進数にするか3進数にするか、本
気で検討したそうです。結局回路の簡単さから2進数を採用。
2進数(変数:0と1)
例)
1 0 1 1
23
22
21
20
(2)
= 23 + 21 + 20
=11 (10)
16進数
• 2進数は表記が長くなり人間が見にくい
• 10進数だと変換が面倒
• 16進数は、2進数を4桁ごとに区切って表
すと変換が容易
• 2進数の101011を例に取ると..
1 0 1 0 1 1 =2B
2
B
• もっと長くても大丈夫
11001010101101011100011
=
110
0101 0101 1010 1110 0011
= 655AE3
16進数
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
2進数
0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
1010
1011
1100
1101
1110
1111
メモリ(情報の格納庫)
•情報を記憶するところ.(記憶でき
なければ,処理もできない.)
•1 bit : 0 or 1のような2者択一の情報
•1 byte = 8 bit
•1 word CPUが基本的に扱う情報量
(現在のパソコンならば,32 bit,もうすく64 bit).
•一般的にメモリーには,1 byteごとに番値(アド
レス)が付けられている.
アドレス
0000
0001
0002
0003
0004
0005
34
AF
21
D1
04
7F
8bit=1byteのデータ
0 0 1 1 0 1 0 0
FFFE 00
FFFF BB
メモリーのデータにアクセスするときは,まずアドレスを指定する.
その上で,
そのアドレスのデータを取得
そのアドレスにデータを格納
することができる.
内容を指定してデータを取って来ることはできない.
CPU(Central Processing Unit)
中央演算処理装置≡コンピュータの中心:情報処理を実際に行なうもの
CPUの代表例:
●Pentium : Intel社,パソコンのCPUの標準
●Athlon : AMD社,Pentiumと命令が互換のプロセッサ.
●MIPS : スタンフォード大学が開発したRISC-1から発展した.効率良いプログラム実行
が可能である.PlayStation,PlayStation 2に登載されている.
●PowerPC :IBMとMotrolaの共同開発.マッキントッシュに登載されていた.また,プリ
ンター,コピー機などにも登載されている.XBox 2やPlayStation 3には,この発展型が
登載される.
●SH :日立製作所.2オペランド命令セットのRISCアーキテクチャがユニークだった.
カーナビなどで使われている.携帯のアプリケーションプロセッサとしてがんばろうとして
いる...
CPUへの命令は,「機械語」によって書かれている.
機械語は,プロセッサが直接解釈することができる,0と1の列である.
CPUとメモリのはたらき
アドレス
CPU
R/W
メモリ
データ
• CPUとメモリーは接続され,情報処理の大部分はこの両者が共同して行なう.
• アドレス: CPUがメモリーに対してアドレスを指定する.
• R/W : CPUがメモリーに対して,動作が「読み出し(R)」であるか,「書き込み
(W)」であるかを指定する.
• データ: CPUとメモリーの間でデータをやり取りする(双方向).
• メモリーには,次のものが格納されている.
• プログラム: CPUがデータを処理するための命令
• データ: CPUが処理するデータ.
• 命令列は,アドレスの昇順に格納する.
• CPUは基本的には,アドレスの順番に命令を取って来て実行する.
• データは必要に応じて,読み出され,書き込まれる
機械語
機械語は単純.
•CPUは単純な命令を高速時実行し,それを組み合わせて複雑な処理を行なう.
•指定したアドレスのメモリーのデータを使って演算し,その結果を指定したアドレスのメ
モリーに書きこむ.代表的な演算:足し算、ビットをずらす、データを移動する,など.
•メモリーに格納されているデータを,命令を読みこむアドレスとして解釈することもある.
低級言語:
機械にはわかりやすい.(機械語が最も低級な言語)
人間にはわかりにくい.
1つ1つの命令がプリミティブ(単純なことしかできない).
高級言語:
CPUのために機械語に翻訳してやる必要がある.
人間にはわかりやすい.
1つ1つの命令がまとまった意味を持っている.
プログラムの例
機械語(最も低級)
01000000010000110000010000000001
01000000010000110011010100100001
10101100001000100011010010000000
10100100001000100000000000000101
10101100111000000000000000011001
Java
r1 = r2 + r3;
r1 = r1 - 1;
r1 = a[r2];
rray[r2] =
r1;
if ( r7 == 0)
{
命令列
}
アセンブリ言語(機械語と1対1対応)
ADD r1 r2 r3
SUBI r1 r2 0001H
LD r1 [r2 + 5H]
ST r1 [r2 + 3480H]
JNZ r7 0019H
•機械語は何を意味しているかわかり難い.(昔の人は,
一目見てわかった.)
•アセンブリ言語で書けば,各命令の意味はわかるが,
プログラムが長くなると大変になる.
•Javaで書いた方が人間にはわかりやすい.大きなプロ
グラムの場合,機能ごとに分割して記述する.
コンパイラ・インタープリター
JavaやCなどの高級言語は,CPUが直接実行することができない.
コンパイラー:高級言語で書かれたプログラムを機械語に翻訳する.
FORTRAN, COBOL, C, C++などで使われている.
インタープリター:高級言語の文を1文づつ読みこんでは解釈し実行する.
Javaの場合は少し複雑:
コンパイラーがJavaで書かれたプログラムを,バーチャルマシンの中間言語
に翻訳する.
実行するCPUの機械語で書かれたバーチャルマシンのプログラムが,イン
タープリターのようにして,中間言語を実行する.
近年では高速化のために,実行時に,バーチャルマシンの機械語を実行す
るCPUの機械語に変換して実行するものもある(ランタイムコンパイラー).
Javaのコンパイルおよび実行コマンド
javac プログラム名.java (コンパイル)
java クラス名(実行)
まとめ
•
•
•
•
•
•
•
•
•
•
講義の目的(プログラミングを学ぶ)
講義について
プログラミングとは
なぜJavaを勉強するか
コンピュータの動作の仕組(ノイマン型コンピュータ)
2進数,16進数
メモリー,CPU
機械語,高級言語,低級言語
今日の最後に...
自分のパソコンにJavaをインストールしよう.
http://java.sun.com/
• 質問の受付はメールなら随時([email protected])、
直接なら水曜日の午後S9ー7階705室へ.