SlideShare une entreprise Scribd logo
1  sur  31
Télécharger pour lire hors ligne
1 
Robot言語 
と 
末尾再帰インタープリタ 
2014/OCT/18 
たけおか@AXE 
twitter: @takeoka 
www.takeoka.org/~take/
2 
Robot言語
3 
Robot言語とは 
● 再帰的な曲線を描くための言語 
● 貧弱だが、ピュア関数型言語といえる 
● タートル・グラフィックスで画を描く 
● 非常に単純なプログラミング言語 
● 繰り返し回数を記憶するために、Accが一つだけある 
● オリジナルのRobot仕様書 & 実装 
Litchen Wang: 
An Interactive programming Language for control 
of robots, DDJ, Vol.2, Issue 10, pp.60-63 
(1977). 
● 日本での紹介文書 
石田晴久: ロボット言語, bit,Vol10, No.7, pp.35- 
50(1978)) 
● たけおかのページ 
http://www.takeoka.org/~take/kvm/robj.html
4 
組み込み関数など 
● + 
● 1+ Accをインクリメント 
● - 
● 1- Accをデクリメント 
● h 
● Home 画面中央部に移動 
● n 
● North 画面上方を向く 
● c 
● Clear 画面を消去 
● r 
● Rotate 45度右へ回る 
● f 
● Forward 線を引きながら1step進む 
● j 
● Jump 線を引かずに1step進む 
● t(<非ゼロ文>)(<ゼロ文>) 
● Test Accが0でないなら<非ゼロ文>のみを 
● Accが0なら<ゼロ文>のみを実行する 
● dF(<定義文>) 
● defun ユーザ関数Fを<定義文>として定義する 
● a 
● Acc項になってAccの値を示す 
● このRobotにはAccが一つだけある 
● (0-2^31の値を取る) 
● ユーザ関数 
● 英小文字かつ予約されていない一 
文字がユーザ関数名として使える。 
● dでdefineする
5 
実行例 
● ヒルベルト曲線 
du(t(-vfxuyfufxv+)(x)) 
dv(t(-uyfvfxvyfu+)(y)) 
dx(6r) 
dy(2r) 
chna-5+2ru 
● 無限ループ 
db(z) 
dz(frb)
6 
実行例 
● ドラゴン曲線 
dx(t(-x6rk+)(f)) 
dk(t(-x2rk+)(f)) 
chna-10+x 
● シェルピンスキー曲線 
dx(t(-xfxufuxfx+)(v)) 
du(5r) 
dv(2r) 
dy(6r3r4(fx)) 
chna-2+y
7 
テイル・リカーシブ・インタープリタ 
(末尾再帰インタープリタ)
末尾再帰呼出し→ループ 変換(コンパイル時) 
8 
● 自分自身の再帰呼出しは、容易に、ループに変換可能 
● 再帰呼び出し recursive call 
int 
fact_tail_rec(int n, int a) 
{ 
if(n == 1){ return a; } 
else 
return fact_tail_rec(n-1, a*n); 
} 
● ループ 
int 
fact_loop(int n, int a) 
{ 
for(;;){ 
if(n==1) return a; 
a= a * n; 
n= n-1; 
} 
}
9 
コンパイラって楽だよね 
● コンパイル時間が長くても、怒られない 
● コンパイル時に、めちゃくちゃメモリを喰っても怒られない 
● 程度問題はあるが… 
● 広域を見れる 
● (自己)末尾再帰を見つけるのも、関数のアタマからお尻ま 
でゆっくりと見れる 
● 実行時間が速ければそれで良し 
● 組込みだと、メモリ・フットプリントも重要だが 
– コード・サイズ 
– ワーキング・メモリ(RAM)
10 
インタープリタは大変 
● インタープリタの性能 = 実行時間 
● JIT なんていうものも大事か… 
● でも、JIT やるなら、実行前に機械語に変換しろよ 
– 大方の言語なら可能だ 
– Javaとか、わざと複雑にしてるよな 
– 古いx86の自己書き換えコードなんか動かなくてもいい 
よ(フツーの場合)
11 
インタープリタは末尾再帰呼び出しを 
見抜けるのか? 
● Tail recursive call は、コンパイラなら、コンパイル中に 
見つけて、静的に変換 
● インタープリタって、基本、極めて局所しか見ない 
● 局所しか見ないで、末尾再帰の最適化はできるのか?
12 
末尾再帰インタープリタ 
● 末尾再帰の最適化を見つけるためのものじゃないよ 
● インタープリタの構造が、末尾再帰 
● Continuation Passing 的なことを、インタープリタ内部で、 
インタープリタ自身がやっている 
↓ 
● インタープリタが、不要なスタックを消費しない 
● テイル・リカーシブ・インタープリタ : インタープリタの実現方法 
● 実行時に、実行のために明らかに不要な情報を記憶しない。 
● 当然のようであるが、素朴な古い実装では、なかなか難し 
い。 
● テイル・リカーシブな実現のインタープリタで有名な言語 
は、Schemeである。
13 
本インタープリタの実現int 
exeq() // 1命令を実行する 
{ 
n= term(); 
switch((ccc=CT[Pc++])){ 
case 'f' : 
x1=x + n*v*step; y1=y + n*u*step; 
drawLine(x,y, x1,y1, 0); 
x=x1; y=y1; 
break; 
case '0' : /* func end */ 
{ Context *c; 
c=stk_pop(); Pc=c->pc; CT=c->ct; top= c->top; n= c->n-1; 
if(Pc== -1){ contAble=false;finishIt(); return; // 評価、全終了} 
if(n>0){ /* n回 繰り返し中 */ 
c->n=n; 
stk_push(c); 
CT=top; Pc=0; //再度、関数の先頭 
return; 
} 
return; 
} 
:
14 
本インタープリタの実現 
: 
default: /* ユーザ定義関数 */ 
top= defun[ccc-'a']; 
/* 末尾再帰 最適化可能な時は、pushしない 
ユーザ関数定義の末尾、すなわち、後に実行すべきものが何もない */ 
if(n!=1 || CT[Pc]!='0'){ 
Context c; 
c.n=n; c.top=top; c.pc=Pc; c.ct=CT; 
stk_push(&c); 
} 
CT= top; Pc=0; 
//printf(" userFunc %c CT=%x ",ccc,CT); 
} 
}
15 
ここまで 
● 関係ないけど… 
● Lispプログラマ、Prologプログラマ募集中 
● ルールベースの人工知能 開発中 
● 機械学習も取り込んだ、ハイブリッドAI 
● 普通の32bit or 64bitマシンが対象です
16 
おまけ
17 
古い素朴なインタープリタ実現 
● 古い素朴なインタープリタ実現の話をしよう。
18 
昔風、素朴なeval 
eval(関数) 
{ 
: 
関数をどんどん実行する 
: 
if(関数呼び出しに出会った) 
eval(新しい関数); 
残りを実行 
: 
}
19 
古い素朴なインタープリタ実現 
● 関数実行の本体(中心部)は 「eval」と いう関数 
● evalが、eval自身を再帰的に呼び出す実現が素朴に行われている 
● 新しい関数を実行するたびに、 
evalが呼び出される。 
● そして、前のevalに戻 るための情報を、常に記憶 
● 実行対象のソースコード が末尾再帰になっていても… 
前のevalのための情報が必ず記憶され、まったく最適化(節約)され 
ない 
● 模式evalで、eval中からevalを再帰的に呼び出す 
● このeval呼び出しによっ て、 
「残りを実行」のための情報を記憶する 
● 呼び出しの度に、記憶している情報はどんどん増える。
20 
テイル・リカーシブなeval 
eval(関数) 
{ 
eval_loop: 
: 
関数をどんどん実行する 
: 
if(関数呼び出しに出会った){ 
if(新しい関数呼び出しの後に、仕事はある?){ 
今evalしている情報を、スタックへ退避 
} 
プログラムカウンタ=新しい関数; 
goto eval_loop; 
} 
※1 
残りを実行 
: 
※2 
if(スタック!=空){ 
スタックから、情報を戻す 
goto eval_loop; 
} 
}
21 
テイル・リカーシブなeval 
※2のあたりで、 
うまいことeval_loopへgotoできるようにするのがコツ 
難しいところかな。 
※1の「残りを実行」は 
なるべく無くすのが、インタープリタをすっきりさせるためには、 
良い
22 
テイル・リカーシブなeval 
● evalそのものが大きなループになっている 
● 新しい関数の実行をしても、evalの呼び出しは深くならない。 
● 関数の末尾からの関数呼び出しは、何も記憶する必要がない 
● テイル・リカーシブ・インタープリタは、何も記憶しない。 
● 関数が自分自身を呼び出していない時も、最適化される 
● 実行途中の関数を継続(再開)するために必要な情報は、 
ソフトウェアで作った スタックに格納する。 
● 当然に、テイル・リカーシブでない呼び出しは、 
普通に記憶を消費する。
23 
テイル・リカーシブなeval 
● 関数の末尾からの関数呼び出しは、何も記憶する必要がな 
い。 
● テイル・リカーシブ・インタープリタは、何も記憶しない。 
↓ 
● テイル・リカーシブ・インタープリタは、 
局所しか見ない、単純な構成のインタープリタでも、 
末尾再帰ループの場合に、無駄な 記憶を消費することがない 
● Prologインタープリタや、コンパイルされたコードを実行する仮 
想マシンのインタープリタ(実行系)は、 
テイル・リカーシブ・インタープリタとして実現されているのが、 
普通である。
24 
Robot言語 
詳細
25 
Robot言語とは 
● 再帰的な曲線を描くための言語 
● タートル・グラフィックスで画を描く 
● 非常に単純なプログラミング言語 
● 繰り返し回数を記憶するために、Accが一つだけある 
● オリジナルのRobot仕様書 & 実装 
Litchen Wang: 
An Interactive programming Language for 
control of robots, DDJ, Vol.2, Issue 10, 
pp.60-63 (1977). 
● 日本での紹介文書 
石田晴久: ロボット言語, bit,Vol10, No.7, pp.35- 
50(1978)) 
● たけおかのページ 
http://www.takeoka.org/~take/kvm/robj.html
26 
文法 
<文> ::= <項><関数> | <項>(<文>) | <文><文> 
● Robotは<文>を実行します。 
● <項>はすぐ後のものの繰り返し回数を表わします。 
<項> ::= a | <数> | 「何もなし」 
● 「何もなし」は1を意味します。 
● aはAccの内容を意味します。 
<数> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 
9 | <数><数> 
● 0は2^31を意味します。 
<関数> ::= 「組み込み関数」 | 「ユーザ関数」 
● 「組み込み関数」、「ユーザ関数」ともに以下。
27 
組み込み関数 
● + 
● 1+ Accをインクリメント 
● - 
● 1- Accをデクリメント 
● h 
● Home 画面中央部に移動 
● n 
● North 画面上方を向く 
● c 
● Clear 画面を消去 
● r 
● Rotate 45度右へ回る 
● f 
● Forward 線を引きながら1step進む 
● j 
● Jump 線を引かずに1step進む 
● t(<非ゼロ文>)(<ゼロ文>) 
● Test Accが0でないなら<非ゼロ文>のみを 
● Accが0なら<ゼロ文>のみを実行する 
● dF(<定義文>) 
● defun ユーザ関数Fを<定義文>として定義する
28 
予約語 
● a 
● Acc 項になってAccの値を示す 
● このRobotにはAccが一つだけある 
● (0-2^31の値を取る) 
● : 
● コマンドであることをしめす。 
● コマンドは本Robot独自の機能である。 
● Robotの言語仕様にはない。
29 
ユーザ関数 
● 英小文字かつ予約されていない一文字がユーザ関数名として使 
えます。 
● dでdefineする
30 
コマンド(独自拡張) 
● コマンドはKRobot独自の機能である。 
● コマンドは実行管理環境(トップレベル)に対する指令である。 
● :d 
● ユーザ関数の全ての定義を表示する 
● :n 
● ユーザ関数をすべて消去する 
● :<項>s 
● f関数で進む距離をドット数で指定する 
● コマンドを実行する場合も文を入力した後、 DoItでトップレベルに評価さ 
せる。 
● 一部のコマンドは、それを評価することによって、PC,スタックなどに影響を 
与えてしまう。 
● よって、一部のコマンド評価後はContはできなくなる。
31 
以上

Contenu connexe

Tendances

20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使うRyo Nagai
 
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみようTakuya Azumi
 
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版openrtm
 
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法Brocade
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないことNorishige Fukushima
 
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)Takehiko YOSHIDA
 
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1Hirotaka Kawata
 

Tendances (8)

Cythonの一喜一憂
Cythonの一喜一憂Cythonの一喜一憂
Cythonの一喜一憂
 
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
 
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
 
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版
 
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
 
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
 
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
 
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
 

En vedette

MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --Kiyotaka Atsumi
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用Toshiki Tsuboi
 
Taming robotframework
Taming robotframeworkTaming robotframework
Taming robotframework泰 増田
 
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~Juniper Networks (日本)
 
Warm up
Warm upWarm up
Warm upmlj815
 
Ad group policy1
Ad group policy1Ad group policy1
Ad group policy1denogx
 
Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2ccole-bennett
 
Hum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaireHum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaireProfWillAdams
 
Mobile User Experience: Auto Drive through Performance Metrics
Mobile User Experience:Auto Drive through Performance MetricsMobile User Experience:Auto Drive through Performance Metrics
Mobile User Experience: Auto Drive through Performance MetricsAndreas Grabner
 
Lengua anuncio
Lengua anuncioLengua anuncio
Lengua anunciofranky226
 
2004 Winter Newsletter
2004 Winter Newsletter2004 Winter Newsletter
2004 Winter NewsletterDirect Relief
 
Google Plus Business Page Setup
Google Plus Business Page SetupGoogle Plus Business Page Setup
Google Plus Business Page SetupBeyondtheSite
 
квест Pons 2
квест Pons 2квест Pons 2
квест Pons 2MarkovDA
 

En vedette (20)

お化け
お化けお化け
お化け
 
Raspi32
Raspi32Raspi32
Raspi32
 
Dataflow140711
Dataflow140711Dataflow140711
Dataflow140711
 
MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --
 
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
 
Taming robotframework
Taming robotframeworkTaming robotframework
Taming robotframework
 
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
 
Warm up
Warm upWarm up
Warm up
 
Ad group policy1
Ad group policy1Ad group policy1
Ad group policy1
 
Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2
 
Chapter 1a
Chapter 1aChapter 1a
Chapter 1a
 
Hum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaireHum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaire
 
Mobile User Experience: Auto Drive through Performance Metrics
Mobile User Experience:Auto Drive through Performance MetricsMobile User Experience:Auto Drive through Performance Metrics
Mobile User Experience: Auto Drive through Performance Metrics
 
Lengua anuncio
Lengua anuncioLengua anuncio
Lengua anuncio
 
Ojo ahumado
Ojo ahumadoOjo ahumado
Ojo ahumado
 
2004 Winter Newsletter
2004 Winter Newsletter2004 Winter Newsletter
2004 Winter Newsletter
 
Pf sense 2.0
Pf sense 2.0Pf sense 2.0
Pf sense 2.0
 
Google Plus Business Page Setup
Google Plus Business Page SetupGoogle Plus Business Page Setup
Google Plus Business Page Setup
 
PROBLEM OF PSYCHOLOGY, Wundt
PROBLEM OF PSYCHOLOGY, WundtPROBLEM OF PSYCHOLOGY, Wundt
PROBLEM OF PSYCHOLOGY, Wundt
 
квест Pons 2
квест Pons 2квест Pons 2
квест Pons 2
 

Similaire à Robot Language and a Tail Recursive Interpreter

ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門Hirotaka Kawata
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半Tetsuya Morimoto
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Takuya Matsunaga
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitSeiya Mizuno
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPUTakuro Iizuka
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングkei takakuda
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7Tetsuya Morimoto
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライドkoturn 0;
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performanceMasaru Oki
 
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
DockerHubを活用してAnsibleのPlaybookを自動ビルドするDockerHubを活用してAnsibleのPlaybookを自動ビルドする
DockerHubを活用してAnsibleのPlaybookを自動ビルドするKoji Shiraishi
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話Wooram Yang
 
cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行kunihikokaneko1
 
ITRON仕様のOSで組み込みにトライしてみた
ITRON仕様のOSで組み込みにトライしてみたITRON仕様のOSで組み込みにトライしてみた
ITRON仕様のOSで組み込みにトライしてみたboropon
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?Developers Summit
 
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...No Bu
 
20120706-readablecode
20120706-readablecode20120706-readablecode
20120706-readablecodeMasanori Kado
 

Similaire à Robot Language and a Tail Recursive Interpreter (20)

ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
 
Runtime c++editing
Runtime c++editingRuntime c++editing
Runtime c++editing
 
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
 
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
 
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent BitFluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
 
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
 
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリングデザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7エキ Py 読書会02 2010/9/7
エキ Py 読書会02 2010/9/7
 
第2回勉強会スライド
第2回勉強会スライド第2回勉強会スライド
第2回勉強会スライド
 
Lagopus performance
Lagopus performanceLagopus performance
Lagopus performance
 
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
DockerHubを活用してAnsibleのPlaybookを自動ビルドするDockerHubを活用してAnsibleのPlaybookを自動ビルドする
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
 
IL2CPPに関する軽い話
IL2CPPに関する軽い話IL2CPPに関する軽い話
IL2CPPに関する軽い話
 
cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行
 
Let's play with Goldfish
Let's play with GoldfishLet's play with Goldfish
Let's play with Goldfish
 
ITRON仕様のOSで組み込みにトライしてみた
ITRON仕様のOSで組み込みにトライしてみたITRON仕様のOSで組み込みにトライしてみた
ITRON仕様のOSで組み込みにトライしてみた
 
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
TOPPERSプロジェクトの紹介 OSC2017 Tokyo FallTOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
 
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
デブサミ2013【15-E-2】Ruby開発者のみなさん、mrubyで楽しく快適な組み込みアプリ開発を始めませんか?
 
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
Literate Computing for Infrastructure - インフラ・コード化の実践におけるIPython (Jupyter) Not...
 
20120706-readablecode
20120706-readablecode20120706-readablecode
20120706-readablecode
 

Plus de たけおか しょうぞう

いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加したいにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加したたけおか しょうぞう
 
俺ASICと俺CPU“松竹V(しょうちくぶい)”
俺ASICと俺CPU“松竹V(しょうちくぶい)”俺ASICと俺CPU“松竹V(しょうちくぶい)”
俺ASICと俺CPU“松竹V(しょうちくぶい)”たけおか しょうぞう
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)たけおか しょうぞう
 
どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?たけおか しょうぞう
 
無脳スマートスピーカを 越えレレレのレ
無脳スマートスピーカを 越えレレレのレ無脳スマートスピーカを 越えレレレのレ
無脳スマートスピーカを 越えレレレのレたけおか しょうぞう
 
昔の外付けキャッシュ & コヒーレント・キャッシュ
昔の外付けキャッシュ & コヒーレント・キャッシュ昔の外付けキャッシュ & コヒーレント・キャッシュ
昔の外付けキャッシュ & コヒーレント・キャッシュたけおか しょうぞう
 

Plus de たけおか しょうぞう (20)

いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加したいにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
 
SOAR:Smalltalk on RISC
SOAR:Smalltalk on RISCSOAR:Smalltalk on RISC
SOAR:Smalltalk on RISC
 
俺ASICと俺CPU“松竹V(しょうちくぶい)”
俺ASICと俺CPU“松竹V(しょうちくぶい)”俺ASICと俺CPU“松竹V(しょうちくぶい)”
俺ASICと俺CPU“松竹V(しょうちくぶい)”
 
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
 
RISC-Vの可能性
RISC-Vの可能性RISC-Vの可能性
RISC-Vの可能性
 
RISC-Vの可能性
RISC-Vの可能性RISC-Vの可能性
RISC-Vの可能性
 
どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?
 
Riscv+fpga200606
Riscv+fpga200606Riscv+fpga200606
Riscv+fpga200606
 
Takep lpc1114-190614
Takep lpc1114-190614Takep lpc1114-190614
Takep lpc1114-190614
 
Takep lpc1114-190613
Takep lpc1114-190613Takep lpc1114-190613
Takep lpc1114-190613
 
初歩的な部品の知識
初歩的な部品の知識初歩的な部品の知識
初歩的な部品の知識
 
Takepino LPC1114
Takepino LPC1114Takepino LPC1114
Takepino LPC1114
 
Lisp_chibi_machine 190427
Lisp_chibi_machine 190427Lisp_chibi_machine 190427
Lisp_chibi_machine 190427
 
無脳スマートスピーカを 越えレレレのレ
無脳スマートスピーカを 越えレレレのレ無脳スマートスピーカを 越えレレレのレ
無脳スマートスピーカを 越えレレレのレ
 
Common Lisp ユーザへのScheme紹介
Common Lisp ユーザへのScheme紹介Common Lisp ユーザへのScheme紹介
Common Lisp ユーザへのScheme紹介
 
RISC-V User level ISA
RISC-V User level ISARISC-V User level ISA
RISC-V User level ISA
 
Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介
 
昔の外付けキャッシュ & コヒーレント・キャッシュ
昔の外付けキャッシュ & コヒーレント・キャッシュ昔の外付けキャッシュ & コヒーレント・キャッシュ
昔の外付けキャッシュ & コヒーレント・キャッシュ
 
Ichigojam ossc-170819
Ichigojam ossc-170819Ichigojam ossc-170819
Ichigojam ossc-170819
 
大昔のMMU
大昔のMMU大昔のMMU
大昔のMMU
 

Robot Language and a Tail Recursive Interpreter

  • 1. 1 Robot言語 と 末尾再帰インタープリタ 2014/OCT/18 たけおか@AXE twitter: @takeoka www.takeoka.org/~take/
  • 3. 3 Robot言語とは ● 再帰的な曲線を描くための言語 ● 貧弱だが、ピュア関数型言語といえる ● タートル・グラフィックスで画を描く ● 非常に単純なプログラミング言語 ● 繰り返し回数を記憶するために、Accが一つだけある ● オリジナルのRobot仕様書 & 実装 Litchen Wang: An Interactive programming Language for control of robots, DDJ, Vol.2, Issue 10, pp.60-63 (1977). ● 日本での紹介文書 石田晴久: ロボット言語, bit,Vol10, No.7, pp.35- 50(1978)) ● たけおかのページ http://www.takeoka.org/~take/kvm/robj.html
  • 4. 4 組み込み関数など ● + ● 1+ Accをインクリメント ● - ● 1- Accをデクリメント ● h ● Home 画面中央部に移動 ● n ● North 画面上方を向く ● c ● Clear 画面を消去 ● r ● Rotate 45度右へ回る ● f ● Forward 線を引きながら1step進む ● j ● Jump 線を引かずに1step進む ● t(<非ゼロ文>)(<ゼロ文>) ● Test Accが0でないなら<非ゼロ文>のみを ● Accが0なら<ゼロ文>のみを実行する ● dF(<定義文>) ● defun ユーザ関数Fを<定義文>として定義する ● a ● Acc項になってAccの値を示す ● このRobotにはAccが一つだけある ● (0-2^31の値を取る) ● ユーザ関数 ● 英小文字かつ予約されていない一 文字がユーザ関数名として使える。 ● dでdefineする
  • 5. 5 実行例 ● ヒルベルト曲線 du(t(-vfxuyfufxv+)(x)) dv(t(-uyfvfxvyfu+)(y)) dx(6r) dy(2r) chna-5+2ru ● 無限ループ db(z) dz(frb)
  • 6. 6 実行例 ● ドラゴン曲線 dx(t(-x6rk+)(f)) dk(t(-x2rk+)(f)) chna-10+x ● シェルピンスキー曲線 dx(t(-xfxufuxfx+)(v)) du(5r) dv(2r) dy(6r3r4(fx)) chna-2+y
  • 8. 末尾再帰呼出し→ループ 変換(コンパイル時) 8 ● 自分自身の再帰呼出しは、容易に、ループに変換可能 ● 再帰呼び出し recursive call int fact_tail_rec(int n, int a) { if(n == 1){ return a; } else return fact_tail_rec(n-1, a*n); } ● ループ int fact_loop(int n, int a) { for(;;){ if(n==1) return a; a= a * n; n= n-1; } }
  • 9. 9 コンパイラって楽だよね ● コンパイル時間が長くても、怒られない ● コンパイル時に、めちゃくちゃメモリを喰っても怒られない ● 程度問題はあるが… ● 広域を見れる ● (自己)末尾再帰を見つけるのも、関数のアタマからお尻ま でゆっくりと見れる ● 実行時間が速ければそれで良し ● 組込みだと、メモリ・フットプリントも重要だが – コード・サイズ – ワーキング・メモリ(RAM)
  • 10. 10 インタープリタは大変 ● インタープリタの性能 = 実行時間 ● JIT なんていうものも大事か… ● でも、JIT やるなら、実行前に機械語に変換しろよ – 大方の言語なら可能だ – Javaとか、わざと複雑にしてるよな – 古いx86の自己書き換えコードなんか動かなくてもいい よ(フツーの場合)
  • 11. 11 インタープリタは末尾再帰呼び出しを 見抜けるのか? ● Tail recursive call は、コンパイラなら、コンパイル中に 見つけて、静的に変換 ● インタープリタって、基本、極めて局所しか見ない ● 局所しか見ないで、末尾再帰の最適化はできるのか?
  • 12. 12 末尾再帰インタープリタ ● 末尾再帰の最適化を見つけるためのものじゃないよ ● インタープリタの構造が、末尾再帰 ● Continuation Passing 的なことを、インタープリタ内部で、 インタープリタ自身がやっている ↓ ● インタープリタが、不要なスタックを消費しない ● テイル・リカーシブ・インタープリタ : インタープリタの実現方法 ● 実行時に、実行のために明らかに不要な情報を記憶しない。 ● 当然のようであるが、素朴な古い実装では、なかなか難し い。 ● テイル・リカーシブな実現のインタープリタで有名な言語 は、Schemeである。
  • 13. 13 本インタープリタの実現int exeq() // 1命令を実行する { n= term(); switch((ccc=CT[Pc++])){ case 'f' : x1=x + n*v*step; y1=y + n*u*step; drawLine(x,y, x1,y1, 0); x=x1; y=y1; break; case '0' : /* func end */ { Context *c; c=stk_pop(); Pc=c->pc; CT=c->ct; top= c->top; n= c->n-1; if(Pc== -1){ contAble=false;finishIt(); return; // 評価、全終了} if(n>0){ /* n回 繰り返し中 */ c->n=n; stk_push(c); CT=top; Pc=0; //再度、関数の先頭 return; } return; } :
  • 14. 14 本インタープリタの実現 : default: /* ユーザ定義関数 */ top= defun[ccc-'a']; /* 末尾再帰 最適化可能な時は、pushしない ユーザ関数定義の末尾、すなわち、後に実行すべきものが何もない */ if(n!=1 || CT[Pc]!='0'){ Context c; c.n=n; c.top=top; c.pc=Pc; c.ct=CT; stk_push(&c); } CT= top; Pc=0; //printf(" userFunc %c CT=%x ",ccc,CT); } }
  • 15. 15 ここまで ● 関係ないけど… ● Lispプログラマ、Prologプログラマ募集中 ● ルールベースの人工知能 開発中 ● 機械学習も取り込んだ、ハイブリッドAI ● 普通の32bit or 64bitマシンが対象です
  • 17. 17 古い素朴なインタープリタ実現 ● 古い素朴なインタープリタ実現の話をしよう。
  • 18. 18 昔風、素朴なeval eval(関数) { : 関数をどんどん実行する : if(関数呼び出しに出会った) eval(新しい関数); 残りを実行 : }
  • 19. 19 古い素朴なインタープリタ実現 ● 関数実行の本体(中心部)は 「eval」と いう関数 ● evalが、eval自身を再帰的に呼び出す実現が素朴に行われている ● 新しい関数を実行するたびに、 evalが呼び出される。 ● そして、前のevalに戻 るための情報を、常に記憶 ● 実行対象のソースコード が末尾再帰になっていても… 前のevalのための情報が必ず記憶され、まったく最適化(節約)され ない ● 模式evalで、eval中からevalを再帰的に呼び出す ● このeval呼び出しによっ て、 「残りを実行」のための情報を記憶する ● 呼び出しの度に、記憶している情報はどんどん増える。
  • 20. 20 テイル・リカーシブなeval eval(関数) { eval_loop: : 関数をどんどん実行する : if(関数呼び出しに出会った){ if(新しい関数呼び出しの後に、仕事はある?){ 今evalしている情報を、スタックへ退避 } プログラムカウンタ=新しい関数; goto eval_loop; } ※1 残りを実行 : ※2 if(スタック!=空){ スタックから、情報を戻す goto eval_loop; } }
  • 21. 21 テイル・リカーシブなeval ※2のあたりで、 うまいことeval_loopへgotoできるようにするのがコツ 難しいところかな。 ※1の「残りを実行」は なるべく無くすのが、インタープリタをすっきりさせるためには、 良い
  • 22. 22 テイル・リカーシブなeval ● evalそのものが大きなループになっている ● 新しい関数の実行をしても、evalの呼び出しは深くならない。 ● 関数の末尾からの関数呼び出しは、何も記憶する必要がない ● テイル・リカーシブ・インタープリタは、何も記憶しない。 ● 関数が自分自身を呼び出していない時も、最適化される ● 実行途中の関数を継続(再開)するために必要な情報は、 ソフトウェアで作った スタックに格納する。 ● 当然に、テイル・リカーシブでない呼び出しは、 普通に記憶を消費する。
  • 23. 23 テイル・リカーシブなeval ● 関数の末尾からの関数呼び出しは、何も記憶する必要がな い。 ● テイル・リカーシブ・インタープリタは、何も記憶しない。 ↓ ● テイル・リカーシブ・インタープリタは、 局所しか見ない、単純な構成のインタープリタでも、 末尾再帰ループの場合に、無駄な 記憶を消費することがない ● Prologインタープリタや、コンパイルされたコードを実行する仮 想マシンのインタープリタ(実行系)は、 テイル・リカーシブ・インタープリタとして実現されているのが、 普通である。
  • 25. 25 Robot言語とは ● 再帰的な曲線を描くための言語 ● タートル・グラフィックスで画を描く ● 非常に単純なプログラミング言語 ● 繰り返し回数を記憶するために、Accが一つだけある ● オリジナルのRobot仕様書 & 実装 Litchen Wang: An Interactive programming Language for control of robots, DDJ, Vol.2, Issue 10, pp.60-63 (1977). ● 日本での紹介文書 石田晴久: ロボット言語, bit,Vol10, No.7, pp.35- 50(1978)) ● たけおかのページ http://www.takeoka.org/~take/kvm/robj.html
  • 26. 26 文法 <文> ::= <項><関数> | <項>(<文>) | <文><文> ● Robotは<文>を実行します。 ● <項>はすぐ後のものの繰り返し回数を表わします。 <項> ::= a | <数> | 「何もなし」 ● 「何もなし」は1を意味します。 ● aはAccの内容を意味します。 <数> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | <数><数> ● 0は2^31を意味します。 <関数> ::= 「組み込み関数」 | 「ユーザ関数」 ● 「組み込み関数」、「ユーザ関数」ともに以下。
  • 27. 27 組み込み関数 ● + ● 1+ Accをインクリメント ● - ● 1- Accをデクリメント ● h ● Home 画面中央部に移動 ● n ● North 画面上方を向く ● c ● Clear 画面を消去 ● r ● Rotate 45度右へ回る ● f ● Forward 線を引きながら1step進む ● j ● Jump 線を引かずに1step進む ● t(<非ゼロ文>)(<ゼロ文>) ● Test Accが0でないなら<非ゼロ文>のみを ● Accが0なら<ゼロ文>のみを実行する ● dF(<定義文>) ● defun ユーザ関数Fを<定義文>として定義する
  • 28. 28 予約語 ● a ● Acc 項になってAccの値を示す ● このRobotにはAccが一つだけある ● (0-2^31の値を取る) ● : ● コマンドであることをしめす。 ● コマンドは本Robot独自の機能である。 ● Robotの言語仕様にはない。
  • 29. 29 ユーザ関数 ● 英小文字かつ予約されていない一文字がユーザ関数名として使 えます。 ● dでdefineする
  • 30. 30 コマンド(独自拡張) ● コマンドはKRobot独自の機能である。 ● コマンドは実行管理環境(トップレベル)に対する指令である。 ● :d ● ユーザ関数の全ての定義を表示する ● :n ● ユーザ関数をすべて消去する ● :<項>s ● f関数で進む距離をドット数で指定する ● コマンドを実行する場合も文を入力した後、 DoItでトップレベルに評価さ せる。 ● 一部のコマンドは、それを評価することによって、PC,スタックなどに影響を 与えてしまう。 ● よって、一部のコマンド評価後はContはできなくなる。