アルゴリズムとデータ構造
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 PresentationTRANSCRIPT
アルゴリズムとデータ構造アルゴリズムとデータ構造アルゴリズムとデータ構造アルゴリズムとデータ構造
20102010 年年 66 月月 1818 日日
酒居敬一酒居敬一 (([email protected]))
http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2010/index.html
プログラムとアルゴリズム
• 二分木と言った非線形なデータ構造と,これを扱うアルゴリズム,特に再帰的なアルゴリズムについて学ぶ
• つぎにハッシュやソートと言った良く利用されるデータ構造やアルゴリズムの概観を得る.
Euclidの互除法(2ページ 1.1 )
1. mをnで割って、余りをrとする。2. r=0であれば、アルゴリズムは終了する。
このとき、nが最大公約数である。3. m←nとする(nの値をmに代入する)。
次にn←rとして1に戻る。
ここでは、次の処理が使われている。•除算•0との比較・分岐処理•変数への代入•繰り返し(ループ)
/* 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を使えないプログラミング言語がある。
; アセンブリ言語による 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言語では例のように、さりげなく使われている。
; アセンブリ言語による 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
学生実験に関するお話• 大学では仮想化された抽象的な知識体系を講義する
– 実システムがどうなっているのかという、体験に基づいた教育は不十分になりがち
• たとえば J97 のコンピュータアーキテクチャの講義では– ハードウェアとソフトウェアのインターフェースに焦点– コンパイラやOSなどの基本ソフトウェアとの関係にも言
及
• 一方で実システムでは– 物理的な大きさ・費用・量産性といった
現実的な制約の下で設計・製造– 仮想化されたシステムとは、実装の相違・省略がある– 集積技術の発達による構成要素のブラックボックス化
•同様に、 J97 のプログラミング入門およびプログラミング言語論では、– 手続き型言語によるプログラミングの概念から
プログラム言語の概念・機能を習得• しかし、コンピュータアーキテクチャから
OSまで習得したとしても、– 実システムで CPU をリセットした後で目的の
プログラムが実行されるまでにどのような過程をたどるのか、プログラムはコンピュータシステムの何を制御すべきか、開発ツールの存在理由は何か、といったことを学習することはできない。
•高知工科大学情報システム工学科のカリキュラム
大学院で開講する「組み込みシステム構成論」( 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)
早期より、ハードウェアとソフトウェアを関連付けたい
マイコン遊びをする学生が少ない
• たいていのコンパイラやアセンブラは free なのに•マイコン(MCU)などの入手にも困らないのに
– トラ技:2007年8月( dsPIC )、2007年1月( MSP430 )
– DigiKey, RS, MonotaRO などの品揃え豊富な部品屋– Olimex などの安い基板試作サービス
•情報の入手にも困らないのに–ネットで入手できるデータシート・アプリケーションノート
方針
• アセンブリ言語の利用– 抽象的な知識と実システムの関連を認識
• C 言語とアセンブリ言語の連携– 手続き型言語の動作・仕組みを理解
• OS の機能を使わない– 具体的なメモリや入出力ポートを意識した開
発• プログラムの動作が把握しやすいこと
– 単純なセンサとアクチュエータは必要
方針•思考力や想像力を鍛える
– OS や ICE (In-Circuit Emulator) を使わない• デバグに使えるものを使う
– 最初は RCX をリセットだけのコード– 以降は順に、モーターを回す、音階を鳴らす、 LCD に表示する
•メモリ管理ユニット (MMU) が不要な部分まで– 2年生の段階でできる– OSの講義を3年次にWS室で行なう
組込みシステムを使う意義
• 講義時間内にアーキテクチャと動作の仕組みを把握• 制御用のプログラムを開発することが可能
• 実システムとして PC を扱うことは非現実的– システムが階層的に構成されているとはいえ、複雑すぎ
る• 講義時間程度 (30回、 120時間 ) では到底理解できない
– 高度に集積された LSI で構成されている• 構成要素を個別に見て取ることが困難• 動作が高速すぎて動作を実感できない
• それならば、開発対象として周辺機器は?– 小規模でも、独立したひとつのコンピュータがいい– コンピュータシステム全体への理解を望みたい
学生実験の内容• 学部2年生対象、前提となる知識は次のとおり
– Pascal の演習や Java の実験を履修済み– C言語やアセンブリ言語を使ったことはない– 登録者数は 85名、 RCX を使った実験では 80名参加
• 教員はメイン・サブが各1名、 TA が3名•半年間で 30回開講、 1 回 4 時間で計 120時間
– 前半 15回は個別に課題を解き、 C言語を習得– 後半はおおむね4人の 1グループで RCX を使う
• グループ化後は、 cvs によりソースやレポートを共有
学生実験課題(セルフ開発)
• C言語の講義・演習– Cコンパイラ (gcc) と、 gdb をつかったデバグ
• make や cvs といったツールによる管理を導入• グループ化後、 LEGO Mindstorms RIS を貸与
– PC と RCX との通信確立– RCX の生存確認、バージョン情報の取得–ダウンローダの作成、 RCX へのダウンロード– S-rec ファイルの読み込み・送信
• 送り込むプログラム自体の作成はしない
学生実験課題(クロス開発1)
•機械語水準から順に C 言語水準までを講義– 機械語命令( 32bit減算、 16bit乗算、ワード
抽出)– クロスアセンブラ・クロスコンパイラ– ABI(Application Binary Interface)
• 基本となるプログラムを配布し・試行– スピーカを鳴らすだけ– LCD に表示させるだけ
•受講生には配布プログラムを発展・改造– 音階の調整、音楽を鳴らす– LCD への 16進数表示、表示テストプログラム
学生実験課題(クロス開発2)
•メモリを意識したクロス開発の講義• クロスリンカ
– ld script 、 ld によるアドレス計算・参照解決• ハードウェアの定義
–モジュール定義 ( 構造体変数へのアドレス付与 )
• センサーの取り扱い– センサからの入力・測定ルーチン作成–ノイズ除去 (IIR フィルタ、固定小数点演算
• アクチュエータの取り扱い–モーターの制御、ライントレーサの走行制御
課題例• アセンブリ言語でプログラムしてみる例•光センサー入力からのノイズを LPF により除去– C 言語水準で光センサ操作、 ADC から光強度入力– LPF を IIR フィルタとして固定小数点演算により実
装– 受講生には叩き台となるプログラムを配布
•C 関数のインターフェース、係数定義だけである
• アセンブリ言語で C 関数 iir_lpf() を記述– デバグのために LCD で戻り値を表示させる