SlideShare a Scribd company logo
1 of 19
Download to read offline
ハードウェアエンジニアとRUBY
自己紹介
身の回りの生活家電メーカー勤務→電気電子エンジニア
経歴
 半導体業界にて業務(イメージセンサ、ゲーム)
 IT系勉強会に参加。勉強会出るたびに視野の狭さに気づく。
 Fukuokarbに参加。居心地がよかったので続けられている。
 周囲ではプログラミングは業務効率化の手段でしかなかった。
 隔週の集会には出るが発言なしの幽霊部員。
Fukuokarbにてアンダースタンディング コンピュティテーションという
本を紹介してもらいプログラムの面白さに気づく。
個人的にはグローバル化、境界がなくなるにつれて異業種異種格闘技みたいなことが
もっと起こってほしいと思っている。
別の視点で事象を見ると新たな発見があり面白い。
Rubyってなんですか
メタプログラミング
 ロジックを直接コーディングするのではなく、あるパターンをもったロジックを
 生成する高位ロジックによってプログラミングを行う方法、
 またその高位ロジックを定義する方法のこと。
 に対象言語に埋め込まれたマクロ言語によって行われる。
抽象度を高める作業
抽象度が高いコードと理解
プログラミング言語に潜む抽象性
; 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言語で書くと
プログラミング言語に潜む抽象性
print "hello world!"
puts "hello world!"
p "hello world!"
終わった後改行なし
終わった後改行あり
データの形式がわかるように表示
抽象度が高まるとゆとりが生まれ、さまざまな表現ができる
rubyだと
ハードウェア界隈での抽象性
●トランジスターによる設計
  (スタンダードセル)→配線間のチェックなど
●ゲート記述による設計
 トランジスターをシンボル化
●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フリップフロップ
ハードウェアエンジニアが
アンダスタンディングコンピュティテーションを
どのように読んだか
一部プログラムと機械
  決定性有限オートマトン→状態と入力によって次に遷移する状態が一意に決まる
  非決定性有限オートマトン→ある状態があったとき次の遷移先が一意に決まらないこともある
  決定性プッシュダウンオートマトン→有限オートマトンと無限容量スタックを組み合わせたシステム
                      スタックを持ち、状態遷移時にスタックへ作用できる。
  非決定性プッシュダウンオートマトン
  チューリングマシン→おなじみの計算機、スタックではなく任意の読み書き装置を有する。
二部計算と計算可能性
決定性有限オートマトン
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
規則
規則集
非決定性有限オートマトン
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 Φ Φ
遷移表
規則集
デジタル回路
加算回路、デコーダ回路、マルチプレクサ
デジタル回路
組み合わせ回路
順序回路 フリップフロップ、シフトレジスタ、カウンタ
組み合わせ回路
入力に対して出力が一意に決まる
/*加算回路*/
assign SUM=A+B;
/*桁上がり信号*/
assign CA=(Q==3’h5) & EN;
/*セレクタ*/
assign Q=(S==1’b0) ? D0: D1;
/*エンコーダ、デコーダ*/
HA回路
順序回路
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
現在の入力値だけでなく過去に入力された値によって出力値を決定する
記憶素子を内蔵している。
順序処理
チューリングマシン
チューリングの仮想機械は、
 無限に長いテープ
 その中に格納された情報を読み書きするヘッド
 機械の内部状態を記憶するメモリ
 で構成され、内部状態とヘッドから読み出した情報の組み合わせに応じて、次の動作を実行する。
 ヘッド位置のテープに情報を書き込む
 機械の内部状態を変える
 ヘッドを右か左に一つ移動する
上の動作を、機械は内部状態が停止状態になるまで反復して実行し続ける。
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(左)移動する
決定性オートマトンに加え構成という記憶素子が必要
チューリングマシン
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
規則集
規則
チューリングマシン
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をインクリメントする)
加算チューリングマシン
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章始めのプログラムの簡約を使う
ある意味ノイマン型?
まとめ
アンダースタンディングコンピュティテーションお勧めです。
実際のハードウェアと関係性を結び付けたかったができなかったので今後の課題。
こうしてみてみると、個人的には抽象的なrubyで厳密なチューリングマシンが記述できるのが
興味深く。またHDL記述のように手続き的に書くことで言語が違えど表現できるのが
興味深い。
参考文献
 アンダースタンディングコンピュティテーション
 FPGAボードで学ぶ組み込みシステム開発
 コンピュータアーキテクチャ
 はじめてのFPGA設計
 デジタル回路の教室
 県産業科学技術振興財団資料
ありがとうございました
Shmooとは
f(駆動周波数)
Vdd(電源)

More Related Content

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

DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二
Kenneth Chan
 

Similar to ハードウェアエンジニアとRuby (11)

高見知英のデジタルガジェット紹介
高見知英のデジタルガジェット紹介高見知英のデジタルガジェット紹介
高見知英のデジタルガジェット紹介
 
WebとIoTとMake
WebとIoTとMakeWebとIoTとMake
WebとIoTとMake
 
ゲーム仕様書の書き方 ~大久保磨編~ ver.1.2.0
ゲーム仕様書の書き方 ~大久保磨編~ ver.1.2.0ゲーム仕様書の書き方 ~大久保磨編~ ver.1.2.0
ゲーム仕様書の書き方 ~大久保磨編~ ver.1.2.0
 
DockerでJupyter使おうぜ
DockerでJupyter使おうぜDockerでJupyter使おうぜ
DockerでJupyter使おうぜ
 
こわくないPython その2- ファイナルファンタジーとグレンラガンで学ぶOOP
こわくないPython その2- ファイナルファンタジーとグレンラガンで学ぶOOPこわくないPython その2- ファイナルファンタジーとグレンラガンで学ぶOOP
こわくないPython その2- ファイナルファンタジーとグレンラガンで学ぶOOP
 
北陸エンジニアず 自己紹介資料
北陸エンジニアず 自己紹介資料北陸エンジニアず 自己紹介資料
北陸エンジニアず 自己紹介資料
 
FPGAでmrubyを動かす
FPGAでmrubyを動かすFPGAでmrubyを動かす
FPGAでmrubyを動かす
 
DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二DiGRAJ-GD 12/04/2011 大野 功二
DiGRAJ-GD 12/04/2011 大野 功二
 
情熱プログラマー Passionate programmer100428
情熱プログラマー Passionate programmer100428情熱プログラマー Passionate programmer100428
情熱プログラマー Passionate programmer100428
 
"Psychology of Video Games" Translaters' LightningTalk
"Psychology of Video Games" Translaters' LightningTalk"Psychology of Video Games" Translaters' LightningTalk
"Psychology of Video Games" Translaters' LightningTalk
 
エンジニアのための格ゲー入門
エンジニアのための格ゲー入門エンジニアのための格ゲー入門
エンジニアのための格ゲー入門
 

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