アルゴリズムとデータ構造

18
アアアアアアアアアアアア アアアアアアアアアアアア 2010 2010 6 6 18 18 アアアアアア( ([email protected] ) ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/ index.html

Upload: cedric-craig

Post on 03-Jan-2016

27 views

Category:

Documents


1 download

DESCRIPTION

アルゴリズムとデータ構造. 2010 年 6 月 18 日 酒居敬一 ( [email protected] ) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/index.html. プログラムとアルゴリズム. 二分木と言った非線形なデータ構造と,これを扱うアルゴリズム,特に再帰的なアルゴリズムについて学ぶ つぎにハッシュやソートと言った良く利用されるデータ構造やアルゴリズムの概観を得る.. Euclidの互除法 (2ページ 1.1 ). mをnで割って、余りをrとする。 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: アルゴリズムとデータ構造

アルゴリズムとデータ構造アルゴリズムとデータ構造アルゴリズムとデータ構造アルゴリズムとデータ構造

20102010 年年 66 月月 1818 日日

酒居敬一酒居敬一 (([email protected]))

http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/index.html

Page 2: アルゴリズムとデータ構造

プログラムとアルゴリズム

• 二分木と言った非線形なデータ構造と,これを扱うアルゴリズム,特に再帰的なアルゴリズムについて学ぶ

• つぎにハッシュやソートと言った良く利用されるデータ構造やアルゴリズムの概観を得る.

Page 3: アルゴリズムとデータ構造

Euclidの互除法(2ページ 1.1 )

1. mをnで割って、余りをrとする。2. r=0であれば、アルゴリズムは終了する。

このとき、nが最大公約数である。3. m←nとする(nの値をmに代入する)。

次にn←rとして1に戻る。

ここでは、次の処理が使われている。•除算•0との比較・分岐処理•変数への代入•繰り返し(ループ)

Page 4: アルゴリズムとデータ構造

/* C言語による gcdの例 1 */int gcd(int m, int n){ int r;

1: r = m % n; if (r == 0) goto 2; m = n; n = r; goto 1; 2: return n;}

/* C言語による gcdの例 2 */int gcd(int m, int n){ int r;

while((r = m % n) != 0){ m = n; n = r; } return n;}/* Java とほとんど同じ */

プログラムは、連接(文の並び順による評価)・条件分岐(たとえば if文)・繰り返し(例えば while文)だけで構成できるとされている。そもそも、 gotoを使わないで書いたほうがわかりやすいことも多い。そのような背景で、 Javaのように gotoを使えないプログラミング言語がある。

Page 5: アルゴリズムとデータ構造

; アセンブリ言語による gcd関数の例 .textgcd: mov.w @(2,sp),r1 ; 引数 m mov.w @(4,sp),r0 ; 引数 n 1: divxu.b r0l,r1 xor.b r2h,r2h mov.b r1h,r2l ; r = m % n beq 2f ; if(r == 0) goto 2 mov.w r0,r1 ; m = n mov.w r2,r0 ; n = r bra 1b ; goto 1 2: rts ; return n .end

戻りアドレス

引数n

引数m

 スタックフレーム

sp+4

sp+2

   sp

簡単なアルゴリズムであればアセンブリ言語でも記述できる。ただし、アルゴリズムが必要とする処理をプロセッサが知っていれば…ちなみに、スタックというデータ構造は、C言語では例のように、さりげなく使われている。

Page 6: アルゴリズムとデータ構造

; アセンブリ言語による gcd関数の例 .textgcd: mov.w @(2,sp),r0 ; m mov.w @(4,sp),r1 ; n beq 1f ; if (n == 0) divxu.b r1l,r0 mov.b r0h,r0l xor r0h,r0h ; m % n push r0 push r1 bsr gcd adds.w #2,sp adds.w #2,sp 1: rts ; return m .end

戻りアドレス

引数n

引数m

 スタックフレーム

sp+4

sp+2

   sp

レジスタ変数 r2(変数 r)が、不要になっている。再帰呼び出しでは、引数は新しい領域に確保される。新しい領域としては、スタックが使われる。

 bsr直後のスタック

sp+10

 sp+8

 sp+6

 sp+4

 sp+2

    sp

戻りアドレス

引数n

引数m

戻りアドレス

引数n

引数m

Page 7: アルゴリズムとデータ構造

学生実験に関するお話• 大学では仮想化された抽象的な知識体系を講義する

– 実システムがどうなっているのかという、体験に基づいた教育は不十分になりがち

• たとえば J97 のコンピュータアーキテクチャの講義では– ハードウェアとソフトウェアのインターフェースに焦点– コンパイラやOSなどの基本ソフトウェアとの関係にも言

• 一方で実システムでは– 物理的な大きさ・費用・量産性といった

現実的な制約の下で設計・製造– 仮想化されたシステムとは、実装の相違・省略がある– 集積技術の発達による構成要素のブラックボックス化

Page 8: アルゴリズムとデータ構造

•同様に、 J97 のプログラミング入門およびプログラミング言語論では、– 手続き型言語によるプログラミングの概念から

プログラム言語の概念・機能を習得• しかし、コンピュータアーキテクチャから

OSまで習得したとしても、– 実システムで CPU をリセットした後で目的の

プログラムが実行されるまでにどのような過程をたどるのか、プログラムはコンピュータシステムの何を制御すべきか、開発ツールの存在理由は何か、といったことを学習することはできない。

Page 9: アルゴリズムとデータ構造

•高知工科大学情報システム工学科のカリキュラム

大学院で開講する「組み込みシステム構成論」( IT Spiral )など、といった講義にもつなげたい

コンピュータリテラシー(1Q1)

情報科学1(1Q2)

情報科学2(1Q3)

情報科学3(1Q4)

情報システム工学実験1(2Q1-Q2)

情報システム工学実験2(2Q3-Q4)

計算機言語1(1Q3)

論理回路(1Q4)

情報システム工学実験4(3Q2)

計算機アーキテクチャ(3Q1)

集積回路システム(3Q4)

計算機システム(3Q2)

OS(3Q3)

アルゴリズムとデータ構造(2Q2)

計算機言語2(2Q1)

ソフトウェア工学(3Q3)

情報システム工学実験3(3Q1)

早期より、ハードウェアとソフトウェアを関連付けたい

Page 10: アルゴリズムとデータ構造

マイコン遊びをする学生が少ない

• たいていのコンパイラやアセンブラは free なのに•マイコン(MCU)などの入手にも困らないのに

– トラ技:2007年8月( dsPIC )、2007年1月( MSP430 )

– DigiKey, RS, MonotaRO などの品揃え豊富な部品屋– Olimex などの安い基板試作サービス

•情報の入手にも困らないのに–ネットで入手できるデータシート・アプリケーションノート

Page 11: アルゴリズムとデータ構造

方針

• アセンブリ言語の利用– 抽象的な知識と実システムの関連を認識

• C 言語とアセンブリ言語の連携– 手続き型言語の動作・仕組みを理解

• OS の機能を使わない– 具体的なメモリや入出力ポートを意識した開

発• プログラムの動作が把握しやすいこと

– 単純なセンサとアクチュエータは必要

Page 12: アルゴリズムとデータ構造

方針•思考力や想像力を鍛える

– OS や ICE (In-Circuit Emulator) を使わない• デバグに使えるものを使う

– 最初は RCX をリセットだけのコード– 以降は順に、モーターを回す、音階を鳴らす、 LCD に表示する

•メモリ管理ユニット (MMU) が不要な部分まで– 2年生の段階でできる– OSの講義を3年次にWS室で行なう

Page 13: アルゴリズムとデータ構造

組込みシステムを使う意義

• 講義時間内にアーキテクチャと動作の仕組みを把握• 制御用のプログラムを開発することが可能

• 実システムとして PC を扱うことは非現実的– システムが階層的に構成されているとはいえ、複雑すぎ

る• 講義時間程度 (30回、 120時間 ) では到底理解できない

– 高度に集積された LSI で構成されている• 構成要素を個別に見て取ることが困難• 動作が高速すぎて動作を実感できない

• それならば、開発対象として周辺機器は?– 小規模でも、独立したひとつのコンピュータがいい– コンピュータシステム全体への理解を望みたい

Page 14: アルゴリズムとデータ構造

学生実験の内容• 学部2年生対象、前提となる知識は次のとおり

– Pascal の演習や Java の実験を履修済み– C言語やアセンブリ言語を使ったことはない– 登録者数は 85名、 RCX を使った実験では 80名参加

• 教員はメイン・サブが各1名、 TA が3名•半年間で 30回開講、 1 回 4 時間で計 120時間

– 前半 15回は個別に課題を解き、 C言語を習得– 後半はおおむね4人の 1グループで RCX を使う

• グループ化後は、 cvs によりソースやレポートを共有

Page 15: アルゴリズムとデータ構造

学生実験課題(セルフ開発)

• C言語の講義・演習– Cコンパイラ (gcc) と、 gdb をつかったデバグ

• make や cvs といったツールによる管理を導入• グループ化後、 LEGO Mindstorms RIS を貸与

– PC と RCX との通信確立– RCX の生存確認、バージョン情報の取得–ダウンローダの作成、 RCX へのダウンロード– S-rec ファイルの読み込み・送信

• 送り込むプログラム自体の作成はしない

Page 16: アルゴリズムとデータ構造

学生実験課題(クロス開発1)

•機械語水準から順に C 言語水準までを講義– 機械語命令( 32bit減算、 16bit乗算、ワード

抽出)– クロスアセンブラ・クロスコンパイラ– ABI(Application Binary Interface)

• 基本となるプログラムを配布し・試行– スピーカを鳴らすだけ– LCD に表示させるだけ

•受講生には配布プログラムを発展・改造– 音階の調整、音楽を鳴らす– LCD への 16進数表示、表示テストプログラム

Page 17: アルゴリズムとデータ構造

学生実験課題(クロス開発2)

•メモリを意識したクロス開発の講義• クロスリンカ

– ld script 、 ld によるアドレス計算・参照解決• ハードウェアの定義

–モジュール定義 ( 構造体変数へのアドレス付与 )

• センサーの取り扱い– センサからの入力・測定ルーチン作成–ノイズ除去 (IIR フィルタ、固定小数点演算

• アクチュエータの取り扱い–モーターの制御、ライントレーサの走行制御

Page 18: アルゴリズムとデータ構造

課題例• アセンブリ言語でプログラムしてみる例•光センサー入力からのノイズを LPF により除去– C 言語水準で光センサ操作、 ADC から光強度入力– LPF を IIR フィルタとして固定小数点演算により実

装– 受講生には叩き台となるプログラムを配布

•C 関数のインターフェース、係数定義だけである

• アセンブリ言語で C 関数 iir_lpf() を記述– デバグのために LCD で戻り値を表示させる