酒居敬一(sakai.keiichi@kochi-tech.ac.jp) アルゴリズムとデータ構造1 2009年6月18日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2009/index.html.

Slides:



Advertisements
Similar presentations
1 B10 CPU を作る 1 日目 解説 TA 高田正法
Advertisements

2.5 プログラムの構成要素 (1)文字セット ① ASCII ( American Standard Code for Interchange ) JIS コードと同じ ② EBCDIC ( Extended Binary Coded Decimal for Information Code ) 1.
アルゴリズムとデータ構造 第2回 線形リスト(復習).
Chapter11-4(前半) 加藤健.
プログラミング入門 (教科書1~3章) 2005/04/14(Thu.).
計算機システムⅡ 主記憶装置とALU,レジスタの制御
実行時のメモリ構造(1) Jasminの基礎とフレーム内動作
応用情報処理V 第1回 プログラミングとは何か 2004年9月27日.
FPGAを用いたMG3用 インターフェース回路の解説
情報科学1(G1) 2016年度.
アルゴリズムとデータ構造 2011年6月13日
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
応用情報処理V 第1回 プログラミングとは何か 2003年9月29日.
オブジェクト指向 プログラミング 第一回 知能情報学部 新田直也.
プログラムはなぜ動くのか.
プログラミング言語論 プログラミング言語論 ガイダンス 水野 嘉明 ガイダンス 1 1.
高性能コンピューティング論2 第1回 ガイダンス
プログラミング演習Ⅰ 課題2 10進数と2進数 2回目.
2016年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
ML 演習 第 7 回 新井淳也、中村宇佑、前田俊行 2011/05/31.
アルゴリズムとデータ構造 2013年6月10日
型付きアセンブリ言語を用いた安全なカーネル拡張
プログラミング言語入門 手続き型言語としてのJava
高速剰余算アルゴリズムとそのハードウェア実装についての研究
アルゴリズムとデータ構造1 2006年6月16日
コンピュータ系実験Ⅲ 「ワンチップマイコンの応用」 第1週目 アセンブリ言語講座
社会シミュレーションのための モデル作成環境
プログラミング言語論 第五回 理工学部 情報システム工学科 新田直也.
Ibaraki Univ. Dept of Electrical & Electronic Eng.
プログラミング基礎a 第1回 ハードウェアとソフトウェア プログラミング総論 ~プログラミング言語とは~
アルゴリズムとデータ構造 2010年6月18日
ユビコン環境構築のためのソフトウェアプラットフォーム ユビコン環境における化身話利用の可能性
アルゴリズムとデータ構造1 2005年6月10日
プログラミング 4 整列アルゴリズム.
プログラミング基礎a 第1回 ハードウェアとソフトウェア プログラミング総論 ~プログラミング言語とは~
Ibaraki Univ. Dept of Electrical & Electronic Eng.
第5章 計算とプログラム 本章で説明すること ・計算の概観と記述法 ・代表的な計算モデル ・プログラムとプログラム言語.
情報とコンピュータ 静岡大学工学部 安藤和敏
先週の復習: CPU が働く仕組み コンピュータの構造 pp 制御装置+演算装置+レジスタ 制御装置がなければ電卓と同様
コンパイラ 2011年10月20日
オブジェクト指向言語論 第六回 知能情報学部 新田直也.
プログラミング言語論 第六回 理工学部 情報システム工学科 新田直也.
2010年度 情報科学序論 ~ 内部構造と動作の仕組み(2) ~.
JAVAバイトコードにおける データ依存解析手法の提案と実装
坂井 修一 東京大学 大学院 情報理工学系研究科 電子情報学専攻 東京大学 工学部 電気工学科
コンパイラ 2012年10月1日
補講:アルゴリズムと漸近的評価.
コンピュータアーキテクチャ 第 2 回.
情報基礎Ⅱ (第1回) 月曜4限 担当:北川 晃.
計算機アーキテクチャ1 (計算機構成論(再)) 第一回 計算機の歴史、基本構成、動作原理
2013年度 プログラミングⅠ ~ 内部構造と動作の仕組み(2) ~.
2017年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
アルゴリズムとデータ構造 2012年6月11日
コンピュータアーキテクチャ 第 2 回.
コンピュータアーキテクチャ 第 5 回.
アルゴリズムとデータ構造1 2009年6月15日
オブジェクト指向言語論 第五回 知能情報学部 新田直也.
コンピュータアーキテクチャ 第 5 回.
情報数学Ⅲ 5,6 (コンピュータおよび情報処理)
プログラムの一時停止時に 将来の実行情報を提供するデバッガ
オブジェクト指向言語論 第二回 知能情報学部 新田直也.
コンパイラ 2012年10月11日
アルゴリズムとデータ構造 2010年6月17日
プログラミング入門2 第6回 関数 情報工学科 篠埜 功.
2014年度 プログラミングⅠ ~ 内部構造と動作の仕組み(1) ~.
オブジェクト指向言語論 第一回 知能情報学部 新田直也.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
2008年度 情報科学序論 ~ 内部構造と動作の仕組み(2) ~.
プログラミング言語論 第九回 理工学部 情報システム工学科 新田直也.
オブジェクト指向言語論 第三回 知能情報学部 新田直也.
Presentation transcript:

酒居敬一(sakai.keiichi@kochi-tech.ac.jp) アルゴリズムとデータ構造1 2009年6月18日 酒居敬一(sakai.keiichi@kochi-tech.ac.jp) http://www.info.kochi-tech.ac.jp/k1sakai/Lecture/ALG/2009/index.html

プログラムとアルゴリズム 二分木と言った非線形なデータ構造と,これを扱うアルゴリズム,特に再帰的なアルゴリズムについて学ぶ つぎにハッシュやソートと言った良く利用されるデータ構造やアルゴリズムの概観を得る.

Euclidの互除法(2ページ 1.1) mをnで割って、余りをrとする。 r=0であれば、アルゴリズムは終了する。 このとき、nが最大公約数である。 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を使えないプログラミング言語がある。

簡単なアルゴリズムであればアセンブリ言語でも記述できる。ただし、アルゴリズムが必要とする処理をプロセッサが知っていれば…  スタックフレーム sp+4 sp+2    sp ; アセンブリ言語によるgcd関数の例 .text gcd: 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 簡単なアルゴリズムであればアセンブリ言語でも記述できる。ただし、アルゴリズムが必要とする処理をプロセッサが知っていれば… ちなみに、スタックというデータ構造は、C言語では例のように、さりげなく使われている。

レジスタ変数r2(変数r)が、不要になっている。 再帰呼び出しでは、引数は新しい領域に確保される。新しい領域としては、スタックが使われる。  スタックフレーム sp+4 sp+2    sp ; アセンブリ言語によるgcd関数の例 .text gcd: 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 1: rts ; return m .end 戻りアドレス 引数n 引数m  bsr直後のスタック sp+10  sp+8  sp+6  sp+4  sp+2     sp 戻りアドレス 引数n 引数m 戻りアドレス 引数n 引数m レジスタ変数r2(変数r)が、不要になっている。 再帰呼び出しでは、引数は新しい領域に確保される。新しい領域としては、スタックが使われる。

学生実験に関するお話 大学では仮想化された抽象的な知識体系を講義する たとえばJ97のコンピュータアーキテクチャの講義では 実システムがどうなっているのかという、 体験に基づいた教育は不十分になりがち たとえばJ97のコンピュータアーキテクチャの講義では ハードウェアとソフトウェアのインターフェースに焦点 コンパイラやOSなどの基本ソフトウェアとの関係にも言及 一方で実システムでは 物理的な大きさ・費用・量産性といった 現実的な制約の下で設計・製造 仮想化されたシステムとは、実装の相違・省略がある 集積技術の発達による構成要素のブラックボックス化

同様に、J97のプログラミング入門および プログラミング言語論では、 手続き型言語によるプログラミングの概念から プログラム言語の概念・機能を習得 しかし、コンピュータアーキテクチャからOSまで習得したとしても、 実システムでCPUをリセットした後で目的のプログラムが実行されるまでにどのような過程をたどるのか、プログラムはコンピュータシステムの何を制御すべきか、開発ツールの存在理由は何か、といったことを学習することはできない。

高知工科大学情報システム工学科のカリキュラム コンピュータリテラシー(1Q1) 早期より、ハードウェアとソフトウェアを 関連付けたい 情報科学1(1Q2) 計算機言語1(1Q3) 情報科学2(1Q3) 情報科学3(1Q4) 論理回路(1Q4) 計算機言語2(2Q1) 情報システム工学実験1(2Q1-Q2) アルゴリズムとデータ構造(2Q2) 情報システム工学実験2(2Q3-Q4) 計算機アーキテクチャ(3Q1) 情報システム工学実験3(3Q1) 計算機システム(3Q2) 情報システム工学実験4(3Q2) OS(3Q3) ソフトウェア工学(3Q3) 大学院で開講する「組み込みシステム構成論」 (IT Spiral)など、といった講義にもつなげたい 集積回路システム(3Q4)

マイコン遊びをする学生が少ない たいていのコンパイラやアセンブラはfreeなのに マイコン(MCU)などの入手にも困らないのに トラ技:2007年8月(dsPIC)、2007年1月(MSP430) DigiKey, RS, MonotaROなどの品揃え豊富な部品屋 Olimexなどの安い基板試作サービス 情報の入手にも困らないのに ネットで入手できるデータシート・アプリケーションノート

方針 アセンブリ言語の利用 C言語とアセンブリ言語の連携 OSの機能を使わない プログラムの動作が把握しやすいこと 抽象的な知識と実システムの関連を認識 C言語とアセンブリ言語の連携 手続き型言語の動作・仕組みを理解 OSの機能を使わない 具体的なメモリや入出力ポートを意識した開発 プログラムの動作が把握しやすいこと 単純なセンサとアクチュエータは必要

方針 思考力や想像力を鍛える メモリ管理ユニット(MMU)が不要な部分まで OSや ICE (In-Circuit Emulator) を使わない デバグに使えるものを使う 最初はRCXをリセットだけのコード 以降は順に、モーターを回す、音階を鳴らす、LCDに表示する メモリ管理ユニット(MMU)が不要な部分まで 2年生の段階でできる OSの講義を3年次にWS室で行なう

組込みシステムを使う意義 講義時間内にアーキテクチャと動作の仕組みを把握 制御用のプログラムを開発することが可能 実システムとしてPCを扱うことは非現実的 システムが階層的に構成されているとはいえ、複雑すぎる 講義時間程度(30回、120時間)では到底理解できない 高度に集積されたLSIで構成されている 構成要素を個別に見て取ることが困難 動作が高速すぎて動作を実感できない それならば、開発対象として周辺機器は? 小規模でも、独立したひとつのコンピュータがいい コンピュータシステム全体への理解を望みたい

学生実験の内容 学部2年生対象、前提となる知識は次のとおり 教員はメイン・サブが各1名、TAが3名 Pascalの演習やJavaの実験を履修済み C言語やアセンブリ言語を使ったことはない 登録者数は85名、RCXを使った実験では80名参加 教員はメイン・サブが各1名、TAが3名 半年間で30回開講、1回4時間で計120時間 前半15回は個別に課題を解き、C言語を習得 後半はおおむね4人の1グループでRCXを使う グループ化後は、cvsによりソースやレポートを共有

学生実験課題(セルフ開発) C言語の講義・演習 makeやcvsといったツールによる管理を導入 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関数iir_lpf()を記述 C言語水準で光センサ操作、ADCから光強度入力 LPFをIIRフィルタとして固定小数点演算により実装 受講生には叩き台となるプログラムを配布 C関数のインターフェース、係数定義だけである アセンブリ言語でC関数iir_lpf()を記述 デバグのためにLCDで戻り値を表示させる