Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

ハードウェアエンジニアとRuby

495 views

Published on

資料

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

ハードウェアエンジニアとRuby

  1. 1. ハードウェアエンジニアとRUBY
  2. 2. 自己紹介 身の回りの生活家電メーカー勤務→電気電子エンジニア 経歴  半導体業界にて業務(イメージセンサ、ゲーム)  IT系勉強会に参加。勉強会出るたびに視野の狭さに気づく。  Fukuokarbに参加。居心地がよかったので続けられている。  周囲ではプログラミングは業務効率化の手段でしかなかった。  隔週の集会には出るが発言なしの幽霊部員。 Fukuokarbにてアンダースタンディング コンピュティテーションという 本を紹介してもらいプログラムの面白さに気づく。 個人的にはグローバル化、境界がなくなるにつれて異業種異種格闘技みたいなことが もっと起こってほしいと思っている。 別の視点で事象を見ると新たな発見があり面白い。
  3. 3. Rubyってなんですか メタプログラミング  ロジックを直接コーディングするのではなく、あるパターンをもったロジックを  生成する高位ロジックによってプログラミングを行う方法、  またその高位ロジックを定義する方法のこと。  に対象言語に埋め込まれたマクロ言語によって行われる。 抽象度を高める作業 抽象度が高いコードと理解
  4. 4. プログラミング言語に潜む抽象性 ; hello.asm [BITS 16] ; リアルモード [ORG 0x7C00] ; 開始位置 start: mov si, msg ; msg の先頭位置を SI レジスタに設定する。 call print_string fn: hlt jmp fn print_char: mov ah, 0x0E ; BIOSに一文字表示を伝える mov bh, 0x00 mov bl, 0x07 ; 文字色(白) int 0x10 ; BIOSの機能を呼び出す。Call video interrupt. ret print_string: next: mov al, [si] ; 文字列から一文字を取得し AL レジスタに設定する inc si ; SI レジスタをインクリメントする or al, al jz exit call print_char jmp next exit: ret msg db 'Hello World!', 0 times 510 - ($ - $$) db 0 ; ブートシグニチャまで0埋めする dw 0xaa55 ; ブートシグニチャ 参照元Qiita https://qiita.com/yoshi-naoyuki/items/fb958e3c914c56baef40 #include <stdio.h> int main(int argc, char *args[]) { printf("Hello, world!n"); return 0; } アセンブラだと C言語だと Hello world をアセンブラとC言語で書くと
  5. 5. プログラミング言語に潜む抽象性 print "hello world!" puts "hello world!" p "hello world!" 終わった後改行なし 終わった後改行あり データの形式がわかるように表示 抽象度が高まるとゆとりが生まれ、さまざまな表現ができる rubyだと
  6. 6. ハードウェア界隈での抽象性 ●トランジスターによる設計   (スタンダードセル)→配線間のチェックなど ●ゲート記述による設計  トランジスターをシンボル化 ●HDL記述  処理内容の記述に対して、複数個の展開を行いやすい メリット  時間短縮  可読性、バグなどの検出向上。信頼性Up  ブラックボックス化することで生産性Up トランジスター記述 ゲート記述 wire clk; wire d; reg q; aways @(posedge clk or posedge rst)begin if(rst==1’b1)begin q<=1’b0; end else begin q<=d; end end HDL記述 Dフリップフロップ
  7. 7. ハードウェアエンジニアが アンダスタンディングコンピュティテーションを どのように読んだか 一部プログラムと機械   決定性有限オートマトン→状態と入力によって次に遷移する状態が一意に決まる   非決定性有限オートマトン→ある状態があったとき次の遷移先が一意に決まらないこともある   決定性プッシュダウンオートマトン→有限オートマトンと無限容量スタックを組み合わせたシステム                       スタックを持ち、状態遷移時にスタックへ作用できる。   非決定性プッシュダウンオートマトン   チューリングマシン→おなじみの計算機、スタックではなく任意の読み書き装置を有する。 二部計算と計算可能性
  8. 8. 決定性有限オートマトン class DFARulebook<Struct.new(:rules) def next_state(state,character) rule_for(state,character).follow end def rule_for(state,character)  rules.detect{|rule| rule.applies_to?(state,character)} end end 状態と入力の組み合わせに対して、必ず規則を一つだけ持つ 1 2 3 b a b a a,b a b →1 {2} {2}  2 {2} {3}  *3 {3} {3} 遷移表 class FARule<Struct.new(:state,:character,:next_state) def applies_to?(state,character) self.state==state&&self.character==character end def follow next_state end end 規則 規則集
  9. 9. 非決定性有限オートマトン require ‘set’ class NFARulebook<Struct.new(:rules) def next_state(state,character) rule_for(state,character).follow end def follow_rules_for(state,character) rules_for(state,character).map(&:follow) end def rule_for(state,character)  rules.detect{|rule| rule.applies_to?(state,character)} end end 与えられた状態と入力に対して複数の規則を持つ 遷移先が状態の集合 1 2 3 4 a,b b a,b a,b a b →1 {1} {1,2}  2 {3} {3}  3 {4} {4}  *4 Φ Φ 遷移表 規則集
  10. 10. デジタル回路 加算回路、デコーダ回路、マルチプレクサ デジタル回路 組み合わせ回路 順序回路 フリップフロップ、シフトレジスタ、カウンタ
  11. 11. 組み合わせ回路 入力に対して出力が一意に決まる /*加算回路*/ assign SUM=A+B; /*桁上がり信号*/ assign CA=(Q==3’h5) & EN; /*セレクタ*/ assign Q=(S==1’b0) ? D0: D1; /*エンコーダ、デコーダ*/ HA回路
  12. 12. 順序回路 module REG4( input CLK,RST, input [3:0] D, output [3:0] Q ); always @(posedge CLK,posedge RST)begin if(RST==1’b1) Q<=4’h0; else Q<=D; end endmodule 現在の入力値だけでなく過去に入力された値によって出力値を決定する 記憶素子を内蔵している。 順序処理
  13. 13. チューリングマシン チューリングの仮想機械は、  無限に長いテープ  その中に格納された情報を読み書きするヘッド  機械の内部状態を記憶するメモリ  で構成され、内部状態とヘッドから読み出した情報の組み合わせに応じて、次の動作を実行する。  ヘッド位置のテープに情報を書き込む  機械の内部状態を変える  ヘッドを右か左に一つ移動する 上の動作を、機械は内部状態が停止状態になるまで反復して実行し続ける。 1 2 3 1/0;L 0/1;R _/1;R _/_;L 0/0;R 1/1;R a,b 2進数をインクリメントする おなじみの計算機 a/b;Lの意味 aを読み込んでbを書き込みLeft(左)移動する 決定性オートマトンに加え構成という記憶素子が必要
  14. 14. チューリングマシン class DTMRulebook<Struct.new(:rules) def next_confguration(confguration) rule_for(confguration).follow(confguration) end def rule_for(confguration) rules.detect{|rule| rule.applies_to?(confguration)} end end おなじみの計算機 構成(状態と左右のテープの組み合わせ) class TMRule def follow(confguration) TMConfguraiton.new(next_state,next_tape(confguration)) end def next_tape(confguration) written_tape=confguration.tape.write(write_character) case direction When :left writen_tape.move_head_left  ........ end end 規則集 規則
  15. 15. チューリングマシン DTMRulebook.new([ TMRule.new(1,’0’,2,’1’,:right), TMRule.new(1,’1’,1,’0’,:left), TMRule.new(1,’_’,2,’1’,:right), TMRule.new(2,’0’,2,’0’,:right), TMRule.new(2,’1’,2,’1’,:right), TMRule.new(2,’_’,3,’_’,:left), ]) 1 2 3 1/0;L 0/1;R _/1;R _/_;L 0/0;R 1/1;R 2進数をインクリメントする。(1011をインクリメントする)
  16. 16. 加算チューリングマシン p rulebook=DTMRulebook.new([ TMRule.new(1,'0',1,'0',:right), TMRule.new(1,'1',2,'1',:right), TMRule.new(2,'0',3,'1',:right), TMRule.new(2,'1',2,'1',:right), TMRule.new(3,'0',4,'1',:left), TMRule.new(3,'1',3,'1',:right), TMRule.new(4,'1',4,'0',:right), TMRule.new(4,'0',4,'0',:left) ]) 加算1(01)+2(011)→3(01110)ちょっと適当 1 2 3 4 0,0;R 1/1;R 0/1;R 0/1;L 1/1;R 1/0;R 1/1;L 参考 http://wiki.bmoon.jp/wiki.cgi/Programming?page= %A5%B3%A5%F3%A5%D4%A5%E5%A1%BC%A5%BF%A4%CE%BB %C5%C1%C8%A4%DF (01)+(011)→(01110) 2章始めのプログラムの簡約を使う ある意味ノイマン型?
  17. 17. まとめ アンダースタンディングコンピュティテーションお勧めです。 実際のハードウェアと関係性を結び付けたかったができなかったので今後の課題。 こうしてみてみると、個人的には抽象的なrubyで厳密なチューリングマシンが記述できるのが 興味深く。またHDL記述のように手続き的に書くことで言語が違えど表現できるのが 興味深い。 参考文献  アンダースタンディングコンピュティテーション  FPGAボードで学ぶ組み込みシステム開発  コンピュータアーキテクチャ  はじめてのFPGA設計  デジタル回路の教室  県産業科学技術振興財団資料
  18. 18. ありがとうございました
  19. 19. Shmooとは f(駆動周波数) Vdd(電源)

×