Soumettre la recherche
Mettre en ligne
Robot Language and a Tail Recursive Interpreter
•
6 j'aime
•
2,735 vues
たけおか しょうぞう
Suivre
とても簡単なプログラミング言語Robotのインタープリタを、 末尾再帰インタープリタとして実現した。 その解説。 スタックが非常に少なくても、末尾再帰の無限ループが、永遠に回る。
Lire moins
Lire la suite
Logiciels
Signaler
Partager
Signaler
Partager
1 sur 31
Télécharger maintenant
Télécharger pour lire hors ligne
Recommandé
Python physicalcomputing
Python physicalcomputing
Noboru Irieda
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出
marsee101
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
Hirotaka Kawata
Ruby/RubyCocoa for iPhone - UICoderz4
Ruby/RubyCocoa for iPhone - UICoderz4
takuma mori
Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)
kotoji
蛇を埋葬する(PythonをEmbedする)
蛇を埋葬する(PythonをEmbedする)
Shintarou Okada
final int をFINAL しやがれ!
final int をFINAL しやがれ!
Keiichi Nagaoka
130831 fpgax3 yos
130831 fpgax3 yos
Mikio Yoshida
Recommandé
Python physicalcomputing
Python physicalcomputing
Noboru Irieda
Pynqでカメラ画像をリアルタイムfastx コーナー検出
Pynqでカメラ画像をリアルタイムfastx コーナー検出
marsee101
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
自作コンピューターでなんかする - 第八回 カーネル/VM探検隊&懇親会
Hirotaka Kawata
Ruby/RubyCocoa for iPhone - UICoderz4
Ruby/RubyCocoa for iPhone - UICoderz4
takuma mori
Tickライブラリで遊ぼう(C++)
Tickライブラリで遊ぼう(C++)
kotoji
蛇を埋葬する(PythonをEmbedする)
蛇を埋葬する(PythonをEmbedする)
Shintarou Okada
final int をFINAL しやがれ!
final int をFINAL しやがれ!
Keiichi Nagaoka
130831 fpgax3 yos
130831 fpgax3 yos
Mikio Yoshida
Cythonの一喜一憂
Cythonの一喜一憂
Kotaro Tanahashi
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
Ryo Nagai
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
Takuya Azumi
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版
openrtm
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
Brocade
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
Takehiko YOSHIDA
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
Hirotaka Kawata
お化け
お化け
たけおか しょうぞう
Raspi32
Raspi32
たけおか しょうぞう
Dataflow140711
Dataflow140711
たけおか しょうぞう
MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --
Kiyotaka Atsumi
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
Toshiki Tsuboi
Taming robotframework
Taming robotframework
泰 増田
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
Juniper Networks (日本)
Warm up
Warm up
mlj815
Ad group policy1
Ad group policy1
denogx
Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2
ccole-bennett
Chapter 1a
Chapter 1a
rohit Kapoor
Hum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaire
ProfWillAdams
Mobile User Experience:Auto Drive through Performance Metrics
Mobile User Experience:Auto Drive through Performance Metrics
Andreas Grabner
Lengua anuncio
Lengua anuncio
franky226
Contenu connexe
Tendances
Cythonの一喜一憂
Cythonの一喜一憂
Kotaro Tanahashi
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
Ryo Nagai
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
Takuya Azumi
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版
openrtm
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
Brocade
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
Norishige Fukushima
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
Takehiko YOSHIDA
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
Hirotaka Kawata
Tendances
(8)
Cythonの一喜一憂
Cythonの一喜一憂
20130615 組込みの仕事場でRubyを使う
20130615 組込みの仕事場でRubyを使う
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
組込み向けスクリプト言語mrubyをEV3で動かしてみよう
Rtミドルウェア講習会 第3部資料 配布版
Rtミドルウェア講習会 第3部資料 配布版
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
自動化万歳!朝起きたらトラブルシューティングが完了している世界の実現方法
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
画像処理ライブラリ OpenCV で 出来ること・出来ないこと
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
組込みシステムでIoTへの扉を開こう! mruby on LEGO Mindstorms EV3 (R)
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
バイナリより低レイヤな話 (プロセッサの心を読み解く) - カーネル/VM探検隊@北陸1
En vedette
お化け
お化け
たけおか しょうぞう
Raspi32
Raspi32
たけおか しょうぞう
Dataflow140711
Dataflow140711
たけおか しょうぞう
MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --
Kiyotaka Atsumi
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
Toshiki Tsuboi
Taming robotframework
Taming robotframework
泰 増田
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
Juniper Networks (日本)
Warm up
Warm up
mlj815
Ad group policy1
Ad group policy1
denogx
Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2
ccole-bennett
Chapter 1a
Chapter 1a
rohit Kapoor
Hum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaire
ProfWillAdams
Mobile User Experience:Auto Drive through Performance Metrics
Mobile User Experience:Auto Drive through Performance Metrics
Andreas Grabner
Lengua anuncio
Lengua anuncio
franky226
Ojo ahumado
Ojo ahumado
karenAlvaredo
2004 Winter Newsletter
2004 Winter Newsletter
Direct Relief
Pf sense 2.0
Pf sense 2.0
OpenFest team
Google Plus Business Page Setup
Google Plus Business Page Setup
BeyondtheSite
PROBLEM OF PSYCHOLOGY, Wundt
PROBLEM OF PSYCHOLOGY, Wundt
Nadia Quintero Güiza
квест Pons 2
квест Pons 2
MarkovDA
En vedette
(20)
お化け
お化け
Raspi32
Raspi32
Dataflow140711
Dataflow140711
MitM on USB -- Introduction of USBProxy --
MitM on USB -- Introduction of USBProxy --
SDN Lab環境でのRobotFramework実践活用
SDN Lab環境でのRobotFramework実践活用
Taming robotframework
Taming robotframework
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
vSRX on Your Laptop : PCで始めるvSRX ~JUNOSをさわってみよう!~
Warm up
Warm up
Ad group policy1
Ad group policy1
Aserl cfdp 2011 11_2
Aserl cfdp 2011 11_2
Chapter 1a
Chapter 1a
Hum2220 fa2014 proust questionnaire
Hum2220 fa2014 proust questionnaire
Mobile User Experience:Auto Drive through Performance Metrics
Mobile User Experience:Auto Drive through Performance Metrics
Lengua anuncio
Lengua anuncio
Ojo ahumado
Ojo ahumado
2004 Winter Newsletter
2004 Winter Newsletter
Pf sense 2.0
Pf sense 2.0
Google Plus Business Page Setup
Google Plus Business Page Setup
PROBLEM OF PSYCHOLOGY, Wundt
PROBLEM OF PSYCHOLOGY, Wundt
квест Pons 2
квест Pons 2
Similaire à Robot Language and a Tail Recursive Interpreter
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Hirotaka Kawata
Runtime c++editing
Runtime c++editing
Seiya Ishibashi
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Tetsuya Morimoto
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
Takuya Matsunaga
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
Seiya Mizuno
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
Takuro Iizuka
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
kei takakuda
C# 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
Tetsuya Morimoto
第2回勉強会スライド
第2回勉強会スライド
koturn 0;
Lagopus performance
Lagopus performance
Masaru Oki
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
Koji Shiraishi
IL2CPPに関する軽い話
IL2CPPに関する軽い話
Wooram Yang
cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行
kunihikokaneko1
Let's play with Goldfish
Let's play with Goldfish
Tetsuyuki Kobayashi
ITRON仕様のOSで組み込みにトライしてみた
ITRON仕様のOSで組み込みにトライしてみた
boropon
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
Center for Embedded Computing Systems, Nagoya Univ.
デブサミ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...
No Bu
20120706-readablecode
20120706-readablecode
Masanori Kado
Similaire à Robot Language and a Tail Recursive Interpreter
(20)
ゼロから始める自作 CPU 入門
ゼロから始める自作 CPU 入門
Runtime c++editing
Runtime c++editing
エキ Py 読書会02 2章後半
エキ Py 読書会02 2章後半
Dalvik仮想マシンのアーキテクチャ 改訂版
Dalvik仮想マシンのアーキテクチャ 改訂版
Fluentd1.2 & Fluent Bit
Fluentd1.2 & Fluent Bit
関東GPGPU勉強会 LLVM meets GPU
関東GPGPU勉強会 LLVM meets GPU
デザインパターンを用いたリファクタリング
デザインパターンを用いたリファクタリング
C# 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
第2回勉強会スライド
第2回勉強会スライド
Lagopus performance
Lagopus performance
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
DockerHubを活用してAnsibleのPlaybookを自動ビルドする
IL2CPPに関する軽い話
IL2CPPに関する軽い話
cs-11. Python の条件分岐と繰り返し,ステップ実行
cs-11. Python の条件分岐と繰り返し,ステップ実行
Let's play with Goldfish
Let's play with Goldfish
ITRON仕様のOSで組み込みにトライしてみた
ITRON仕様のOSで組み込みにトライしてみた
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
TOPPERSプロジェクトの紹介 OSC2017 Tokyo Fall
デブサミ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...
20120706-readablecode
20120706-readablecode
Plus de たけおか しょうぞう
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
たけおか しょうぞう
SOAR:Smalltalk on RISC
SOAR:Smalltalk on RISC
たけおか しょうぞう
俺ASICと俺CPU“松竹V(しょうちくぶい)”
俺ASICと俺CPU“松竹V(しょうちくぶい)”
たけおか しょうぞう
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
たけおか しょうぞう
RISC-Vの可能性
RISC-Vの可能性
たけおか しょうぞう
RISC-Vの可能性
RISC-Vの可能性
たけおか しょうぞう
どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?
たけおか しょうぞう
Riscv+fpga200606
Riscv+fpga200606
たけおか しょうぞう
Takep lpc1114-190614
Takep lpc1114-190614
たけおか しょうぞう
Takep lpc1114-190613
Takep lpc1114-190613
たけおか しょうぞう
初歩的な部品の知識
初歩的な部品の知識
たけおか しょうぞう
Takepino LPC1114
Takepino LPC1114
たけおか しょうぞう
Lisp_chibi_machine 190427
Lisp_chibi_machine 190427
たけおか しょうぞう
無脳スマートスピーカを 越えレレレのレ
無脳スマートスピーカを 越えレレレのレ
たけおか しょうぞう
Common Lisp ユーザへのScheme紹介
Common Lisp ユーザへのScheme紹介
たけおか しょうぞう
RISC-V User level ISA
RISC-V User level ISA
たけおか しょうぞう
Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介
たけおか しょうぞう
昔の外付けキャッシュ & コヒーレント・キャッシュ
昔の外付けキャッシュ & コヒーレント・キャッシュ
たけおか しょうぞう
Ichigojam ossc-170819
Ichigojam ossc-170819
たけおか しょうぞう
大昔のMMU
大昔のMMU
たけおか しょうぞう
Plus de たけおか しょうぞう
(20)
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
いにしえ的ななにか、カニか? RISC-V picoRV32, e203 改造 オレオレ命令追加した
SOAR:Smalltalk on RISC
SOAR:Smalltalk on RISC
俺ASICと俺CPU“松竹V(しょうちくぶい)”
俺ASICと俺CPU“松竹V(しょうちくぶい)”
あるRISC-V CPUの 浮動小数点数(異常なし)
あるRISC-V CPUの 浮動小数点数(異常なし)
RISC-Vの可能性
RISC-Vの可能性
RISC-Vの可能性
RISC-Vの可能性
どうして昔の人は八進数でしゃべるのか?
どうして昔の人は八進数でしゃべるのか?
Riscv+fpga200606
Riscv+fpga200606
Takep lpc1114-190614
Takep lpc1114-190614
Takep lpc1114-190613
Takep lpc1114-190613
初歩的な部品の知識
初歩的な部品の知識
Takepino LPC1114
Takepino LPC1114
Lisp_chibi_machine 190427
Lisp_chibi_machine 190427
無脳スマートスピーカを 越えレレレのレ
無脳スマートスピーカを 越えレレレのレ
Common Lisp ユーザへのScheme紹介
Common Lisp ユーザへのScheme紹介
RISC-V User level ISA
RISC-V User level ISA
Lispマシン・シミュレータの紹介
Lispマシン・シミュレータの紹介
昔の外付けキャッシュ & コヒーレント・キャッシュ
昔の外付けキャッシュ & コヒーレント・キャッシュ
Ichigojam ossc-170819
Ichigojam ossc-170819
大昔のMMU
大昔のMMU
Robot Language and a Tail Recursive Interpreter
1.
1 Robot言語 と
末尾再帰インタープリタ 2014/OCT/18 たけおか@AXE twitter: @takeoka www.takeoka.org/~take/
2.
2 Robot言語
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
7.
7 テイル・リカーシブ・インタープリタ (末尾再帰インタープリタ)
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マシンが対象です
16.
16 おまけ
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インタープリタや、コンパイルされたコードを実行する仮 想マシンのインタープリタ(実行系)は、 テイル・リカーシブ・インタープリタとして実現されているのが、 普通である。
24.
24 Robot言語 詳細
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はできなくなる。
31.
31 以上
Télécharger maintenant