Enviar pesquisa
Carregar
Functional Pearl + Brainfuck
•
Transferir como KEY, PDF
•
1 gostou
•
909 visualizações
Eita Sugimoto
Seguir
HaskellでBrainfuckインタプリタを作ったことについて、初心者向け
Leia menos
Leia mais
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 42
Baixar agora
Recomendados
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
初めてのHaskell (表)
初めてのHaskell (表)
karky7
本当は怖いPHP
本当は怖いPHP
Takuya Sato
Perl6で遊ぼう
Perl6で遊ぼう
VienosNotes
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
final int をFINAL しやがれ!
final int をFINAL しやがれ!
Keiichi Nagaoka
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Recomendados
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
Ransui Iso
初めてのHaskell (表)
初めてのHaskell (表)
karky7
本当は怖いPHP
本当は怖いPHP
Takuya Sato
Perl6で遊ぼう
Perl6で遊ぼう
VienosNotes
ゲーム開発者のための C++11/C++14
ゲーム開発者のための C++11/C++14
Ryo Suzuki
final int をFINAL しやがれ!
final int をFINAL しやがれ!
Keiichi Nagaoka
知ってるようで意外と知らないPHPの便利関数
知ってるようで意外と知らないPHPの便利関数
Wataru Terada
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
Ransui Iso
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
Perl io layer
Perl io layer
Hiroko Suzuki
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Wataru Terada
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室
Yusuke Ando
乱数調整概説
乱数調整概説
Blastoise_X
from old Java to modern Java
from old Java to modern Java
心 谷本
Perl勉強会#2資料
Perl勉強会#2資料
Kiyo Tsunezumi
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
Kousuke Ebihara
Parsing Left Recursive PEG
Parsing Left Recursive PEG
Takayuki Goto
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
Appresso Engineering Team
from old java to java8 - KanJava Edition
from old java to java8 - KanJava Edition
心 谷本
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」
Yusuke Ando
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307
Xatierlike Lee
brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料
Michihito Shigemura
Mais conteúdo relacionado
Mais procurados
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
CHY72
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Nobuhisa Koizumi
Perl io layer
Perl io layer
Hiroko Suzuki
PHP基本的関数QUIZ
PHP基本的関数QUIZ
Wataru Terada
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Yuki Miyatake
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
Genya Murakami
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
勝成 鈴江
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
Nobuhisa Koizumi
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
Genya Murakami
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室
Yusuke Ando
乱数調整概説
乱数調整概説
Blastoise_X
from old Java to modern Java
from old Java to modern Java
心 谷本
Perl勉強会#2資料
Perl勉強会#2資料
Kiyo Tsunezumi
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
Kousuke Ebihara
Parsing Left Recursive PEG
Parsing Left Recursive PEG
Takayuki Goto
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
Appresso Engineering Team
from old java to java8 - KanJava Edition
from old java to java8 - KanJava Edition
心 谷本
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」
Yusuke Ando
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
Ryosuke839
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Kentaro Matsui
Mais procurados
(20)
Unity2015_No10_~UGUI&Audio~
Unity2015_No10_~UGUI&Audio~
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
Perl io layer
Perl io layer
PHP基本的関数QUIZ
PHP基本的関数QUIZ
BoostAsioで可読性を求めるのは間違っているだろうか
BoostAsioで可読性を求めるのは間違っているだろうか
Constexpr 中3女子テクニック
Constexpr 中3女子テクニック
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
C++でのゲームプログラミングをしたときのお話 札幌C++勉強会 #4 〜スタートゲームプログラミング〜
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
90分間濃縮 PHPエラーの教室
90分間濃縮 PHPエラーの教室
乱数調整概説
乱数調整概説
from old Java to modern Java
from old Java to modern Java
Perl勉強会#2資料
Perl勉強会#2資料
お前は PHP の歴史的な理由の数を覚えているのか
お前は PHP の歴史的な理由の数を覚えているのか
Parsing Left Recursive PEG
Parsing Left Recursive PEG
20150302 java8 第一回_ラムダ式(1)
20150302 java8 第一回_ラムダ式(1)
from old java to java8 - KanJava Edition
from old java to java8 - KanJava Edition
PHPの教室「foreachを極める」
PHPの教室「foreachを極める」
不遇の標準ライブラリ - valarray
不遇の標準ライブラリ - valarray
「Html sql」で図書館hpにアクセスしてみよう
「Html sql」で図書館hpにアクセスしてみよう
Destaque
Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307
Xatierlike Lee
brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料
Michihito Shigemura
Learn you a Brainfuck for great good!
Learn you a Brainfuck for great good!
Antoine Leblanc
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Katsuhiro Endo
Rubyで作る奇妙なプログラミング言語
Rubyで作る奇妙なプログラミング言語
toyoshi
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
kirin_nico
実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング入門編
京大 マイコンクラブ
BFmeta
BFmeta
京大 マイコンクラブ
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
京大 マイコンクラブ
ライフゲームでプログラミング
ライフゲームでプログラミング
Shinya Miyazaki
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
SECCON Beginners
Destaque
(11)
Brainfuck interpreter 分析新竹碼農0307
Brainfuck interpreter 分析新竹碼農0307
brainfuckであそぼう #lldiver LT資料
brainfuckであそぼう #lldiver LT資料
Learn you a Brainfuck for great good!
Learn you a Brainfuck for great good!
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
MTDDC Hokkaido : テンプレートタグでBrainf*ckを作ってみた
Rubyで作る奇妙なプログラミング言語
Rubyで作る奇妙なプログラミング言語
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
「魔法少女志向プログラミングのススメ」 プロ生勉強会 第10回@品川
実用Brainf*ckプログラミング入門編
実用Brainf*ckプログラミング入門編
BFmeta
BFmeta
実用Brainf*ckプログラミング
実用Brainf*ckプログラミング
ライフゲームでプログラミング
ライフゲームでプログラミング
CTF for ビギナーズ ネットワーク講習資料
CTF for ビギナーズ ネットワーク講習資料
Semelhante a Functional Pearl + Brainfuck
JavaScript 講習会 #1
JavaScript 講習会 #1
Susisu
PHP AST 徹底解説
PHP AST 徹底解説
do_aki
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
Shin Ise
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
Takuya Akiba
transformer解説~Chat-GPTの源流~
transformer解説~Chat-GPTの源流~
MasayoshiTsutsui
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
Ransui Iso
What is Metasepi?
What is Metasepi?
Kiwamu Okabe
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
pocketberserker
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
Ra Zon
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
y_taka_23
FOLIOのコードを動かしてみた
FOLIOのコードを動かしてみた
Futoshi Tanuma
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
Hadoop / Spark Conference Japan
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
yak1ex
Clojure programming-chapter-2
Clojure programming-chapter-2
Masao Kato
Semelhante a Functional Pearl + Brainfuck
(14)
JavaScript 講習会 #1
JavaScript 講習会 #1
PHP AST 徹底解説
PHP AST 徹底解説
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
すごいHaskell読書会 in 大阪 #4 「第6章 モジュール」
プログラミングコンテストでのデータ構造 2 ~動的木編~
プログラミングコンテストでのデータ構造 2 ~動的木編~
transformer解説~Chat-GPTの源流~
transformer解説~Chat-GPTの源流~
Lisp tutorial for Pythonista : Day 1
Lisp tutorial for Pythonista : Day 1
What is Metasepi?
What is Metasepi?
F#+Erlangで簡単なシューティングゲームを作ってみている
F#+Erlangで簡単なシューティングゲームを作ってみている
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
思ったほど怖くない! Haskell on JVM 超入門 #jjug_ccc #ccc_l8
FOLIOのコードを動かしてみた
FOLIOのコードを動かしてみた
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
MapReduce/Spark/Tezのフェアな性能比較に向けて (Cloudera World Tokyo 2014 LT講演)
Impractical Introduction of Boost Spirit Qi [PPT]
Impractical Introduction of Boost Spirit Qi [PPT]
Clojure programming-chapter-2
Clojure programming-chapter-2
Mais de Eita Sugimoto
型推論
型推論
Eita Sugimoto
電源2
電源2
Eita Sugimoto
Semiotics
Semiotics
Eita Sugimoto
電源
電源
Eita Sugimoto
Lecture4
Lecture4
Eita Sugimoto
Lecture3
Lecture3
Eita Sugimoto
Lecture2
Lecture2
Eita Sugimoto
Lecture1
Lecture1
Eita Sugimoto
Summer seminar
Summer seminar
Eita Sugimoto
ラムダ計算入門
ラムダ計算入門
Eita Sugimoto
Mais de Eita Sugimoto
(10)
型推論
型推論
電源2
電源2
Semiotics
Semiotics
電源
電源
Lecture4
Lecture4
Lecture3
Lecture3
Lecture2
Lecture2
Lecture1
Lecture1
Summer seminar
Summer seminar
ラムダ計算入門
ラムダ計算入門
Functional Pearl + Brainfuck
1.
FUNCTIONAL PEARL
+ BRAINFUCK 67th yingtai
2.
自己紹介 • yingtai • 67回生
(高1) • twitter: @__int • Haskellが好き
3.
何してたか • brainfuckのインタプリタを作ってました •
Haskell製 • variantも作りたかったです
4.
BRAINFUCKとは • ググれ •
Wikipediaの記事読めば分かります • (闇の|難解)プログラミング言語
5.
HELLO, WORLD >+++++++++[<++++++++>-]<.>+++++ ++[<++++>-]<+.+++++++..+++.[-]> ++++++++[<++++>-]<.>+++++++++++ [<+++++>-]<.>++++++++[<+++>-]<. +++.------.--------.[-]>+++++++
+[<++++>-]<+.[-]++++++++++.
6.
インタプリタとは • ソースコードを実行するソフトウェア
7.
HASKELLとは • 光のプログラミング言語 • 純粋関数型
8.
LTでしたいこと • 成果発表 • Haskellのかんたんな説明 •
たぶん LT じゃなくなります
9.
処理の流れ source code
parse AST execute I/O
10.
かいせつ
文字列として 読み込む source code parse AST execute I/O
11.
かいせつ source code
データを整形 (実行しやすく) parse AST execute I/O
12.
かいせつ
source code データを整形 Parsec (実行しやすく) parse AST execute I/O
13.
かいせつ source code
parse データ、木構造 AST execute I/O
14.
かいせつ source code
parse データ、木構造 AST execute I/O
15.
かいせつ source code
parse AST 実行! execute I/O
16.
かいせつ source code
parse AST execute 外に入出力される I/O
17.
ところで
18.
ところで
source code parse • 「Haskellは純粋関数型」 AST • どういう意味? execute I/O
19.
純粋関数とは • 「副作用を及ぼさない関数」のこと • 副作用とは? •
おおざっぱに説明します
20.
副作用とは • int power
(int x) {return x * x;} • これは副作用がない • int power2 (int x) {printf(“hoge”); return x * x;} • これには副作用がある
21.
副作用とは •
int power2 (int x) {printf(“hoge”); return x * x;} • hoge と外部に出力している • これは返す値には関係がない!
22.
たとえば
int main() { int x = power2(5); printf(“%d¥n”, x); • 右のコードを動かす } • 関数の使用者が単に 5^2 を計算したいだけなら? •→ hoge の表示は計算に「無関係な作用」である
23.
ここで問題です
int main() { • 右のmain関数において int x = power(5); printf(“%d¥n”, x); • 「副作用」は存在するか? }
24.
あります
int main() { int x = power(5); printf(“%d¥n”, x); • 計算結果を表示してる } •→ main関数が「外」の状態を変更している
25.
なくしたければ
int main() { • こうすればいい! int x = power(5); } • 外部の状態を変更しない • (無意味)
26.
つまり • 副作用はどうしても必要なもの • だけど「純粋関数」に副作用はあってほしくない •
→ うまく分離すればいい!
27.
ここで問題です
source code parse • 右の過程において AST • 「副作用」のある部分は? execute I/O
28.
source code
parse AST execute I/O
29.
ANSWER
source code parse • 答えは右図 AST execute I/O
30.
「分離」
source code • Haskellには「IOモナド」と parse いう概念がある AST • ここでは「箱」としてイ execute メージしてください I/O
31.
「分離」
source code parse • 非純粋な関数を隔離する AST •→ IOモナドという箱に入 れる IO Monad execute I/O
32.
「分離」
source code parse • 副作用は箱の外には及ばな AST い! IO Monad execute I/O
33.
閑話休題
34.
成果報告します • brainfuckインタプリタを作りました
(再掲) • https://gist.github.com/gists/3318876/
35.
なぜ作ったか • Haskellで書いたことがなかった • 特に
Zipper の練習
36.
ZIPPERとは • Functional
Pearl の一つ • すごいH本の最終章でも紹介されてます
37.
ZIPPERとは • 木構造を手続き型的に簡単に扱うパターン • ポインタ
/ メモリ、 命令 / コード をzipする
38.
例えば • [0, 1,
2, 3, 4, 5, 6, 7, 8, 9] というリスト、ポインタは 7 •→ ([6, 5, 4, 3, 2, 1, 0], [7, 8, 9]) • リスト = ジッパー, ポインタ = チャック
39.
BRAINFUCKでは • 直線的に命令が実行されていく • ループがある •→
2分木 • ループ部分で枝分かれ
40.
結果 • brainfuckなのにS式みたいになります • evalします •
まわりくどいです
41.
まとめ • インタプリタはparseしexecuteする • 副作用は「外の状態を変更する」作用 •
Haskellは光の言語 • だがBrainfuckインタプリタの作成には不向き
42.
ご清聴 ありがとうございました
Notas do Editor
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
\n
Baixar agora